当前位置:   article > 正文

深入探讨Function Calling:实现外部函数调用的工作原理

function calling原理

引言

Function Calling 是一个允许大型语言模型(如 GPT)在生成文本的过程中调用外部函数或服务的功能。Function Calling允许我们以 JSON 格式向 LLM 模型描述函数,并使用模型的固有推理能力来决定在生成响应之前是否调用该函数。模型本身不执行函数,而是生成包含函数名称执行函数所需的参数JSON

function calling 执行原理

现在我们定义提示词像大语言模型问一下当前北京的天气?

因为 LLM 大语言模型缺乏实时数据,所以无法回答实时数据这种场景。

我们用SK来测试一下

  1. Console.WriteLine("===>没有设置function calling=<===");
  2. {
  3.     var kernel = Kernel.CreateBuilder().AddAzureOpenAIChatCompletion(config.ModelId,
  4.             endpoint: config.Endpoint,
  5.     apiKey: config.ApiKey).Build();
  6.     var template = "当前北京的天气?";
  7.     Console.WriteLine($"User: {template}");
  8.     var function = kernel.CreateFunctionFromPrompt(template);
  9.     var functionResult = await function.InvokeAsync(kernel);
  10.     Console.WriteLine($"Assistant:{functionResult}");
  11. }

输出:

  1. User: 当前北京的天气?
  2. Assistant:对不起,作为一个AI,我无法为你提供实时信息。你可以查看可信的天气应用或网站来获取当前北京的天气。

这时候就需要用到 LLMFunction Calling 功能来帮助回答用户的问题

使用 OpenAI API function calling

OpenAIfunction calling的核心是我们将Prompts 提示词和可用函数列表一起发送给LLM

OpenAI Chat Completions 接口

  1. {
  2.   "tool_choice""auto",
  3.   "messages": [
  4.     {
  5.       "role""system",
  6.       "content""You are a helpful assistant."
  7.     },
  8.     {
  9.       "role""user",
  10.       "content""我想知道现在北京的天气状况"
  11.     }
  12.   ],
  13.   "tools": [
  14.     {
  15.       "type""function",
  16.       "function": {
  17.         "name""Get_Weather_For_City",
  18.         "description""获取指定城市的天气",
  19.         "parameters": {
  20.           "type""object",
  21.           "properties": {
  22.             "cityName": {
  23.               "type""string",
  24.               "description""城市名"
  25.             }
  26.           }
  27.         }
  28.       }
  29.     }
  30.   ]
  31. }

核心参数解释

tool_choice:

这个参数决定了模型是否应该自动选择是否调用函数。值为 "auto" 表示模型将根据情况自动决定是否调用函数。默认情况下,如果请求中不存在任何函数,则将其设置为“none”,则设置为“auto”

tools

tools 部分定义了一个函数,这个函数可以被 OpenAI 的模型调用。以下是 tools 部分参数的简单解释:

  • type: 指定了这个工具的类型,这里是 "function",表示这是一个函数调用。

  • function: 包含函数的详细信息,是一个对象。

    • type: 参数对象的类型,这里是 "object",表示参数是一个对象类型。

    • properties: 包含具体的参数定义,是一个对象,每个属性对应一个参数。

    • type: 此参数的类型,这里是 "string",表示参数应该是一个字符串。

    • description: 参数的描述,这里是 "城市名",用于解释这个参数的意义。

    • cityName: 这是一个参数的名称,表示城市名称。

    • name: 函数的名称,这里是 "Get_Weather_For_City",这是调用时使用的函数名。

    • description: 函数的描述,这里是 "获取指定城市的天气",用于说明这个函数的作用。

    • parameters: 定义了函数调用时需要的参数,是一个对象。

这个 tools 部分定义了一个名为 Get_Weather_For_City 的函数,它需要一个名为 cityName 的字符串参数,用于指定想要查询天气的城市。当模型需要调用这个函数时,它将使用这个参数来获取相应的天气信息。

