一、面试题目
请你解释一下什么是 Function Calling(函数调用)?它和我们手动解析 LLM 输出的 JSON 有什么区别?
二、知识储备
1. Function Calling 核心定义
Function Calling(函数调用) 是大模型(如 GPT、文心一言、通义千问)原生支持的结构化输出能力 。开发者提前把函数名、参数、功能描述 告诉 LLM,当用户提问需要调用工具 / 接口时,LLM 不会直接回答 ,而是严格按照约定格式返回可执行的函数 + 参数,由程序自动调用并返回结果给 LLM 做最终回答。
核心作用:让 LLM 安全、精准、标准化地调用外部工具(查询天气、查数据库、计算、发请求)。
2. 手动解析 LLM 输出(原生 Prompt 解析)
通过写 Prompt 让 LLM 返回固定格式(如 JSON),然后程序用 json.parse 解析,再调用函数。
3. 核心区别(面试必背)
① 输出稳定性
- Function Calling :模型原生保证格式正确,几乎不会出错、不会乱码、不会漏字段。
- 手动解析:格式不可控,偶尔缺逗号、少引号、结构错乱,直接导致程序崩溃。
② 意图识别能力
- Function Calling :模型精准判断什么时候该调用、调用哪一个,支持多函数自动路由。
- 手动解析:靠 Prompt 硬约束,容易误判、漏判、多判。
③ 参数填充
- Function Calling:自动补全必填参数、自动校验类型(int/str)、自动追问缺失信息。
- 手动解析:容易参数缺失、类型错误、格式不匹配。
④ 安全性
- Function Calling :输出严格隔离,不会注入、不会执行恶意内容。
- 手动解析:存在注入风险、格式污染风险。
⑤ 多工具支持
- Function Calling:同时注册几十个工具,模型自动选择最优。
- 手动解析:工具越多越容易混乱。
4. 适用场景
Function Calling 适用
- AI Agent
- 工具调用(查天气、查订单、发邮件、查数据库)
- 插件系统
- 需要高稳定性、高可靠性的生产环境
手动解析适用
- 简单结构化输出
- 不支持 Function Calling 的小模型
- 临时、非核心、简单业务
三、破局之道
在面试中,用这段话展现你对 LLM 工具调用的深度理解:
Function Calling 本质是大模型原生提供的标准化、高稳定、强意图的工具调用能力。
它和手动解析最大的区别:手动解析是 "猜格式",Function Calling 是 "保格式"。
Function Calling 解决了生产环境最痛的三个问题:输出不稳定、意图判断不准、参数不可靠。
工程落地中,只要模型支持,必须优先使用 Function Calling,手动解析只适合简单非核心场景。真正的生产级 Agent、插件系统、工具调用,一定是基于 Function Calling 构建的。
四、代码实现
1. Python 版本
python
# ==========================================
# 1. 官方 Function Calling(稳定、安全、生产级)
# ==========================================
def function_calling_demo(user_query):
# 注册工具
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string",
"date": {"type": "string"}
},
"required": ["city"]
}
}
}
]
# LLM 原生返回函数+参数
response = llm.chat(
messages=[{"role": "user", "content": user_query}],
tools=tools
)
# 模型保证格式正确,直接调用
func = response.function
args = response.arguments
result = get_weather(args["city"])
return result
# ==========================================
# 2. 手动解析输出(不稳定、易报错、测试用)
# ==========================================
def manual_parse_demo(user_query):
# 让模型返回 JSON
prompt = f"""
用户问题:{user_query}
如果需要查天气,返回JSON:
{{"func":"get_weather","params":{{"city":"xxx"}}}}
"""
# 模型返回字符串
raw = llm(prompt)
# 手动解析 → 极易报错
try:
data = json.loads(raw)
return get_weather(data["params"]["city"])
except:
return "解析失败"
2. JavaScript 版本
javascript
// ==========================================
// 1. Function Calling(推荐)
// ==========================================
async function functionCalling(userQuery) {
const tools = [{
name: "getWeather",
params: { city: "string" }
}];
const res = await llm.invoke(userQuery, tools);
const { functionName, args } = res;
return getWeather(args.city);
}
// ==========================================
// 2. 手动解析(不推荐生产)
// ==========================================
async function manualParse(userQuery) {
const prompt = `返回JSON格式:{func,params}`;
const raw = await llm(prompt + userQuery);
try {
const data = JSON.parse(raw);
return getWeather(data.params.city);
} catch (e) {
return "解析错误";
}
}