Antonio Gulli《Agentic Design Patterns》学习笔记:第 12–17 章
Antonio Gulli 著,https://github.com/evoiz/Agentic-Design-Patterns(21 章 + 7 个附录,每章配可运行的 Jupyter Notebook) 全书导读见 agentic-design-patterns-summary.md;本篇是我的学习笔记(讲回)。
一句话
前两部分讲 agent 怎么搭,第三部分讲 agent 怎么在生产里活下来:出错了怎么恢复、什么时候必须让人接手、答案从哪来才靠得住。
第 12 章:异常处理与恢复
机器遇到的错误,和正常程序一样,分已知和未知两种。以前的做法是记个 log、重试,换种方法再试,实在处理不了就抛异常。
AI 的情况里,异常最大头是输入输出不符合规格。AI 最大的用处,是能知道自己错了、自己改了再试——不像以前代码写死,一不符合就得重写代码。以前写代码不可能把所有情况都写进去,不然逻辑异常庞大复杂;AI 能根据输入输出判断哪种重试方法更合适,从而提高成功率。
但也要注意,AI 有时会因为错误走错方向,烧很多 token 也没更正确的结果。
补充:AI 只能自己修“有信号的错”(工具报错、格式校验失败、测试不过);“没信号的错”(答案错了但看起来对)它自己发现不了,得靠外部校验(judge、测试、人)。所以重试必须设预算(最多几次、最多多少 token)+ 熔断,烧到头就停、转人工。恢复策略分四档:重试 / 回退 / 降级 / 转人工;先分错的种类(一次性调用失败、工具返回错、模型自己跑偏),再定策略。
第 13 章:Human-in-the-Loop
人在 loop 里最大的问题是没法 scaling:需要人 handle 的事一多,人要么变橡皮图章,要么变瓶颈(当然也可以放更多的人)。然后必然走到 human on the loop:能让 AI 自动做的就让 AI 自动做,人就在旁边监察一下,处理故障与 AI 做不了的事。
人为什么必须在环里(in the loop 或 on the loop)?除了 handle 机器 handle 不了的事,最关键的是要为重要决定负责,以及保证机器的伦理与操作与人的想法和方向一致。
补充:on the loop 成立的前提是人还能有效干预——能停、能回滚,否则监察是摆设。in→on 不是一刀切,是按信任度分级:新的、高风险的动作还在 in the loop,跑稳了的降到 on the loop。审批只放在不可逆动作前(写操作、发出去的东西、花钱的调用);其余让人事后能查、能回滚就行。
第 14 章:知识检索 / RAG
RAG 根子上就是 prompt 的增强:无论通过搜索引擎、数据库还是本地文本,把可能的答案藏在输入里,AI 的答案就更精确,不太会幻想一个不存在的答案给你。
一般 RAG 用向量数据库 embedding 内容,把相似的词以一定维度放在一起;更进一步 Graph RAG,可以把需要推理才能联系起来的内容以图的方式连在一起,提高检索内容的精确性和全面性。
Agentic RAG,就是让一个或多个 agent 专门负责 RAG,再把结果给主要 AI 汇总处理——有点像我们的陪审团与法官模式。
补充:检索也可能把错的东西塞进输入(相似不等于正确,版本旧了也会一本正经地答错),所以 Agentic RAG 里自我评估那道关才是关键。Graph RAG 和 Agentic RAG 的代价是构建成本 + 延迟/成本(延迟 1–2 秒变 10 秒+、成本 3–10 倍),只在查询复杂、知识库乱的时候上;查询简单、知识库干净时标准 RAG 就够了。陪审团与法官的类比里,关键是法官得会判(自我评估:相关吗?完整吗?和其他信息冲突吗?不过关就换问法或换源重试,最多循环 5 次)。
第四部分(第 15–17 章)
一句话:第四部分讲企业级规模化:agent 之间怎么通信协作、资源怎么按需分配、推理质量怎么用算力换。
第 15 章:Agent 间通信 / A2A
A2A(Agent to Agent Protocol)是为 agent 之间的交流与协作定的协议。它的目的是让不同框架、不同厂商的 agent 也能互相发现、互相委派任务、协同干活。关键机制是 Agent Card:一份放在固定地址的 JSON 描述,写明这个 agent 能干什么、怎么调它,client agent 靠它发现 remote Agent。
和 MCP 的不同:MCP 侧重于上下文与规范,管 LLM 怎么接外部数据和工具,可调用的工具面很广。其实我们并不 care MCP 背后调用的工具到底是写的程序、数据库还是另一个 agent,我们只关心为我们的任务拿到下一步的 context。A2A 则不同,它管的是 agent 之间的任务协调。
A2A 还有个好处,这篇文章里并没有提,是我通过其他方式学到的:MCP 的工具是按指令行事,输入和输出都是定义好的;A2A 的代理却可以比较自由,因为 AI 可以自主决定怎么处理数据。MCP 是同步请求并响应,A2A 可以同步,也可以异步,还可以并行。MCP 是无状态的,A2A 是有状态的。所以如果一个任务 agent 需要管理自己的状态,并在独立的底层架构上运行,就需要使用 A2A。
补充:A2A 的操作就几条:
tasks/send(同步发任务)、tasks/sendSubscribe(订阅式,长任务流式回进度)、tasks/get/tasks/cancel,还有个input-required状态——agent 做到一半缺信息可以停下来反问,等补了再继续。这就是它“有状态”的具体样子。
第 16 章:资源感知优化
这一章主要讲成本控制。概念是根据任务的不同难度来取舍不同的 model,这样可以节约成本,而且反应很快。资源感知优化这一步,应该是有个 Agent 首先过一遍任务,判断这个任务该由哪个 model 来完成才符合最优解。
如果我来做的话,还会根据回答判断质量高不高:不高的话,升级用更高一档的模型重新来做。因为我认为,为了节省成本而降低回答质量是不可取的;当然,为了保证质量,一味用最贵的模型也是一种浪费。
补充:你这个“先便宜模型答、再判质量、不行升级重做”的思路,正是这章推荐的标准做法,叫 cascade(级联)+ verifier(校验)。另外那个“先过一遍”的 router 不一定非得是个完整 Agent,轻量分类器、甚至规则都行,关键是“先判断难度再分流”这个动作。
第 17 章:推理技术
推理技术里,CoT 是模仿人类思考,把一个大问题拆成很多小问题,然后一步一步地回答。ToT 则是在 CoT 基础上允许分叉,探索多条路径,形成树状结构。ReAct 是一种循环的方式:先做一步,然后把结果反馈回来,调整计划,再接着做下一步推理,有点像一种能自我纠错的机制。CoD 是多个模型辩论,共同求解。
这一章还提到一个很有意思的情况:用多个小模型多次推理,也可以达到大参数模型相似的高质量回答。这让我想起最近流行的 harness,就是这个思想的实现与成功证明。
补充:CoD 的辩论是模型之间互相看到对方的论点、来回交锋、几轮之后才定论;咱们的智囊团不是辩论,是陪审团——几个模型各自独立答题、互不相见,最后由裁判模型挑出最好的那个。所以智囊团是“并行独立作答 + 裁判裁决”,更接近 best-of-N / 自洽性那一路。什么时候用辩论、什么时候用陪审团,是设计多 agent 系统时一个实在的选型点。另外“多小模型多次推理 ≈ 大模型”这个思想叫 test-time compute(推理时算力):质量不一定非要靠更大的模型,也能靠推理时多花算力换来,harness / 智囊团确实是这个思想的一个实现。