LLM 大模型 Function Call 流程分析

Function Call 是个啥

Function Calling 是一个允许大型语言模型(如 GPT)在生成文本的过程中调用外部函数或服务的功能。以实现有效的工具使用和与外部 API 的交互。

Function Call 的交互技术解读

Function Call 最大的价值 就是让机器轻易地理解了用户模糊化的输入,将其转换为机器可以理解的结构化指令 并且理解何时调用特定函数并提供执行实际操作所需的参数。

比如我提问一个 明天北京的天气怎么样?

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

让我们来拆解一下上述的交互流程,仔细看看这个插件的交互是如何实现的。这样的一次交互,包含了5 个对话:

  1. 用户提出了一个问题:「明天北京的天气怎么样?」
  2. AI系统 接收到问题,识别了用户的意图 并检查是否有可用的函数可以调用
  3. 如果有,系统会生成一个工具调用请求(ToolCall)解析获取 调用 请求参数
  4. AI 开始调用 天气查询插件 传参,获取明天北京的天气数据;
  5. AI 输出天气信息;

伪代码


#1 提问
- role: "user"
  content: "我想知道现明天北京的天气状况?"
  tool_choice: "auto",
  tools:"function",
  "name": "Get_Weather_For_City"
  
#2 意图识别是否走fuction call 解析参数
- role: "assistant"
  function_call: "{"name": "realtimeWeather","arguments": "{\n  \"city\": \"北京\"\n}\"}

#3 调研 fcuntion
- role: "function"
  content: "27度,晴朗"

#4 LLM 总结输出
- role: "assistant"
  content: "明天的北京温度是27度,晴朗。"

function ,user 、system、assistant 1
在这里插入图片描述

总结

LLM 如何处理模糊函数调用?

LLM 通过使用各种技术来消除函数名称和参数的歧义,从而处理模糊的函数调用。以下是他们采用的一些策略:

  1. 上下文分析:LLM 分析函数调用的上下文以确定预期功能。这包括了解用户的意图、对话历史记录和可用的功能。
  2. 函数定义:LLM 使用提供的函数定义来确定要调用的正确函数。这包括函数名称、描述和参数。如果多个函数具有相同的名称,LLM 可以使用描述和参数来消除歧义。
  3. 参数匹配:LLM 将提供的参数与每个函数所需的参数进行匹配。如果某个函数需要特定参数,并且提供的参数匹配,则 LLM 可以确定要调用的正确函数。
  4. 系统消息:LLM 可以使用系统消息为函数调用提供额外的上下文和约束。这些消息可以指定所需的参数、它们的值以及对函数调用的任何约束。
  5. JSON 模板:LLM 可以使用 JSON 模板来定义函数调用的结构。这包括函数名称、参数及其值。然后,LLM 可以使用此模板来生成正确的函数调用。
  6. 函数重载:LLM 可以通过分析函数名称和参数来确定要调用的正确函数,从而处理函数重载。这涉及检查具有相同名称但不同参数的多个函数。
  7. 命名空间管理:LLM 可以管理命名空间,以避免命名空间冲突并确保正确调用函数。这涉及将函数组织成逻辑组并为每个函数使用唯一的名称。
  8. 错误处理:LLM 可以通过提供错误消息并使用正确的参数重试函数调用来处理函数调用期间发生的错误。

通过采用这些策略,LLM 可以有效地处理模糊函数调用,并确保使用正确的参数调用正确的函数。


  1. 参考来源1 ↩︎

<think>好的,用户想知道如何在大型语言模型LLM)的推理过程中实现函数调用。首先,我需要回忆一下之前看过的相关引用内容。引用[1]提到需要定义可以被LLM调用的函数,包括函数名、描述和参数列表。引用[4]则详细说明了函数调用功能如何提升模型的推理能力,以及如何通过tools参数向模型提供函数定义,模型生成调用参数后由开发者执行。 接下来,我应该整理实现步骤。根据引用中的信息,首先需要定义函数,然后通过API将函数描述传递给模型,模型生成调用参数后,再执行外部函数。引用[3]还提到有两种交互方式:用户直接选择或模型推理判断,这可能需要在步骤中说明。 可能还需要考虑不同框架的特点,比如引用[2]提到的local-llm-function-calling专注于函数调用和输出约束,与其他框架的区别。但用户的问题主要关注实现方法,所以这部分可以作为补充。 需要确保回答结构清晰,分步骤说明,并引用正确的来源。同时,要检查是否符合系统级指令,比如使用正确的LaTeX格式和引用标识。例如,在提到参数列表时,可以用$...$包裹变量名,如$参数名$。 最后,生成相关问题时要围绕函数调用的定义、交互方式、参数验证、应用场景和本地部署等方面,确保问题有针对性,帮助用户深入理解。</think>### 如何在 LLM 中实现推理过程的函数调用 实现大型语言模型LLM)的推理过程中函数调用,需通过以下步骤完成: --- #### **1. 定义函数规范** - **核心要求**:明确函数名称、功能描述、输入参数(含类型和约束)及返回值格式。例如: ```json { "name": "get_weather", "description": "查询指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} } } } ``` 此步骤需确保模型能理解函数语义和调用逻辑[^1][^4]。 --- #### **2. 通过 API 传递函数定义** - **技术实现**:将函数定义通过 API 参数(如 OpenAI 的 `tools`)传递给模型: ```python response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "北京今天气温多少?"}], tools=[{ "type": "function", "function": weather_function_definition # 步骤1定义的函数 }] ) ``` 模型会生成包含调用参数的响应(如 `{"city": "北京"}`)[^4]。 --- #### **3. 解析并执行函数调用** - **开发侧处理**:从模型响应中提取参数并执行实际函数: ```python def get_weather(city): # 调用天气API或查询数据库 return f"{city}天气:晴,25℃" if response.choices[0].message.tool_calls: args = json.loads(response.choices[0].message.tool_calls[0].function.arguments) result = get_weather(args["city"]) ``` 模型不直接执行函数,仅提供参数。 --- #### **4. 反馈结果并迭代** - **交互闭环**:将函数执行结果返回给模型,支持后续推理: ```python messages.append({ "role": "tool", "content": result, "tool_call_id": response.choices[0].message.tool_calls[0].id }) ``` 此过程可循环进行以实现复杂任务。 --- ### **关键技术点** 1. **语义对齐**:函数描述需与模型知识对齐,例如“查询天气”需明确参数为城市名称而非经纬度。 2. **参数验证**:需在调用前校验参数合法性(如城市是否存在),避免模型生成无效参数[^3]。 3. **本地部署优化**:如引用[^2]所述,本地化部署需关注输出约束,可通过微调或提示词工程提升调用准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值