背景
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 模型可以根据上下文智能选择并调用适当的函数,来完成特定的任务或查询。这种机制在增强模型的交互性和功能性方面非常重要,使得模型能够执行更加复杂和多样化的操作。这些信息包括:
-
- name:函数的名称,唯一标识每个函数,便于模型选择对应的函数进行调用。
-
- description:描述函数的具体功能,帮助模型理解每个函数的作用,在需要时选择正确的函数来处理请求。
-
- 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']
