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 助手系统
系统注册了多个函数:
search_flight(origin, destination, date)
book_hotel(city, checkin_date)
get_weather(city, date)
用户问题:
“我要去北京出差,帮我查一下航班、酒店,并告诉我那几天天气。”
模型行为流程:
判断需要调用多个函数:
航班查询 →
search_flight
酒店预定 →
book_hotel
天气信息 →
get_weather
按顺序生成多个调用请求(串联调用):
[{"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"}}
]
外部依次调用 API,获取数据
模型组合调用结果生成最终回复:
“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)方向迈进 |