LLM中Function Call的原理及应用

今天的博客深度讲一下Function Call。下面的内容是从 五个方面大语言模型(LLM)中的 Function Call(函数调用)机制 进行系统性、深入性的分析:


一、什么是 Function Call?

1. 定义

Function Call 是指大语言模型(如 GPT)通过自然语言理解任务需求后,生成结构化的函数调用请求,再由 外部系统实际执行函数或 API 调用,并将结果返回模型继续处理。

Function Call 的本质是:

模型主动生成函数调用的格式与参数,由外部系统执行函数逻辑,从而实现与真实世界的交互。

2. 功能目的

Function Call 解决的问题是:

  • LLM 本身无法联网、查数据库、执行逻辑

  • 需要把语言理解能力和外部操作结合起来

  • 赋予模型实际操作能力(如查天气、发邮件、查数据库)

3. 示例场景

用户输入:

“明天北京天气怎样?”

传统 LLM 会尝试“编”一个回答;使用 Function Call 后,模型会输出一个结构化的函数调用描述,例如:

{
  "name": "get_weather",
  "arguments": {
    "city": "北京",
    "date": "2025-08-03"
  }
}

然后外部系统调用真实的天气 API 获取数据,并把结果交给模型继续回答。


二、Function Call 的工作原理

Function Call 的执行过程由三大参与者构成:

  • 语言模型(LLM):负责识别调用意图,构造函数调用请求

  • 调用执行器(Tool/Agent Layer):负责接收模型输出、执行函数/接口

  • 用户/应用层:提供问题或任务

工作流程

1. 用户输入自然语言指令
2. 模型识别调用意图
3. 模型生成结构化调用格式(函数名 + 参数)
4. 外部系统接收到调用描述,执行真实函数
5. 将结果(JSON 等)返回给模型
6. 模型继续生成最终输出

技术要点

  • 结构化格式一般为 JSON,符合函数 schema

  • 函数 schema 通常由开发者提供,类似 OpenAPI 定义

  • 参数提取是语言推理的过程,模型必须正确从上下文中“抓出”需要的字段

  • 可以与 Tool调用Agent系统RAG系统 等协同使用


三、Function Call 的单一函数应用

场景举例:天气查询

函数定义(schema)如下:

{
  "name": "get_weather",
  "description": "获取指定城市的天气",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {"type": "string"},
      "date": {"type": "string"}
    },
    "required": ["city"]
  }
}

用户问题:

“帮我查一下深圳今天的天气。”

模型输出:

{
  "name": "get_weather",
  "arguments": {
    "city": "深圳",
    "date": "2025-08-02"
  }
}

外部系统执行:

get_weather(city="深圳", date="2025-08-02") → 返回天气信息

模型继续生成回答:

“深圳今天多云,最高气温32℃,最低气温27℃。”

核心能力

  • 参数理解与提取(city/date)

  • 函数名称推理(基于语义匹配)

  • 响应生成时融合调用结果

技术挑战

  • 日期表达多样(今天、明天、后天)

  • 城市可能有歧义(“广州” vs “广州市”)


四、Function Call 的多个函数应用(多函数选择与组合)

场景举例:AI 助手系统

系统注册了多个函数:

  1. search_flight(origin, destination, date)

  2. book_hotel(city, checkin_date)

  3. get_weather(city, date)

用户问题:

“我要去北京出差,帮我查一下航班、酒店,并告诉我那几天天气。”

模型行为流程:

  1. 判断需要调用多个函数:

    • 航班查询 → search_flight

    • 酒店预定 → book_hotel

    • 天气信息 → get_weather

  2. 按顺序生成多个调用请求(串联调用):

[
  {
    "name": "search_flight",
    "arguments": {
      "origin": "上海",
      "destination": "北京",
      "date": "2025-08-04"
    }
  },
  {
    "name": "book_hotel",
    "arguments": {
      "city": "北京",
      "checkin_date": "2025-08-04"
    }
  },
  {
    "name": "get_weather",
    "arguments": {
      "city": "北京",
      "date": "2025-08-04"
    }
  }
]
  1. 外部依次调用 API,获取数据

  2. 模型组合调用结果生成最终回复:

“2025年8月4日从上海到北京的航班有3个。已为您预订北京酒店。预计天气晴转多云,最高31℃。”

多函数调用核心能力

  • 多个调用意图识别

  • 多函数参数分拆

  • 跨函数结果整合与推理


五、Function Call 实现数据库查询

应用背景:结构化数据问答

用户提问:

“我想知道今年上半年营收超过 10 亿的公司有哪些?”

1. 函数注册:生成 SQL 的函数

{
  "name": "generate_sql",
  "description": "将自然语言转换为 SQL 查询",
  "parameters": {
    "type": "object",
    "properties": {
      "question": {"type": "string"}
    },
    "required": ["question"]
  }
}

2. 模型调用 generate_sql:

{
  "name": "generate_sql",
  "arguments": {
    "question": "今年上半年营收超过 10 亿的公司有哪些?"
  }
}

→ 外部系统返回 SQL:

SELECT company_name FROM company_financials
WHERE revenue > 1000000000 AND period = '2025-H1';

3. 外部数据库执行 SQL → 返回结果:

["腾讯", "阿里巴巴", "华为"]

4. 模型生成回答:

“今年上半年营收超过 10 亿的公司包括:腾讯、阿里巴巴、华为。”

优势

  • 可以让模型访问结构化数据而不是全文检索

  • 精准、可控、可验证

  • 减少幻觉(hallucination)

难点

  • SQL 的生成需要模型有数据库 schema 知识

  • 多表联合、聚合、过滤等复杂查询需要 fine-tune 或 schema-aware 模型支持


总结

