AI大模型:OpenAi之函数调用(Function Calling)

1.函数调用(Function Calling)

学习如何使大语言模型连接到外部工具

1.1介绍

在API调用中,您可以描述函数规范,让模型智能地选择输出包含参数的JSON对象,过程中你以调用一个或多个函数。聊天补全API自身不能调用函数;而是,让模型生成JSON,使用它调用函数代码

最新的模型(gpt-3.5-turbo-0125和gpt-4-turbo-preview)已通过训练,可以检测何时应该调用函数(取决于输入),并使用模型对符合函数签名的JSON进行响应。拥有这项能力的同时也伴随着风险。我们强烈建议在采取可能影响世界范围内的用户行为之前建立用户确认流程(例如:发邮件、发布网络、购物等待)

1.2常用案例

函数调用可以使你更可靠的从模型获得结构化的数据。可以这样:

  • 创建一些助理,通过调用外部的APIs来回答一些问题(例如:像ChatGPT的插件)
    • 例如:可以定义函数:send_email(to:string, body:string)或get_current_weather(location:string, unit:‘celsius’|‘fahrenheit’)
  • 转换自然语言到API调用
    • 例如:转换“我的最主要的客户都有谁?” get_customers(min_revenue: int, created_before: string, limit: int) 并调用你系 统内部的API
  • 从文本中提取结构化的数据
    • 例如:定义一个函数调用:extract_data(name: string, birthday: string) 或 sql_query(query: string)

等等还有很多…

函数调用的基本步骤如下:

  1. 调用模型时,将“用户查询”和“多个函数”定义在“函数参数”中
  2. 模型可以选择调用一个或多个函数;这样,内容将是遵循自定义模式的字符串化JSON对象(注意:模型可能会产生幻觉参数)
  3. 在你的代码中将string解析成JSON对象,用之前提供的参数(如果存在)调用函数
  4. 追加函数的返回作为一个新的消息再次调用模型,然后让模型归纳结果并返回给用户

1.3支持模型

目前,不是所有模型的版本都是用函数调用数据训练的。支持函数调用的模型有:

  • gpt-4, gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-4-0613
  • gpt-3.5-turbo
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613

另外, 以下模型支持并行的函数调用:

  • gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106

2.并行函数调用

并行函数调用就是模型一起执行多个函数调用的能力,允许这些函数的效果和结果的调用被并行的解析。如果函数调用要花很长的时间,并行调用就显得非常有用。例如,模型可能要调用函数同时返回三个不同地点的天气,在tool_calls数组中,要包含三个函数调用,并作为一个消息结果返回,每个调用含有一个ID.为响应这些函数调用,增加三个消息至会话中,每个消息包含一个函数调用的结果,从tool_calls引用id,并用tool_call_id表示。

在下面例子中,我们仅定义一个函数get_current_weather。模型调用了函数多次,并将调用函数的返回结果再次发送给模型,由模型决定下一步的返回消息。它会返回一个面向用户的消息,告诉用户一些地区的温度。根据查询结果,可能会在调用一次函数。

如果你想强制模型调用一个指定的函数,你可以设置tool_choice参数,指定具体的函数名。你也可以强制模型生成面向用户的消息,设置参数:tool_choice: none。请注意:参数默认设置为:tool_choice: auto ,含义是由模型决定是否调用函数,调用哪一个函数。

2.1多个函数调用案例

# @Time : 2024/2/15 11:22
# @Author : NaiveFrank
# @Version : 1.0
# @Project : python_tutorial
from openai import OpenAI
import json

# 加载 .env 文件到环境变量
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 服务。会自动从环境变量加载 OPENAI_API_KEY 和 OPENAI_BASE_URL
client = OpenAI()

# 例子模拟函数调用的硬编码,返回相同数据格式的天气
# 在实际生产中,可以是后台API或第三方的API fahrenheit-华氏温度
def get_current_weather(location, unit="fahrenheit"):
    """返回指定地区的实时天气"""
    if "北京" in location.lower():
        return json.dumps({"location": "北京", "temperature": "16", "unit": unit})
    elif "上海" in location.lower():
        return json.dumps({"location": "上海", "temperature": "22", "unit": unit})
    elif "承德" in location.lower():
        return json.dumps({"location": "承德", "temperature": "12", "unit": unit})
    else:
        return json.dumps({"location": location, "temperature": "未知"})

