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 是基础组件

相关推荐
空白到白5 分钟前
机器学习-聚类
人工智能·算法·机器学习·聚类
中新赛克22 分钟前
双引擎驱动!中新赛克AI安全方案入选网安创新大赛优胜榜单
人工智能·安全
飞哥数智坊25 分钟前
解决AI幻觉,只能死磕模型?OpenAI给出不一样的思路
人工智能·openai
聚客AI29 分钟前
🌈多感官AI革命:解密多模态对齐与融合的底层逻辑
人工智能·llm·掘金·日新计划
Zz_waiting.35 分钟前
Javaweb - 14.6 - Vue3 数据交互 Axios
开发语言·前端·javascript·vue·axios
切糕师学AI1 小时前
前后端分离架构中,Node.js的底层实现原理与线程池饥饿问题解析
前端·vue.js·node.js
zzywxc7871 小时前
AI在金融、医疗、教育、制造业等领域的落地案例
人工智能·机器学习·金融·prompt·流程图
zstar-_1 小时前
【论文阅读】REFRAG:一个提升RAG解码效率的新思路
人工智能
妄小闲1 小时前
网页设计模板 HTML源码网站模板下载
前端·html
慧一居士1 小时前
SpringBoot改造MCP服务器(StreamableHTTP)
人工智能