今天的博客深度讲一下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)方向迈进
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