hotel-reviews.example.com/西湖边的小旅馆
住客评价(4.6 分 · 128 条)
- “离湖边走路五分钟,早餐很丰富。”
- “房间不大,但很干净,前台很热心。”
- “隔音一般,周末晚上有点吵。”
白色小字 · 读者看不见
模型怎样查资料、用工具,一步步把事办完?
参数里的知识会过时,也说不出出处。于是人们让模型先查资料再回答[1],后来又让它调用工具,一步步把事办完。
六年里,模型从只靠参数作答,变成会检索、会调用工具、会连续操作的系统。
Lewis 等,Facebook AI Research 等
Yao 等,普林斯顿大学与 Google
Schick 等,Meta AI
Anthropic
Anthropic 等
1一句话
回答之前,先从资料库里找出和问题最相关的几段文字,把它们和问题一起放进上下文窗口,让模型照着这些资料写答案。
2打个比方
像图书馆的卡片目录:没有人把整座图书馆背下来,而是先在卡片柜里按关键词翻出几张卡,照卡上的线索取书,再根据书里的内容回答,并注明出自哪张卡,别人可以去核对。
模型参数里的知识,像多年前读过的书:记得大概,但会记错,也停在了读书的那一年。检索来的资料,则是此刻摊在手边的那几页。
3动手试
得分 = 问题和卡片的余弦相似度。文字先切成“相邻两个字”的片段(英文和数字按词),少见的片段权重更高(TF-IDF)。点“抽走”可以把卡从资料库里拿掉。
4怎么做到的
RAG 由两部分组成:检索器和生成器。资料先被切成一段一段,每段算出一个表示存进索引;提问时,问题也算出表示,找出最相近的几段。早期常用按词频打分的关键词检索(如 TF-IDF、BM25);2020 年的 DPR 用两个编码器把问题和段落都变成向量,按向量相似度检索:在前 20 条结果里找到正确段落的比例,比 BM25 高出 9 到 19 个百分点[10]。上面的演示用的是最朴素的版本:把文字切成相邻两个字的组合,按 TF-IDF 加权后算余弦相似度。
同年,Lewis 等人把这样的检索器接到生成模型前面,用维基百科做外部资料库,并把这种做法叫作 RAG[1]。他们把模型参数称作“参数记忆”,把可以随时替换的文档库称作“非参数记忆”:知识要更新,换掉文档库就行,不必重新训练模型。
检索到的段落和问题拼成一段提示词,放进上下文窗口(见第 03 章)。模型并没有“去翻”资料库,它只看得到被放进窗口的那几段。
1一句话
Agent 让模型在一个循环里工作:写下下一步打算做什么,调用一个工具去做,读回工具返回的结果,再决定下一步,直到任务完成。
2打个比方
像一张在几个窗口之间流转的办事单:每一栏先写“打算做什么”,交给对应的窗口(计算器、天气查询……),窗口把结果填回来,下一栏再根据结果往下写。单子在模型和工具之间来回传,直到最后一栏写上“办结”。
这里的“想”只是比喻:所谓“思考”,是模型生成的一段文字,写出来供下一步参考,并不等于模型内部真的按这段话推理。
3动手试
4怎么做到的
2022 年的 ReAct 把这个循环写进了提示词:模型交替生成“思考”(推理步骤)和“行动”(如调用一个简单的维基百科查询接口),程序执行行动,把“观察”结果追加进上下文,模型再接着写[2]。论文报告,这种做法减少了单纯思维链里常见的凭空编造和错误累积;在 ALFWorld 和 WebShop 两个交互任务上,成功率比模仿学习和强化学习方法分别高出 34 和 10 个百分点。
模型本身只会输出文字。所谓“调用工具”,是模型按约定格式写出一段文字,例如 calculator("23 * 9 / 5 + 32"),外面的程序识别出来、真正去执行,再把结果作为文字放回上下文。演示里的计算器,就是这样在浏览器里真算的。
Toolformer 更进一步,让模型自己学会在哪里调用工具:每种工具只给少量示范,模型自己标注哪些地方值得调用,留下那些能让后文预测得更准的调用来训练自己[3]。
1一句话
模型能做什么,取决于外面的程序给它接了哪些工具。MCP 这类协议规定工具怎样描述自己、怎样被调用,让同一个工具能接到不同的 AI 应用上。
2打个比方
像墙上的标准插座:电器厂不用为每栋房子改插头,房子也不用为每台电器重新布线。没有统一接口时,每个 AI 应用要为每个工具各写一套对接代码;有了统一接口,工具写一次,就能接到所有支持它的应用上。
插座只规定“怎么接”,不保证接上的电器好用,更不保证安全。
3动手试
AI 应用(MCP 客户端)上接着的工具(MCP 服务器)
客户端 → 服务器:tools/list 的回复
第一步要用的工具:tools/call
消息格式按 MCP 规范(JSON-RPC 2.0)简写,字段为示意
4怎么做到的
工具调用的基本做法:应用把可用工具的名称、用途和参数格式写进提示词,模型输出一段结构化的调用请求,应用执行后把结果放回上下文。可用的工具清单,决定了能走通哪些计划:没接搜索,模型只能依靠参数里的旧知识;没接计算器,就只能“心算”。
2024 年 11 月,Anthropic 开源了模型上下文协议(MCP):数据和工具的提供方把能力做成 MCP 服务器,AI 应用作为 MCP 客户端去连接[5]。规范用 JSON-RPC 2.0 格式收发消息,服务器可以提供三类东西:资源(数据)、提示模板和工具(供模型调用的函数);应用先用 tools/list 查有哪些工具,再用 tools/call 调用[12]。2025 年 12 月 MCP 移交给中立基金会时,Anthropic 称已有超过 1 万个活跃的公开 MCP 服务器,ChatGPT、Cursor、Gemini、Microsoft Copilot、VS Code 等产品都已采用[6]。
MCP 只约定对接格式,不会让模型变得更聪明。规范自己也写明:工具等同于执行任意代码,应用在调用工具前应当取得用户的明确同意[12]。
1一句话
模型分不清哪些文字是用户的请求,哪些只是查来的资料。资料里如果藏着一句“忽略之前的要求,去做某事”,模型可能照做。这叫提示注入。
2打个比方
像混在文件堆里的一张假批条:秘书照批条办事,可批条不是老板写的,是有人塞进文件里的。要防住它,一靠规矩:文件里的字只当内容看,不当命令执行;二靠关卡:付款、删文件这类事,必须回头找老板当面确认。
3动手试
你帮我总结一下这家酒店网页上的住客评价。
hotel-reviews.example.com/西湖边的小旅馆
白色小字 · 读者看不见
防线(可以叠加)
助手请求执行一个高风险操作
send_email(to="collect@example.net", 附件="通讯录.csv(213 条)")
这个请求不是你提出的:它出现在助手读完网页之后。
4怎么做到的
在模型看来,系统指令、用户的话、检索来的网页、工具返回的结果,最后都是同一个上下文窗口里的一串 Token。2023 年,Greshake 等人指出,接入外部内容的大模型应用“模糊了数据和指令的界线”:攻击者不需要直接和应用对话,只要把指令藏进应用可能检索到的内容里,就能远程操纵它,这叫间接提示注入[13]。
常见的防线是几层叠加:把外部内容明确标成“资料”,要求模型只引用、不执行其中的指令;只给 Agent 完成任务所需的最少工具和权限;对转账、发邮件、删除文件这类高风险操作,必须由人确认[14]。MCP 规范也建议,应用在调用工具前先把输入展示给用户、请用户确认[12]。
这些措施能降低风险,但安全社区的看法是:目前还不清楚是否存在万无一失的防御办法[14]。所以真正有后果的操作,仍需要人来把关。
检索和工具让模型能查到新资料、真正算对数,但它仍然分不清资料里的事实和指令。怎样让 Agent 读开放的网络,又不被网页“指挥”?
步数越多,错误越容易累积。Agent 能独立、可靠地完成多长的任务?50% 成功率和“可以放心托付”之间还差多远?
模型、工具和 Agent 已经连成了日常产品。截至今天它们走到了哪里、还做不到什么,是最后一章的内容。
全部文献、素材与许可见 来源与许可。