function calling 输出

  1. {
  2.   "id""chatcmpl-9TOuIqnuMirU3BUDluCrHMTlsjz97",
  3.   "object""chat.completion",
  4.   "created"1716794282,
  5.   "model""gpt-4",
  6.   "choices": [
  7.     {
  8.       "index"0,
  9.       "message": {
  10.         "role""assistant",
  11.         "content": null,
  12.         "tool_calls": [
  13.           {
  14.             "id""call_DQU6OKHWyv3HVLyWVjSRqvwZ",
  15.             "type""function",
  16.             "function": {
  17.               "name""Get_Weather_For_City",
  18.               "arguments""{\n  \"cityName\": \"北京\"\n}"
  19.             }
  20.           }
  21.         ]
  22.       },
  23.       "logprobs": null,
  24.       "finish_reason""tool_calls"
  25.     }
  26.   ],
  27.   "usage": {
  28.     "prompt_tokens"83,
  29.     "completion_tokens"20,
  30.     "total_tokens"103
  31.   },
  32.   "system_fingerprint": null
  33. }

最核心的方法是tool_calls回参里面返回了我们需要的方法名和一个 json 参数 比如"{\n \"cityName\": \"北京\"\n}"包含了我们的参数和值。

返回函数结果上下文

  1. {
  2.     "max_tokens"3000,
  3.     "tool_choice""auto",
  4.     "messages": [
  5.         {
  6.             "role""system",
  7.             "content""You are a helpful assistant."
  8.         },
  9.         {
  10.             "role""user",
  11.             "content""我想知道北京的天气状况"
  12.         },
  13.         {
  14.             "role""assistant",
  15.             "function_call": {
  16.                 "name""Get_Weather_For_City",
  17.                 "arguments""{\n  \"cityName\": \"北京\"\n}"
  18.             }
  19.         },
  20.         {
  21.             "role""function",
  22.             "name""Get_Weather_For_City",
  23.             "content""27度,晴朗"
  24.         }
  25.     ],
  26.     "tools": [
  27.         {
  28.             "type""function",
  29.             "function": {
  30.                 "name""Get_Weather_For_City",
  31.                 "description""获取指定城市的天气",
  32.                 "parameters": {
  33.                     "type""object",
  34.                     "properties": {
  35.                         "cityName": {
  36.                             "type""string",
  37.                             "description""城市名"
  38.                         }
  39.                     }
  40.                 }
  41.             }
  42.         },
  43.         {

需要把上下文信息和function callingresult回答的信息传给LLM

  • ToolCall上下文信息

  1. {
  2.   "role""assistant",
  3.   "function_call": {
  4.     "name""Get_Weather_For_City",
  5.     "arguments""{\n  \"cityName\": \"北京\"\n}"
  6.   }
  7. }
  • ToolCallResponse

  1. {
  2.   "role""function",
  3.   "name""Get_Weather_For_City",
  4.   "content""27度,晴朗"
  5. }

LLM 输出

  1. {
  2.   "id""chatcmpl-9TRZBqCcRMBYIojuZimio6GOpsTi4",
  3.   "object""chat.completion",
  4.   "created"1716804505,
  5.   "model""gpt-4",
  6.   "choices": [
  7.     {
  8.       "index"0,
  9.       "message": {
  10.         "role""assistant",
  11.         "content""北京的天气状况是27度,晴朗。"
  12.       },
  13.       "logprobs": null,
  14.       "finish_reason""stop"
  15.     }
  16.   ],
  17.   "usage": {
  18.     "prompt_tokens"133,
  19.     "completion_tokens"19,
  20.     "total_tokens"152
  21.   },
  22.   "system_fingerprint": null
  23. }

到现在为止简单的function calling的简单调用已经完成了 具体的流程可以总结为

3768b159a8fa8235446f24fdf5193d90.png

可以看到function calling跟大预言模型至少有两次交互的的过程

总结

根据文档中的描述,OpenAI的函数调用(function calling)过程可以简化为以下几个步骤,并且可以用一个流程图来表示:

9cb5ce57f869a3618567bbb2417b8d0e.png

  1. 用户提出问题。

  2. 系统接收到问题,并检查是否有可用的函数可以调用。

  3. 如果有,系统会生成一个工具调用请求(ToolCall),并发送给应用程序。

  4. 应用程序执行请求的函数,并返回结果。

  5. 系统将函数的响应(ToolCallResponse)发送回 LLM 模型。

  6. 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[1]

参考资料

[1]

openai-function-calling: https://systenics.ai/blog/2024-03-11-openai-function-calling/

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号