AI应用高级工程师 · 第 06 / 12 章

工具调用、Function Calling与MCP

模型说“应该退款”不会让退款真的发生。工具调用的核心是:模型只能提出结构化调用请求,后端验证后才执行真实函数,再把结果交回模型。

Function CallingTool LoopIdempotencyMCP
上一章
已经能从知识库取回正确政策和引用。
→
本章解决
怎样让模型查询订单、创建工单,并把真实结果安全带回对话。
→
下一章
把多次模型判断和工具执行组织成可恢复的Agent工作流。
学完后的结果:你能设计一套有权限、有确认、有幂等和失败恢复的工具调用循环,并分清Function Calling与MCP。

本章目录

阅读过程中可按 Ctrl + Z 快速返回当前页面的本章目录;也可以点击右下角按钮。

本章思维导图

知识流向:先完成左侧基础,再进入中间机制,最后用右侧工程控制把它变成可上线能力。节点可直接点击跳转。

MODULE 01

模型提出工具请求

按照本模块顺序完成以下知识点,再进入下一模块。

T01工具调用的执行边界

模型API能力 Function Calling也叫Tool Calling。开发者把工具名称、说明和参数Schema随模型请求传入;模型返回“建议调用哪个工具以及参数”,真正的函数由你的后端执行。

后端提供工具说明
→
模型提出调用
→
后端校验并执行
→
结果回灌模型
→
模型回答用户
生活中的例子:像餐厅服务员:模型负责写“建议点这道菜”的单子,真正开火做菜的是厨房,也就是后端工具。

T02工具 Schema 与字段职责

tools = [{
 "name":"get_order",
 "description":"按订单号查询当前登录用户自己的订单",
 "parameters":{
   "type":"object",
   "properties":{"order_id":{"type":"string"}},
   "required":["order_id"]
 }
}]
部分谁写作用
name开发者稳定的机器标识,后端据此路由到函数
description开发者告诉模型何时使用;描述模糊会选错工具
parameters Schema开发者限制参数外形;不保证订单属于当前用户
生活中的例子:工具Schema像标准点菜单:菜名、份数、辣度都有固定栏目,但服务员仍要核对桌号和是否已付款。

T03完整工具调用循环

用户说:“帮我看看A10086退款到哪了。”
后端把用户问题和get_order工具定义发给模型。
模型返回tool_call:get_order({order_id:"A10086"}),此时尚未查询。
后端从登录会话取得user_id,校验订单格式和权限,再查订单服务。
后端把工具结果与call_id一起交回模型。
模型基于真实状态生成:“退款已审核,预计三个工作日内到账。”

call_id:用于把某次工具结果对应回某次工具请求,不能在并行调用时混淆。

生活中的例子:像取快递:报取件码、工作人员核验身份、仓库取件、把结果交给顾客,缺一步都不算完成。
MODULE 02

程序控制执行风险

按照本模块顺序完成以下知识点,再进入下一模块。

T04参数、业务与权限三层校验

工具参数即使符合JSON Schema,也是不可信输入。订单号可能不存在,金额可能超限,用户可能试图查询别人的订单。

1. Schema校验:order_id必须是字符串
2. 格式校验:符合公司订单号规则
3. 身份绑定:user_id只取登录会话,不取模型参数
4. 资源归属:订单必须属于该user_id
5. 状态规则:只有paid状态可申请退款
6. 风险控制:金额过大转人工审批
生活中的例子:像银行柜台不仅检查表格有没有填,还要核对身份证、账户归属、余额和交易规则。

T05读工具和写工具必须区别对待

读工具

查询订单、查库存、算运费。通常可自动执行,但仍需权限、超时和脱敏。

写工具

退款、发邮件、删数据、改权限。会改变现实状态,默认要求确认、幂等键、审计和更严格授权。

默认策略:低风险只读工具可自动;高风险写工具先展示将要执行的对象和影响,让用户或人工明确确认后再执行。

生活中的例子:查余额像问柜员“我还有多少钱”;转账像真的动钱,后者必须有更严格确认。

T06幂等:重试不能退款两次

业务执行性质 幂等表示同一个业务请求执行一次或重复执行多次,最终效果相同。后端为写操作生成idempotency_key,并在业务数据库保存执行结果。

idempotency_key = "refund:A10086:request-7821"

第一次调用:创建退款R9001并保存结果
网络超时后重试:发现该key已成功,直接返回R9001
不会再创建第二笔退款

幂等不是让模型记住“我调用过了”,而是由权威业务系统用唯一键保证。

生活中的例子:网购付款后页面卡住,再点一次不能扣两次;同一订单号让系统识别这是重复请求。

T07超时、重试与部分成功处理

情况程序做法不能做
查询超时有限重试,仍失败则说明暂时无法查询让模型猜订单状态
写入返回超时先用幂等键查询是否已成功,再决定重试直接再次退款
多工具部分成功记录每步状态,必要时补偿或人工处理把整个流程笼统标成失败后全部重跑
工具返回恶意文本视为外部不可信数据,限制其指令效力把工具文字当System规则
生活中的例子:像快递显示超时:先查包裹是否已经送达,再决定是否重新派送,不能直接再寄一件。

T08并行调用和串行调用

两个互不依赖的只读查询可以并行,例如同时查订单和物流;“先查订单再退款”必须串行,因为第二步依赖第一步状态。并行能降延迟,但要为每个call_id独立记录结果、超时和错误。

可并行:get_order(A10086) + get_logistics(A10086)
必须串行:get_order → check_refund_rule → confirm → create_refund
生活中的例子:查天气和查日历可以同时做;先确认订单存在再退款必须按顺序做。
MODULE 03

标准化接入能力

按照本模块顺序完成以下知识点,再进入下一模块。

T09MCP 与 Function Calling 的关系

开放通信协议 MCP是Model Context Protocol,中文可理解为“模型上下文协议”。它不是模型,也不是数据库;它规定AI应用怎样发现并调用外部服务器提供的工具、资源和提示模板。

Host

承载AI体验的应用,负责权限、用户同意和上下文汇总。

Client

Host里连接某个MCP Server的协议客户端。

Server

暴露特定工具或资源的服务,例如CRM服务器。

Tools / Resources / Prompts

可执行能力、可读取内容、可复用提示模板。

关系:Function Calling是模型API表达“我要调用函数”的机制;MCP是应用与外部能力提供方之间的标准连接方式。Host可把MCP工具转换成模型可见的工具定义。

生活中的例子:MCP像USB标准:设备能力不同,但用统一插口和协议让应用发现并使用。

T10本章可靠架构

最小权限工具目录
→
模型提议
→
Schema+身份+业务校验
→
确认+幂等执行
→
真实结果+审计

模型负责选择和填写,程序负责授权和执行,业务系统负责事实和幂等。

生活中的例子:像机场安检:旅客提出目的地,系统逐层检查身份、行李、登机口和记录。

本章总结:从哪里来,解决什么,为什么继续

上一章留下的问题怎样安全调用一次真实工具
本章形成的能力模型只提出工具调用;后端校验、确认、幂等执行,再把真实结果交回模型。
下一章必须继续解决多个工具与步骤怎样组成可恢复任务

本章参考的权威资料

课程讲的是跨厂商通用工程方法;具体参数会更新,真正开发时再以所选厂商最新官方文档为准。

← 上一章检索、混合搜索、Rerank与召回评测下一章 →Agent工作流与可靠执行
↑ 返回本章目录Ctrl+Z