def run_conversation():
    # 第一步:发送会话和函数调用给模型
    messages = [{"role": "user", "content": "北京、上海、承德3地的天气现在是什么样的?"}]
    tools = [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "返回指定地区的温度",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "承德市双桥区",
                        },
                        "unit": {"type": "string", "enum": ["celsius", "华氏温度"]},
                    },
                    "required": ["location"],
                },
            },
        }
    ]
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-0125",
        messages=messages,
        tools=tools,
        tool_choice="auto",  # auto 默认值,明确给出
    )
    response_message = response.choices[0].message
    tool_calls = response_message.tool_calls
    # 第二步: 检查模型是否需要调用一个函数
    if tool_calls:
        # 第三步: 调用函数
        # 注意:返回的JSON消息不一定有效,一定要检查错误
        available_functions = {
            "get_current_weather": get_current_weather,
        }  # 这个例子只有一个参数调用,当然也可以有多个
        messages.append(response_message)  # 将助理的回复加入到消息中
        # 第四步: 将每一个函数调用及其相应的响应发送给模型
        for tool_call in tool_calls:
            function_name = tool_call.function.name  # 返回函数调用名
            function_to_call = available_functions[function_name]  # 返回JSON不一定有效,使其有效
            function_args = json.loads(tool_call.function.arguments)  # 将函数所用的参数解析为JSON
            function_response = function_to_call(  # 调用函数并传指定参数
                location=function_args.get("location"),
                unit=function_args.get("unit"),
            )
            """
             函数调用返回结果加入新的会话
             "tool_call_id": tool_call.id, -> 函数返回的ID
             "role": "tool", -> role 类型为tool
             "name": function_name, -> 动态解析的函数调用名
             "content": function_response, -> 内容为函数调用返回结果
            """
            messages.append(
                {
                    "tool_call_id": tool_call.id,
                    "role": "tool",
                    "name": function_name,
                    "content": function_response,
                }
            )
            # 模型理解函数返回的响应后,并返回一个新的响应
        second_response = client.chat.completions.create(
            model="gpt-3.5-turbo-0125",
            messages=messages,
        )
        return second_response

print(run_conversation())

输出结果:

ChatCompletion(
	id='chatcmpl-8sMdpiaEJhSQhmbN9ONbd1ZR2pefZ', 
	choices=[
		Choice(
			finish_reason='stop', 
			index=0, 
			logprobs=None, 
			message=ChatCompletionMessage(
					content='目前,北京的气温是16摄氏度,上海的气温是22摄氏度,承德的气温是12摄氏度。', 
					role='assistant', 
					function_call=None, 
					tool_calls=None
			)
		)
	], 
	created=1707967437, 
	model='gpt-3.5-turbo-0125', 
	object='chat.completion', 
	system_fingerprint='fp_69829325d0', 
	usage=CompletionUsage(
		completion_tokens=49, 
		prompt_tokens=177, 
		total_tokens=226
	)
)


2.2Tokens

在底层,函数被训练成模型的语法注入到系统消息中。这意味着函数长度也要遵循模型的上下文限制,并作为输入的token进行计费。如果遇到上下文限制,我们建议限制函数的数量或函数参数长度。

如果定义了许多函数,也可以使用精调来减少使用的token数量。


文章结尾

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频,免费分享!

在这里插入图片描述

一、大模型全套的学习路线

L1级别:AI大模型时代的华丽登场
L2级别:AI大模型API应用开发工程
L3级别:大模型应用架构进阶实践
L4级别:大模型微调与私有化部署

在这里插入图片描述

达到L4级别也就意味着你具备了在大多数技术岗位上胜任的能力,想要达到顶尖水平,可能还需要更多的专业技能和实战经验。

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

三、大模型经典PDF书籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

在这里插入图片描述

四、AI大模型商业化落地方案

在这里插入图片描述

作为普通人在大模型时代,需要不断提升自己的技术和认知水平,同时还需要具备责任感和伦理意识,为人工智能的健康发展贡献力量。

有需要全套的AI大模型学习资源的小伙伴,可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

在这里插入图片描述

如有侵权,请联系删除。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值