维度描述
本质机制模型生成结构化函数调用请求,外部系统执行,返回结果供模型生成最终输出
单函数应用简单任务,如查天气、查时间等,需正确提取参数并选择函数
多函数组合支持任务分解、逻辑链式调用,需具备意图识别和结果整合能力
数据库 Function Call利用自然语言 → SQL 生成 → 数据查询 → LLM 整合结果,实现高质量问答
关键价值让语言模型具备真实世界交互能力,向智能体(Agent)方向迈进
<think>好的,我现在需要解释LLM中的function call的作用,并用Python举几个例子,同时解释代码。首先,我得先理解什么是function callLLM中的角色。 Function call应该是指大语言模型能够调用外部函数或工具的能力。这样的话,模型在处理用户请求时,如果发现需要执行某些特定操作,比如获取实时数据、进行计算或者访问外部API,就可以通过调用预设的函数来实现。这样做的好处是增强模型的功能,让它不仅能生成文本,还能执行实际的操作,提升应用的实用性。 接下来,我需要确定如何用Python来展示这个功能。可能需要用到像OpenAI的API,或者其他支持function calling的库。假设用户指的是类似OpenAI的function calling功能,那例子应该围绕如何定义函数,让模型决定何时调用这些函数,并处理返回结果。 第一个例子可能是一个简单的天气查询。定义个get_weather函数,然后让模型在用户询问天气时调用它。需要展示如何解析用户的问题,触发函数调用,并整合结果。 第二个例子可以是数学计算,比如调用计算器函数。用户问数学问题,模型生成表达式,调用计算函数,返回结果。这样可以展示处理结构化数据的过程。 第三个例子可能更复杂,比如多步骤操作,比如先获取天气,再根据天气推荐活动。这时候需要处理多个函数调用,或者链式调用,展示模型如何协调不同的函数完成任务。 在写代码的时候,需要注意模拟大模型的行为,因为实际中可能需要模型生成调用函数的请求。这里可能需要用模拟的响应来展示流程,比如用户的问题,模型返回需要调用的函数和参数,然后执行函数并生成最终回答。 另外,要解释代码每一步的作用,比如定义函数的结构,处理函数调用的逻辑,如何将结果返回给用户。确保代码示例简洁,同时覆盖不同的使用场景。 可能还需要考虑错误处理,比如当函数调用参数不正确时如何处理,但为了简化例子,可能暂时忽略这部分,专注于核心流程。 最后,总结function call的作用,强调其扩展模型能力、连接外部工具的重要性,以及在实际应用中的价值,比如构建智能助手、自动化工作流等。 现在需要把这些思路整理成结构化的回答,分点解释function call的作用,然后给出三个Python示例,每个示例包含代码和解释。确保代码符合语法,使用正确的格式,比如函数定义、模拟的模型响应,以及处理过程的注释。</think>以下分三部分解释LLMfunction call功能及Python示例: --- ### 一、LLMfunction call的作用 1. **扩展模型能力** 使LLM能调用外部工具(如数据库/API/计算器),突破纯文本生成的限制 2. **结构化输出** 强制模型返回结构化的参数数据,方便程序后续处理 3. **任务自动化** 实现多步骤操作(如:查天气→推荐穿搭→预约网约车) 4. **精确计算** 避免大模型在数学计算等场景中出现幻觉错误 --- ### 二、Python示例代码 #### 示例1:天气查询工具 ```python import json # 定义可调用函数 def get_weather(location: str, date: str) -> str: """获取指定地点和日期的天气信息""" # 模拟API调用 return f"{location}在{date}的天气:晴,25℃" # 模拟LLM的输出(实际开发中通过API获取) model_response = { "function_call": { "name": "get_weather", "arguments": json.dumps({"location": "北京", "date": "2023-10-01"}) } } # 解析并执行函数调用 func_name = model_response["function_call"]["name"] args = json.loads(model_response["function_call"]["arguments"]) result = globals()[func_name](**args) # 动态调用函数 print(result) # 输出:北京在2023-10-01的天气:晴,25℃ ``` #### 示例2:数学计算器 ```python from math import sqrt def calculator(expression: str) -> float: """执行数学计算""" return eval(expression) # 模拟用户问题:"请计算125的平方根" model_response = { "function_call": { "name": "calculator", "arguments": json.dumps({"expression": "sqrt(125)"}) } } # 执行计算 args = json.loads(model_response["function_call"]["arguments"]) result = calculator(**args) print(f"计算结果:{result:.2f}") # 输出:计算结果:11.18 ``` #### 示例3:多函数协作(航班+酒店查询) ```python def search_flights(departure: str, arrival: str, date: str) -> str: """查询航班信息""" return f"找到3个航班:{departure}→{arrival} ({date})" def book_hotel(city: str, dates: str) -> str: """预订酒店""" return f"已预订{city}的酒店({dates})" # 用户请求:"帮我安排10月1日上海到纽约的行程" model_response = { "function_calls": [ { "name": "search_flights", "arguments": {"departure": "上海", "arrival": "纽约", "date": "2023-10-01"} }, { "name": "book_hotel", "arguments": {"city": "纽约", "dates": "2023-10-01至2023-10-07"} } ] } # 顺序执行多个函数调用 for call in model_response["function_calls"]: func = globals()[call["name"]] result = func(**call["arguments"]) print(result) ``` --- ### 三、关键执行流程 1. **函数注册**:预先定义工具函数及其参数格式 2. **意图识别**:LLM分析用户query,判断是否需要调用函数 3. **参数生成**:模型结构化输出函数名称和参数 4. **安全执行**:程序验证参数有效性后执行调用 5. **结果整合**:将执行结果返回给LLM生成最终回复 > 💡 实际开发建议:使用LangChain等框架实现自动化流程管理,并通过Type Validation确保参数安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值