Function call

Function call

尽管大语言模型(LLM)具备强大的语言理解和生成能力,但其本质是基于训练数据的静态模型。当需要与现实世界动态交互时(如查询天气、订票、访问数据库等),必须通过调用外部 API 或工具来实现。然而,这种集成存在以下关键问题:

  1. 知识滞后性(Knowledge Staleness)
  • LLM 是在固定时间点上训练完成的,无法感知训练数据之后发生的事件。
  1. 无法访问私有数据(Privacy & Security)
  • 私有数据库、企业内部系统、用户敏感信息等不能直接暴露给通用大模型。
  • 将私有数据输入公有云模型可能引发数据泄露风险。
  • 解决方案:
    • 在本地或私有环境中部署模型 + 工具调用机制
    • 使用 Function Call + 内部服务接口 安全地获取私有信息
  1. 上下文不足导致"幻觉"(Hallucination)
  • 当 LLM 缺乏足够上下文或事实依据时,会自行编造看似合理但错误的回答。
  • 特别是在涉及精确数据(如航班号、价格、时间)时尤为危险。
  • 解决方案:
    • 提供清晰上下文
    • 引导模型使用 Function Call 明确调用外部工具获取真实数据

✅ 总结:LLM 本身不具备实时性、安全性、准确性保障能力,必须借助外部工具弥补短板。

如何让 LLM 调用外部工具?------核心机制:Function Calling

Function Calling(函数调用)是一种让 LLM 理解何时、如何调用外部函数 的机制,将自然语言请求转化为结构化 API 调用。

核心思想是让 LLM 从"只会说"进化为"能做事"。

比如用户说:

"帮我订明天北京到上海的航班。"

传统聊天机器人只能回答:"我可以帮你查询航班信息。"

而支持 Function Call 的系统可以:

  1. 识别意图:book_flight
  2. 抽取参数:from=北京, to=上海, date=明天
  3. 调用真实 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(工作流)

随着需求复杂化,单一函数调用已不够用,出现了更高阶的解决方案:

  1. MCP(Model + Code + Prompt)
  • 不再依赖模型"猜"要做什么
  • 而是通过预设代码逻辑 + Prompt 指引,形成可靠流程
  • 类似于给 LLM "插 USB",即插即用新能力
  1. Workflow(工作流引擎)
  • 将多个节点(Node)串联成自动化流程
  • 每个节点可以是:
    • LLM 推理
    • 函数调用
    • 条件判断
    • 数据处理
  • 典型工具:LangChain, LlamaIndex, Dify, Flowise

✅ 优势:可构建复杂应用(如客服机器人 → 查询订单 → 修改地址 → 发送确认邮件)

Function Call 是"可控幻觉"的典范

→ 模型知道自己不知道,就会主动调用工具,而不是瞎编。

不是所有模型都原生支持 Function Call

→ 开源模型(如 Qwen、Llama)需自行实现类似逻辑(可用 Tool Calling 插件或自定义解析)

工具调用也可能失败

→ 需设计错误处理机制(重试、降级、人工接管)

未来趋势:Agent + Multi-step Planning

→ AI 自主规划多个步骤完成任务,Function Call 是基础组件

相关推荐
什么都想学的阿超14 分钟前
【大语言模型 00】导读
人工智能·语言模型·自然语言处理
lxmyzzs16 分钟前
【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)
人工智能·深度学习·opencv·算法·yolo·计算机视觉·实例分割
明心知21 分钟前
DAY 45 Tensorboard使用介绍
人工智能·深度学习
界面开发小八哥30 分钟前
DevExtreme Angular UI控件更新:引入全新严格类型配置组件
前端·ui·界面控件·angular.js·devexpress
bitbitDown38 分钟前
重构缓存时踩的坑:注释了三行没用的代码却导致白屏
前端·javascript·vue.js
xiaopengbc42 分钟前
火狐(Mozilla Firefox)浏览器离线安装包下载
前端·javascript·firefox
维维180-3121-14551 小时前
AI大模型+Meta分析:助力发表高水平SCI论文
人工智能·meta分析·医学·地学
程序员陆通1 小时前
CloudBase AI ToolKit + VSCode Copilot:打造高效智能云端开发新体验
人工智能·vscode·copilot
程高兴1 小时前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
拾零吖1 小时前
吴恩达 Machine Learning(Class 1)
人工智能·机器学习