Function call
尽管大语言模型(LLM)具备强大的语言理解和生成能力,但其本质是基于训练数据的静态模型。当需要与现实世界动态交互时(如查询天气、订票、访问数据库等),必须通过调用外部 API 或工具来实现。然而,这种集成存在以下关键问题:
- 知识滞后性(Knowledge Staleness)
- LLM 是在固定时间点上训练完成的,无法感知训练数据之后发生的事件。
- 无法访问私有数据(Privacy & Security)
- 私有数据库、企业内部系统、用户敏感信息等不能直接暴露给通用大模型。
- 将私有数据输入公有云模型可能引发数据泄露风险。
- 解决方案:
- 在本地或私有环境中部署模型 + 工具调用机制
- 使用 Function Call + 内部服务接口 安全地获取私有信息
- 上下文不足导致"幻觉"(Hallucination)
- 当 LLM 缺乏足够上下文或事实依据时,会自行编造看似合理但错误的回答。
- 特别是在涉及精确数据(如航班号、价格、时间)时尤为危险。
- 解决方案:
- 提供清晰上下文
- 引导模型使用 Function Call 明确调用外部工具获取真实数据
✅ 总结:LLM 本身不具备实时性、安全性、准确性保障能力,必须借助外部工具弥补短板。
如何让 LLM 调用外部工具?------核心机制:Function Calling
Function Calling(函数调用)是一种让 LLM 理解何时、如何调用外部函数 的机制,将自然语言请求转化为结构化 API 调用。
核心思想是让 LLM 从"只会说"进化为"能做事"。
比如用户说:
"帮我订明天北京到上海的航班。"
传统聊天机器人只能回答:"我可以帮你查询航班信息。"
而支持 Function Call 的系统可以:
- 识别意图:
book_flight
- 抽取参数:
from=北京
,to=上海
,date=明天
- 调用真实 API 完成操作
Function Call 的工作流程(两步法)
text
[用户输入]
↓
[LLM 判断是否需要调用工具]
↓ 是 → [生成函数调用请求(JSON)] → [执行函数] → [返回结果给 LLM]
↓ 否 → [直接生成回复]
↓
[LLM 综合结果生成自然语言响应]
示例代码逻辑(OpenAI 风格 API)
js
const tools = [
{
type: "function",
function: {
name: "get_flight_info",
description: "查询指定城市和日期的航班信息",
parameters: {
type: "object",
properties: {
from: { type: "string", description: "出发城市" },
to: { type: "string", description: "目的城市" },
date: { type: "string", format: "date", description: "出行日期" }
},
required: ["from", "to", "date"]
}
}
}
];
// 第一次调用:让模型决定是否调用函数
const response = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [{ role: "user", content: "明天从北京去上海有航班吗?" }],
tools: tools,
tool_choice: "auto"
});
// 如果返回了 tool_calls,则执行对应函数
if (response.choices[0].message.tool_calls) {
const toolCall = response.choices[0].message.tool_calls[0];
const args = JSON.parse(toolCall.function.arguments);
const result = await getFlightInfo(args.from, args.to, args.date); // 真实调用
// 第二次调用:把结果交给 LLM 生成最终回复
const finalResponse = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [
{ role: "user", content: "明天从北京去上海有航班吗?" },
{
role: "assistant",
tool_calls: [toolCall]
},
{
role: "tool",
tool_call_id: toolCall.id,
content: JSON.stringify(result)
}
]
});
console.log(finalResponse.choices[0].message.content);
}
Function Call 的关键技术点
组件 | 说明 |
---|---|
tools 数组 |
声明可用的函数及其参数格式(JSON Schema) |
tool_choice |
控制是否自动选择、强制调用某个函数 |
role: tool |
表示这是工具执行后的返回结果,供 LLM 再次理解 |
函数返回值 | 必须是结构化数据,便于 LLM 解析和总结 |
进阶:MCP 与 Workflow(工作流)
随着需求复杂化,单一函数调用已不够用,出现了更高阶的解决方案:
- MCP(Model + Code + Prompt)
- 不再依赖模型"猜"要做什么
- 而是通过预设代码逻辑 + Prompt 指引,形成可靠流程
- 类似于给 LLM "插 USB",即插即用新能力
- Workflow(工作流引擎)
- 将多个节点(Node)串联成自动化流程
- 每个节点可以是:
- LLM 推理
- 函数调用
- 条件判断
- 数据处理
- 典型工具:LangChain, LlamaIndex, Dify, Flowise
✅ 优势:可构建复杂应用(如客服机器人 → 查询订单 → 修改地址 → 发送确认邮件)
Function Call 是"可控幻觉"的典范
→ 模型知道自己不知道,就会主动调用工具,而不是瞎编。
不是所有模型都原生支持 Function Call
→ 开源模型(如 Qwen、Llama)需自行实现类似逻辑(可用 Tool Calling 插件或自定义解析)
工具调用也可能失败
→ 需设计错误处理机制(重试、降级、人工接管)
未来趋势:Agent + Multi-step Planning
→ AI 自主规划多个步骤完成任务,Function Call 是基础组件