深入探讨Function Calling:完成外部函数调用的作业原理
导言
Function Calling
是一个答应大型言语模型(如 GPT
)在生成文本的进程中调用外部函数或服务的功用。Function Calling
答应咱们以 JSON
格局向 LLM
模型描绘函数,并运用模型的固有推理才能来决议在生成呼应之前是否调用该函数。模型自身不履行函数,而是生成包括函数称号和履行函数所需的参数的 JSON
。
function calling 履行原理
现在咱们界说提示词像大言语模型问一下当时北京的气候?
由于 LLM
大言语模型缺少实时数据,所以无法答复实时数据这种场景。
咱们用SK
来测验一下
Console.WriteLine("===>没有设置function calling=<===");
{
var kernel = Kernel.CreateBuilder().AddAzureOpenAIChatCompletion(config.ModelId,
endpoint: config.Endpoint,
apiKey: config.ApiKey).Build();
var template = "当时北京的气候?";
Console.WriteLine($"User: {template}");
var function = kernel.CreateFunctionFromPrompt(template);
var functionResult = await function.InvokeAsync(kernel);
Console.WriteLine($"Assistant:{functionResult}");
}
输出:
User: 当时北京的气候?
Assistant:对不住,作为一个AI,我无法为你供给实时信息。你能够查看可信的气候运用或网站来获取当时北京的气候。
这时候就需求用到 LLM
的 Function Calling
功用来协助答复用户的问题
运用 OpenAI API function calling
OpenAI
的 function calling
的中心是咱们将Prompts
提示词和可用函数
列表一同发送给LLM
。
OpenAI Chat Completions 接口
{
"tool_choice": "auto",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "我想知道现在北京的气候状况"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "Get_Weather_For_City",
"description": "获取指定城市的气候",
"parameters": {
"type": "object",
"properties": {
"cityName": {
"type": "string",
"description": "城市名"
}
}
}
}
}
]
}
中心参数解说
tool_choice:
这个参数决议了模型是否应该主动挑选是否调用函数。值为 "auto"
表明模型将依据状况主动决议是否调用函数。 默许状况下,假如恳求中不存在任何函数,则将其设置为“none”
,则设置为“auto”
。
tools
在 tools
部分界说了一个函数,这个函数能够被 OpenAI 的模型调用。以下是 tools
部分参数的简略解说:
-
type: 指定了这个东西的类型,这里是
"function"
,表明这是一个函数调用。 -
function: 包括函数的详细信息,是一个目标。
-
name: 函数的称号,这里是
"Get_Weather_For_City"
,这是调用时运用的函数名。 -
description: 函数的描绘,这里是
"获取指定城市的气候"
,用于阐明这个函数的效果。 -
parameters: 界说了函数调用时需求的参数,是一个目标。
-
type: 参数目标的类型,这里是
"object"
,表明参数是一个目标类型。 -
properties: 包括详细的参数界说,是一个目标,每个特点对应一个参数。
- cityName: 这是一个参数的称号,表明城市称号。
- type: 此参数的类型,这里是
"string"
,表明参数应该是一个字符串。 - description: 参数的描绘,这里是
"城市名"
,用于解说这个参数的含义。
- type: 此参数的类型,这里是
- cityName: 这是一个参数的称号,表明城市称号。
-
-
这个 tools
部分界说了一个名为 Get_Weather_For_City
的函数,它需求一个名为 cityName
的字符串参数,用于指定想要查询气候的城市。当模型需求调用这个函数时,它将运用这个参数来获取相应的气候信息。
function calling 输出
{
"id": "chatcmpl-9TOuIqnuMirU3BUDluCrHMTlsjz97",
"object": "chat.completion",
"created": 1716794282,
"model": "gpt-4",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_DQU6OKHWyv3HVLyWVjSRqvwZ",
"type": "function",
"function": {
"name": "Get_Weather_For_City",
"arguments": "{\n \"cityName\": \"北京\"\n}"
}
}
]
},
"logprobs": null,
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 83,
"completion_tokens": 20,
"total_tokens": 103
},
"system_fingerprint": null
}
最中心的办法是tool_calls
回参里边回来了咱们需求的办法名和一个 json
参数 比方"{\n \"cityName\": \"北京\"\n}"
包括了咱们的参数和值。
回来函数成果上下文
{
"max_tokens": 3000,
"tool_choice": "auto",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "我想知道北京的气候状况"
},
{
"role": "assistant",
"function_call": {
"name": "Get_Weather_For_City",
"arguments": "{\n \"cityName\": \"北京\"\n}"
}
},
{
"role": "function",
"name": "Get_Weather_For_City",
"content": "27度,晴朗"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "Get_Weather_For_City",
"description": "获取指定城市的气候",
"parameters": {
"type": "object",
"properties": {
"cityName": {
"type": "string",
"description": "城市名"
}
}
}
}
},
{
需求把上下文信息和function calling
的result
答复的信息传给LLM
ToolCall
上下文信息
{
"role": "assistant",
"function_call": {
"name": "Get_Weather_For_City",
"arguments": "{\n \"cityName\": \"北京\"\n}"
}
}
ToolCallResponse
{
"role": "function",
"name": "Get_Weather_For_City",
"content": "27度,晴朗"
}
LLM 输出
{
"id": "chatcmpl-9TRZBqCcRMBYIojuZimio6GOpsTi4",
"object": "chat.completion",
"created": 1716804505,
"model": "gpt-4",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "北京的气候状况是27度,晴朗。"
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 133,
"completion_tokens": 19,
"total_tokens": 152
},
"system_fingerprint": null
}
到现在为止简略的function calling
的简略调用现已完成了
详细的流程能够总结为
能够看到function calling
跟大预言模型至少有两次交互的的进程
总结
依据文档中的描绘,OpenAI
的函数调用(function calling
)进程能够简化为以下几个进程,而且能够用一个流程图来表明:
- 用户提出问题。
- 体系接纳到问题,并查看是否有可用的函数能够调用。
- 假如有,体系会生成一个东西调用恳求(ToolCall),并发送给运用程序。
- 运用程序履行恳求的函数,并回来成果。
- 体系将函数的呼应(ToolCallResponse)发送回 LLM 模型。
- LLM 模型运用这个呼应来生成终究的用户呼应。
下面是一个简化的流程图,描绘了上述进程:
在这个流程图中:
- A 代表用户。
- B 是用户提出的问题。
- C 是
LLM
模型,它查看是否有函数能够调用。 - D 是生成东西调用(
ToolCall
)的进程。 - E 是运用程序,它接纳
ToolCall
并履行相应的函数。 - F 是运用程序回来的
ToolCallResponse
,即函数履行的成果。 - G 是 LLM 模型,它运用
ToolCallResponse
来生成用户呼应。 - H 是终究接纳到用户呼应的用户。
这个流程图是根据文档内容的简化表明,实践的体系或许包括更多的细节和进程。
最终
本章的首要了解function calling
及其作业原理的简略介绍。鄙人一篇博客中,咱们 x 学习在Semantic kernel
下运用运用function calling
。
参考资料
openai-function-calling