了解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']
相关推荐
coder_pig8 小时前
Coze+Trae+掘金MCP = "✨掘金微热榜"
coze·mcp·trae
盏灯12 小时前
国产❓Trae ❓收费❓❗︎
trae
石小石Orz12 小时前
浏览器指纹-探究前端如何识别用户设备
trae
anyup13 小时前
记一次解决 uni-app 真机运行时导致的白屏问题:Trae vs 通义灵码 vs Cursor
前端·uni-app·trae
Wo在稀土掘金16 小时前
Trae 智能体--git自动提交代码
ai编程·trae
日升19 小时前
如何在 Chrome 136+ 用 browser-use 打开「带登录态」的浏览器
python·ai编程·trae
Goboy20 小时前
用 Trae 一键生成“水波纹按钮”,连 CSS 动画都不用自己写了!
ai编程·trae
Goboy20 小时前
用 Trae 打造创意 Loading 动画生成器:只需三个词,就能玩出花来!
ai编程·trae
Pitayafruit1 天前
还在配置规则文件和智能体?Roo Commander:预置90+领域专家,开箱即用的AI编程新体验
aigc·ai编程·trae
杭州胖敬亭1 天前
Trae终於有付费版本了,一分价钱一分货
前端·cursor·trae