01先说它解决什么THE PROBLEM
模型的输入是文字,输出也是文字。它可以把"帮我查一下订单状态"回答得头头是道,但它本身查不了任何东西——没有数据库连接,没有网络请求,没有文件系统。让文字变成动作,需要一套机制把模型的"想做什么"翻译成程序的"真的去做"。
这套机制就是工具调用(tool calling / function calling)。F-001 讲过一个关键措辞:模型只能"请求"执行,真正执行的是外层程序。这一页把这个措辞背后的机制拆开——因为几乎所有关于 Agent 权限的判断,根子都在这套机制里。
02函数调用的四步握手THE HANDSHAKE
图 F-006 · 四步握手:模型说,外层做(示意)
第一步,递工具清单。程序在请求里附上一份清单:每个工具的名字、参数、一句话说明(比如 query_order(order_id):按订单号查状态)。清单是用自然语言和结构定义写的——模型靠读说明来理解工具能干什么。
第二步,模型填表。模型判断"这个问题需要查订单",于是不输出普通回答,而是输出一个结构化的调用请求:工具名 + 参数值。注意:这只是一段格式规整的文字,模型到此为止什么都没有发生。
第三步,程序执行。外层程序读到这个请求,校验参数,真正去调数据库或 API,拿到结果。执行、鉴权、超时、重试,全部发生在这一步——发生在你的代码里,不在模型里。
第四步,结果回填。程序把执行结果塞回对话,模型看着结果继续说话或再次填表。循环由此转起来。
看清这四步,就看清了一件事:模型从头到尾只是在填表。它的"能力"是清单给的,它的"动作"是程序做的。所以工具出问题,先查清单写得清不清楚、程序校验严不严——而不是先怪模型。
03MCP:工具的统一插座THE SOCKET
四步握手解决了单个应用接工具的问题,但留下一个工程麻烦:每个应用都要自己写一遍"接数据库、接日历、接搜索",同一个工具在十个应用里被重复实现十次。
MCP(Model Context Protocol,模型上下文协议)就是为这个麻烦生的:一个开放协议,把"工具提供方"和"工具使用方"解耦。工具做成 MCP 服务器,声明自己提供哪些工具和资源;任何支持 MCP 的 Agent 应用做客户端,即插即用。类比很直白:以前每个电器自带发电机,现在墙上有了统一插座。它由模型厂商 Anthropic 在 2024 年底开源,此后被多家工具和应用跟进——这属于公开可查的行业事实。
对学习者的意义:接口标准化后,"会接工具"的门槛在降低,值钱的部分继续上移——移到工具本身的质量,和下一节要讲的边界设计上。
04三层缰绳THREE REINS
装手容易,缰绳难。F-001 说过“工具清单即权力边界”,落到工程上是三层:
第一层,给什么工具。白名单思维:这个任务需要什么就给什么,而不是把全家桶都接上。每加一个工具,等于扩一次权力边界、多一分误用面。
第二层,每个工具能到哪。作用域限制:读文件的工具限制在哪个目录,查数据库的工具限制在哪些表,发请求的工具限制在哪些域名。工具内部的边界检查,比指望模型"自觉"可靠得多。
第三层,什么动作要过人。可撤回的动作(查询、草稿、标注)放行;不可逆的动作(发送、删除、支付)在执行前弹给人确认。这层缰绳不在模型里也不在工具里,在流程设计里。
MCP 时代多了一个新课题:第三方 MCP 服务器是一种供应链。接入一个别人写的服务器,相当于给你的 Agent 装一个浏览器扩展——它声明的工具、它返回的内容,都值得用装扩展的警惕来审视。工具返回的结果同样是模型的输入,里面藏一句"忽略之前的指令",没有防备的系统就可能照做——这类风险有个名字叫提示注入,防它的思路不是让模型更听话,而是让边界更硬:来源标注、内容过滤、高危动作过人。
05常见误区PITFALLS
把"接了 MCP"当成能力本身。插座是标准件,插什么电器、电器质量如何才是差异所在。评估一个 Agent 产品,别停在"支持 MCP"这行字,往下问:接了哪些工具?边界怎么设?
工具越多越好。恰恰相反:清单越长,模型选错工具的概率越大,权限面越宽,出事后越难排查。成熟的做法是按任务配工具,像配钥匙串,不像配万能钥匙。
把工具结果当可信输入。工具返回的网页内容、文件文本、检索结果,都可能携带影响模型行为的内容。对外部内容保持"引用而不轻信",和 F-002 里"资料里没有就说没有"是同一种纪律。
06连回判断TO THE NOTES
工具清单即权力边界的完整展开,见 N-006 边界不清为什么失败;不可逆动作前为什么必须有人,见 N-001 邮件边界;想在代码里亲手摸一遍"注册表 + 边界检查"长什么样,P-006 Minimal Agent Loop 的工具层只有几十行,专为看懂而写。
07自测清单SELF CHECK
- 能说出四步握手,并指出"执行"发生在哪一步、谁的代码里吗?
- 能用一句话解释 MCP 解决了什么工程麻烦吗?
- 三层缰绳分别管什么?哪一层不在代码里、在流程里?
- 接入一个第三方 MCP 服务器前,你会检查什么?
- 为什么工具返回的内容也要当成需要防备的输入?