背景
Function Calling 的核心思想: 将大语言模型的语言理解能力与外部工具的功能结合起来,让大语言模型能够理解用户的意图,并调用合适的工具来完成任务。例如,通过 Function Calling,大语言模型可以:
- 调用天气 API 获取实时天气信息: 不再局限于提供过时的天气预报,而是可以告诉你此时此刻的天气状况,就像你打开手机上的天气应用一样。调用订票网站 API 预订机票: 不再只是告诉你如何订票,而是可以直接帮你完成订票操作,就像一个专业的旅行代理一样。调用代码执行程序: 可以执行代码来完成各种任务,例如数据分析、图像处理等,就像一个经验丰富的程序员一样。
例子:ChatGPT调用 自己定义的函数 实现 二维数组的求和计算
1.建立自定义函数和与LLM的通信
(1)定义:外部函数(自定义函数)
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)建立外部函数库
字典类型 ,用于方便后面通讯时候查找调用的函数
available_functions = { "chen_ming_algorithm": chen_ming_algorithm,}
3)通讯 Functions
在 Chat 模型中的 function calling 功能中,functions
参数的作用是定义模型可以调用的函数信息。通过 functions
参数,LLM的Chat 模型可以根据上下文智能选择并调用适当的函数,来完成特定的任务或查询。这种机制在增强模型的交互性和功能性方面非常重要,使得模型能够执行更加复杂和多样化的操作。这些信息包括:
- name:函数的名称,唯一标识每个函数,便于模型选择对应的函数进行调用。
- description:描述函数的具体功能,帮助模型理解每个函数的作用,在需要时选择正确的函数来处理请求。
- parameters:规定函数的输入参数格式(采用 JSON Schema 格式),确保模型调用时的数据格式正确并满足要求。
function = { "name": "chen_ming_algorithm", "description": "用于执行陈明算法的函数,定义了一种特殊的数据集计算过程", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "执行陈明算法的数据表字符串表示" } }, "required": ["data"], },}
2. LLM通讯具体过程
(1)不使用 外部函数 LLM 的response 的例子
# 定义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"
# 再次调用openai接口,并指定使用functions和function_callresponse = 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] #调用函数库
# 提取参数并调用相应函数function_args = json.loads(response_message["function_call"]["arguments"]) function_response = function_to_call(**function_args) #加载到外部函数中print(function_response)
# 将第一次模型返回的结果消息追加到messages中messages.append(response_message)
#将函数调用结果作为下一步messages中的一部分,更新消息messages.append({ "role": "function", "name": function_name, "content": function_response})
(3)使用外部函数 第二次询问
# 再次调用模型并输出最终结果second_response = openai.ChatCompletion.create( model="gpt-4-0613", messages=messages,)# 提取并打印最终生成的消息内容final_message = second_response["choices"][0]["message"]["content"]print(final_message)# 转换为DataFramedf_str = final_message
json schema 格式
判断:判断是否为一个 array 如果是array 则加入item 判断多个 property 否则只有一个property套娃 :可以property 里面 套type 在套 property
Message 4种消息
函数查表
response.choices[0].message['content']