了解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']
相关推荐
豆包MarsCode1 天前
用 SOLO Coder 搭建 3D 机器人项目
trae
风止何安啊1 天前
收到字节的短信:Trae SOLO上线了?尝尝鲜,浅浅做个音乐播放器
前端·html·trae
天天摸鱼的java工程师1 天前
从 0 到 1:我用 Java + Vue 实现了文件上传压缩功能(附完整项目结构)
trae
五号厂房1 天前
TRAE中国版SOLO模式上线尝鲜
trae·solo
围巾哥萧尘2 天前
🚀TRAE SOLO 实战干货:从零到一部署国内版“拍立得”应用的踩坑避坑指南🧣
trae
kungggyoyoyo2 天前
TRAE中国版SOLO模式上线!我用它从0到1开发了一款AI小说编辑器
前端·vue.js·trae
围巾哥萧尘2 天前
🚀TRAE SOLO Coder :网页版“切水果”游戏开发实录,基于手势识别的互动游戏制作🧣
trae
程序员爱钓鱼2 天前
Go语言 OCR 常用识别库与实战指南
后端·go·trae
程序员爱钓鱼2 天前
使用简单 JSON + 自定义 t 函数实现轻量多语言国际化(无需 next-intl)
前端·javascript·trae
天天摸鱼的java工程师2 天前
RuoYi-Cloud 完全解剖:TRAE AI 绘制的架构蓝图
trae