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 的工作流程(两步法)
[用户输入] ↓[LLM 判断是否需要调用工具] ↓ 是 → [生成函数调用请求(JSON)] → [执行函数] → [返回结果给 LLM] ↓ 否 → [直接生成回复] ↓[LLM 综合结果生成自然语言响应]
示例代码逻辑(OpenAI 风格 API)
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 推理函数调用条件判断数据处理
✅ 优势:可构建复杂应用(如客服机器人 → 查询订单 → 修改地址 → 发送确认邮件)
Function Call 是“可控幻觉”的典范
→ 模型知道自己不知道,就会主动调用工具,而不是瞎编。
不是所有模型都原生支持 Function Call
→ 开源模型(如 Qwen、Llama)需自行实现类似逻辑(可用 Tool Calling 插件或自定义解析)
工具调用也可能失败
→ 需设计错误处理机制(重试、降级、人工接管)
未来趋势:Agent + Multi-step Planning
→ AI 自主规划多个步骤完成任务,Function Call 是基础组件