1760 字
约 5 分钟
5
什么是 Function Calling?Agent 如何调用工具,又怎样避免“

什么是 Function Calling?Agent 如何调用工具,又怎样避免“乱调用”?

大模型本身最擅长的是理解和生成语言,但它不能天然查询数据库、读取订单、发送邮件或运行代码。

Function Calling(函数调用)就是给模型提供一种标准接口,让它知道:

当需要外部能力时,不要自己编结果,而是输出“应该调用哪个工具、传什么参数”。

它是 Agent 能“做事”的关键能力之一。

一、Function Calling 不等于模型真的执行了函数

假设用户问:

帮我查一下订单 20260912 的物流状态。

系统可能给模型提供一个工具:

{
  "name": "get_order_logistics",
  "description": "查询订单物流状态",
  "parameters": {
    "type": "object",
    "properties": {
      "order_id": {
        "type": "string",
        "description": "订单编号"
      }
    },
    "required": ["order_id"]
  }
}

模型不会直接去查物流,而是输出结构化请求:

{
  "name": "get_order_logistics",
  "arguments": {
    "order_id": "20260912"
  }
}

真正执行调用的是应用程序或 Agent 框架。它调用订单系统 API,把结果返回给模型;模型再把结果整理成用户能看懂的回答。

所以:

模型负责决定“要不要调用、调用什么”;系统负责决定“允不允许调用、如何安全执行”。

二、Function Calling 在 Agent 中如何工作?

一个典型 Agent 的执行流程如下:

用户提出任务
→ 模型判断需要哪些信息或工具
→ 模型发起 Function Call
→ 系统校验参数、权限和风险
→ 系统执行工具/API
→ 工具结果返回模型
→ 模型判断任务是否完成
→ 继续调用工具或生成最终答案

例如用户说:

分析本月销售下降原因,并生成报告。

Agent 可能依次调用:

1. 查询本月销售数据
2. 查询上月销售数据
3. 查询库存与缺货记录
4. 查询促销活动与客户反馈
5. 进行数据分析
6. 生成报告文件

这就是 Agent 和普通聊天机器人的差别:普通模型只会回答“应该怎么做”,Agent 可以在授权范围内真正推进任务。

三、Function Calling 最容易出现什么问题?

Function Calling 的风险通常不在“函数能不能被调用”,而在“模型是否在正确时间,用正确参数,调用正确工具”。

常见问题包括:

  • 用户只想查询,模型却调用了修改或删除接口;
  • 参数缺失、格式错误,导致调用失败;
  • 模型把猜测的订单号、用户 ID 当作真实值;
  • 连续重复调用同一个工具;
  • 工具返回异常,模型却假装已经成功;
  • 外部文档中的恶意文字诱导模型调用危险工具;
  • 用户权限不足,却通过 Agent 间接访问了敏感数据。

因此,不能把工具权限完全交给模型。

四、如何确保调用正确?

1. 工具定义要清晰且“窄”

不要给模型一个万能工具:

database_query(sql)

而应提供更明确的业务工具:

get_order_logistics(order_id)
get_customer_profile(customer_id)
create_refund_request(order_id, amount, reason)

工具越具体,模型越不容易误用,也越容易做权限控制和审计。

2. 用严格的参数 Schema 校验

工具参数应定义类型、必填项、枚举值和格式。例如:

{
  "amount": {
    "type": "number",
    "minimum": 0,
    "maximum": 10000
  }
}

系统收到模型请求后,必须先验证:

  • 参数是否齐全;
  • 类型是否正确;
  • 格式是否合理;
  • 数值是否越界;
  • 目标资源是否存在。

校验失败时,不执行工具,而是把错误返回模型,让它补充信息或向用户确认。

3. 模型不能猜关键参数

对于订单号、收款账户、员工编号、合同编号等关键信息,Agent 不应“猜一个差不多的”。

正确策略是:

信息明确 → 调用工具
信息不明确 → 追问用户
存在多个候选 → 列出候选让用户确认

例如用户说“帮我给张总发报告”,但系统中有多个“张总”,Agent 必须要求确认收件人,而不是自行选择。

4. 高风险操作必须二次确认

可以把工具分为不同风险等级:

风险等级 示例 策略
低风险 查询资料、读取状态 自动执行
中风险 创建草稿、生成报表 记录日志后执行
高风险 发邮件、退款、删除数据 用户确认后执行
极高风险 转账、修改权限、发布生产环境 人工审批

例如,Agent 可以先生成退款方案,但在真正调用退款接口前,应明确询问:

将为订单 20260912 发起 299 元退款,是否确认?

五、工具返回结果也不能盲信

工具调用成功,不代表任务真的成功。

例如,发邮件接口返回“已提交”,不代表对方已经收到;数据分析接口返回空结果,也可能是筛选条件错误。

因此,Agent 应检查:

  • 返回状态是否成功;
  • 返回数据是否为空或异常;
  • 结果是否符合预期;
  • 是否需要重试、换工具或向用户说明限制。

同时,工具返回的文本也应被视为“数据”,不能让其中的内容改变系统规则或诱导后续危险调用。

六、上线前如何验证 Agent 会不会乱调用?

需要建立专门的测试集,而不只是测“回答写得好不好”。

至少覆盖:

  • 正常查询;
  • 参数缺失;
  • 模糊指令;
  • 重复调用;
  • 权限不足;
  • 工具超时或报错;
  • 恶意提示词注入;
  • 高风险操作;
  • 用户中途取消;
  • 多工具串联任务。

评估指标可以包括:

工具选择正确率
参数正确率
无效调用率
越权调用率
高风险操作确认率
调用成功率
任务最终完成率

结语

Function Calling 让模型从“会说”变成“能连接外部系统”。但它不是让模型拥有无限权限,而是让模型在严格规则下提出行动建议。

一个可靠的 Agent 应当做到:

模型负责思考和决策;系统负责校验、授权、执行和审计;高风险动作始终保留人为控制。

什么是 Function Calling?Agent 如何调用工具,又怎样避免“
http://clxhxhhr.top/posts/588/
作者
clxstart
发布于
2026-09-12
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。