了解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']
相关推荐
十盒半价3 天前
前端性能优化避坑指南:从回流重绘到页面渲染全解析
前端·css·trae
Pitayafruit4 天前
AI帮我写代码,谁来帮我看代码?
trae
楽码4 天前
终于说清楚!希腊字符如何进入数学或科学场景
openai·编程语言·trae
十盒半价4 天前
闭包:JS 里的 “背包客”,背走了变量的秘密
前端·javascript·trae
极客密码13 天前
Cursor再见!简单两步,Augment真无限续杯,爽用Claude 4!
ai编程·cursor·trae
田威AI14 天前
Trae知识库实战教程:智能体提示词+完整设置方法分享,打造你的专属AI助手
ai编程·trae
curdcv_po14 天前
前端开发,一句话自动3d建模
trae
小磊哥er14 天前
【前端AI实践】Trae:一款可以让你从0到1快速开发完整项目的IDE
前端·ai编程·trae
cpp加油站14 天前
Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)
ai编程·mcp·trae
coder_pig14 天前
🙋‍♂️挑战用1天,让AI从0到1搭建纯前端 "塔防游戏"
aigc·mcp·trae