了解Function Calling的原理

背景

Function Calling 的核心思想:大语言模型的语言理解能力与外部工具的功能结合起来,让大语言模型能够理解用户的意图,并调用合适的工具来完成任务。例如,通过 Function Calling,大语言模型可以:

  • 调用天气 API 获取实时天气信息: 不再局限于提供过时的天气预报,而是可以告诉你此时此刻的天气状况,就像你打开手机上的天气应用一样。
  • 调用订票网站 API 预订机票: 不再只是告诉你如何订票,而是可以直接帮你完成订票操作,就像一个专业的旅行代理一样。
  • 调用代码执行程序: 可以执行代码来完成各种任务,例如数据分析、图像处理等,就像一个经验丰富的程序员一样。

例子:ChatGPT调用 自己定义的函数 实现 二维数组的求和计算

1.建立自定义函数和与LLM的通信

(1)定义:外部函数(自定义函数)

python 复制代码
def chen_ming_algorithm(data):  #计算 二维数组的每行的和
    '''
    陈明算法函数,该函数定义了一种特殊的数据集计算过程
    :param data: 必要参数,表示带入计算的数据表,用字符串进行表示
    :return: 陈明函数计算后的结果,返回结果为表示为JSON格式的DataFrame类型对象
    '''
    data = io.StringIO(data)
    df_new = pd.read_csv(data, sep='\s+', index_col=0)
    res = np.sum(df_new, axis=1) - 1
    return json.dumps(res.to_string())

(2)建立外部函数库

字典类型 ,用于方便后面通讯时候查找调用的函数

ini 复制代码
available_functions = {
    "chen_ming_algorithm": chen_ming_algorithm,
}

3)通讯 Functions

在 Chat 模型中的 function calling 功能中,functions 参数的作用是定义模型可以调用的函数信息。通过 functions 参数,LLM的Chat 模型可以根据上下文智能选择并调用适当的函数,来完成特定的任务或查询。这种机制在增强模型的交互性和功能性方面非常重要,使得模型能够执行更加复杂和多样化的操作。这些信息包括:

    1. name:函数的名称,唯一标识每个函数,便于模型选择对应的函数进行调用。
    1. description:描述函数的具体功能,帮助模型理解每个函数的作用,在需要时选择正确的函数来处理请求。
    1. parameters:规定函数的输入参数格式(采用 JSON Schema 格式),确保模型调用时的数据格式正确并满足要求。
bash 复制代码
function = {
    "name": "chen_ming_algorithm",
    "description": "用于执行陈明算法的函数,定义了一种特殊的数据集计算过程",
    "parameters": {
        "type": "object",
        "properties": {
            "data": {
                "type": "string",
                "description": "执行陈明算法的数据表字符串表示"
            }
        },
        "required": ["data"],
    },
}

2. LLM通讯具体过程

(1)不使用 外部函数 LLM 的response 的例子

ini 复制代码
# 定义messages列表,其中包含system和user的消息
messages = [
    {"role": "system", "content": "数据集data: %s, 数据集以字符串形式呈现" % df_str},
    {"role": "user", "content": "请在数据data上执行陈明算法"}
]

# 调用openai接口,生成对话响应
response = openai.ChatCompletion.create(
    model="gpt-4-0613",
    messages=messages
)

# 提取生成的响应消息
response_message = response["choices"][0]["message"]

# 检查生成的内容,输出调试
print(response_message["content"])

(2)使用外部函数 第一次询问

添加参数:functions=functions, function_call="auto"

ini 复制代码
# 再次调用openai接口,并指定使用functions和function_call
response = openai.ChatCompletion.create(
    model="gpt-4-0613",
    messages=messages,
    functions=functions,  # 传递可用的函数字典
    function_call="auto"  # 自动执行函数调用
)
# 提取函数调用信息
response_message = response["choices"][0]["message"]
function_name = response_message["function_call"]["name"] 

#functions 提取,并整理的符合参数类型  自然语言转化为结构化语言
function_to_call = available_functions[function_name]   #调用函数库
ini 复制代码
# 提取参数并调用相应函数
function_args = json.loads(response_message["function_call"]["arguments"]) 
function_response = function_to_call(**function_args)  #加载到外部函数中
print(function_response)
bash 复制代码
# 将第一次模型返回的结果消息追加到messages中
messages.append(response_message) 
bash 复制代码
#将函数调用结果作为下一步messages中的一部分,更新消息
messages.append({
    "role": "function",
    "name": function_name,
    "content": function_response
})

(3)使用外部函数 第二次询问

ini 复制代码
# 再次调用模型并输出最终结果
second_response = openai.ChatCompletion.create(
    model="gpt-4-0613",
    messages=messages,
)

# 提取并打印最终生成的消息内容
final_message = second_response["choices"][0]["message"]["content"]
print(final_message)

# 转换为DataFrame
df_str = final_message

json schema 格式

判断:判断是否为一个 array 如果是array 则加入item 判断多个 property 否则只有一个property 套娃 :可以property 里面 套type 在套 property

Message 4种消息

函数查表

css 复制代码
response.choices[0].message['content']
相关推荐
sinat_267611913 天前
Trae AI 进行 Android 从0 到 1的一键开发
kotlin·android studio·trae
阆遤4 天前
利用TRAE对nanobot进行安全分析并优化
python·安全·ai·trae·nanobot
Molesidy5 天前
【VSCode】VSCode或者Trae的扩展文件夹以及用户设置文件夹的路径更改到指定位置
ide·编辑器·trae
yosh'joy!!5 天前
下载Trae使用
ai·trae
豆包MarsCode5 天前
只需一个指令,让 OpenClaw 安排 TRAE 干活
trae
sugar15695 天前
Trae快速构建自己项目的docker镜像
docker·容器·trae
sugar15696 天前
Trae 添加项目规则,快速完成crmeb项目本地开发环境搭建
docker·容器·trae
欧简墨6 天前
kotlin Android Extensions插件迁移到viewbinding总结
android·trae
arbboter7 天前
【AI编程】约束即设计:AI时代的人机边界重构
ai编程·ai工作流·人机协作·trae·声明式执行·流程编排
进击的雷神9 天前
Trae AI IDE 完全指南:从入门到精通
大数据·ide·人工智能·trae