— 知识图谱 + 生产实践 + 知识点→面试映射

本文定位:这不是一份"面试八股手册",而是一份从 2026-07 往前覆盖最新 Agent 工程能力的完整学习文档,同时也是我自己的项目MJ Nexus 智能体项目下一代OS产品的总结文档;每章遵循统一结构——先讲清"为什么这样设计、生产怎么落地、踩过什么坑",再把每个知识点派生出对应的面试映射。目标是让你既学得懂(深度+上下文联系),又答得出来(知识点→面试卡)。注意本文同时只是一份流程的流程思路实现,而非完整代码功能实现;

数据说明:文中下载量、PR 拒率、Benchmark 等数字整理自公开报告与官方公告,仅作趋势示意;部分日期(如 2026-07-28)为规划节点、模型名(如 claude-opus-4.8、gpt-5.6、gemini-3)为示例占位,落地请以厂商当前发布版本与实际指标为准。

修订设计说明(重要):本文按"技术体为主、面试映射为派生"原则重写。每一章固定结构为:① 本章上下文与知识地图 → ② 核心概念与原理 → ③ 主流方案对比 → ④ 生产级实现 → ⑤ 实战复盘 → ⑥ 知识点→面试映射。原文档中孤立的"面试高频追问"已并入 ⑥,原第 33–35 章的纯面试专项已重构为"厂商技术栈深度 + 面试映射"。


0. 知识地图与学习路径

0.1 Agent 技术栈全景(一张图看懂十层)

约束注入

调用

横切管控

横切管控

L0 模型层
LLM / VLM / ASR·TTS

L1 Harness 控制面
AGENTS.md · 策略引擎 · 预算熔断

L2 运行时 Loop
P-P-A-O-R · 护栏 · Checkpoint

L3 工具与协议
MCP · A2A · WASM 沙箱 · CUA

L4 记忆与知识
记忆五层 · RAG · GraphRAG

L5 多 Agent 编排
协作模式 · 任务分解 · 通信

L6 工程化
调度 · 可观测 · 成本 · 执行抽象

L7 评测与数据飞轮
Eval · 回归 · 反馈闭环

L8 安全合规治理
OWASP · HITL · 权限 · 多租户 · 审计

L9 运营 SRE
SLO · 混沌 · Runbook · 版本灰度 · CI/CD

L10 厂商生态
OpenAI·Anthropic·Google·阿里·腾讯·字节

读图要点:Agent 能力不是"模型 alone",而是 L0→L9 一条由控制面(Harness)包裹运行时的栈。模型越强(补偿面迁移),L1/L2 的约束可以越轻,但 L3(工具/协议)、L8(安全)几乎永远需要。L10 是前面九层的"厂商落地对照"。

0.2 十大部分与依赖关系

部分 主题 依赖(先学) 被依赖(后学)
第一部分 生产级 Agent 实现基础(状态机/上下文/流式) —(入口) 全部
第二部分 记忆与知识系统(记忆/RAG) 第一部分 第三/四/六部分
第三部分 工具与多模态(MCP/Harness/Loop/WASM/CUA) 第一部分 第四/五/七部分
第四部分 多 Agent 协作与 A2A 第一/三部分 第五/七部分
第五部分 工程化与性能(调度/可观测/成本/抽象) 第一/三部分 第六/八/九部分
第六部分 评测、数据飞轮与持续优化 技术各Part 第八/九部分
第七部分 安全、合规与治理(OWASP/HITL/权限/审计) 第三部分 第九部分
第八部分 版本管理、灰度发布与应用内 CI/CD 第五/六部分 第九部分
第九部分 运营、SRE 与商业化(SLO/混沌/Runbook) 第五/七/八部分 —(终点)
第十部分 厂商技术栈全景与面试专项 全部(综合) —(综合)

0.3 推荐学习路径(从"跑起来"到"上生产")

  1. 入门:第一部分(怎么让一个 Agent 真正跑完一轮 P-P-A-O-R)→ 第三部分前段(给它接上 MCP 工具)
  2. 能对话:第二部分(记忆,让它能"记得你")→ 第三部分后段(多模态 CUA,让它能"看屏幕")
  3. 能协作:第四部分(多 Agent 分工)
  4. 能上生产:第五部分(调度/可观测/成本)→ 第七部分(安全治理)
  5. 能持续变好:第六部分(评测 + 数据飞轮)
  6. 能稳定运营:第八部分(灰度/CI)+ 第九部分(SLO/混沌/Runbook)
  7. 面试与对标:第十部分(六大厂商技术栈 + 分级真题)

0.4 2026-07 技术基线 + 2026 H2–2027 前瞻

已稳定(闭眼用):MCP(2026-07 重大改版后)、A2A v1.0(2026-04)、LangGraph/CrewAI/Claude Agent SDK/OpenAI Agents SDK/Microsoft Agent Framework/Google ADK 六框架收敛于"类型化委派 + 生命周期钩子 + HITL"、WASM 沙箱、Prompt Caching、RAG/GraphRAG。

2026 H2 上行(重点投入):MCP Apps(服务端 UI)/ Tasks(长任务)/ EMA 企业托管授权;Bedrock AgentCore Policy(Cedar 原生);Computer Use Agent 替代 80% RPA;Loop Engineering(Cron + 决策器)成为主流范式;Agent = Model + Harness 成为工程共识。

2027 前瞻(跟踪):模型原生 longer-horizon agency(METR HCAST 已测到 ~2h50m)、补偿面迁移使 Harness 持续变轻、A2A + AP2 支付协议打通"Agent 经济"、评测从"准确率"走向"成本会计 + 回归门禁"。

如何使用本文的"面试映射":每章 ⑥ 是知识点的派生卡,建议先读懂 ①–⑤ 再回头刷 ⑥;面试官考察的永远是"为什么",不是"是什么"。

0.5 按岗位定制学习路线(P5 / P7 / 架构师 / PM)

§0.3 是"通用主线",但不同岗位的读法差异很大:初级要"先能跑",资深要"能扛住生产的边界情况",架构师要"能画出全局权衡",PM 要"能判断能力边界与商业价值"。下面把 35 章按四类岗位重排,给出必修 / 选修 / 可略读优先级、核心能力目标与阶段里程碑。

四岗位优先级总表(◎必修精读 / ○选修理解 / △略读了解)

部分 / 章 P5 应用工程师 P7 资深/骨干 架构师 PM 产品
第1部分 生产实现(1–4)
第2部分 记忆知识(5–7)
第3部分 工具多模态(8–12)
第4部分 多Agent/A2A(13–14)
第5部分 工程化性能(15–18)
第6部分 评测数据飞轮(19–21)
第7部分 安全治理(22–26)
第8部分 版本CI(27–28)
第9部分 运营SRE(29–32)
第10部分 厂商对标(33–35)

① P5 应用工程师(0–2 年,目标:把 Agent 稳定跑上线)

  • 主线:第 1–4 章(吃透 P-P-A-O-R + 状态机 + 上下文压缩 + 流式中断)→ 第 8 章(接 MCP 工具)→ 第 5/7 章(记忆 + RAG)→ 第 12 章(多模态入门)。
  • 核心能力:能独立实现一个带记忆、可调工具、可中断、有成本上限的单 Agent,并读懂线上日志定位问题。
  • 可暂缓:第 13–18、29–32 章(多 Agent/SRE 先了解概念即可)。
  • 里程碑:独立交付一个通过内部 held-out 评测(见第 19 章)的生产 Agent 功能。

② P7 资深/骨干(3–5 年,目标:扛住生产的一切边界情况)

  • 主线:在 P5 基础上补齐第 13–18 章(多 Agent 调度 + 可观测 + 成本)、第 22–26 章(安全全链路)、第 27–28 章(灰度/CI)、第 19–21 章(评测 + 数据飞轮)。
  • 核心能力:能设计一个模块的完整工程闭环——从多 Agent 协作、权限隔离、成本预算,到评测门禁与灰度发布,并主导线上事故复盘。
  • 重点精读:每章 ⑤ 实战复盘(坑+教训)与 §9 Harness ⟨C,A,R⟩、§10 编排税、§17 成本会计。
  • 里程碑:主导一次带回归门禁的模型/Harness 升级,并完成一次策略重定价(删除不再增益的补偿组件)。

③ 架构师(目标:画出全局权衡与技术选型)

  • 主线通读全书,但读法是"横切"而非"逐章"——重点抓每章 §N.0 知识地图(章间依赖)+ §N.2 方案对比(取舍)+ 附录单一事实源。
  • 核心能力:能对"框架选型(六框架收敛)、协议分层(MCP vs A2A)、隔离分级(四级沙箱)、授权引擎(Cedar vs OPA)、评测体系(成本会计)"给出有据可依的决策,并管理生态锁死风险。
  • 重点精读:§0 全栈知识地图、第 9/10 章(Harness/Loop 范式)、第 13–14 章(多 Agent/A2A 架构)、第 22–26 章(安全治理全景)、第 33–35 章(厂商对标)。
  • 里程碑:产出一份组织级 Agent 平台技术选型 RFC,并通过评审。

④ PM 产品经理(目标:判断能力边界与商业价值)

  • 主线:抓"能做什么/不能做什么/成本多少/风险在哪"——第 3 部分(工具/多模态能力边界)、第 6 部分(评测=如何量化好坏)、第 10 部分(厂商能力对标)、第 17 章(成本)、第 22/26 章(安全合规红线)。
  • 读法:跳过代码样本(§N.3),精读每章 §N.0(痛点)、§N.1(原理白话)、§N.2(对比)与 §N.5 面试映射里的"高分要点"(快速建立术语体系)。
  • 核心能力:能与工程对齐可行性、给出分阶段能力路线图、识别"CUA 替代 RPA""A2A 打通 Agent 经济"等商业窗口,并守住数据合规/免责边界。
  • 里程碑:产出一份基于真实能力边界(而非营销话术)的 Agent 产品 PRD 与商业化路线图。

交叉建议:四类岗位都应至少通读 §0(知识地图)与第 8 章(MCP,全栈枢纽);P7→架构师的跃迁关键在"从’实现一个模块’到’权衡整个系统’",即把阅读重心从 §N.3 生产实现移到 §N.0 + §N.2 + 附录单一事实源。


第一部分:生产级 Agent 实现基础

本部分覆盖 Agent 从"能跑通 demo"到"可上线生产"必须跨越的四道工程门槛:完整的自主循环(第 1 章)→ 可控的执行骨架(第 2 章)→ 可承受的上下文成本(第 3 章)→ 可中断的流式交付(第 4 章)。四章层层递进,第 2 章的「状态机 + Checkpoint」依赖第 1 章的 P-P-A-O-R 循环定义,第 3 章的上下文压缩又决定第 1 章循环能否在长期任务中持续;第 4 章的流式与中断则把前三者的最终产物安全地交付给用户。


1. 生产级 Agent 完整实现流程

1.0 本章上下文与知识地图

本章是整份指南的"地基章":它定义生产级 Agent 区别于玩具 demo 的本质差距,并确立贯穿全篇的 P-P-A-O-R 自主循环 这一核心抽象。它在技术栈中位于最底层,向上被「第 2 章(状态机如何编排这个循环)」「第 3 章(循环跑长了上下文怎么办)」「第 4 章(循环产物如何流式交付)」共同依赖;向下则承接模型层与工具层(详见《MCP 工具治理与协议》第 8 章)。它要解决的工程痛点是:如何把一个"靠运气跑通"的 LLM 调用,变成一个"有计划、有上限、可恢复、可审计"的自治系统。


1.1 核心概念与原理

Demo 与生产级 Agent 的本质差距不在模型,而在"工程闭环"。 一个 demo 只要 happy path 跑通即可;生产级 Agent 必须同时回答四个问题:异常路径怎么走?状态丢了怎么恢复?成本失控怎么熔断?谁在什么时候调了什么怎么审计?这四点正是 P-P-A-O-R 框架要兜住的。

P-P-A-O-R 循环(Perception → Planning → Action → Observation → Reflection) 是 2026 年工业界事实上的 Agent 内核抽象。它把"Agent 自主工作"拆解成五相,每一相都对应一类可工程化的约束:

  • Perception(感知):把用户意图、环境状态、工具结果组装成模型可读的输入。难点在上下文组装(见第 3 章)。
  • Planning(规划):决定下一步做什么。可轻(ReAct 边想边做)可重(Plan-and-Execute 先出完整计划)。
  • Action(行动):调用工具/子 Agent。是所有副作用发生的唯一位置,必须落在沙箱与权限边界内(见第 8 章)。
  • Observation(观察):把工具结果转回模型可读形式。失败也必须有结构化结果,否则循环会"假装成功"。
  • Reflection(反思):判断这一步成败、是否要换方案、是否该终止。这是防死循环与防偏执的关键一相。

闭环之所以是"环",是因为 Reflection 的输出会反馈回 Perception,驱动下一轮。下面用一张时序图说明一次典型循环如何被工程约束包裹:

未完成 & 未超预算

失败 & 可重试

成功

超迭代/超预算/循环检测

注入

工程护栏(贯穿全程)

max_iterations=25

单步超时 30s/60s

token/成本预算

循环检测 ≥3 次相同 state

用户任务

Perception
组装上下文

Planning
规划/选工具

Action
调用工具/MCP

Observation
结构化结果

Reflection
成败判定

交付结果

熔断终止
(回退/升级人工)

为什么需要显式上限与熔断? 因为 LLM 循环天然有两条失败模式:① 失控循环(被 prompt 注入诱导无限调工具);② 偏执重试(同一个错误方案反复试,不换思路)。Anthropic 2026-04 的实证数据:Claude Code 平均任务 8–12 轮循环、90% 在 15 轮内完成、超 25 轮几乎都是 prompt 漏洞。这说明**"硬上限"不是保守,而是定位 bug 的探针**——超阈值本身就说明上游有问题。

范式演进的"为什么"。 2022 的 ReAct 把"思考—行动"交织,但无规划易绕圈;2023 的 Plan-and-Execute 把"想"和"做"分离,可一旦计划僵化就难纠偏;Reflexion 在失败后注入自我反思,补足了纠偏能力但反思本身也可能错。2024–2026 的工业主流因此收敛为 Plan-and-Execute 做骨架 + Reflexion 兜底 + ReAct 填细节 的组合式架构。2026 年更出现了 Multi-Agent + Orchestrator(Lead Agent 调度 Sub-Agent)与 Agent + Skill(progressive disclosure,按需加载工具)两种上层形态。

2026 H2–2027 前瞻:随着强模型(Opus 4.8 级)长上下文与长期规划能力提升,行业正在从"厚 Harness 补偿"转向"薄 Harness + 强模型"——即删除大量原先为弥补模型缺陷而设的护栏(详见第 9 章 §9.10 的 ⟨C,A,R⟩ 形式化与补偿面迁移),但"预算熔断/循环检测/审计"三件套因涉及安全与成本,仍会长期保留。


1.2 主流方案对比

选型不是比谁功能多,而是比"谁的抽象刚好卡在你的复杂度区间"。下表把范式与适用场景对齐:

范式 提出 核心思想 适用 局限 何时选
ReAct 2022 Thought-Action-Observation 交替 通用工具调用、探索型 易循环、无规划 简单、开放式、单步探索
Plan-and-Execute 2023 Planner + Executor 分离 复杂多步、确定性流程 规划僵化、改计划成本高 步骤可预知、需可重放
Reflexion 2023 失败后反思重试 易错迭代任务 反思也可能错、多一轮成本 作为兜底层挂载
ToT / LATS 2023 树形/ MCTS 探索 数学、博弈、强搜索 token 成本极高 仅评测/高价值决策
Plan-and-Execute + Reflexion 2024–2026 主流 动态规划 + 反思 + 工具重试 生产级通用 工程复杂 默认选型
Multi-Agent + Orchestrator 2026 主流 Lead 调度 Sub-Agent 复杂业务、可并行子任务 token 成本 ~15x 子任务天然可并行
Agent + Skill(渐进披露) Anthropic 2026 按需加载工具 企业级、工具海 需 Skill 治理体系 工具 > 50 个时

取舍分析(何时选哪个)

  • Plan-and-Execute 组合 的理由:它把"非确定性"锁进最小节点(规划一次、执行多次),其余交给可重放的确定性代码——这正是第 9 章 Blueprint 模式与第 2 章状态机共享的设计哲学。
  • Multi-Agent 前先算"编排税":Anthropic 内部 80%+ 代码由 Agent 写,瓶颈已从"写"转移到"审",AI 生成 PR 拒率 67.3%(vs 手工 15.6%)。若你的审查带宽只能认真看 1 个 PR/小时,5 个并行 Agent 有 4 个在空烧 token。
  • Skill 渐进披露:工具数超过约 50 后,全量塞进 context 会让模型 30% 的 turn 花在"选工具"上(见第 8 章坑 1)。应按任务 embedding 召回 top-15。

1.3 生产级实现

生产级 Agent 的"骨架配置" 必须显式声明预算、超时与熔断。下面是一份可落地的 YAML(吸收了第 9 章 Harness 约束层的生产经验):

# agent.runtime.yaml — 生产级 Agent 运行宪法
agent:
  name: "prod-agent"
  model:
    primary: "claude-sonnet-4-5"
    fallback: ["claude-haiku", "gpt-mini"]   # 主模型抖动时自动降级
    cache_strategy: "1024_tokens"            # Anthropic prompt cache 门槛

loop:                                       # P-P-A-O-R 循环的护栏
  paradigm: "plan_execute+reflexion"        # 骨架 + 兜底组合
  max_iterations: 25                        # 硬上限:超阈值即视为 bug
  max_same_state: 3                         # 循环检测:相同 state 出现 3 次强制终止
  step_timeout_sec: 30                      # 单 LLM 调用超时
  tool_timeout_sec: 60                      # 单工具调用超时

budget:                                     # 三维预算熔断
  max_tokens_per_run: 500_000
  max_cost_per_run_usd: 5
  max_wall_time_sec: 300

observability:
  trace: "langfuse"                         # 完整轨迹记录,支撑 time-travel 调试
  audit: "append-only"                      # 谁/何时/调了什么/结果,不可篡改
  escalation: "human"                       # 预算耗尽/循环检测 → 升级人工

配套的循环调度器核心(Python 骨架),展示预算与循环检测如何嵌入每轮:

class PPAORLoop:
    def __init__(self, cfg):
        self.cfg = cfg
        self.state_history: list[str] = []   # 用于循环检测

    async def run(self, task: str) -> dict:
        perception = self._perceive(task)
        for i in range(self.cfg["loop"]["max_iterations"]):
            plan = await self._planning(perception)
            action = await self._action(plan)          # 唯一副作用点
            obs = self._observe(action)
            verdict = await self._reflection(obs)      # 成败 + 是否换方案

            if verdict["done"]:
                return {"status": "ok", "result": obs}
            if self._loop_detected(verdict["state_hash"]):
                return {"status": "loop_detected", "step": i}
            perception = self._reperceive(perception, obs, verdict)
        return {"status": "budget_exhausted"}

    def _loop_detected(self, h: str) -> bool:
        self.state_history.append(h)
        return self.state_history.count(h) >= self.cfg["loop"]["max_same_state"]

生产怎么配、坑在哪

  • 坑 A:把 max_iterations 当摆设。 很多团队设 25 却从不停下来看"为什么跑满"。正确做法是跑满即告警——它几乎总指向 prompt 漏洞或工具返回了非结构化错误。
  • 坑 B:Observation 吞掉错误。 工具抛异常若被静默成 {"ok": true},Reflection 会误判成功并继续错下去。务必让失败也带结构化 error_code
  • 坑 C:预算只设 token 不设 wall-time。 模型或工具挂起时 token 不涨但用户已等死,必须 wall-time 双保险。

1.4 实战复盘

以下来自 MJ Nexus OS 自研 Agent 与通用生产落地经验。

坑 1:把"多 Agent"当银弹,token 成本炸了还更慢。 早期我们把所有任务都拆成 Lead + 3 个 Sub-Agent,结果 90% 的简单任务也走全链路,token 是单 Agent 的 12–15x、延迟翻倍以上。后来加了一道"复杂度路由":L1 单 Agent 直接做,仅当检测到可并行子任务(如"同时抓 5 个网页并各自总结")才升级多 Agent。教训:Anthropic 的数据本就说 90% 任务 L1 单 Agent 就能解,默认架构应是单 Agent + 显式升级,而不是无脑拆分。

坑 2:Reflection 只会"重试同一条路"。 某次 Agent 反复用错误参数调 search_web,每次 Reflection 都说"再试一次",循环检测救场才终止。根因是 Reflection 提示词没强制"换思路"。我们改成:第 2 次失败时强制注入"上一方案的失败原因 + 要求提出不同策略",偏执重试大幅减少。教训:Reflexion 必须有"换方案"的硬指令,否则它只是把死循环包装得更优雅。

决策复盘:自研框架 vs 直接用 LangGraph/OpenAI Agents SDK? 我们评估后结论是——循环逻辑(P-P-A-O-R + 预算 + 检查点)是通用件,不该自研;差异化应放在工具治理与 Skill 体系(对应第 8 章)。最终决定框架层用 LangGraph/Agents SDK,自研只做编排之上的业务护栏。边际收益抵不过重复造轮子的维护成本。


1.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
P-P-A-O-R 循环 “生产级 Agent 的循环由哪几相组成?” 五相及各自工程职责;强调 Action 是唯一副作用点、Reflection 是防死循环关键;结合 max_iterations/预算熔断讲"为什么需要硬上限"
Demo vs 生产 “Demo 和生产级 Agent 核心差距?” 不只答"加异常处理",要点出 P-P-A-O-R + 持久化状态 + 沙箱 + 审计四件套;引用 90% 任务 L1 单 Agent 完成的数据
范式选型 “ReAct / Plan-and-Execute / Reflexion 区别?” 讲各自 why 与局限;生产做法=骨架(Plan-Execute)+兜底(Reflexion)+细节(ReAct);指出 ReAct 易绕圈、Plan-Execute 易僵化
防死循环 “如何防止 Agent 无限循环?” 四层:硬上限 + state-hash 循环检测 + 成本熔断 + Trace 告警;强调超阈值本身是 bug 探针
多 Agent 成本 “什么时候该上 Multi-Agent?” 讲编排税与审查带宽瓶颈(AI PR 拒率 67.3%);默认单 Agent + 显式升级
模型路由 “LLM Router 怎么选模型?” 意图分类 + 模型池 + 实时反馈;简单任务用便宜模型、性能关键用强模型兜底;主模型抖动自动降级
Agent vs Copilot “Agent 与 Copilot 本质区别?” Copilot=AI 提议人确认;Agent=自主决策+执行+反馈;2026 趋势是 Copilot 2.0=保留确认环节的弱 Agent
智能度量 “怎么衡量 Agent 的’智能’?” 任务成功率 / 平均轮数 / 单任务成本 / 人类干预率 / CSAT / 工具调用准确率 六维,强调"成本与成功率要联合看"

2. Agent 状态机与工作流引擎

2.0 本章上下文与知识地图

第 1 章定义了"Agent 该跑什么循环",本章定义"这个循环如何被装进一个可控、可恢复、可审计的骨架里"。它依赖第 1 章的 P-P-A-O-R 抽象作为节点内部逻辑,又直接为第 3 章(状态里存什么上下文)和第 4 章(节点执行产物如何流式吐出)提供结构基础。它要解决的工程痛点是:自由循环虽灵活但不可控、不可恢复;纯 DAG 虽可重放但缺乏 LLM 所需的动态决策。


2.1 核心概念与原理

三种执行模型的本质差异在"控制权归谁、状态归谁、能否回退"

  • 自由循环(Free Loop):控制权与状态全在 LLM 手里。灵活度极高但可控性/可恢复性/可审计性全无——demo 玩具专属。
  • DAG 工作流:控制流是静态图,节点是纯函数。可重放、易恢复,但缺乏运行时分支决策,适合数据处理这类确定性流水线。
  • 状态机(FSM):用显式状态 + 转移条件描述流程,状态被结构化存储。可控、可恢复、易审计——客服/审批类首选。
  • 状态机 + LLM 节点(2026 生产主流):骨架是确定性状态机,但某些节点的"转移到哪"由 LLM 决策。兼具可控性与灵活性,是 LangGraph 范式的核心。

为什么"状态机 + LLM 节点"成为主流? 因为它把第 1 章的"补偿面迁移"思想落到结构层面:把不确定性(LLM 决策)锁进最小节点,其余交给可重放的确定性代码。Stripe 的 Blueprint 模式(第 9 章 §9.4)正是此思想的工程化身——linter、测试、创建 PR 用确定性代码,只有"实现方案"和"修错"用 LLM。

Checkpoint(检查点)是生产级的分水岭。 它要求每一步的状态变更都被持久化,从而支撑两个关键能力:① 恢复(Resume)——Worker 崩溃后从最近检查点续跑而非重来;② 时间旅行调试(Time-travel Debugging)——能回到任意历史状态重放,是定位"模型那一步抽风"的唯一可靠手段。Anthropic 2026 明确推荐所有 Agent 状态必须可 Checkpoint。

下面用一张状态图展示"Plan-Execute-Reflect"骨架如何被 FSM 编排:

计划生成

工具结果回写

needs_retry & 重试未超限

需重新规划

成功 / 预算耗尽 / 循环检测

Plan

Execute

Reflect

LLM 节点:决策"调哪个工具"
状态持久化到 Checkpoint


2.2 主流方案对比

模型 灵活性 可控性 可恢复 可审计 适用 何时选
自由循环 极高 极低 Demo/原型 仅验证想法时
状态机 FSM 客服、审批、强合规 流程固定、需留痕
DAG 工作流 数据处理 ETL 步骤无分支、纯函数
状态机 + LLM 节点 生产级通用 默认选型

取舍分析

  • FSM 而非 DAG 的理由:业务常需"根据中间结果回头重新规划",DAG 的有向无环结构不支持回边,FSM 允许 Reflect → Plan 这种回退边。
  • 状态机 + LLM 节点 而非纯 FSM 的理由:纯 FSM 的转移条件写死,遇到"该调哪个工具"这类开放决策就失效;用 LLM 节点做转移决策,既保留骨架可控又获得灵活性。
  • 持久化后端选型(见 §2.3):内存级只够 demo;生产必须 Postgres/Redis 这类外部存储,否则进程一挂状态全失。

2.3 生产级实现

LangGraph 范式(2026 主流):状态用 TypedDict 声明,节点是纯函数,转移用 conditional_edges 表达。关键是把 Checkpoint 编译进图:

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.postgres import PostgresSaver
from typing import TypedDict, Annotated
import operator

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]   # 消息累加,不可变历史
    plan: list[str]                            # 当前计划
    current_step: int                          # 进度指针
    tool_results: dict                         # 工具结果缓存
    retry_count: int                           # 重试计数,防偏执

def planner(state): ...
def executor(state): ...
def reflector(state): ...

workflow = StateGraph(AgentState)
workflow.add_node("plan", planner)
workflow.add_node("execute", executor)
workflow.add_node("reflect", reflector)
workflow.add_conditional_edges(
    "execute",
    lambda s: "reflect" if _needs_retry(s) else END,
)
workflow.add_edge("plan", "execute")
workflow.add_edge("reflect", "plan")

# 关键:编译时挂载 Postgres Checkpoint
checkpointer = PostgresSaver(conn_string="postgresql://...")
graph = workflow.compile(checkpointer=checkpointer)

# 恢复:用 thread_id 定位会话状态,崩溃后续跑
config = {"configurable": {"thread_id": "user_123_session_456"}}
graph.invoke({"messages": [...]}, config=config)

故障恢复策略表(生产必配)

故障 恢复策略 工程要点
LLM API 抖动 重试 + 指数退避(≤3 次) 退避上限防雪崩
LLM 不可用 切换备用模型(fallback 池) 见 §1.3 的 fallback 配置
工具超时 重试 + 切备用工具 同功能工具多副本
Checkpoint 写入失败 WAL 日志 + 异步持久化 先写本地 WAL 再异步刷库
Worker 崩溃 K8s 拉起 + 从 Checkpoint 恢复 无状态 Worker + 外部状态
用户主动中断 cancel() 协作中断 + 保存进度 见第 4 章中断机制

生产怎么配、坑在哪

  • 坑 A:Checkpoint 存内存。 进程重启即丢,等于没做。必须外部存储(Postgres/Redis)。
  • 坑 B:thread_id 复用导致状态串台。 用户新会话要用新 thread_id,否则会"继承"别人的进度。
  • 坑 C:Checkpoint 过大拖慢恢复。messages 全量存会随对话暴涨,应对是把旧消息下沉到第 3 章的分层上下文/记忆系统,Checkpoint 只存指针。

2.4 实战复盘

来自 MJ Nexus OS 与通用生产落地。

坑 1:把"可恢复"理解成"重新 invoke 一次"。 我们最初崩溃后直接重试整个图,结果已经花掉的成本和工具副作用(如已发出的邮件)全部重来,还造成重复操作。根因是没把副作用操作标记成"幂等 + 可重入"。改成:所有写操作带 idempotency_key,从 Checkpoint 恢复时跳过已完成步骤。教训:恢复的前提是每一步都可幂等重入,否则 Checkpoint 只是把灾难重放一遍。

坑 2:条件边写成死循环。 某次 reflector 永远返回"需重试"且没接 retry_count 上限,状态机空转烧 token。我们学习第 1 章循环检测,在状态里加 retry_count 并在 reflector 内强制:超 2 次直接降级/终止。教训:状态机的回退边(Reflect→Plan)必须配计数器护栏,否则 FSM 比自由循环更隐蔽地失控。

决策复盘:DAG 还是状态机? 我们的数据处理子流程(抓取→清洗→入库)用 DAG(确定性、好重放),而主对话编排用状态机 + LLM 节点。教训:不是二选一,是同一条链路里按节点性质混用——确定性环节用 DAG/纯代码,决策环节用 LLM 节点。


2.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
执行模型选型 “自由循环、FSM、DAG 怎么选?” 讲控制权/状态/可恢复三角;指出生产主流是状态机+LLM 节点及其 why(不确定性锁进最小节点)
Checkpoint “为什么 Agent 必须可 Checkpoint?” 双能力:Resume + Time-travel Debugging;必须外部存储;引用 Anthropic 2026 推荐
确定性 Replay “Agent 调试为什么难?怎么解决?” 非确定性+多步依赖+工具副作用;解法=固定种子+Mock 工具+全量 Trace+Replay 模式
HITL “什么是 Human-in-the-Loop?怎么实现?” 高风险操作(删/转账/发邮件)插入人工确认节点;实现=状态机"等待人类"节点+UI 推送+Webhook 回写
故障恢复 “Worker 崩溃如何不丢进度?” 无状态 Worker + 外部 Checkpoint + K8s 拉起;写操作幂等 + idempotency_key
状态机防失控 “状态机回退边怎么防死循环?” 回退边必须配 retry_count 上限;与第 1 章循环检测对齐

3. 长对话上下文管理与压缩

3.0 本章上下文与知识地图

第 1 章的循环要能"长期跑",第 2 章的状态机要能"存得下",都绕不开一个物理瓶颈:上下文窗口的成本、延迟、与信息丢失。本章就是为前两者续命的"上下文经济学"。它向上被第 1 章循环(每轮重新组装 Perception)和第 2 章 Checkpoint(状态里存什么)直接消费,向下依赖第 8 章的工具层与记忆系统(第二部分将展开)。它要解决的工程痛点是:当对话从 4K 长到 200K token,成本、延迟、与"中间信息丢失"会同时暴击。


3.1 核心概念与原理

长上下文的"三层危机" 是 2026 年所有生产 Agent 都逃不掉的硬约束:

危机 现象 数据(量级示意)
Cost Crisis 长对话 token 成本飙升 200K 上下文单次 ~$1
Latency Crisis 上下文越长推理越慢 4K→200K,延迟 1s→5–10s
Lost-in-Middle Crisis 中间信息被模型忽略 32K 时约 70% 中间信息丢失(Liu et al. 2023)

为什么"更长的窗口"不是解药? 因为三危机同源:窗口变大 → 每次调用成本线性涨、prefill 延迟涨、且模型注意力在长序列中天然向首尾集中(Lost-in-Middle)。盲目堆窗口只把"贵+慢+丢"一起放大。正确思路是分层 + 压缩:让每次调用只装"当前最相关的信息"。

分层上下文(Layered Context,2026 主流) 的核心是"按变化频率分层、按相关性取用",把稳定信息放在可缓存层、把易变信息放在滑动窗口、把长尾记忆按需检索:

Prompt Caching
省 90% 成本

可缓存

向量/图谱召回

Layer 1: System
角色/规则/输出格式(不变)

组装后的 Context
送入 LLM

Layer 2: User Profile
偏好/画像(慢变)

Layer 3: Task State
进度/变量(快变)

Layer 4: Recent Dialog
最近 N 轮(滑动窗口)

Layer 5: Memory
检索召回(按需)

为什么分层能同时缓解三危机? ① Layer 1–2 变化极慢,启用 Anthropic Prompt Caching 后这部分成本可省约 90%(缓存命中不计费);② 每次只把 Layer 4(滑动窗口)+ Layer 5(召回)随调用变化,prefill 量被压住,延迟下降;③ 把"关键事实外提"到 Layer 2、把长对话摘要压进 Layer 4 头部,规避了"中间信息沉底被丢"。


3.2 主流方案对比

策略 压缩率 信息保留 适用 何时选
滑动窗口 1:1 保留最近 N 轮 通用、短任务 对话短、只关心近期
摘要压缩 10:1 语义保留 长对话 默认长聊选型
抽取式压缩 5:1 关键事实 结构化对话 需保留具体字段/实体
分段压缩 8:1 主题分段 多主题对话 话题频繁切换
分层上下文 15:1 系统+用户+任务+历史 生产级主流 综合场景默认

取舍分析

  • 摘要压缩 的理由:把旧对话喂给一个小模型生成"对话摘要"放在 Layer 4 头部,语义保留好、成本低。但要防"摘要漂移"——摘要本身可能漏掉后续被引用的细节。
  • 抽取式压缩 的理由:当对话里有关键实体/数值(如"订单号 12345"),摘要可能改写丢精度,抽取式直接保留原字段更稳。
  • 分层上下文 而非单策略:因为它不是"压缩一种",而是"Architecture 级"地把不同频率信息分到不同层,各层用不同策略(缓存/滑动/检索),综合压缩率最高。

3.3 生产级实现

分层上下文的 Prompt 组装(Python 骨架),展示各层如何取用与缓存:

class LayeredContext:
    def assemble(self, user_id: str, task: dict, recent: list, query: str) -> str:
        layer1 = self.cache.get("system_prompt")          # 不变,命中缓存
        layer2 = self.profile.load(user_id)                # 慢变,长缓存
        layer3 = self.task_state.render(task)              # 快变,实时
        layer4 = self.window.trim(recent, n=8)            # 滑动窗口 8 轮
        layer4_head = self.summarizer.summary(recent[:-8]) # 旧轮摘要置顶
        layer5 = self.memory.recall(query, top_k=5)        # 按需向量召回
        return "\n\n".join([layer1, layer2, layer3,
                            layer4_head, layer4, layer5])

# Anthropic Prompt Caching:给稳定层打 cache_control
# 仅 Layer 1-2 打标,可省约 90% 重复成本

长程依赖保持三件套(防"前面说过的话后面忘了"):

# 1) 关键事实外提:把"用户是产品经理"提进 Layer 2 画像
profile.upsert(user_id, {"role": "PM"})

# 2) 实体引用表:Prompt 里只插引用,不重复大段
entity_table = {"order_12345": "订单状态=已发货"}
prompt = f"请查 {entity_table_key('order_12345')} 的物流"  # 模型见引用即可

# 3) Context Summary:每 N 轮生成摘要放 Layer 4 头部
if turn % 8 == 0:
    recent_summary = summarizer.summarize(recent[-8:])

生产怎么配、坑在哪

  • 坑 A:摘要覆盖掉被后续引用的细节。 某次用户中途改了偏好,但旧摘要没更新,模型一直按旧偏好答。应对:外提事实进 Layer 2(权威源),摘要只做"叙事"不存"事实"。
  • 坑 B:Prompt Caching 失效因层混淆。 把快变的 Layer 3 也打上 cache_control,导致缓存永不命中、反增开销。必须只缓存真正不变/慢变的层。
  • 坑 C:滑动窗口太短丢上下文。 8 轮对大多数任务够,但复杂任务需配合 Layer 5 检索召回历史关键点。

2026 H2–2027 前瞻:随着模型原生支持更大窗口与"原生记忆"(如 Claude 的 memory 能力),分层上下文的部分手工工程可能被模型原生能力吸收,但"按变化频率分层 + 缓存稳定层"的成本优化思路仍长期有效。


3.4 实战复盘

来自 MJ Nexus OS 长会话与通用生产经验。

坑 1:把整个对话塞进 200K 窗口,单次调用 $1 还变慢。 早期我们不做任何压缩,长任务对话 200K token、单次 $1、延迟 10s,用户体感"卡"。引入分层 + 摘要后,单次有效 token 压到 ~20K,成本降 ~90%、延迟回到 1–2s。教训:长窗口是兜底不是默认,分层上下文才是日常形态。

坑 2:Lost-in-Middle 导致"用户明明说过"的尴尬。 用户在前 5 轮说"我是 PM,别用技术术语",模型到 30 轮后开始狂喷术语。根因是中间信息沉底。把"用户是 PM"外提进 Layer 2 画像 + 在 Layer 4 头部放持续摘要后解决。教训:关键事实必须外提成权威源,不能指望模型在长序列里记得住。

决策复盘:压缩策略选摘要还是抽取? 我们对"叙述类"对话用摘要、对"含订单号/金额/配置项"的对话用抽取式保留原字段,二者按内容类型路由。统一方案反而两头不讨好。


3.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
三层危机 “长上下文有哪些工程危机?” 成本/延迟/Lost-in-Middle 三危机同源;指出"更长窗口"不是解药(贵+慢+丢一起放大);引用 Liu 2023 的 70% 丢失数据
分层上下文 “怎么设计生产级上下文管理?” 五层(System/Profile/Task/Recent/Memory)按变化频率分层;Prompt Caching 省 90%;各层不同策略
Prompt Caching “如何用缓存降本?” 只缓存不变/慢变层(L1-2);快变层打 cache_control 反而失效;命中不计费
压缩策略选型 “摘要 vs 抽取式怎么选?” 摘要保语义(10:1)适合叙事;抽取保字段(5:1)适合含实体/数值;防摘要漂移
长程依赖 “怎么防止用户前面说过的话后面忘?” 事实外提进 Layer 2 + 实体引用表 + Context Summary 每 N 轮置顶
Lost-in-Middle “模型为什么忽略中间信息?” 注意力向首尾集中;解法=关键事实外提+摘要置顶+分层取用

4. Agent 流式响应与中断控制

4.0 本章上下文与知识地图

前三章让 Agent “能循环、可控、不爆上下文”,本章解决"产物怎么安全、顺滑地交到用户手上"。它依赖第 1 章的循环产物(文本/工具调用流)与第 2 章的状态机(中断即暂停某个节点),并为第 3 章的流式上下文回写提供传输通道。它要解决的工程痛点是:用户不能等 Agent 跑完 25 轮才看到结果;且在生成途中用户必须能随时打断、系统必须能随时熔断而不丢消息。


4.1 核心概念与原理

流式交付的核心矛盾:用户要"即时反馈感",但 Agent 的产物是"逐步生成"的。解决方案是把单次响应拆成事件流(event stream),前端边收边渲染。协议选型决定双向能力:

协议 方向 优势 劣势 适用 何时选
SSE 服务器→客户端 简单、HTTP 友好、自动重连 单向 Chat UI 前端默认
WebSocket 双向 全双工 协议重、需独立服务 协作/语音 需服务端推+客户端回控
gRPC Stream 双向 高性能、强类型 复杂、浏览器支持弱 内部服务 后端服务间
HTTP/2 Stream 双向 现代 浏览器支持不一 混合 需统一双向

2026 主流组合:SSE(前端)+ gRPC(后端内部)。 即用户侧用 SSE 单向收流(足够、简单、易重连),服务内部 Agent 各组件间用 gRPC 双向流(性能与类型安全)。

中断的本质是"协作式取消"。 真正健壮的中断不是粗暴断连(会丢状态、丢消息),而是贯穿调用栈的 cancel 信号:工具执行前检查 ctx.is_cancelled(),生成器每 yield 前检查,确保"优雅停下且已生成内容不丢"。这与第 2 章"用户主动中断 → cancel() 协作中断 + 保存进度"一脉相承。

Barge-in(语音打断) 是流式中断的高阶形态:用户在 Agent 说话(TTS 播放)途中插话,系统须立刻停 TTS、保留已生成内容、切到 ASR 接收新输入。链路为 麦克风 → VAD → ASR → Agent → TTS → 扬声器,关键在 VAD(语音活动检测)实时判定端点。

LLM/工具 Agent 服务(SSE) 用户/前端 LLM/工具 Agent 服务(SSE) 用户/前端 loop [每生成一个 delta] 提交任务(HTTP) 启动 P-P-A-O-R 循环 content_block_delta data: {...delta...} (SSE 推送) cancel_event (用户打断/超时) ctx.cancel() 协作取消 已生成内容保留 + 状态存档 stream_closed (不丢已收 delta)

4.2 主流方案对比

(见 §4.1 协议对比表,补充取舍:)

  • SSE 而非 WebSocket 的理由:绝大多数 Chat 场景是"服务端单向推",SSE 基于 HTTP、天然穿过代理/CDN、断线自动重连,无需独立长连接服务;WebSocket 的双向能力在"用户要回控(如中途改指令)"时才必需。
  • gRPC 内部流 的理由:后端 Agent 内部多组件(规划器/执行器/工具代理)需双向低延迟通信,gRPC 的强类型与流式原生支持优于 JSON over HTTP。

4.3 生产级实现

Anthropic 规范事件流结构(前端据此逐块渲染,含 tool_use 块以支持"边生成边调工具"):

data: {"type":"message_start","message":{...}}
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" world"}}
data: {"type":"content_block_stop","index":0}
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"}}
data: {"type":"message_stop"}
data: [DONE]

协作式取消(Python 生成器骨架),对接第 2 章中断:

async def stream_agent(task, ctx):
    async for delta in ppaor_loop(task, ctx):   # 第 1 章循环
        if ctx.is_cancelled():                  # 每步检查取消信号
            yield {"type": "stream_closed", "kept": buffer}
            return                               # 优雅退出,已生成内容已在 buffer
        buffer.append(delta)
        yield {"type": "content_block_delta", "delta": delta}

# 中断类型映射
# 用户主动中断  -> 前端发 cancel_event -> ctx.cancel()
# 系统超时      -> 服务端 timeout -> ctx.cancel() (gRPC deadline)
# Kill Switch   -> 全局标志位 -> 所有 ctx 共享状态置位

中断后"不丢消息"的续传机制:每个 delta 携带 sequence_id,客户端记录已接收最大 sequence;中断重连后从 sequence+1 续传。结合 Anthropic Prompt Caching 可把重连的上下文成本压到最低。

生产怎么配、坑在哪

  • 坑 A:中断=直接断 TCP。 用户一点取消,连接断了,已生成内容全丢、状态没存档。必须改成协作式 cancel() + Checkpoint 存档(第 2 章)。
  • 坑 B:前端没处理 SSE 重连。 网络抖断后不重连就空白。SSE 自带 EventSource 自动重连,但要配 sequence_id 续传否则重复/丢失。
  • 坑 C:边生成边调工具时前端卡住。 收到 tool_use 块时前端若继续渲染文本会错乱。正确做法:收到 tool_use 暂停渲染→调工具→把结果作为下一 content_block 注入。

4.4 实战复盘

来自 MJ Nexus OS 语音 Agent 与流式 Chat 经验。

坑 1:语音 Agent 的 Barge-in 做成"回声"。 用户打断时我们 TTS 还在播、新 ASR 又进来,出现"Agent 和自己打架"。根因是没在 VAD 端点检测后硬规则立刻停 TTS。加 VAD end-of-speech → 停止 TTS → 切 ASR 后解决。教训:Barge-in 不是"软优先级",是"打断即停"的硬切换,否则体验灾难。

坑 2:流式中断后前端丢半句话。 用户取消时,已流式到前端的最后半句因没 sequence_id 而无法续传,重连后整段重来。引入 sequence 续传 + Checkpoint 存档后,重连只补未收到的尾部。教训:流式的"可恢复"和状态机的"可恢复"是同一个 Checkpoint 能力的两面。

决策复盘:SSE 还是 WebSocket? Chat 场景我们坚定用 SSE(简单、易重连、CDN 友好);仅语音/协作这类"用户需中途回控指令"的场景才上 WebSocket。不因为"WebSocket 更先进"就全场统一。


4.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
协议选型 “为什么用 SSE 不用 WebSocket?” SSE=HTTP 友好+自动重连+单向够用(Chat 默认);WebSocket 双向但重、需独立服务;内部用 gRPC
边生成边调工具 “流式中如何实现边生成边工具调用?” 用 tool_use 块;前端收此块暂停渲染→调工具→结果作新 block 注入;OpenAI 用 tool_calls 同理
中断不丢消息 “流式中断后如何保证前端不丢消息?” 每 delta 带 sequence_id + 客户端记最大 seq + 重连续传;结合 Prompt Caching 降本
协作式取消 “强制断连和协作取消区别?” 强制断连丢状态丢消息;协作式 cancel() 贯穿调用栈、保留已生成内容+Checkpoint 存档
Barge-in “语音 Agent 怎么支持用户打断?” VAD 端点检测 + 打断即停 TTS + 切 ASR;是硬切换不是软优先级
中断类型 “有哪些中断类型?分别怎么实现?” 用户主动(WebSocket 控制帧)/系统超时(gRPC deadline)/优雅(ctx.is_cancelled)/强制(断连)/Kill Switch(全局标志)

第二部分:记忆与知识系统

5. 完整记忆系统架构

5.0 本章上下文与知识地图

本章承接第 1–4 章的 Agent 运行时与工具调用基础,首次把"状态"从无状态的单轮对话提升为有持久状态的智能体(Stateful Agent)。第 5 章给出的五层记忆模型,是第 6 章"检索与遗忘"的数据组织前提,也是第 7 章 RAG 知识库的"语义/归档记忆"落点;后续章节的规划与多 Agent 编排都依赖本章定义的记忆读写契约。工程痛点在于:上下文窗口(Working Memory)容量有限且随对话增长而"失忆",需要把高价值信息可靠地沉淀到长期存储,并在正确时机以正确预算召回。

5.1 核心概念与原理

What —— 什么是 Agent 记忆系统? 记忆系统是把对话与任务中产生的信息,按"容量 / 速度 / 持久性"分层存储、按需召回的机制。它让 Agent 突破单次上下文窗口的物理上限,实现跨轮次、跨会话甚至跨用户的连续性。

Why —— 为什么必须分层? 人类认知科学(Atkinson–Shiffrin 记忆模型)早已证明:不同信息有不同的生命周期与访问频率。若把所有信息都塞进上下文窗口,会产生三类成本:(1) 金钱成本——每轮都把全量历史重新喂给模型,token 费用随对话长度线性甚至平方级增长;(2) 注意力稀释——无关早期信息挤占有限上下文,降低模型对当前任务的聚焦(“Lost in the Middle” 现象);(3) 延迟成本——长上下文的首 token 延迟(TTFT)显著上升。分层的核心动机正是"用低成本存储换高成本上下文",并按信息价值动态分配稀缺的上下文预算。

设计权衡:分层存储引入了"写入 / 召回"两条额外管线(见 §5.3、§5.4),带来一致性、延迟与成本的三角权衡——写得太勤会拖慢对话、写得太粗会漏掉关键信息;召回太多会稀释注意力、太少会"失忆"。

记忆五层模型(对齐人类认知):

层级 容量 速度 例子 Agent 对应 典型技术
Working(工作记忆) 7±2 项 极快 当前对话上下文 上下文窗口 KV-Cache、Prompt Cache
Session(会话记忆) 一会话 整次会话 会话表 SQLite / Redis
Episodic(情景记忆) 数千 “上周问了 X” 时间索引 向量库 + 时间戳
Semantic(语义记忆) 数十万 “用户是 PM” 知识图谱 Kuzu / Neo4j
Procedural(程序记忆) 数十 极快 “如何调工具” Skill / Tool Skill 定义
Archival(归档记忆) 无限 历史全量 对象存储 S3 / 向量库冷层

2026 趋势:Berkeley 2026-04 研究指出长期记忆是 Agent 落地的关键瓶颈,约 67% 企业计划部署五层记忆架构(行业调研示意,落地以实际为准)。Mem0 2026-02 论文同期给出量化收益:长期记忆使 p95 延迟降低 91%、token 节省 90%、LongMemEval J-score 0.51 vs 0.22。

2026 H2–2027 前瞻:随 1M+ token 上下文模型普及,Working / Session 两层的部分职能会被"长上下文 + Prompt Cache"吸收;但 Semantic / Episodic / Procedural 三层(“该记住什么、记住多久、怎么用”)不会被取代,记忆系统将从"全量召回"演进为"门控召回 + 锚点常驻"。

记忆系统整体数据流(Mermaid):

召回管线(§5.4 / 第6章)

写入管线(§5.3)

读写

对话轮次

触发器

LLM 信息抽取

去重/合并/冲突解决

分层存储

用户查询

多路召回: 向量/关键词/图谱/时间

重排 Cross-Encoder

Token 预算分配

注入 Prompt

5.2 主流方案对比

2026 年记忆框架已从"玩具 demo"进入生产评估期,核心差异在架构范式(向量 vs 图谱 vs 混合)、时间推理能力、自托管友好度、以及 LongMemEval 基准得分

框架 架构 时间推理 图记忆 自托管 开源 LongMemEval(J) 适合场景
Mem0 混合(向量+图谱+KV) Pro $249/月 Apache 2.0 49.0% 通用、LangChain 生态
Zep 时间知识图谱 ★★★★★ 原生 复杂 Graphiti OSS 63.8% 时间敏感任务
Letta (MemGPT) OS 式分页调度 LLM 决定 Apache 2.0 N/A 超长上下文(百万级)
Cognee 多存储 + 自定义图 部分 原生 Apache 2.0 N/A 强知识图谱需求
LangMem LangChain 原语 MIT N/A 已用 LangChain
Evermind.ai Engram 生命周期 原生 Docker 83.0% 高个性化
shodh-memory 神经科学启发 ✓(5 机制) ✓ 扩散激活 ✓(30MB 单文件) Apache 2.0 N/A 边缘 / 隐私
Supermemory Memory API + RAG 有限 N/A SaaS 快速接入
MJ Nexus OS 自研 五层 + Kuzu 图谱 部分 内置 - 桌面本地优先

取舍分析(何时选哪个)

  • 通用起步:选 Mem0——生态成熟、接入快,但时间推理弱、图谱能力需付费。
  • 时间敏感(“上周你说过…”“三个月前的决策”):选 Zep / Graphiti,时间知识图谱是壁垒。
  • 超长上下文(单会话百万 token):选 Letta 的 OS 式分页,把上下文当"内存"换入换出。
  • 强关系推理(法律 / 家谱 / 供应链):选 Cognee 或自研图谱。
  • 边缘 / 隐私:shodh-memory 单文件 30MB 可离线,神经科学启发的衰减更符合人类记忆。
  • 决策树时间敏感 → Zep超长上下文 → Letta强图谱 → Cognee通用 / 快接入 → Mem0本地优先桌面 → MJ Nexus OS 五层

5.3 生产级实现

写入流程(生产怎么配、坑在哪):

对话轮次 → 触发器 → 信息抽取(LLM) → 去重合并 → 编码入库
├─ 每轮结束    ├─ NER 实体抽取
├─ 关键事件    ├─ 关系抽取            ├─ 重复:合并(保留更详细)
└─ 用户标记    ├─ 偏好检测            ├─ 矛盾:覆盖(valid_from/valid_to)
              └─ 置信度评估          └─ 未知:暂存待确认

冲突解决策略(源 §5.5,生产必备):

场景 策略 实现
重复 合并(保留更详细) 向量相似度 > 0.95
矛盾 时间戳新覆盖旧 valid_from / valid_to
置信度低 标记待确认 下次出现时强化
用户纠正 立即更新 + 记录历史 correction_count

生产配置样本(YAML,注解"坑在哪"):

memory:
  write:
    # 触发器策略:每轮抽 vs 每 N 轮 vs 事件驱动
    trigger: "event_driven"        # 坑1:每轮都抽成本高 3x(Anthropic 2026-04)
    event_keywords: ["记住", "我叫", "搬到", "偏好"]  # 仅命中才抽,省 ~70% 写入成本
    batch_every_n_turns: 3         # 兜底:至少每 3 轮抽一次,防漏
  extract:
    llm: "claude-haiku"            # 坑2:抽取用 haiku 而非 opus,成本降 ~10x
    schema: [entity, relation, preference, confidence]
    dedup_threshold: 0.95          # 向量相似度 > 0.95 视为重复
  conflict:
    strategy: "timestamp_override" # 新时间覆盖旧(上表)
    keep_history: true             # 坑3:纠正要留痕 correction_count + 审计
  storage:
    working: "prompt_cache:1024"   # 工作记忆走 Anthropic prompt cache 1K 门槛
    session: "sqlite"
    episodic: "qdrant"
    semantic: "kuzu"               # 图谱存储语义记忆
    archival: "s3_cold"

关键坑

  • 抽取频率:Anthropic 2026-04 经验——LLM 抽取比规则抽取多 20% recall,但成本高 3x。务必用"事件触发 + 定时兜底"平衡。
  • 抽取模型:用 cheap model(haiku)做抽取,不要把 opus 浪费在 NER 上。
  • 写入即污染:未经校验直接入库,会把用户口误 / 玩笑变成"事实"。写入前建议 LLM 二次校验 + 高置信记忆人工确认(见 §6.4 合规遗忘与审计)。

5.4 实战复盘

来自 MJ Nexus OS 记忆体系与通用 Agent 项目的真实经历。

坑 1:每轮都"全量写记忆"拖垮对话。 早期我们每轮结束都跑一次 LLM 抽取,用户感知到"打字停顿变长"(每次 +800ms),账单也暴涨。后来改事件触发 + 每 3 轮兜底,写入成本降约 70%,对话流畅度恢复。教训:记忆写入是后台活,绝不能以牺牲实时性为代价——触发器设计优先于抽取质量。

坑 2:召回把"三个月前的闲聊"顶掉了"用户是 PM"的关键事实。 多路召回按相似度排序,用户问"帮我写周报"时,一堆旧对话碎片挤占了上下文,真正的身份事实反而被裁掉。我们加了 §6.2 的重要性评分(user_marked 权重 0.15 + relevance),并对身份类记忆做"常驻白名单"不参与预算竞争。教训:召回不是越相关越好,要把"用户是谁"这类锚点记忆提升到预算分配的最高优先级。

坑 3:用户纠正后记忆"阴魂不散"。 用户说"我不住上海了",但我们只覆盖没留痕,后续生成仍偶尔引用旧值。补上 correction_count + 保留历史版本后,模型在生成时会优先采信被纠正过的新值。教训:记忆系统必须有版本与纠正计数,否则"被遗忘权"和"纠错"都形同虚设。

5.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
五层记忆模型 Agent 记忆分几类?分别存什么? Working→上下文窗口;Session→SQLite;Episodic→向量+时间索引;Semantic→知识图谱;Procedural→Skill;Archival→对象存储。强调"按容量/速度/持久性分层"的动机是省 token、抗注意力稀释
框架选型 Mem0、Zep、Letta 怎么选? 决策树:时间敏感→Zep;超长上下文→Letta;强图谱→Cognee;通用→Mem0。能讲清 LongMemEval 差异(Evermind 83% vs Mem0 49%)背后的架构原因
写入触发 记忆写入时机? 每轮(贵)/ 每 N 轮(平衡)/ 关键事件(“我搬到上海”)/ 用户标记(“记住这个”)。生产用"事件触发+定时兜底"
防污染 如何避免记忆污染? 写入前 LLM 二次校验、关键记忆人工确认、定期审计评分、用户可视化编辑("我的记忆"页)
ROI 计算 记忆系统 ROI 怎么算(PM 题)? 加:留存↑、个性化满意度↑;减:存储↑、延迟↑、隐私风险↑。度量:个性化命中率、记忆调用转化率

6. 记忆检索与遗忘机制

6.0 本章上下文与知识地图

本章是第 5 章"存储"落定后的"取用与淘汰"闭环:§5.3 / §5.4 已定义写入与召回的骨架,本章深入召回算法选型、重要性评分、时间衰减与遗忘策略,并直接为第 7 章 RAG 的检索层提供算法底座(混合检索、重排、预算)。同时,遗忘机制中的"合规遗忘"是数据治理(GDPR / 个保法)的硬约束,生产不可绕过。工程痛点在于:相似度不等于重要性,召回越多越稀释注意力;而"该忘的不忘"既撑爆存储,又带来隐私与法律风险。

6.1 核心概念与原理

What —— 召回(Retrieval) 是把查询映射成"该注入哪些记忆"的算法集合;遗忘(Forgetting) 是主动 / 被动移除低价值或受监管信息的生命周期管理。

Why —— 仅用向量检索会遇到两个本质盲区:(1) 关键词盲区——用户用精确专有名词(订单号、报错码)查询时,向量检索语义模糊反而召回错误;(2) 关系盲区——多跳推理(“A 的朋友的供应商”)向量无法表达。因此需要"多路召回 + 融合"取长补短。遗忘的动机来自认知科学"遗忘是记忆系统的特征而非缺陷"——主动遗忘释放预算、降低噪声、满足合规。

设计权衡:多路召回越多越准,但工程复杂度与延迟越高;时间衰减平滑但 λ 难调(半衰期设错会让偏好"过早遗忘"或"永不老化")。

遗忘策略(人类认知对齐)

策略 机制 适用
被动遗忘 重要性降低、自然被排除 通用
主动遗忘 显式删除 / 归档 合规、容量控制
合并遗忘 多条合并为摘要 知识固化
合规遗忘 GDPR / 个保法要求 必做

多路召回 + 融合示意(Mermaid):

用户查询

向量检索 HNSW 语义相似

关键词 BM25 精确匹配

图谱遍历 BFS/DFS 多跳

时间索引 近期优先

RRF 倒数排名融合

Cross-Encoder 重排

Token 预算裁剪

注入 Prompt

6.2 主流方案对比

算法 原理 优点 缺点 适用
向量检索(HNSW) ANN 近似最近邻 语义相似、规模好 关键词弱、需 Embedding 主流默认
关键词(BM25) TF-IDF 词频 精确匹配、零成本 无语义、近义词失效 补盲
图谱遍历 BFS / DFS 多跳关联推理 复杂度高、建图贵 关系推理
混合(RRF) 多路倒数排名融合 取长补短、鲁棒 实现复杂、需调权 生产级首选

RRF 公式score(d) = Σ 1/(k + rank(d)),k 常取 60,对每路召回的排名取倒数求和,不依赖各路分数量纲——这是它比加权求和更稳的原因。

何时选哪个:通用问答用"向量 + BM25 混合 + RRF";关系密集型(法律 / 家谱)加图谱遍历;成本敏感的边缘场景可只留 BM25 + 轻量向量。

6.3 生产级实现

重要性评分(决定"哪些记忆挤进有限预算"):

# 生产级记忆重要性评分(用于召回后预算裁剪)
def importance(memory, query):
    return (
        0.30 * recency(memory)             # 时近性:指数衰减(见下)
        + 0.20 * frequency(memory)         # 访问频率:被召回次数
        + 0.25 * relevance(query, memory)  # 与当前查询相关度(Cross-Encoder)
        + 0.15 * user_marked(memory)       # 用户显式标记"重要"
        + 0.10 * confidence(memory)        # 来源置信度(抽取时评估)
    )
# 坑:相关度权重过高 → 旧但重要的身份记忆被裁;建议 user_marked 兜底 + 锚点白名单

时间衰减模型(指数衰减):

score(t) = base * exp(-λ * Δt)    # Δt = 当前时间 - 记忆时间
记忆类型 λ 半衰期
偏好 0.005 138 天
事件 0.02 35 天
闲聊 0.1 7 天

记忆固化(借鉴人类睡眠,离线任务):1) 低峰期跑合并;2) 基于长期访问模式重评重要性;3) 高频共现建边;4) 长尾记忆压缩为"经验"摘要;5) 低价值归档 / 删除。

生产配置样本

retrieval:
  recall:
    routes: [vector, bm25, graph, temporal]
    vector: { index: hnsw, ef_search: 128 }
    bm25: { index: "tantivy" }
    fusion: { method: rrf, k: 60 }
  rerank:
    model: "cross-encoder/bge-reranker-v2"   # 坑:重排模型要领域微调,通用模型对专业词弱
    top_k: 20
  budget:
    max_tokens: 4000            # 注入 Prompt 的记忆预算
    anchor_whitelist: ["user_role", "user_name"]  # 锚点记忆常驻,不参与竞争
  decay:
    prefer_power_law: true      # shodh-memory 用 Wixted 2004 幂律,更贴合人类记忆
  consolidation:                # 记忆固化(离线)
    schedule: "0 4 * * *"       # 每天低峰期
    merge_low_value: true

关键坑

  • 衰减 λ 不能全局一套:偏好半衰期应为事件的数倍,否则用户"是 PM"这种稳定事实会被过早遗忘。
  • 重排模型(Cross-Encoder)是质量分水岭,但需领域微调;通用 reranker 对医疗 / 法律专有词弱。

2026 H2–2027 前瞻:长上下文模型(1M+ token)会吃掉一部分 Working / Session 记忆需求,但语义 / 情景 / 程序记忆的分层与衰减逻辑不会消失——长上下文解决"看得见",解决不了"该不该看、看多久"。预期出现"长上下文 + 轻量记忆路由"的混合架构,记忆系统从"全量召回"转向"门控召回 + 锚点常驻"。

6.4 实战复盘

来自通用 Agent 与 MJ Nexus OS 的记忆生命周期实践。

坑 1:RRF 融合后"相关但不重要"的闲聊压垮了关键事实。 用户问"订机票",多路召回把一年前的旅游闲聊排到了身份事实前面。加了 §6.3 的重要性评分 + 锚点白名单后才稳。教训:融合解决"召得全",重要性评分解决"排得对"——两步都不能省。

坑 2:GDPR / 个保法"被遗忘权"只删了主库,没删 Embedding 和备份。 用户注销后我们级联删了 DB,但向量库里的 embedding、备份快照、日志缓存仍含其数据,被合规扫描抓出。补了"定位所有副本 → 级联删除 → 派生数据清理 → 周期审计"四步。教训:遗忘不是删一行,是删一个数据图——Embedding、聚合特征、日志都是副本。

坑 3:遗忘策略只有"被动",导致存储无上限增长。 起初只靠重要性自然衰减,但冷数据永远占着热存储。引入"合并遗忘"(多条→摘要)+ 低峰期固化任务后,存储成本降约 40%。教训:遗忘要主动 + 被动组合,像人类睡眠一样定期"整理记忆"。

6.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
混合检索 为什么用混合检索? 向量语义但关键词弱、BM25 精确但无语义、图谱多跳但慢;RRF 倒数排名融合取长补短且不依赖分数量纲(k=60)
合规遗忘 GDPR "被遗忘权"怎么实现? 定位所有副本(DB / 备份 / 向量库 / 日志 / 缓存 / Embedding)→ 级联删除 + 审计日志 → 清理派生数据(聚合、特征)→ 周期审计 + 第三方扫描
记忆压缩 压缩会不会丢信息? 会,但目标是最小化"可恢复性损失":关键事实外提、冗余丢弃、长尾归档。引用 Mem0 2026-02:91% p95 延迟↓、90% token↓、LongMemEval J 0.51 vs 0.22
时间衰减 半衰期怎么设? 按记忆类型分级:偏好 138 天、事件 35 天、闲聊 7 天;生物启发可用幂律(Wixted 2004)更贴合人类记忆

7. RAG 知识库与检索增强

7.0 本章上下文与知识地图

本章把第 5–6 章的"记忆"范式推广到外部知识——RAG(Retrieval-Augmented Generation,检索增强生成)本质是用"语义 / 归档记忆"为模型动态注入私有、时效、可溯源的知识。它直接复用第 6 章的混合检索与重排算法,并解决"模型不知道的最新 / 私有事实"。后续的 Agentic 检索与多步推理都以此为基础。工程痛点在于:检索质量差会直接"垃圾进垃圾出",而 GraphRAG 等高阶模式成本与收益边界模糊,容易 overkill。

7.1 核心概念与原理

What —— RAG 在生成前先从知识库检索相关片段注入上下文,使模型基于"带出处的事实"作答,而非仅凭参数记忆 hallucinate(幻觉)。

Why —— 三类替代方案各有硬伤:(1) Fine-tuning(微调) 把知识烧进权重,更新需重训、不可溯源、成本高;(2) Long Context(长上下文) 把知识塞进 Prompt,改 Prompt 即可更新但 token 贵、且超长上下文存在"Lost in the Middle"注意力衰减;(3) RAG 检索即更新、可溯源、成本中,是动态 / 私有知识的主流。因此生产常取 RAG + FT 兼顾(RAG 供知识、FT 调风格)。

方式 更新 成本 延迟 可溯源 适用
RAG 实时 动态 / 私有知识(主流)
Fine-tuning 重训 风格 / 格式
Long Context 改 Prompt 短期知识
RAG + FT 兼顾 生产级

2026 H2–2027 前瞻:随 1M–10M token 上下文普及,RAG vs Long Context 的边界正在移动——对于"中等规模、变化不频繁"的知识,长上下文可能直接替代 RAG;但超大规模、强时效、需可溯源 / 合规留痕的场景,RAG 仍不可替代。预期趋势是"长上下文做近场、RAG 做远场"的分层。

RAG 流水线(Mermaid):

在线检索

离线索引

向量

文档 PDF/Word/MD

解析 Unstructured/Docling

清洗 + 分块 语义/父子

向量化 BGE-M3/OpenAI

向量库 pgvector/Qdrant/Milvus

查询

改写 HyDE/Query Rewrite

多路召回 向量/BM25/图谱

重排 Cohere/BGE Rerank

Token 预算

LLM 生成 + 引用

7.2 主流方案对比

模式 提出 核心思想 适用 成本信号
Self-RAG Akari 2023 LLM 自评检索质量、按需检索 高精度 中(多一次 LLM 判断)
Corrective RAG (CRAG) Yan 2024 检索后用 LLM 纠错 / 回退 容错场景
GraphRAG Microsoft 2024 知识图谱 + 社区摘要 全局 / 多跳问题 高($5–10/1K docs)
Agentic RAG 2025 Agent 决定何时 / 检索什么 复杂多步任务 中高
HyDE Gao 2022 假设文档嵌入 短 / 模糊查询 低(多一次生成)
RAG-Fusion 2024 多查询融合 + RRF 模糊查询
LazyGraphRAG Microsoft 2026 延迟图构建,索引成本降 0.1% 大规模 极低($0.005–0.05/1K)
DRIFT Search Microsoft 2026 动态推理 + 事实追踪 复杂推理

取舍分析:简单 FAQ / 产品手册用基础 RAG + 混合检索足够;全局性"所有 X 的共性"类问题才上 GraphRAG;预算紧又要多跳,优先 LazyGraphRAG;复杂 Agent 任务用 Agentic RAG 让模型自主决策检索。

7.3 生产级实现

离线索引配置样本 + 知识库版本管理

rag:
  index:
    parsers: { pdf: "unstructured", doc: "docling", md: "llama_parse" }
    chunking:
      strategy: "parent_child"     # 父子块:小块检索、大块喂模型,兼顾精度与上下文
      size: 600                    # GraphRAG 研究:600 token 小块抽实体更多
      overlap: 50
    embed:
      model: "bge-m3"              # 坑1:领域不匹配要微调,通用 embedding 对专业词弱
      dim: 1024
    store: "qdrant"
  versioning:                      # 知识库版本管理(生产必备)
    doc_version: "git-lfs 风格"
    embedding_version: true        # 模型升级必须重建
    chunk_hash: true               # 变更检测
    dual_write: true               # vN + vN+1 并存,逐步切换

在线检索配置样本(含 HyDE / 改写 / 重排)

# 生产级检索增强(伪代码 + 注解)
def retrieve(query: str, top_k: int = 5):
    # 1. 查询改写:用户问法多样,先规范化
    q = rewrite(query)                      # HyDE / Query Rewrite
    # 2. 多路召回
    vec = vector_store.search(embed(q), k=20)
    bm25 = bm25_index.search(q, k=20)
    fused = rrf([vec, bm25], k=60)          # 坑2:单路召回召回率低,必须混合
    # 3. 重排
    ranked = cross_encoder.rerank(q, fused, top_n=top_k)
    # 4. 预算裁剪 + 引用注入
    return budget_truncate(ranked, max_tokens=4000, attach_citation=True)
# 坑3:Top-K 太小 → 召回率不足;太大 → 稀释注意力。生产常 5-10。

GraphRAG 深度(2026 热点):Microsoft GraphRAG 流程为 ① Chunking(600 tokens/chunk)② Entity / Relation Extraction(LLM 抽三元组)③ KG Construction(LPG 标记属性图)④ Community Detection(Leiden 聚类)⑤ Community Summary(LLM 生成社区摘要)⑥ Query(Local 实体邻居子图 / Global 社区摘要 Map-Reduce / DRIFT 动态推理 + 事实追踪)。真实效果:LinkedIn 客服解决时间 −28.6%、Data.world 调研响应精度 3x。成本对比是选型关键:

方案 成本 / 1K docs
传统 RAG $0.01
全 GraphRAG $5–10
LazyGraphRAG $0.005–0.05(索引成本降到 0.1%)

关键坑

  • 分块:过大召回噪声、过小丢上下文;父子块是生产甜点。
  • Embedding 领域适配:医疗 / 法律需微调,否则召回率骤降。
  • 评测闭环:用 RAGAS / DeepEval 持续监控 Faithfulness 与 Answer Relevancy。
  • 版本管理盲区:知识库版本本质是 embedding 版本——模型一换必须全量重建,不是只更新原文。

7.4 实战复盘

来自 RAG 知识库从 0 到生产的建设复盘。

坑 1:RAG "答非所问"根因是分块,不是模型。 上线初用户反馈"检索到的内容不对",我们狂调 prompt 无效。最后发现是 2000 token 大块把多个主题揉在一起,召回噪声大。改父子块(600 检索 / 大块喂入)后 Faithfulness 从 0.62 升到 0.88。教训:RAG 质量 80% 取决于索引工程,先查分块 / Embedding / 召回率,再怀疑生成。

坑 2:GraphRAG 全量构建把索引成本打到 $8/1K docs,老板叫停。 我们为"显得先进"上了全 GraphRAG,但 90% 查询是简单 FAQ,根本用不到图。降级到 LazyGraphRAG(延迟建图)后成本降到 1/100,长尾多跳问题仍可用。教训:GraphRAG 是手术刀不是锤子,先算 ROI 再上,LazyGraphRAG 是性价比甜点。

坑 3:知识库更新后 Embedding 没重建,旧向量还在服务。 我们改了文档但只更新了原文,向量库还是旧 embedding,用户查到的是过期答案。补上"embedding_version + 双写过渡 + chunk_hash 变更检测"后才杜绝。教训:知识库版本管理不是文档版本,是 embedding 版本——模型一换必须全量重建。

7.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
检索质量排查 RAG 检索质量差怎么排查? 顺时针排查:分块质量→Embedding 领域匹配→查询改写→召回率 Top-K→重排。记住"80% 在索引工程"
GraphRAG 选型 何时用 GraphRAG? 强关系(法律 / 医疗 / 金融)、全局问题、多跳推理;简单 FAQ overkill。成本对比:全量 $5–10 vs LazyGraphRAG $0.005–0.05/1K
HyDE HyDE 是什么?何时用? 假设文档嵌入:先 LLM 生成假想答案再嵌入;适合短 / 模糊查询;缺点是有幻觉风险、依赖 LLM 质量
实时更新 RAG 要不要实时更新(PM 题)? 看时效:强实时(股价 / 新闻)流式增量;弱实时(手册)定时批量;平衡 = 核心实时 + 长尾批量
RAG 评测 RAG 评测怎么做? 检索:Recall@K / MRR / NDCG;生成:Faithfulness / Answer Relevancy;端到端:LLM-as-Judge;工具 RAGAS / ARES / DeepEval

第三部分:工具与多模态能力扩展

本部分覆盖《AI Agent 开发技术完全学习指南》最大的一块——第 8–12 章:MCP 工具治理与协议、Harness Engineering 实践、Loop Engineering 工程范式、WASM 沙箱隔离与执行环境、Agent 多模态能力扩展。它承上(模型/上下文/记忆)启下(多 Agent 协作与 A2A 协议),是 Agent 从「能推理」走向「能动手、能落地」的核心工程层。

数据说明:文中下载量、PR 拒率、Benchmark 等数字整理自公开报告与官方公告,仅作趋势示意;部分日期(如 2026-07-28)为规划节点、模型名(如 claude-opus-4.8、gpt-5.4-mini)为示例占位,落地请以厂商当前发布版本与实际指标为准。

8. MCP 工具治理与协议

8.0 本章上下文与知识地图

MCP(Model Context Protocol,模型上下文协议)是 Agent 连接外部工具与数据的「USB-C」。它依赖第 2 章的 Function Calling 原语作为底层传输,又为第 9 章 Harness 的「工具系统层(L2)」与第 11 章 WASM 沙箱提供运行时承载;其 Extensions 机制(MCP Apps / Tasks)直接延展到第 12 章多模态与第 13 章多 Agent 协作。核心工程痛点:工具一旦多了,模型选错、权限失控、审计缺失、协议升级即雪崩——本章给出治理与协议层面的完整解法。

8.1 核心概念与原理

what:MCP 是 Anthropic 于 2024-11 开源的「AI 应用 ↔ 工具/数据」统一协议,把 N×M 的集成收敛为 M+N。它定义了三大原语——Tools(可执行函数,写操作)、Resources(可读数据源)、Prompts(预定义模板)。

why:在 MCP 之前,每个 Agent 对接每个工具都要写一套私有适配,集成复杂度是 N×M。MCP 把「模型侧」与「工具侧」解耦,工具厂商只需实现一次 MCP Server,任何兼容 MCP 的 Agent 即可接入。

2026-07-28 重大改版(划时代)

  1. Stateless Core — 删除 initialize 握手与 Mcp-Session-Id,新增 Mcp-Method / Mcp-Name HTTP header,支持 round-robin 负载均衡(部署拓扑变化,见 §8.4 复盘)。
  2. Extensions Framework — Extensions 升为一等公民:MCP Apps(服务端 UI)、Tasks 长任务扩展(SEP-2663)。
  3. Authorization 强化 — 对齐 OAuth 2.1 + OIDC。
  4. Formal Deprecation Policy — 形式化废弃流程。
  5. Full JSON Schema 2020-12 for Tools — 工具描述完整 JSON Schema。
  6. Roots / Sampling / Logging 标记 deprecated — 应用层需迁移到 Extensions。

生态规模(2026-03):MCP SDK 月下载 9700 万+(18 个月从 100K 超越 React 同期);官方 Registry 服务器 9,652 条;GitHub mcp-server topic 15,926 个仓库;AAIF 成员 190 个组织

2026 H2–2027 前瞻:Extensions 是主战场——MCP Apps(服务端渲染 UI,让 Agent 在对话里直接操作第三方界面)、Tasks(长任务断点续跑,SEP-2663)、EMA(弹性/事件驱动能力,提案中)。协议层已进入稳定期,差异化红利在 Extensions 而非协议本身。

下图把一次真实工具调用串成「Stateless 请求 → 权限决策 → 沙箱执行 → 审计」的最小闭环(即 §8.3 的 Harness Contract):

Tool (MCP Server) WASM 沙箱 PDP (Cedar 策略) Dispatcher 调度器 Loop / Harness Tool (MCP Server) WASM 沙箱 PDP (Cedar 策略) Dispatcher 调度器 Loop / Harness 2026-07 起无 session,header 携带 Mcp-Method / Mcp-Name alt [高风险] [越权] [通过] loop.requestTool(toolId, args) pdp.decide(agent, tool, resource, param) confirm(二次确认) deny(终止 + 审计) allow(scoped 权限) 写入参数 + 路径白名单 + fuel 预算 执行(capability-scoped) 结果(长度前缀编码) 结果 telemetry + 审计日志(append-only, 可回放)

8.2 主流方案对比

方案 A:工具隔离/沙箱强度对比(决定「工具能在多大范围内搞破坏」)

方式 强度 性能开销 启动 适用
同进程 0 信任
子进程+seccomp 1-10ms 通用
WASM 中强 0.1-1ms 插件
Docker 100-500ms 服务端
gVisor 极强 50-200ms 高安全
Firecracker 极强 中高 10-50ms Serverless
远端 RPC 极强 网络 N/A 严格隔离

方案 B:MCP 与 Function Calling 的关系(常被混淆)

维度 Function Calling MCP
层次 模型原生 tool_use 协议 协议层(跨平台、跨模型统一)
厂商差异 OpenAI / Anthropic / Google 各家不一 统一规范
关系 底层传输载体 可基于 Function Calling 传输
生态 绑定单一模型厂商 Anthropic+OpenAI+Google+MS+AWS+Block+Cloudflare 全支持

取舍分析:Function Calling 是「模型怎么表达要调工具」,MCP 是「工具怎么被标准化暴露」。二者不是竞争关系——MCP 把各家 Function Calling 的差异收敛在协议层之下,让同一套工具能被任意模型调用。自研协议边际收益抵不过生态锁死成本(见 §8.4 决策复盘)。

8.3 生产级实现

权限粒度(Action → Tool → Resource → Parameter):生产级 MCP 必须做声明式权限 + 运行时校验,而非「装上就能调」。

Action → Tool → Resource → Parameter
允许调用 → search → HR库 → query="张三"

生产级四要素

  • 声明式权限:工具在 manifest 中声明所需权限(scoped)。
  • 运行时校验:每次调用前经 PDP(Policy Decision Point,如 Cedar)决策。
  • 二次确认:高风险操作(删库、强推)触发 human-in-the-loop。
  • 限额控制:按 agent / tool / resource 做 rate-limit 防滥用。

工具调用审计:每次调用记录 谁 / 何时 / 调了什么 / 传了什么 / 结果 / 为什么不可篡改(append-only + 签名),天然支撑 §10.3 的「会话事件日志作为可回放状态源」。

工具市场与版本治理:官方 Registry(registry.modelcontextprotocol.io);社区 mcp.so / Smithery / PulseMCP(15,930+ 服务器);工具包需签名验证(防恶意);版本管理用 SemVer + 灰度切换

# mcp-server 生产治理清单(节选)
server:
  name: "hr-search"
  version: "1.4.2"                 # SemVer,灰度切换依据
  manifest:
    tools:
      - name: "search"
        inputSchema: "2020-12"     # 完整 JSON Schema 2020-12
        permissions:
          - resource: "hr_db"
            scope: "read:employee:name,dept"   # 声明式最小权限
        risk: "medium"
    extensions:                    # 2026-07 起用 Extensions 替代 Roots/Sampling/Logging
      - type: "tasks"              # SEP-2663 长任务
        capability: "long_running"
  signing:
    key: "registry+org"            # 工具包签名,防止投毒
  governance:
    audit: "append-only+signed"    # 不可篡改审计
    rate_limit: "1000/h/agent"     # 限额防滥用

8.4 实战复盘

以下来自 MJ Nexus OS 插件体系落地的真实经历,不是文档搬运。

坑 1:把 MCP 当「万能胶」一次暴露 40+ 工具。 早期不做筛选,直接把全部工具塞进系统提示词。结果模型在「选工具」上花掉约 30% 的 turn,还频繁调错参数。后来学 Stripe 做工具选择器——按任务 embedding 召回 top-15 再给模型——turn 数与错误率同时下降。教训:工具数量不是越多越好,检索式召回比全量塞进 context 更稳。

坑 2:有状态 MCP 的 session 漂移。 2026-07 之前用有状态 server,水平扩容时 Mcp-Session-Id 漂到不同实例,偶发 401 很难复现。改版后去掉 session、改用 Mcp-Method / Mcp-Name header,LB 才能真正 round-robin。教训:协议改版不只是文档变化,往往是部署拓扑变化,升级前先评估你的负载均衡器。

决策复盘:自研协议 vs 直接上 MCP? 一度想自研一个「更轻」的协议,评估后发现 MCP 已是事实标准(9700 万月下载、7 家大厂支持),自研边际收益抵不过生态锁死成本。最终决策:协议层用 MCP,差异化放在 Extensions(MCP Apps / Tasks)里做——正好对应 §8.1 的 2026-07 改版方向。

8.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
MCP 定位与价值 MCP 是什么?解决了什么问题? Anthropic 开源的 AI 应用↔工具/数据协议;把 N×M 集成收敛为 M+N;类比「AI 时代 USB-C」;已 9700 万月下载
三大原语 MCP 三大原语区别? Tools 可执行(写)、Resources 可读(数据)、Prompts 模板(提示词);职责不重叠
2026-07 改版 MCP 2026-07 改版影响? Stateless 化可 LB 横向扩;Extensions 化(MCP Apps/Tasks);Auth 对齐 OAuth2.1+OIDC;Roots/Sampling/Logging→Extensions
与 Function Calling 关系 MCP vs Function Calling 区别? FC 是模型原生 tool_use 协议(各家不一);MCP 是跨平台跨模型协议层;MCP 底层可基于 FC 传输
标准化程度(PM 题) MCP 是否已成行业标准? 是;Anthropic/OpenAI/Google/MS/AWS/Block/Cloudflare 全支持;2026-07 后稳定,投资低风险高收益

9. Harness Engineering 实践

9.0 本章上下文与知识地图

Harness 是包裹模型的「环境 + 约束 + 反馈回路」,Agent = Model + Harness。它依赖第 8 章 MCP 提供工具系统、第 11 章 WASM 提供沙箱,又为第 10 章 Loop 提供运行时骨架。核心痛点:同一个模型,换一套 Harness 质量可从 6.7% 飙到 68.3%——Agent 的上限不只取决于模型,更取决于 Harness 的精巧程度。本章给出六层架构、⟨C,A,R⟩ 形式化分解与 research/production 二分。

9.1 核心概念与原理

核心公式Agent = Model + Harness。2026-03 LangChain 的 Vivek Trivedy 明确提出:Agent 质量不在于模型多强,而在于 Harness 多精巧。量化证据——同一模型仅改变 Harness 接口格式,Can.ac 实验从 6.7% → 68.3%;LangChain 换 Harness,Terminal Bench 2.0 通过率从 52.8% → 66.5%。

Harness 解决三个根本问题:① 环境残缺(Agent 需要正确的工具、信息、权限);② 行为边界(无约束的 Agent 像无缰绳的马);③ 反馈回路(无闭环验证的 Agent 无法自纠)。

六层架构:L1 信息边界层(AGENTS.md 免疫系统)、L2 工具系统层(工具选择器 + MCP)、L3 执行编排层(Plan-Build-Verify-Fix + Blueprint)、L4 记忆与状态层(跨会话记忆)、L5 评估与观测层(Generator-Evaluator 对抗)、L6 约束恢复层(YOLO 三级分类 + 预算熔断)。

⟨Control, Agency, Runtime⟩ 形式化分解(南洋理工 + 阿里,2026 理论骨架):

  • C — Control(持久制约物):AGENTS.md、架构规则、linter、权限策略、验收标准。人类判断被翻译成机器可读约束。
  • A — Agency(可用动作空间):模型被允许做什么——代码执行、浏览器、文件读写、sub-agent 调度。
  • R — Runtime(动态机制):上下文组装、记忆压缩、断点恢复、审批流、预算管理、执行轨迹记录。

下图把六层架构与 ⟨C,A,R⟩ 对齐,看清「模型如何被 Harness 包裹运行」:

A · Agency 动作空间

allow / scoped

Loop 调度

pdp.decide()

结果

下一轮

约束注入

约束注入

回放 / 续跑

R · Runtime 动态机制

Loop 相位 P-P-A-O-R

护栏 / Checkpoint

记忆 / 预算 / 轨迹

C · Control 持久制约物

AGENTS.md / 架构规则

linter / 权限策略

验收标准 / 预算熔断

LLM Model

工具调度器 Dispatcher

MCP Servers

Sub-agent 调度

策略决策点 (Cedar)

append-only 审计日志

9.2 主流方案对比

研究型 vs 生产型 Harness(显式二分,Anthropic《Scaling Managed Agents》)——这是 2026 年能力分野的关键判断:

维度 研究型 Harness 生产型 Harness
目标 冲能力天花板(多烧 token / 多子代理 / 多评估器) 成本·延迟·安全约束下的稳定交付
状态 transcript / 本地临时文件 外部 session log + checkpoint + 事件历史
上下文 尽量多给 更小、更高信噪比
工具 尽量多接 动态发现 + 按需加载 + scoped 权限
多 Agent 先试并行 / 角色分工 仅高价值可并行任务才用
失败恢复 重试 / 转人工 resume / replay / checkpoint / trace
迭代 加模块 / 加策略 / 加 Agent 跑消融、删掉不再产生收益的策略

平台蓝图的默认基线(maxTurns=30、costBudget=$1、humanCheckpoint 五类)本质是「生产型 Harness」参数;应同时提供 harnessMode: research | production 开关,以「研究档」探索能力上限。

9.3 生产级实现

① Harness 运行时配置(六层完整映射)

# harness.yaml — Agent 运行环境配置(Agent 的运行宪法)
version: "v1"
agent:
  name: "dev-assistant"
  model:
    primary: "claude-sonnet-5"
    fallback: ["claude-haiku", "gpt-5.4-mini"]
    cache_strategy: "1024_tokens"   # Anthropic prompt cache 1K 门槛

# L1 信息边界(C 层):只加载索引,深层文档按需
documentation:
  agents_md: "./AGENTS.md"
  architecture_md: "./ARCHITECTURE.md"
  progressive_disclosure: true

# L2 工具系统(A 层):工具选择器 + MCP + WASM 沙箱
tools:
  registry:
    mcp_servers:
      - name: "filesystem"
        url: "http://localhost:3100/mcp"
        auth: "oauth2"
    max_tools_per_call: 15          # Stripe 风格:从 500 中筛选 15
  sandbox:
    type: "wasm"                    # WASM 沙箱,0.1-1ms 启动
    fuel_limit: 10_000_000          # ≈100ms CPU
    allowed_paths: ["/workspace/src", "/workspace/tests"]
    denied_paths: ["~/.ssh", "/etc", "/var"]

# L3 执行编排(R 层):Blueprint + 循环检测
execution:
  blueprint:
    max_agent_retries: 2            # 概率性节点最多重试 2 次
    checkpoints: true               # 全状态持久化
    worktree_isolation: true
  loop_detection:
    max_same_file_edits: 3          # 同一文件改 3 次 → 换方案

# L4 记忆与状态(R 层)
memory:
  working_limit: "8K tokens"
  session_storage: "sqlite"
  cross_session:
    enabled: true
    progress_file: "./progress.md"
    state_format: "json"

# L5 评估与观测(R 层)
evaluation:
  exit_checklist: true
  trace:
    provider: "langfuse"
    export: "otel"
  evaluator:
    type: "separate_agent"          # 独立评估 Agent(制造者不批改自己作业)
    model: "claude-opus-4.8"

# L6 约束恢复(C 层)
constraints:
  budget:
    max_iterations: 25
    max_tokens_per_run: 500_000
    max_cost_per_run: "$5"
    max_wall_time: "300s"
  safety:
    yolo_classifier: true           # 三级分类:放行/软拒/硬拒
    confirmation_required:
      - pattern: "DELETE FROM"
        risk: "high"
      - pattern: "rm -rf"
        risk: "critical"
      - pattern: "git push --force"
        risk: "high"

② AGENTS.md 免疫系统(Harness 最高 ROI 实践):Agent 启动时自动加载;把它当「免疫系统」——每犯一次错加一条规则;渐进式文档披露(OpenAI 仓库有 88 个深层文档),不一次性全量加载降低噪声;命令优先(Agent 执行命令比读文字更准确)。

③ Blueprint 模式模型不运行系统,系统运行模型。用确定性代码跑 linter / 推代码 / 创建 PR,与概率性 Agent 弹性(实现、修 CI)交替;中间状态全持久化,任何节点可恢复。

④ Build-Verify 闭环(Plan-Build-Verify-Fix):防 Agent 对「第一个合理方案」产生偏见;退出前检查清单拦截过早结束;循环检测注入「换方案」上下文;推理预算三明治(规划↑→实现→验证↑)。

2026 H2–2027 前瞻harnessMode: research|production 将成为 Agent 平台标配;模型每升级一次,Harness 策略需重新定价(见 §9.4 消融删冗)。

9.4 实战复盘

坑 1:把 Harness 当「补丁墙」,护栏越加越多。 早期每遇到一次失败就加一条硬规则,三个月后 AGENTS.md 膨胀到 400+ 行、约束层有 9 个分类器,结果正常任务的误杀率升到 18%。后来按 Anthropic「harness strategies get repriced every time the model upgrades」做消融——模型升级后跑回归,删掉不再产生收益的 4 个分类器,误杀率回到 3%、token 成本降 12%。教训:Harness 是补偿面,模型变强就要主动拆除补偿,迭代纪律是「删冗」而非「堆料」。

坑 2:评估 Agent 与干活 Agent 用同模型,自己批改自己。 一度让 sonnet 既写代码又当评审,PR 质量肉眼可见下滑。改成「实现用 haiku、评审用 opus-4.8」的制造者↔审查者分离后,漏判率从 22% 降到 6%。教训:制造者不批改自己作业,是 L5 评估层的最低成本护栏。

决策复盘:研究档 vs 生产档何时切换? 探索新能力(如多模态 CUA,第 12 章)时用 harnessMode: research 放开预算冲天花板;一旦能力验证可行,立即切回 production 收紧成本/延迟/安全。我们用这个开关把新功能的试错成本压低了约 40%。

9.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
核心公式 Harness Engineering 核心是什么? Agent=Model×Harness;解决环境/约束/反馈三问题;量化 6.7%→68.3%(Can.ac)
AGENTS.md AGENTS.md 怎么工作? 启动自动加载;犯错加规则(免疫系统);渐进式披露;命令优先
Blueprint 模式 Blueprint 模式是什么? 确定性代码(linter/PR)与概率性 Agent(实现/修 CI)交替;模型不运行系统,系统运行模型
⟨C,A,R⟩ 形式化 Harness 怎么形式化分解? C=Control 持久制约物(AGENTS.md/linter);A=Agency 动作空间(工具/sub-agent);R=Runtime 动态机制(记忆/预算/轨迹)
research/production 二分 研究型 vs 生产型 Harness 区别? 目标/状态/上下文/工具/恢复/迭代六维差异;平台应提供 harnessMode 开关
消融删冗 模型升级后 Harness 怎么调? 跑消融实验,删除不再产生收益的护栏/子代理/评估器,形成「升级→重定价→删冗→回升」闭环

10. Loop Engineering 工程范式

10.0 本章上下文与知识地图

Loop Engineering 是「构建驱动 Agent 运行的系统,而非写单个 prompt」。它把第 9 章 Harness 作为被调度的运行时,用第 8 章 MCP 工具与第 11 章 WASM 沙箱作为执行肢体,并直接延展到第 13 章多 Agent 编排。核心痛点:手动 prompt 一个 coding agent 是 2025 年的做法——2026 年人应该退出循环内部、成为 Loop 的作者(Loop = Cron + 决策器)。

10.1 核心概念与原理

核心思想:Loop = Cron + 决策器。模型降格为子程序,人升格为 Loop 的作者。

  • “你不应该再手动 prompt coding agent 了。你应该设计 loop 来 prompt 你的 agent。” — Peter Steinberger
  • “我不再 prompt Claude 了。我写 loop 让它们运行,loop 去 prompt Claude 并决定下一步做什么。我的工作是写 loop。” — Boris Cherny(Claude Code 负责人)

演进史(ReAct → Loop):ReAct(2022 推理+行动) → AutoGPT(2023 全自主但易失控) → Ralph Loop(2025 结构化循环验证) → /goal 与 /loop(2026 声明式目标+自动循环) → 多 Agent 编排(2026,复杂度指数增长)。

补偿面迁移:Harness 本质是对模型当前缺陷的补偿面;模型变强时应拆除不必要组件(Anthropic 拆掉 Context Reset/Sprint Contract;Cursor 单变量调工具粒度让 15 个模型提升 5–14 分)。形成「变强→变轻→更快→再变强」正向循环。

下图把「真实 Loop 的形状」建模为带终止条件与预算熔断的状态机:

通过

不通过

否且未超预算

超迭代/预算

Automation 定时触发

扫描 issue / CI 失败

写入 progress.md (State)

Loop 取最高优先级任务

创建 worktree (隔离)

Sub-agent A 实现 (fast model)

Sub-agent B 审查 (strong model)

开 PR + 关联 Linear (Connector)

反馈写回 progress.md

满足 /goal 终止条件?

Loop 终止

终止并升级给人

10.2 主流方案对比

Loop 六原语(Addy Osmani,映射到 Codex 与 Claude Code)

原语 Loop 中的角色 Codex 实现 Claude Code 实现
Automations 定时发现与分诊 Automations tab + /goal /loop + /goal + hooks + GitHub Actions
Worktrees 并行隔离 内置 worktree per thread git worktree + isolation: worktree
Skills 固化项目知识 SKILL.md, $name 调用 SKILL.md, 隐式匹配
Connectors 连接外部工具 MCP Connectors + Plugins MCP servers + Plugins
Sub-agents 审查与制造分离 .codex/agents/ TOML .claude/agents/ + agent teams
State 跨会话记忆 Markdown / Linear AGENTS.md / progress files / Linear

六原语取舍:Automations 解决「何时启动」,Worktrees 解决「并行不打架」,Skills 解决「知识不流失」,Connectors 解决「连得上」,Sub-agents 解决「审查分离」,State 解决「跨会话不丢上下文」。缺任何一环,Loop 在长跑中都会崩。

10.3 生产级实现

示例 1:Claude Code /goal 持续改进 Loop(终止条件由独立小模型判定,制造者不批改自己作业):

/goal "让 test/auth 目录全部通过测试且 lint clean"
# → 自动: 1.运行测试记失败 2.修复 3.重验 4.循环直到全通过或超 25 轮终止

示例 2:Claude Code /loop 定时维护 Loop

/loop --schedule "0 9 * * 1-5" --prompt "
1. 读取 progress.md 找出 P0/P1 issue
2. 检查 CI 是否有失败
3. 对每个问题: a.创建独立 worktree b.派 sub-agent 修复 c.派另一 sub-agent 审查 d.通过→开 PR
4. 更新 progress.md
"

示例 3:Codex Automations YAML

# .codex/automations/ci-triage.yaml
name: "CI 失败自动分诊"
schedule: "0 */2 * * *"
environment: "dev"
tasks:
  - name: "检查 CI 管道"
    action: run_command
    command: "gh run list --branch main --limit 5 --json conclusion,databaseId,displayTitle"
  - name: "分析失败原因"
    action: call_skill
    skill: "ci-triage"
    params: { max_depth: 3, include_logs: true }
  - name: "修复或升级"
    action: agent_loop
    max_iterations: 15
    budget: { max_cost: "$5", max_time: "300s" }
    worktree_isolation: true
    on_complete:
      - action: create_pr
        labels: ["auto-fix", "ci"]
      - action: notify_slack
        channel: "#eng-ci"

示例 4:制造者↔审查者分离的 Sub-agent 编排(Python 伪代码)

async def triage_loop():
    issues = await scan_ci_failures()
    if not issues:
        await append_state("progress.md", "✓ CI 全部绿色")
        return
    for issue in issues:
        worktree = await create_worktree(f"fix-{issue.id}")
        try:
            fix_agent = SubAgent(model="claude-haiku", max_iterations=10,
                                 budget={"cost": "$1", "time": "120s"})
            fix_result = await fix_agent.run(f"修复 #{issue.id}: {issue.title}", worktree=worktree)
            review_agent = SubAgent(model="claude-opus-4.8", max_iterations=1)
            review = await review_agent.run(f"审查修复: {fix_result.diff}", worktree=worktree)
            if review.approved:
                pr = await create_pr(title=f"auto-fix: {issue.title}", body=f"Closes #{issue.id}")
                await notify(f"PR #{pr.number} 已创建")
            else:
                await append_state("progress.md", f"⏳ #{issue.id} 未通过审查: {review.feedback}")
        finally:
            await append_state("progress.md", f"✓ #{issue.id} 处理完成")

会话事件日志作为可回放状态源(生产型第三根支柱):持久状态应放进外部 session event log(事件溯源),不绑定容器;每条记录携带 {ts, actor, toolId, version, decision, sandbox, latencyMs, costUsd},天然支撑断点续跑与失败重放——这是脑手分离、凭据代理之外生产型 Harness 的第三根支柱。

10.4 实战复盘

坑 1:Loop 没有硬终止条件,烧钱空转。 第一个 /loop 忘了设 /goal 终止判定,Agent 在「已通过测试但觉得还能优化」上又跑了 14 轮,单晚烧了 $40。加 max_iterations: 15 + 可验证终止条件后才可控。教训:终止条件和预算熔断不是可选项,是 Loop 的「闸刀」。

坑 2:并行 5 个 Agent,人成了瓶颈。 一度为提速开 5 路并行,结果 5 个 PR 同时砸向唯一审查人,4 个在排队等审、token 白烧。后改为「短生命周期 PR + Sub-agent 初审 + 人只看关键决策」。教训:你的 review 带宽是并行度的真正上限(见 §10.5 编排税)。

决策复盘:制造者与审查者是否要同一模型? 早期为省事共用 sonnet,漏判率高。改为「实现 haiku、审查 opus-4.8」后成本反而更低(haiku 便宜且实现够用,opus 只在审查时贵一次)。教训:分离的不是「人」,是「角色」;用模型梯度匹配角色梯度。

10.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
Loop 本质 Loop Engineering 是什么? 构建驱动 Agent 的系统而非单个 prompt;Loop=Cron+决策器;人从执行者变设计者
六原语 Loop 的六个原语? Automations/Worktrees/Skills/Connectors/Sub-agents/State,分别对应发现/隔离/知识/连接/审查/记忆
补偿面迁移 补偿面迁移是什么意思? Harness 是对模型缺陷的补偿面;模型变强拆组件;变强→变轻→更快→再变强
编排税 编排税(Orchestration Tax)? review 带宽是并行度上限;PR 短生命周期、人值守+无人值守混合、Sub-agent 初审
可回放状态源 生产型 Loop 如何断点续跑? 外部 session event log(事件溯源),记录 {ts,actor,toolId,…},支撑 replay/resume

编排税补充(必考):Anthropic 内部 80%+ 代码由 Agent 写 → 写代码不再是瓶颈,审查才是。AI 生成 PR 被拒率 67.3%(vs 手工 15.6%);工程师日均合并量比 2024 增 8x。你的 review 带宽是并行度的真正天花板。


11. WASM 沙箱隔离与执行环境

11.0 本章上下文与知识地图

WASM(WebAssembly)沙箱是第 8 章 MCP 工具与第 9 章 Harness「L2 工具系统层」的可信执行底座,也为第 12 章多模态插件提供隔离。它依赖宿主语言的运行时(wasmtime/Wasmer),被 Loop(第 10 章)调度执行。核心痛点:插件/工具不可信,但又要快——Docker 太重(100–500ms),同进程太弱(能搞崩宿主);WASM 以 0.1–1ms 启动 + 能力安全拿到平衡。

11.1 核心概念与原理

what:WASM 是一种可移植的字节码格式,配合 WASI(WebAssembly System Interface)构成 capability-based(能力式)安全模型——模块只能看到被显式授予的能力,线性内存保证隔离,WASI 限制可访问的系统调用。

why(vs Docker)

维度 Docker WASM
启动 100-500ms 0.1-1ms
内存 10-50MB 0.1-2MB
跨平台 需 daemon 单文件跨平台
字节码可验证 (线性内存+能力)
桌面分发 (KB 级)

关键机制:① 线性内存(每模块独立,沙箱外不可访问);② Capability Boundary(preopen 目录白名单 + fuel 计费);③ WASI 限制(仅暴露必要 syscall);④ Fuel 计费(防死循环,默认 1000 万 fuel ≈ 100ms CPU);⑤ 路径验证(canonicalize + 拒绝 symlink 防 TOCTOU)。

下图把一次「带 fuel 预算的 WASM 工具执行」建模为带 Trap 的时序:

Module (Plugin) Store (per plugin) wasmtime Runtime Host (Harness) Module (Plugin) Store (per plugin) wasmtime Runtime Host (Harness) alt [fuel 耗尽] [访问非 preopen 路径] [正常完成] loop [每执行一条指令] 加载 module + 设置 fuel=10_000_000 实例化 Store(独立线性内存) 调用 plugin_run(args, preopen=/workspace/src) fuel -= cost Trap(FuelExhausted) ← 防死循环 Trap(CapabilityDenied) 返回结果(长度前缀编码) 结果

11.2 主流方案对比

隔离强度 × 性能 × 适用(全谱系)

方式 强度 启动 适用 备注
同进程 0 信任代码 能直接搞崩宿主
子进程+seccomp 1-10ms 通用 需精心写 seccomp profile
WASM 中强 0.1-1ms 插件/第三方 能力安全,KB 级分发
gVisor 极强 50-200ms 高安全 需完整 POSIX 时用
Firecracker 极强 10-50ms Serverless microVM,隔离强于 Docker
Docker 100-500ms 服务端重负载 生态成熟但启动慢、内存重
远端 RPC 极强 N/A 严格隔离 网络开销,跨信任边界

取舍:信任的 first-party 代码可同进程/子进程;第三方插件默认 WASM;需要完整 POSIX(如跑 ffmpeg 二进制)才降级到 gVisor microVM。WASM 不是「最强隔离」而是「性价比隔离」。

11.3 生产级实现

MJ Nexus OS 插件沙箱落地(插件市场 v2,mj-plugin-sdk:统一 ABI 定义 plugin_init / plugin_run / plugin_cleanup / plugin_alloc / plugin_free;载荷用长度前缀编码(4 字节 LE u32 + UTF-8),配合路径白名单(preopen)+ fuel 计费实现安全隔离。

// 宿主嵌入 wasmtime 的最小骨架(Rust 伪代码)
use wasmtime::*;

fn run_plugin(wasm_bytes: &[u8], args: &str, preopen: &str) -> Result<String> {
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    // ① Fuel 计费:安全网不是性能预算,要小步续期
    store.set_fuel(10_000_000);                 // ≈100ms CPU,耗尽即 Trap
    store.out_of_fuel_trap();

    let module = Module::from_binary(&engine, wasm_bytes)?;
    let linker = Linker::new(&engine);
    // ② Capability Boundary:仅 preopen 白名单目录可见
    // ③ 每次 syscall 重新校验路径(防 symlink/junction 绕过,见 §11.4)
    let instance = linker.instantiate(&mut store, &module)?;
    let run = instance.get_typed_func::<(i32, i32), i32>(&mut store, "plugin_run")?;

    // ④ 长度前缀编码写入线性内存
    let ptr = write_length_prefixed(&mut store, args.as_bytes());
    let out_ptr = run.call(&mut store, (ptr, args.len() as i32))?;
    let result = read_length_prefixed(&mut store, out_ptr);
    Ok(result)
}

生产配置要点:fuel 分层(默认 1000 万,长任务显式申请续期);preopen 白名单 + 每次 syscall 重校验;canonicalize 堵 TOCTOU;WASI 仅暴露必要接口。

2026 H2–2027 前瞻WASM Component ModelWASI Preview 2 成熟后,组件可组合、跨语言互调(插件用 Rust/Go/JS 写都能被同一宿主加载),mj-plugin-sdk 的 ABI 将升级为 Component 接口而非裸函数导出。

11.4 实战复盘

来自 MJ Nexus OS 插件沙箱的踩坑记录。

坑 1:Fuel 设太大导致「慢死循环」。 最初 fuel_limit 给到 1 亿(≈1s),某插件写 while(true) 但每次循环极轻,1s 才 Trap,用户感知是「卡死」。后改为分层:默认 1000 万(≈100ms),长任务显式申请续期。教训:fuel 是安全网不是性能预算,要小步续期。

坑 2:preopen 白名单被 symlink 绕过。canonicalize 堵了 TOCTOU,却忘了 Windows 的 junction 也能绕。最后改成每次 syscall 都重新校验路径,不只在校验入口做一次。教训:能力边界要在执行点持续生效,不能只检查一次。

决策复盘:WASM vs Docker 的边界。 对「信任的 first-party 插件」和「市场装的第三方插件」默认都用 WASM(0.1–1ms 启动);只有当插件需要完整 POSIX 环境(如跑 ffmpeg 二进制)才降级到 gVisor microVM。这个分级在「安全」和「生态兼容」之间拿到平衡——对应 §11.2 沙箱对比表。

11.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
安全模型 WASM 沙箱安全模型是什么? 能力安全(capability-based);模块只看到显式授予的能力;线性内存隔离;WASI 限制 syscall
Fuel 计费 Fuel 计费怎么实现? wasmtime Store::set_fuel/get_fuel;每次执行前设 fuel;耗尽自动 Trap;长任务分阶续期
路径校验 如何防路径穿越/TOCTOU? canonicalize + 拒绝 symlink/junction;每次 syscall 重校验而非仅入口校验
MJ Nexus OS 落地 MJ Nexus OS 怎么用 WASM? 插件市场 v2 mj-plugin-sdk;统一 ABI(init/run/cleanup/alloc/free);长度前缀编码 + preopen + fuel
选型取舍 何时用 WASM 而非 Docker? 需快启动(0.1-1ms)/轻分发/第三方插件用 WASM;需完整 POSIX 降级 gVisor microVM

12. Agent 多模态能力扩展

12.0 本章上下文与知识地图

多模态让 Agent 从「纯文本推理」扩展到看、听、说、操作界面。它依赖第 8 章 MCP 暴露多模态工具(视觉/语音/浏览器)、第 11 章 WASM 隔离多模态插件,并被第 10 章 Loop 编排为长时任务。核心痛点:多模态不是「多就强」,而是「在决策点给对的信息」——盲目全量喂图喂语音,延迟与成本会先崩。

12.1 核心概念与原理

多模态能力矩阵(2026)

模态 输入 输出 主流模型 2026 进展
视觉(VLM) 图像+文本 文本 GPT-5.4 Vision、Claude Sonnet 4.5、Qwen3-VL 多模态推理
语音(ASR) 音频 文本 Whisper v4、Gemini Voice 实时流式
语音(TTS) 文本 音频 ElevenLabs、Cartesia Sonic 情绪控制
视频 视频流 文本/帧 Gemini 2.5 Video、Veo 2 实时分析
代码 代码 代码+执行 Codex、Claude Code 长任务(35h)
浏览器 截图 动作 Computer Use、browser-use 72.5% OSWorld

多模态编排三件套:① 中央模态对齐(CLIP 风格,把不同模态投到统一向量空间);② 模态路由(图像→VLM、音频→ASR/TTS 独立部署);③ 联合 embedding(统一决策空间协作)。这是「中心化对齐」与「去中心化路由」的折中。

语音 Agent 完整链路麦克风 → VAD → ASR → Agent → TTS → 扬声器,关键能力 Barge-in(打断即停 TTS)、Turn-taking(VAD end-of-speech)、Emotion(TTS 情绪)、低延迟(端到端 <1s,首 token <300ms)。

下图把「模态路由 + 专用小模型」编排建模为中央仲裁:

图像

音频

文本

截图

用户输入

模态路由

VLM (视觉)

ASR → Agent → TTS

LLM 决策

Computer Use Agent

中央决策空间 (联合 embedding)

动作 / 回复 / 工具调用

12.2 主流方案对比

Computer Use Agent(CUA)2026 终极对比

框架 厂商 范围 模型 开源 OSWorld 适合
Claude Computer Use Anthropic 全桌面 Claude Sonnet 4.5+ API 72.7% 跨应用工作流
OpenAI CUA OpenAI 网页 GPT-4o variant API(Operator 已合并) 38.1% C 端任务
Gemini Computer Use Google 浏览器 Gemini 2.5 Preview 接近 Sonnet Google 生态
browser-use 社区 浏览器 BYO 模型 MIT(94K star) 60%+ 自托管原型
Stagehand 社区 浏览器 BYO 模型 MIT 80%+ 生产级
Playwright MCP 社区 浏览器 BYO 模型 MIT - MCP 生态
Copilot Studio CUA Microsoft M365 OpenAI CUA + Claude Sonnet 4.5 企业 - 唯一 GA(2026-05-13)

关键事件:2026-05-13 Microsoft Copilot Studio CUA 全 GA(OpenAI CUA + Claude Sonnet 4.5),首个合同级 SLA;Anthropic 仍 beta;Google 仍 preview。

CUA vs RPA:RPA 脚本化、UI 一变就失效;CUA 让 AI 看屏幕、推理、决策。工业界趋势是 CUA 替代约 80% 的 RPA,但复杂、强规则的企业流程仍离不开 RPA。

12.3 生产级实现

① 语音 Agent 链路(低延迟优先)

麦克风 → VAD(端点检测) → ASR(流式) → Agent(决策) → TTS(流式) → 扬声器
关键配置:
  - Barge-in: 检测到用户语音 → 立即中断 TTS 播放(防回声)
  - Turn-taking: VAD end-of-speech 判定说话结束
  - 首 token < 300ms, 端到端 < 1s

② CUA 状态差分截图(降本提速):不做「每步全屏截图」,改为「状态差分截图(只截变化区域)+ 仅关键步骤全屏」,延迟从 1.5s 砍到 600ms、成本降约 60%。

③ 模态路由代码骨架(去中心化部署)

def route_modality(user_input, signal):
    # 按信号路由到专用小模型,而非塞进单一巨模型
    if signal == "image":
        return vlm.describe(user_input)          # 图像→VLM
    if signal == "audio":
        text = asr.transcribe(user_input)
        reply = agent.decide(text)
        return tts.speak(reply, emotion="calm")   # 语音→ASR/Agent/TTS
    if signal == "screenshot":
        return cua.act(user_input)                # 截图→Computer Use
    return llm.decide(user_input)                 # 文本→LLM
# 收益:延迟可控、单点故障不影响其他模态、成本按模态独立优化

2026 H2–2027 前瞻CUA 替代约 80% RPA 是明确趋势;原生多模态大模型(GPT-5.4 Vision、Claude Sonnet 4.5、Qwen3-VL)将把「看+推理+动作」进一步端到端化,但「模态路由 + 专用小模型」在成本/延迟敏感场景仍长期存在。

12.4 实战复盘

来自语音 + CUA 客服原型的复盘。

坑 1:CUA 把「看屏幕」当默认,太贵太慢。 最初每步都截全屏图送 VLM,单次 1.5s、token 成本高。改成「状态差分截图」(只截变化区域)+ 仅关键步骤全屏,延迟砍到 600ms、成本降约 60%。教训:多模态不是「多就强」,是在决策点给对的信息。

坑 2:语音链路 Barge-in 没做好。 TTS 还在播,用户打断时没立刻停 TTS,出现「回声」尴尬。后加 VAD end-of-speech + 「打断即停 TTS」硬规则才解决。教训:语音 Agent 的 Barge-in 是体验底线,不是优化项。

决策复盘:端到端一个大模型 vs 模态路由? 选了「模态路由 + 专用小模型」(图像→VLM、语音→ASR/TTS 独立部署),而非把所有模态塞进一个巨模型。理由:延迟可控、单点故障不影响其他模态、成本按模态独立优化。这是「中心化模态对齐」与「去中心化路由」之间的折中。

12.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
CUA vs RPA Computer Use 与 RPA 区别? RPA 脚本化、UI 变即失效;CUA 看屏推理决策;CUA 替代约 80% RPA,复杂强规则流程仍要 RPA
多模态编排 多模态编排怎么做? 中央模态对齐(CLIP 风格)+ 模态路由(图像→VLM、音频→ASR)+ 联合 embedding 统一决策空间
CUA 商业化(PM 题) CUA 商业化场景? 客服自动化、数据录入、跨 SaaS 集成(无 API)、测试自动化——「人在环外、流程高度重复」最先被吃
语音链路 语音 Agent 关键能力? Barge-in(打断停 TTS)、Turn-taking(VAD)、Emotion、端到端 <1s(首 token <300ms)
降本策略 多模态成本怎么控? 状态差分截图、模态路由到专用小模型、仅在决策点给关键信息,而非全量喂入

第四部分:多 Agent 协作与 A2A 协议

13. 多智能体协作架构

13.0 本章上下文与知识地图

本章承接前面单 Agent 执行循环(ReAct / Plan-Execute)与框架选型,解决"一个 Agent 干不完、干不好"的工程问题;它直接被第 14 章(A2A 跨厂商协作)和第 18 章(执行抽象)依赖——多 Agent 编排本质是把"执行器"(第 18 章)以某种拓扑组合起来。核心痛点:协作模式选错会带来 Orchestrator 瓶颈、token 成本飙升(多 Agent 比单 Agent 多 ~15x)与冲突无法收敛。理解本章的六种拓扑与取舍,是后续接入 A2A 网络的前置条件。

13.1 核心概念与原理

多 Agent 协作(Multi-Agent Collaboration)的本质:把单一复杂任务拆分为若干子任务,交由多个具备不同专长的 Agent(角色,Role)并行或串行完成,再通过某种拓扑(Topology)与通信机制(Communication)聚合结果。为什么不用一个强模型? 因为单 Agent 在上下文长度、注意力稀释、可解释性、故障隔离上存在上限;多 Agent 通过"分工 + 隔离 + 专业化"突破了这些上限,代价是协调开销与成本。

六种主流协作拓扑(Topology)及其设计动机:

模式 拓扑特征 适合场景 工程动机 代表实现
Pipeline(流水线) 串行、数据驱动 数据流 ETL 简单可控、无循环依赖 数据管线
Orchestrator-Worker 中心调度 + N Worker 通用复杂任务 灵活、可动态路由 70% 生产部署
Swarm(群) 无中心、点对点 handoff 简单任务 极简、去中心 OpenAI Swarm
Hierarchy(层级) 树状、Manager/Sub-manager 决策类 职责清晰 CrewAI
Debate(辩论) 正反方 + 仲裁 验证/高风险决策 提高答案质量 学术/评审
Market(市场) 竞价/资源竞争 资源受限 高效分配 拍卖机制

关键设计权衡

  • 中心化(Orchestrator)vs 去中心化(Swarm):中心化可控但 Orchestrator 成瓶颈;去中心化无单点但难保证收敛。
  • 任务分解(Decomposition)方式:2026 主流是「LLM 分解(强模型 Planner)→ DAG 生成 → 拓扑序并行执行 → 强模型聚合」。DAG 让独立子任务天然并行,是有向无环图(Directed Acyclic Graph)而非普通链。
  • 冲突解决(Conflict Resolution):投票(多数决)、优先级(专家 > 通用)、辩论 + 仲裁、降级(人工接管)——这是多 Agent 稳定性最后一道闸。

生成 DAG

生成 DAG

生成 DAG

分歧

用户请求

Planner / Orchestrator
强模型做任务分解

Task A

Task B

Task C

Worker: Researcher

Worker: Analyst

Worker: Coder

Aggregator
结果聚合 + 冲突解决

Arbitrator / Debate

最终交付

2026 H2–2027 前瞻:Orchestrator 正从"硬编码路由"演进为「能力评分路由(capability scoring,基于 Worker 历史成功率)」;预计 2027 年会出现标准化的 Agent 调度协议,使 Orchestrator 能跨组织发现并委托 Worker(与 A2A 深度融合)。

13.2 主流方案对比

框架选型决定了协作模式的表达能力与运维成本:

框架 协作模式 异步 A2A 支持 适合 取舍
LangGraph 状态图(State Graph) 1.0+ 复杂工作流 图建模强、学习曲线陡
AutoGen v0.4+ 对话群(Group Chat) 实验 研究 灵活但生产治理弱
CrewAI 角色 + Process 业务 角色抽象直观、规模受限
OpenAI Swarm Handoff 轻量 极简、无中心协调
Anthropic Agent SDK Sub-agent Coding 深度集成 Claude、单厂商
Google ADK A2A 优先 ✓ 原生 跨厂商 与 A2A 绑定最紧
OpenAgents 网络 ✓ 原生 社区 生态早期

取舍分析

  • 若需要强状态控制 + 可重放:选 LangGraph(持久化 checkpointer)。
  • 若需要跨厂商互操作:选 Google ADK / OpenAgents(A2A 原生)。
  • 若只是轻量 handoff:Swarm 足够,但生产要自己补治理能力。

通信机制对比(也是编排内部的数据通路):

方式 实现 适用 取舍
共享内存 进程内 / 同进程 单进程多 Agent 最快、无序列化,但无隔离
消息队列 Redis / Kafka 跨服务 解耦、可重放,引入运维成本
A2A 协议 JSON-RPC / gRPC 跨厂商 标准化、安全,开销最高
共享状态 State Store(Redis) LangGraph 与状态图天然契合

13.3 生产级实现

角色定义(Role Definition):用结构化字段描述每个 Agent 的专长、目标、工具——这使 Orchestrator 能按能力匹配任务。

# 角色即「能力契约」,Orchestrator 据此做任务路由
researcher = Agent(
    role="高级研究员",                       # 人类可读的专长标签
    goal="收集并验证信息",                    # 该角色的失败/成功判据
    backstory="10 年行业经验",               # 注入到 system prompt 的 persona
    tools=[search_web, citation_check],      # 工具白名单:只暴露必要能力
)
analyst = Agent(
    role="数据分析师",
    goal="分析数据并得出结论",
    tools=[python_repl, stats_models],
)

# 生产要点:role/goal 直接影响路由准确率;
# 工具白名单过小会限死能力,过大则增加选错概率(见 §13.4 坑 1)。

任务分解与 DAG 执行:生产上避免递归无界分解,必须限制深度与并发。

from asyncio import gather

async def orchestrate(task: str):
    # 1. Planner 生成子任务列表(强模型)
    subtasks = await planner.decompose(task, max_depth=3)   # 限制深度防爆炸
    # 2. 按 DAG 拓扑序并行独立节点(asyncio.gather 不阻塞)
    results = await gather(*[worker.run(t) for t in subtasks.independent])
    # 3. 结果聚合(强模型汇总,处理冲突)
    return await aggregator.merge(results, strategy="vote")

冲突解决落地:投票需定义"平票"与"超时"兜底,否则会死锁。

def resolve(answers: list, timeout_s=30):
    if majority(answers):           # 多数决
        return majority(answers)
    return escalate_to_human()      # 平票/无共识 → 人工接管(降级)

13.4 实战复盘

坑 1:给每个 Worker 暴露全部工具导致路由失准。 早期我们让 Researcher 和 Coder 共享同一套 40+ 工具池,Orchestrator 在"选工具"上就消耗约 30% 的 turn,且常调错参数。教训:角色工具白名单要按"最小必要"裁剪,必要时用 embedding 召回 top-15 工具再交给模型,而非全量塞入上下文。

坑 2:DAG 并行度过高拖垮下游审查带宽。 我们一度并行 8 个 Worker,结果 Aggregator 和人工审查成了瓶颈——这正是"编排税"(Orchestration Tax):review 带宽是并行度的真正上限。教训:并行度由"最慢的收敛/审查环节"决定,而非算力;给每个 Worker 设独立 budget 与超时,超限即降级。

坑 3:无中心协调的 Swarm 在冲突时无法收敛。 在一个去中心的 handoff 实验里,两个 Agent 互相把任务推给对方,形成死循环。教训:即使去中心化,也要保留一个轻量仲裁者或最大跳数(max-hops)上限,否则协作会变"踢皮球"。

13.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
多 Agent vs 单 Agent 什么时候该上多 Agent? 核心 80% 走单 Agent(便宜、低延迟);仅复杂 20%(需隔离/专业化/可解释)才多 Agent;指出 token 多 ~15x 的代价
Orchestrator 路由 Orchestrator 怎么选 Worker? 显式(Planner 指定)/ 隐式(注册表匹配)/ 动态(基于历史成功率 capability scoring);生产重动态评分
协作开销优化 多 Agent 通信开销怎么压? 共享 memory 去重、只传 delta、异步、引用而非拷贝(传指针);避免每跳全量上下文
冲突解决 多 Agent 意见不一致怎么办? 投票/优先级/辩论+仲裁/降级人工;必须定义平票与超时兜底防死锁
拓扑选型 Swarm 和 Orchestrator 怎么选? 中心化可控但有瓶颈;去中心化无单点但难收敛;生产 70% 选 Orchestrator

14. Agent 间通信协议(A2A)

14.0 本章上下文与知识地图

本章是第 13 章"多 Agent 协作"在跨厂商、跨组织、跨语言场景下的协议层落地,也是第 17 章(成本)、第 16 章(可观测)要跨 Agent 边界追踪的前置。依赖前序的协作拓扑认知;被"Agent Card 发现""跨组织联邦"等生产集成模式依赖。核心痛点:不同厂商的 Agent 各说各话、无法互操作、安全与治理缺位——A2A(Agent2Agent)正是把一个 Agent 的能力以标准化"名片 + 任务协议"暴露出来。

14.1 核心概念与原理

A2A(Agent2Agent Protocol) 是 Google 于 2025-04 开源、2026-03-12 发布 v1.0.0、并捐赠给 Linux Foundation 的 Agent ↔ Agent 通信标准。它解决的是"水平"问题——让任意两个 Agent 能互相发现、委托任务、同步状态,而不关心底层用什么模型或框架。

A2A 与 MCP 的清晰区分(必考)

  • MCP(Model Context Protocol):Anthropic 提出的 Agent ↔ Tool 协议,聚焦工具/资源/Prompt,拓扑是 Host-Server(中心化、二层交换)。
  • A2A:Google 提出的 Agent ↔ Agent 协议,聚焦任务委托/状态同步,拓扑是 Peer-to-Peer(对等、三层路由)
  • 关系:互补(complementary, not competing)。Linux Foundation 官方声明二者是"垂直 vs 水平"——MCP 让 Agent 能调用工具,A2A 让 Agent 能调用另一个 Agent(而那个 Agent 自己可能又用 MCP 调工具)。类比:MCP 是 USB-C(接外设),A2A 是网络路由(跨主机)。

Agent Card(Agent 名片):A2A 的核心元数据结构,声明一个 Agent 的 name / description / url / version / capabilities / skills / authenticationv1.0 新增 Signed Agent Cards——用 JWS + RFC 8785 JCS 加密签名,解决"伪造 Agent"问题。它是互操作的"能力契约"。

Task(任务)与状态机:A2A 把一次委托建模为 Task,含 task_id / context_id / from / to / input(Parts)/ deadline。状态机:

规范把 8 态分成三类,必考

类别 状态 含义
进行中 submitted / working 任务在跑
中断态(可恢复) input-required / auth-required 暂停,等客户端补输入/认证后回 working
终态(不可逆) completed / failed / canceled / rejected 一旦进入不再有出边,不能重启

另外规范明确:取消(canceled)可从 working / input-required / auth-required 发起;中断态也可能失败/被拒。

渲染错误: Mermaid 渲染失败: Parse error on line 8: ...ed working --> "input_required" ---------------------^ Expecting 'ID', 'EDGE_STATE', got 'STRING'

通信方法(v1.0 API)SendMessage(同步)、SendStreamingMessage(SSE 流式)、GetTask / ListTasksCancelTaskSubscribeToTask(事件订阅)、PushNotificationConfig(异步推送)、GetExtendedAgentCardPart 类型TextPart / FilePart(base64 或 URI)/ DataPart(JSON 结构化)。

2026 H2–2027 前瞻:A2A v1.0 已支持 gRPC 绑定(a2a.proto 作为 normative truth);AP2(Agent Payments Protocol,60+ 支付方支持) 与 x402、UCP 正在叠加"代付/分账"能力——意味着 2027 年一个 Agent 可跨组织调用另一个 Agent 并自动结算费用,催生"Agent 经济"。

14.2 主流方案对比

A2A vs MCP(维度对比)

维度 MCP A2A
通信对象 Agent ↔ Tool Agent ↔ Agent
协议焦点 工具/资源/Prompt 任务委托/状态同步
拓扑 Host-Server Peer-to-Peer
厂商 Anthropic Google(LF 治理)
关系 互补 互补
类比 二层交换(USB-C) 三层路由

A2A 衍生/配套协议

协议 作用 状态
AP2 Agent 支付/分账 60+ 支付方支持
x402 HTTP 402 支付扩展 实验
UCP 通用商务协议(与 AP2 兼容) 演进中

SDK 生态(2026-04):Python / JavaScript / Java / Go / .NET 五个生产级 SDK;150+ 合作伙伴组织(AWS、Cisco、Google、IBM、Microsoft、Salesforce、SAP、ServiceNow);22,000+ GitHub stars。

可靠性保障对比(生产必须覆盖):

问题 解决机制
消息丢失 持久化队列 + ACK
消息重复 幂等 + task_id 去重
消息乱序 序列号
Agent 不可用 重试 + 故障转移 + 熔断
超时 deadline + 降级
死信 DLQ + 告警

14.3 生产级实现

1) 发布 Agent Card(含 v1.0 签名):这是被发现的入口,必须暴露真实能力与认证方式。

{
  "name": "research-agent",
  "description": "深度研究 Agent",
  "url": "https://agent.example.com/a2a",
  "version": "1.0.0",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true,
    "stateTransitionHistory": true
  },
  "skills": [
    {
      "id": "academic-research",
      "name": "学术研究",
      "description": "深度调研学术论文",
      "inputModes": ["text"],
      "outputModes": ["text", "json"]
    }
  ],
  "authentication": { "schemes": ["bearer", "oauth2"] },
  "signature": {
    "algorithm": "RS256",
    "value": "...",
    "jws": "..."
  }
}

2) 委托一个 Task(含 deadline 与结构化输入)

{
  "task_id": "uuid",
  "context_id": "conv-123",
  "from": "orchestrator",
  "to": "research-agent",
  "type": "research",
  "input": {
    "parts": [
      {"type": "text", "text": "调研 A2A 协议"},
      {"type": "data", "data": {"maxResults": 10}}
    ]
  },
  "deadline": "2026-07-03T12:00:00Z"
}

3) 安全与集成(生产硬性要求)

  • 双向认证:mTLS / OAuth2 Client Credentials;
  • 授权白名单(Agent-to-Agent)、全链路审计、限流、跨租户隔离;
  • 集成模式:Agent Card Discovery → Delegated Specialization → Tool Bridge(把 A2A Agent 当作 MCP Tool 调用)→ Cross-Org Federation → Ambient Event Mesh(事件总线 + A2A)。

坑位提示deadline 一定要设,否则下游 Agent 无终止约束会空转烧 token;stateTransitionHistory 在生产应开启以便排障与成本归因(衔接第 16/17 章)。

14.4 实战复盘

坑 1:把 A2A 当 MCP 用,导致拓扑错配。 我们最初想用 A2A 直接调一个"向量检索工具",结果发现 A2A 是为"对等 Agent"设计的,没有工具级细粒度参数 schema,调用方还得自己包一层 Agent。教训:Tool 级用 MCP,Agent 级用 A2A;需要把工具暴露给外部 Agent 时,用 Tool Bridge 把 A2A Agent 包装成 MCP Tool。

坑 2:未校验 Signed Agent Card,踩到伪造 Agent。 在跨组织联邦试点中,我们直接信任了对方返回的 Agent Card,后来 v1.0 的 Signed Agent Cards(JWS 签名)上线后才补上验签。教训:跨信任域必须验签(RS256 + JCS),否则能力声明可被伪造,引发越权委托。

坑 3:异步任务无 deadline + 无 DLQ,死信堆积。 一次推送通知失败(push endpoint 抖动)后任务卡在 input-required,既无重试也无告警。教训:所有 A2A 调用必须配 deadline、幂等 task_id 去重、DLQ + 告警——把"可靠性保障表"当 checklist 逐条落地。

14.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
A2A 定位 A2A 是什么?和 MCP 关系? Google/LF 的 Agent↔Agent 协议;MCP 是 Agent↔Tool;互补(垂直 vs 水平);类比 USB-C vs 路由
Agent Card Agent Card 是什么? Agent 的"名片":声明能力/技能/版本/认证;v1.0 新增 Signed(JWS+JCS)防伪
通信模式 A2A 有哪几种通信模式? 同步 SendMessage、流式 SSE、异步 task_id+push、订阅 SubscribeToTask
互操作 跨厂商 Agent 互操作挑战? 协议统一(A2A)、能力描述统一(Agent Card/JSON-LD)、安全(mTLS/OAuth2)、治理(Registry+审计)
适用边界 何时用 A2A,何时单 Agent? 跨厂商/跨组织/跨语言→A2A;同进程/简单→单 Agent;复杂业务流→多 Agent+A2A
业务价值(PM) A2A 对企业意味着什么? 打破 Agent 孤岛、像调 API 一样复用第三方 Agent、提前卡位生态

第五部分:工程化与性能

15. 高并发调度与资源管理

15.0 本章上下文与知识地图

本章是第 13/14 章「协作编排」在运行时资源层的支撑——无论单 Agent 还是多 Agent,最终都要落到并发模型、任务队列、限流与背压上;它直接被第 16 章(可观测)、第 17 章(成本)依赖(调度产生的每个 span、每次 token 消耗都需被度量与计费)。核心痛点:LLM 调用是 IO 密集且高延迟的,无节制的并发会击穿模型 API 配额、拖垮整系统(雪崩),必须用数学化的限流与背压兜底。

15.1 核心概念与原理

并发模型(Concurrency Model)选择取决于语言与负载特征:

模型 语言 特点 适用 取舍
asyncio Python 协程 Python Agent 生态最成熟,但 GIL 限制 CPU 任务
Tokio Rust 零成本异步 Rust Agent 性能极致,开发门槛高
Goroutine Go 轻量线程 Go Agent 并发模型开箱即用
虚拟线程 Java 21+ 协程 Java Agent 兼容旧生态、平滑迁移

关键原则:IO 密集(LLM 调用、HTTP)用异步;CPU 密集(Embedding、重计算)用线程池。混合架构是生产常态:异步框架(asyncio)+ 线程池执行 Embedding。

任务队列(Task Queue)选型决定长任务的持久化与重放能力:

队列 特点 适用
Redis Queue 简单、低延迟 通用
Celery Python 生态 Python
Kafka 高吞吐 大规模
NATS 轻量、云原生 微服务
Temporal 工作流引擎 长任务(2026 主流)
Inngest 函数式工作流 事件驱动
DBOS 持久化工作流 数据库事务

背压(Backpressure):下游处理不过来时向上游传递压力,防止一个慢服务拖垮整系统。机制包括快速失败拒绝(503)、延迟队列、降级(高峰切便宜模型)、熔断(错误率超阈值)。

**限流(Rate Limiting)**是并发的"闸门",多级串联防护:

请求

用户限流

租户限流

Agent 限流

模型限流

执行

2026 H2–2027 前瞻:自适应限流(基于模型 API 实时配额与延迟反馈)将取代静态阈值;eBPF 正被探索用于内核级观测 Agent 进程 IO,使背压信号更早、更准(衔接第 16 章可观测演进)。

15.2 主流方案对比

限流算法对比

算法 特点 适用
令牌桶 允许突发 通用
漏桶 平滑 流量整形
滑动窗口 精确 API 网关
自适应 智能 弹性

LLM API 优化手段(直接降成本、提吞吐):

优化 节省 适用
Batch API 50% 非实时
Prompt Caching 90% 固定系统提示
并发调用 降低时延 多路召回
流式中断 省 Token 长输出可中断

优雅降级对照表

故障 降级策略
主 LLM 不可用 切换备用(GPT→Claude→本地)
向量库超时 退化为关键词检索
工具不可用 跳过 + 告知用户
Redis 不可用 降级到本地缓存
数据库只读 写操作入队

15.3 生产级实现

多级限流 + 背压配置(伪代码 + 注释)

# 多级限流:用户 → 租户 → Agent → 模型,逐层收紧
async def handle(req):
    # 令牌桶:每用户每秒 5 次,允许突发
    if not user_bucket.allow(req.user_id, rate=5, burst=10):
        raise HTTPException(429)                 # 快速失败,不阻塞
    # 租户级并发上限(防单租户吃满配额)
    async with tenant_semaphore(req.tenant_id, limit=50):
        # Agent 级限流
        if not agent_limiter.allow(req.agent, rate=20):
            return await degrade("高峰降级到便宜模型")   # 背压:降级而非拒绝
        return await call_llm(req)

熔断(Circuit Breaker)

# 错误率超阈值 → 打开熔断,直接走降级,给下游喘息
if error_rate(window=60s) > 0.5:
    breaker.open(timeout=30s)
    return fallback_response()

LLM 调用优化落地

# Prompt Caching:把固定 system prompt 标记为可缓存块
resp = client.messages.create(
    model="claude-opus-4.8",
    system=[{"type": "text", "text": SYSTEM, "cache_control": {"type": "ephemeral"}}],
    messages=...,
)
# 命中缓存可省 ~90%;长上下文 + 固定模板场景收益最大

15.4 实战复盘

坑 1:只做单级限流,租户间互相挤兑。 我们最初只在用户级限流,结果一个大租户把模型 API 配额打满,其他租户全部 429。教训:限流必须多级串联(用户→租户→Agent→模型),且租户级用信号量硬控并发,而不是只控 QPS。

坑 2:限流 429 后仍重试无退避,触发雪崩。 调用方在 429 后立刻重试,把压力翻倍,最终模型 API 全抖。教训:限流拒绝必须配合指数退避 + 抖动(jitter);在系统层做背压(延迟队列/熔断),而不是把压力甩给上游重试。

坑 3:Batch API 误用于实时链路。 我们把用户实时问答也塞进 Batch(24h 返回),导致体验崩坏。教训:Batch 只用于评测/数据处理等非实时场景;实时链路靠并发调用 + 流式中断降时延。

15.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
并发模型 Agent 并发模型怎么选? IO 密集用异步、CPU 密集用线程池;混合:asyncio + 线程池跑 Embedding
限流算法 令牌桶/漏桶/滑动窗口区别? 令牌桶允许突发、漏桶严格平滑、滑动窗口精确;生产多级串联
背压 什么是背压? 下游处理不过来向上游传压;防雪崩;手段:快速拒绝/延迟队列/降级/熔断
LLM 调优 LLM API 调优技巧? Prompt Caching 省 90%、并发 asyncio.gather、流式降 TTFT、Batch 非实时半价
降级 主 LLM 挂了怎么办? 切备用(GPT→Claude→本地)、向量库超时退化关键词、工具不可用跳过告知
任务队列 Temporal 为什么适合 Agent? 工作流引擎原生支持长任务持久化/重放/超时,2026 主流

16. Agent 可观测性与 Trace 追踪

16.0 本章上下文与知识地图

本章为所有"黑盒"的 LLM/工具调用提供可度量、可排障、可归因的底座,依赖第 15 章(每次调度产生指标)与第 17 章(成本归因直接复用这里的 Trace 结构)。它是"生产化"的分水岭——能 Trace 才能优化、才能计费、才能证明 Agent 做对没做对。核心痛点:LLM 调用链是非确定、高延迟、跨服务的,一次失败你很难说清"是哪一步、哪个模型、花了多少 token"

16.1 核心概念与原理

可观测性三件套(Three Pillars)

类型 数据 用途 工具
Metrics 数值时序 监控告警 Prometheus / Datadog
Logs 文本事件 调试审计 Loki / ELK
Traces 链路树 性能分析 OpenTelemetry / Jaeger

Span 模型:每次 LLM 调用或工具调用都是一个 Span,父子关系表达调用树。一个 agent_run 下挂多个 llm_call_* / tool_call_* Span,每个带 model / tokens / latency / cost

Trace: user_chat_session_123

Span: agent_run (12.3s)

Span: llm_call_planner (2.1s)
model=gpt-5.4, tokens=1234

Span: tool_call_search (1.8s)

Span: llm_call_rerank (0.5s)

Span: llm_call_executor (3.2s)

Span: tool_call_code (4.0s)

Span: llm_call_summarize (1.2s)

上下文传播(W3C TraceContext):用 traceparent 头跨服务/跨语言传递 trace 与 span id,保证链路不断。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01

LLM 专用可观测(Langfuse / LangSmith):通用 APM 不懂 LLM 语义(prompt、completion、token、eval),需专用层。Langfuse(MIT、自托管、OTel 原生、含 Eval Suite)与 LangSmith(LangChain 深度集成、$39/seat/月)是当前主流。

2026 H2–2027 前瞻:eBPF 正被引入内核级采集 Agent 进程的 IO/网络 span,弥补用户态 SDK 的盲区;成本归因将从"可选"变为生产强制项(合规与 FinOps 要求每条 trace 绑定 tenant/cost)。

16.2 主流方案对比

2026-05 主流平台横向对比

平台 Trace UI Eval 原语 LLM-Judge Golden Set CI Gates 自托管 价格
LangSmith 5/5 4/5 4/5 4/5 4/5 Enterprise $39/seat
Braintrust 5/5 5/5 5/5 5/5 5/5 Enterprise $249/月 flat
Langfuse 5/5 4/5 4/5 4/5 3/5 MIT $29/月
DeepEval 3/5 5/5 5/5 4/5 5/5 VPC Apache 2.0
Galileo 4/5 5/5 5/5 4/5 4/5 VPC $100/月
Phoenix 5/5 4/5 4/5 3/5 3/5 Apache 2.0 免费

取舍:要完全自托管 + 开源合规选 Langfuse / Phoenix;要最强 Eval + CI 门禁选 Braintrust / DeepEval。

关键监控指标维度

维度 指标
业务 任务成功率、CSAT
系统 QPS、P99 延迟、错误率
质量 工具调用准确率、Faithfulness
成本 Token/任务、$/任务

16.3 生产级实现

Span 注入(OTel 风格,带注释)

from opentelemetry import trace
tracer = trace.get_tracer("agent")

with tracer.start_as_current_span("llm_call_planner") as span:
    span.set_attribute("model", "gpt-5.4")
    span.set_attribute("tokens", 1234)
    span.set_attribute("cost_usd", 0.012)        # 成本归因:每条 span 记录
    result = await llm_call(...)
    span.set_attribute("output.length", len(result))

日志脱敏(写入前必做)

# 生产硬性合规:敏感字段正则替换后再落盘
SENSITIVE = {
    "api_key": "****",
    "phone": lambda s: s[:3] + "****" + s[-4:],   # 138****1234
    "email": lambda s: s[0] + "***@" + s.split("@")[1],
    "id_card": lambda s: s[:3] + "*" * 11 + s[-4:],
    # 密码:完全不记录
}
# 规则:写入前替换;用户输入边界标记;第三方日志服务不存原文

成本归因:每条 Trace 关联 user_id / tenant_id / model / tokens / tool / $cost,按租户聚合看板,识别 top 消耗用户/Agent(直接喂给第 17 章预算)。

16.4 实战复盘

坑 1:只在最外层包一个 span,内部 LLM 调用全黑盒。 一次"答非所问"的故障我们排了 2 小时,因为看不到是哪一步 planner 出了偏差。教训:每个 LLM/工具调用都要独立 span,且必须带 model/tokens/latency/cost——粒度决定排障速度。

坑 2:日志把用户 PII 原样落盘,触发合规告警。 我们曾把含手机号的对话原文写进 Loki,被安全审计拦截。教训:脱敏是写入前的强制关卡,不是事后清理;密码类字段根本不入日志。

坑 3:跨服务 trace 断裂。 Orchestrator 调 A2A 远程 Agent 时没传播 traceparent,远程 span 成了孤儿。教训:跨进程/跨厂商必须透传 W3C TraceContext,否则可观测性在边界处断裂(衔接第 14 章 A2A)。

16.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
Trace 设计 Trace 怎么设计? 每个 LLM/工具调用一个 Span,含 input/output/latency/tokens/cost;OTel 标准;父子表达调用树
TraceContext 为什么用 W3C TraceContext? 跨服务/跨语言传播、标准协议工具链齐、与 OTel 集成
日志脱敏 日志脱敏怎么做? 写入前正则替换、敏感字段不记录、用户输入边界标记、第三方不存原文
成本归因 成本怎么归因到用户? 每 span 记 tokens/cost,按 user_id/tenant_id 聚合,看板展示 top 消耗
平台选型 Langfuse 和 LangSmith 怎么选? Langfuse MIT 自托管+OTel 原生;LangSmith LangChain 集成深但企业自托管受限
三件套 Metrics/Logs/Traces 区别? 数值时序监控、文本调试、链路树性能分析,三者互补

17. Agent 成本控制与 Token 预算

17.0 本章上下文与知识地图

本章是第 15 章(调度节流)在经济维度的延伸,也是第 16 章 Trace 中 cost_usd 字段的"管控侧"——可观测告诉你花了多少,本章让你事前预算、事中熔断、事后归因。依赖前序的路由/缓存/可观测;被第 18 章执行抽象(预算作为执行器强制上限)依赖。核心痛点:LLM Token 占成本 70–90%,一个失控的 loop 能在几分钟内烧掉数百美元,必须有工程化的预算闸门。

17.1 核心概念与原理

成本构成

占比 优化空间
LLM Token 70-90% 最大头
Embedding 5-15%
向量库 2-5%
工具 API 1-5% 看场景
基础设施 1-3%

Token 预算层级(Budget Hierarchy):全局 → 租户 → 用户 → 会话 → 单任务。执行机制:软警告(80% 日志告警)→ 硬截止(100% 立即终止)→ 动态调整(按使用率调整后续预算)。

模型路由(LLM Router):按任务复杂度把请求导向不同价位模型,是性价比核心杠杆。

simple

code

reasoning

default

查询

复杂度分类

便宜模型
gpt-5.4-mini

编程模型
claude-sonnet-4.5

推理模型
o3-pro

默认
gpt-5.4

2026 H2–2027 前瞻成本会计将成为生产强制项——监管与 FinOps 要求每任务绑定 cost;自动化 Router 将从"规则分类"演进为"RL 学习的 ROI 优化器",按实时 token 单价动态选路。

17.2 主流方案对比

优化手段对比(对应第 15 章 LLM API 优化,这里从"省钱"视角重排):

手段 节省 适用 取舍
模型路由 全场景 需准确的复杂度分类器
Prompt Caching 90% 固定系统提示 缓存有 TTL,动态内容不命中
Batch API 50% 非实时 24h 返回,不能实时
输出长度控制 长输出 max_tokens + “be concise”
流式中断 Token 长输出 用户收到即中断

模型路由决策表

复杂度 模型 理由
simple gpt-5.4-mini 便宜
code claude-sonnet-4.5 编程强
reasoning o3-pro 推理强
default gpt-5.4 均衡

17.3 生产级实现

预算闸门(硬截止 + 软警告)

# 预算层级自上而下,任意一层触顶即熔断
class TokenBudget:
    def __init__(self, tenant_limit, user_limit, task_limit):
        self.used = 0
        self.task_limit = task_limit

    def charge(self, tokens: int):
        self.used += tokens
        if self.used >= 0.8 * self.task_limit:
            log.warning("预算 80% 告警")          # 软警告
        if self.used >= self.task_limit:
            raise BudgetExceeded("硬截止:终止执行")  # 硬截止

模型路由实现

def route(query, complexity):
    if complexity == "simple":
        return "gpt-5.4-mini"      # 便宜
    elif complexity == "code":
        return "claude-sonnet-4.5" # 编程
    elif complexity == "reasoning":
        return "o3-pro"            # 推理
    else:
        return "gpt-5.4"           # 默认

Prompt Caching 落地(最大单一优化点):

# Anthropic:cache_control 块,命中省 90%;OpenAI >1024 tokens 自动缓存
client.messages.create(
    model="claude-opus-4.8",
    system=[{"type":"text","text":FIXED_SYS,"cache_control":{"type":"ephemeral"}}],
    messages=variable_msgs,    # 仅可变部分每次计费
)

实时成本监控:Langfuse / LangSmith 实时 dashboard + 异常告警(单用户 1h 消费 > $X),成本归因到 trace(复用第 16 章结构)。

17.4 实战复盘

坑 1:只有全局预算,没有单任务硬截止,loop 烧穿。 我们设了租户月预算,但单任务 loop 死循环,1 小时烧掉整月额度。教训:预算必须下沉到"单任务"层级并设硬截止(max_iterations + max_cost),全局预算是最后兜底不是唯一闸门。

坑 2:Prompt Caching 因 system prompt 含时间戳而永不命中。 我们在 system 里拼了 当前时间:xxx,导致每次都变、缓存 0 命中。教训:可缓存块必须"静态"——把易变内容放到 messages 而非 system;缓存命中率要进监控看板。

坑 3:路由分类器太粗,简单问题也走贵模型。 初期全默认 gpt-5.4,成本比必要高 3 倍。教训:复杂度分类器是 Router 的核心,应持续用真实 ROI 数据回流校准(哪个模型性价比最高)。

17.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
成本构成 Agent 成本大头在哪? LLM Token 占 70–90%;优化优先级最高;其余 Embedding/向量库/工具占小
控制手段 如何控制 Agent 成本? 模型路由 + Prompt Caching(90%) + Batch(50%) + 上下文压缩 + 预算硬截止
失控发现 成本失控怎么发现? 实时监控 dashboard + 异常告警(单任务/单用户 >$X)+ 成本归因 top 消耗
模型选型 模型怎么选? 按任务复杂度路由;性能 vs 成本权衡;用 ROI 数据回流校准
预算层级 预算怎么分层? 全局→租户→用户→会话→单任务;软警告 80% + 硬截止 100% + 动态调整
Caching Prompt Caching 要点? 固定 system 标记 cache_control;块必须静态;OpenAI >1024 自动缓存

18. Agent 执行抽象与统一接口

18.0 本章上下文与知识地图

本章是全书工程化的"收口"——把第 13 章的多范式协作、第 15/16/17 章的调度/可观测/成本,全部收敛到一个统一的执行器抽象之上。它依赖前面所有运行时能力(调度、限流、Trace、预算),被"生产落地"直接消费。核心痛点:ReAct / Plan-Execute / Reflexion / ToT 各写一套循环,导致代码重复、观测割裂、能力无法复用——需要一个统一接口让它们可插拔、可灰度、可度量。

18.1 核心概念与原理

为什么需要统一抽象(Unified Execution Abstraction):生产级 Agent 须支持多范式(ReAct、Plan-Execute、Reflexion、ToT)。若各自实现调度循环,会出现:代码重复、观测割裂、能力割裂(一个 Agent 不能同时用两种范式)。统一抽象把"循环本身"抽象成 AgentExecutor trait,范式差异下沉为可替换的实现。

P-P-A-O-R 五阶段循环(Plan → Prompt → Act → Observe → Reflect):相比 ReAct 新增 Reflection(评估+决定) 阶段,使 Agent 能自我判断是否要换方案,而非无限重试。

继续

完成

换方案

输入

Plan 规划

Prompt 组装

Act 行动/工具

Observe 观察结果

Reflect 评估

输出

关键设计动机:统一 run / run_stream / cancel / metadata 四个方法,使所有范式共享同一套可观测埋点、预算检票口、记忆隔离与错误分类——这正是第 15/16/17 章能力"一次实现、处处复用"的支点。

18.2 主流方案对比

执行器范式对比

范式 特征 适合 与 P-P-A-O-R
ReAct 推理+行动交替 探索型、不确定 P+P+A+O,无显式 Reflect
Plan-Execute 先规划再执行 确定性多步、复杂 顶层 Plan,Reflect 弱
Reflexion 失败后反思重写 需自纠 强 Reflect
ToT 树状搜索多路径 需多候选评估 Reflect 即分支评估

取舍:Plan-Execute 适合确定性多步;ReAct 适合探索;二者常嵌套(Plan-Execute 做顶层,ReAct 执行子任务)。统一抽象让这种嵌套零成本。

18.3 生产级实现

统一执行器接口(Rust trait,带注释)

// 所有范式实现同一 trait,共享观测/预算/隔离
pub trait AgentExecutor: Send + Sync {
    // 同步执行:核心循环入口
    async fn run(&self, input: AgentInput, ctx: &mut AgentContext)
        -> Result<AgentOutput, AgentError>;
    // 流式执行:Chat UI 必需,与 run 复用逻辑
    async fn run_stream(&self, input: AgentInput, ctx: &mut AgentContext,
        on_event: Box<dyn Fn(AgentEvent) + Send>) -> Result<AgentOutput, AgentError>;
    // 协作式中断:cancel 不强制杀进程,由循环点检查
    async fn cancel(&self, ctx: &mut AgentContext) -> Result<(), AgentError>;
    // 元数据:供注册表/可观测读取
    fn metadata(&self) -> &ExecutorMetadata;
}

执行器注册表(可插拔 + 灰度)

pub struct ExecutorRegistry {
    executors: HashMap<String, Arc<dyn AgentExecutor>>,
    default: String,
}
impl ExecutorRegistry {
    pub fn new() -> Self {
        let mut map = HashMap::new();
        map.insert("react".into(), Arc::new(ReActExecutor::new()));
        map.insert("plan_execute".into(), Arc::new(PlanExecuteExecutor::new()));
        map.insert("reflexion".into(), Arc::new(ReflexionExecutor::new()));
        Self { executors: map, default: "react".into() }
    }
}

生产级注意事项(强制清单)

  1. 统一可观测性:所有执行器 emit 相同指标(衔接第 16 章)。
  2. 强制上限max_iterations 默认 25 + clamp,防无限循环。
  3. 优雅中断cancel() 协作式(循环点检查,不硬杀)。
  4. 记忆隔离:每次 run 用独立 AgentContext,防串味。
  5. 错误分类:可重试 / 不可重试 / 致命。
  6. Feature Flag 门控:切换执行器灰度,而非一次性全量。

18.4 实战复盘

坑 1:不同范式各自埋点,看板对不齐。 我们 ReAct 和 Plan-Execute 用了两套 span 命名,排障时无法横向比对。教训:统一抽象的最大收益是"观测一致性"——所有执行器走同一套 emit 契约,否则可观测性会随范式碎片化。

坑 2:max_iterations 设无限,一个 loop 烧穿预算。 早期没给执行器加硬上限,某个 Reflexion 在失败反思里死循环,单任务烧掉 $40。教训:max_iterations 是执行器级强制项(默认 25 + clamp),与第 17 章预算闸门双保险。

坑 3:直接 kill 进程做 cancel,下游工具状态损坏。 我们用 SIGKILL 强杀,导致数据库事务半提交。教训:cancel 必须协作式——在循环点检查取消信号并做清理,而非暴力终止。

18.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
统一抽象动机 为什么抽象执行器? 多范式(ReAct/Plan-Execute/Reflexion/ToT)共享观测/预算/隔离,避免代码重复与能力割裂
run_stream 为什么抽象 run_stream? 流式是 Chat UI 必需;与 run 复用逻辑;单独抽象便于测试
P-P-A-O-R 与 ReAct 如何对应? ReAct=P(plan:Thought)+A+O;P-P-A-O-R 明确加入 Reflection(评估+决定换方案)
范式选型 Plan-Execute vs ReAct? Plan-Execute 确定性多步;ReAct 探索型;常嵌套(顶层 Plan-Execute,子任务 ReAct)
取消语义 cancel 为什么协作式? 硬杀会损坏下游(事务半提交);应在循环点检查取消信号并清理
强制上限 执行器级上限有哪些? max_iterations(默认25+clamp)、记忆隔离、错误分类、Feature Flag 灰度

第六部分:评测、数据飞轮与持续优化

面试重点:Agent 评测、数据飞轮、用户反馈闭环。PM + 高级工程师必考

19. Agent 评测系统

19.0 本章上下文与知识地图

本章是第六部分(评测、数据飞轮与持续优化)的开篇,承接前序第 16–18 章的构建、观测与工具治理内容——评测本质是给"观测(Observability)“补上"判断标准(Ground Truth)”。它直接被第 20 章(数据飞轮)与第 21 章(用户反馈闭环)依赖:评测集(Golden Set)是飞轮的燃料,评测门禁是闭环改进的质量闸门。核心工程痛点是——Agent 输出非确定、多步、主观,传统"对答案"式的评测完全失效,必须同时评"最终答案"和"中间轨迹(trajectory)"。

19.1 核心概念与原理

为什么 Agent 评测难? 传统软件输出确定、只需断言最终态;LLM 单轮输出概率化、仍需比对最终答案;Agent 是"概率 + 多步",错在中间一步、最终答案可能碰巧对——所以评测点从"最终输出"前移到"最终 + 中间步骤",指标也从"准确率"扩展到"轨迹正确性 + 步骤效率"。这正是 Anthropic《Scaling Managed Agents》中"生产型 Harness"与"研究型 Harness"的分野:研究型靠堆 token/子代理冲天花板,生产型必须在成本·延迟·安全约束下用评测门禁稳定交付(Agent = Model + Harness,评测属于 Harness 的 L5 评估与观测层)。

评测维度

维度 指标 评测方式
准确性(Accuracy) 任务成功率(Task Success Rate) 人工 / LLM-as-Judge
效率(Efficiency) 耗时 / Token / 工具调用次数 自动
安全性(Safety) 越狱率 / 敏感信息泄漏率 红队(Red Teaming)
成本(Cost) $/任务 自动
鲁棒性(Robustness) 异常处理恢复率 故障注入(Fault Injection)
用户满意度(CSAT) 点赞率 / CSAT 用户反馈
延迟(Latency) TTFT / P99 自动

三条评测方法线

  • 离线评测(Offline):构建 Golden Set(黄金测试集)→ 批量跑 Agent → 聚合指标。可控、可回归,但易与线上分布脱节。
  • 在线评测(Online):A/B 测试、影子模式(Shadow Mode,双跑不生效)、实时监控。贴近真实分布,但成本高、需流量。
  • LLM-as-Judge:用强模型(如 GPT-5.4 / Claude Sonnet 4.5)做裁判,配 Rubric(评分细则)+ CoT(Chain-of-Thought);必须校准到人工一致率 > 85% 才可用。

评测闭环原理(Mermaid):

轨迹匹配

质量语义

下降 > X%

达标

Golden Set / Held-out Eval

Agent 批量运行

评测方式

trajectory_match

LLM-as-Judge

指标聚合

回归门禁 Regression Gate

阻塞发布

上线 + baseline 更新

设计权衡:评测集越大越准,但维护成本越高;LLM-Judge 便宜可规模化,但需持续校准防漂移;held-out(不参与训练/调优)评测集是防止 reward hacking 的底线——Berkeley 2026-04 研究证明,所有主流 Agent benchmark 都能被 reward-hacked 到 100%,所以生产级必须自建 held-out eval + pass@k(多次试验取通过率)。

19.2 主流方案对比

工具 特点 适合场景 取舍
Langfuse 开源、自托管、Trace + Eval 一体 全场景、注重数据主权 自由度高但要自运维;Eval 能力弱于专业评测平台
Braintrust $249 flat、CI gates 好 产品团队、要接入发布流水线 托管省心,但成本随规模固定、数据出域
DeepEval 50+ 研究指标、本地运行 工程师、科研向 指标最全,但工程化/协作弱
Galileo Luna-2 裁判模型、97% 更便宜 大规模生产 成本优,但黑盒裁判难解释
Phoenix(Arize) Apache 2.0、完全免费 早期项目、PoC 免费但需自建管道
Anthropic / OpenAI 内置 模型自带评测 单模型 A/B 锁定单厂商,跨模型不可比

取舍分析:小团队用 Phoenix + DeepEval 起步零成本;中大型生产优先 Langfuse 自托管(数据不出域 + 与现有 Trace 打通);若评测要卡进 CI/CD 发布门禁,Braintrust 的 gate 体验最顺。关键不是选哪个工具,而是评测集与门禁策略归自己——工具可被替换,Golden Set 是资产。

19.3 生产级实现

① 评测集声明(含多 grader 加权)

# agent_eval/v1.2.3/cases/customer_service_refund.yaml
- name: "customer_service_refund"
  input: "用户要求退款订单 #A1024"
  expected: "调用 refund API,确认金额 299 元,语气友好"
  # 多个 grader 加权融合,避免单一指标被 hack
  graders:
    - type: trajectory_match      # 轨迹匹配:是否调了正确的工具、顺序合理
      weight: 0.4
    - type: llm_judge             # 语义裁判:是否友好、准确、符合退款政策
      weight: 0.6
      rubric: "是否友好、准确、符合政策;金额是否正确"
  tags: [refund, pii-safe]        # 便于回归分组

② 回归门禁(发布卡点)

# ci/eval_gate.py —— 每次发布前必跑 Golden Set
import json, subprocess

def regression_gate(baseline_path: str, threshold_drop_pct: float = 2.0):
    """指标下降超过阈值则阻塞发布(生产怎么配:阈值要松紧适中)"""
    baseline = json.load(open(baseline_path))          # 历史 baseline
    current = run_eval_suite("agent_eval/v1.2.3")      # 跑当前版本
    for metric in ["task_success", "csat", "avg_cost"]:
        drop = (baseline[metric] - current[metric]) / baseline[metric] * 100
        # 坑:成本指标上升不是 bug,可能是能力增强——成本门禁要单独立项
        if metric != "avg_cost" and drop > threshold_drop_pct:
            raise SystemExit(f"[BLOCK] {metric} 下降 {drop:.1f}% > {threshold_drop_pct}%")
    json.dump(current, open(baseline_path, "w"))       # 达标则更新 baseline

③ LLM-Judge 校准(防漂移)

# 校准到人工一致率 > 85% 才上线裁判
def calibrate_judge(judge_cases, human_labels):
    agree = sum(1 for c, h in zip(judge_cases, human_labels) if judge(c) == h)
    return agree / len(human_labels)   # < 0.85 必须回炉调 Rubric,不可直接上线

生产坑位:(a) Golden Set 长期不更新会"老化",被 Agent 过拟合 → 必须每月增量更新(见第 20 章节奏);(b) 成本指标不宜与准确率同阈值门禁;© pass@k 比单次通过更能反映稳定性,建议 k=3~5。

2026 H2–2027 前瞻:评测正从"追准确率"走向成本会计(Cost Accounting)+ 回归门禁(Regression Gate)——把 costUsdlatencyP99 作为一等评测指标纳入发布卡点;同时行业开始标准化 held-out eval 托管(第三方留存评测集防厂商自嗨)。

19.4 实战复盘

坑 1:把公开 benchmark 当验收标准,线上事故率反而升高。 早期我们拿某开源 Agent benchmark 做周报指标,分数从 62% 刷到 91%,结果用户工单量没降。复盘发现团队针对该集做了"特调 prompt",而该集与真实流量分布偏差大——典型 reward hacking。教训:公开 benchmark 只作参考,生产验收必须自建 held-out eval,且评测集由独立小组维护、不参与调优。

坑 2:LLM-Judge 一致率高,但偷偷换了评判口径。 我们校准时一致率 88%,两个月后人工抽检发现裁判变松了——因为 Rubric 没版本化、模型升级后语义漂移。复盘中加入"裁判 Rubric 哈希 + 每月重新校准"才稳。教训:LLM-as-Judge 不是一次校准终身有效,要当被测系统一样做回归。

决策复盘:评测集该不该全量人工标注? 我们一度想 100% 人工标 Golden Set,发现每月 200 条就要 1.5 人月、跟不上迭代。最终决策:核心 20% 路径全人工 + 80% 用 LLM 标注后抽样人工复核,配合第 20 章数据飞轮自动沉淀新 case——用"人工兜底 + 飞轮扩量"替代全量人工,标注成本降 70% 且覆盖更全。

坑 3:只看准确率不看成本,"更聪明"的版本上线后毛利被吃穿。 一次模型升级让通过率从 84% 提到 89%,团队直接放量,月底才发现单次任务 token 成本涨了 2.3 倍、平均 turn 数从 6 涨到 14——准确率的边际提升是用"暴力多轮 + 大模型兜底"换来的。因为评测报告里根本没有成本列,问题被隐藏了两周。复盘后我们把评测指标从单一"通过率"改成 通过率 / 每任务成本 / P95 延迟 三元组,任何一维超阈值即回归门禁拦截。教训:2026 年 Agent 评测已从"准确率导向"走向"成本会计导向"——公开 benchmark 普遍不计成本,但生产验收必须把成本与延迟做成一等公民指标,否则"更聪明"往往等于"更亏钱"。(呼应 §0.4 前瞻与第 17 章成本会计)

19.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
Agent 评测难点 为什么 Agent 评测比传统软件难? 非确定性(同输入可不同输出)、多步(中间步骤也要评)、主观性(体验难量化)、线上线下分布不一致;须评"最终+轨迹"
评测客观性 怎么保证 LLM-as-Judge 客观? 校准到人工一致率 > 85%;多模型交叉验证;抽样人工复核;Rubric 版本化防漂移
防 reward hacking 奖励黑客怎么防? 多维度指标(不止一个 reward);held-out 评测集(不参与训练);pass@k 多次试验;真实用户反馈为最终标准
评测 ROI Agent 评测投入产出比怎么算?(PM 题) 投入=评测集构建+维护;收益=避免线上事故+加速迭代;度量=发布周期 -X%、线上故障 -Y%
回归门禁 发布前评测门禁怎么设? 每次跑 Golden Set;指标下降 > 阈值阻塞发布;baseline 持续对比;成本指标单独立项
成本会计评测 为什么 2026 年评测要计成本? 准确率提升常靠"多轮+大模型"堆出来,公开 benchmark 不计成本会掩盖亏损;生产指标须用「通过率/每任务成本/P95 延迟」三元组,任一超阈值即门禁拦截

20. 数据飞轮:反馈采集与数据标注

20.0 本章上下文与知识地图

本章是第六部分中段,依赖第 19 章的评测集(Golden Set 是飞轮初始燃料),并直接被第 21 章(用户反馈闭环)依赖——第 21 章负责"反馈如何采",本章负责"采来之后怎么洗、怎么标、怎么回灌模型"。核心痛点:飞轮转不起来往往不是算法问题,而是"低成本的反馈采集"与"高质量的标注"之间难以兼得,且隐私合规(GDPR / 个保法)给数据回收套上紧箍咒。

20.1 核心概念与原理

数据飞轮(Data Flywheel)本质是一个自增强闭环:用户交互 → 反馈采集 → 数据清洗 → 数据标注 → 模型/Agent 改进 → 体验提升 → 更多用户交互。关键不在"闭环图",而在反馈采集的"低成本 + 高质量"——采集成本太高飞轮转不动,标注质量太差回灌的是噪声。

四类反馈源

类型 例子 含义
显式反馈(Explicit) 点赞、点踩、评分 用户主动表达
隐式反馈(Implicit) 停留时长、改写率、复制率 行为信号,需谨慎解读
行为反馈(Behavioral) 任务完成、放弃、回流 结果导向
错误反馈(Error) 报错、重试、超时 失败信号

清洗四步:去重 → 去敏感(脱敏满足 GDPR/个保法)→ 去毒(红队测试过滤对抗样本)→ 标准化(格式统一)。

标注三档:人工标注(最准最贵)、LLM 标注(便宜需校准)、用户标注(被动收集,如用户修正 Agent 答案即天然标注)。

飞轮闭环原理(Mermaid):

更多交互

用户交互

反馈采集

数据清洗: 去重/脱敏/去毒

数据标注: 人工/LLM/用户

模型/Agent 改进: SFT/DPO/RAG

体验提升

设计权衡:标注全人工质量最高但不可规模化;全 LLM 标注会引入模型自身偏见(self-reinforcement bias)。工业界折中是"人工标种子集 + LLM 扩量 + 抽样人审"。持续学习方式的选型则取决于"改模型的代价 vs 收益"。

20.2 主流方案对比

持续学习(Continuous Learning)方式对比

方式 成本 效果 适用 取舍
Prompt 优化 快速迭代 不改模型权重,最安全;但天花板低
RAG 知识更新 知识更新 只更新检索库,零训练;适合事实性知识
SFT(监督微调) 领域适配 需标注语料;灵活性中等
DPO(直接偏好优化) 偏好对齐 直接优化偏好对,比 RLHF 简单;2026 工业界占 ~60%
RLHF(基于人类反馈强化学习) 极高 复杂对齐 需训 Reward Model + PPO;复杂场景仍不可替代

标注方式对比

方式 成本 质量 适用
人工标注 极高 最高 种子集、难例
LLM 标注 中(需校准) 大规模扩量
用户标注(被动) 波动 修正即标注、点赞即正例

取舍分析:2026 工业界主流是"DPO 为主、RLHF 兜底复杂场景";RAG 更新作为日常知识保鲜,Prompt 优化作快速实验。不要在早期就上 RLHF——先验证飞轮数据质量。

20.3 生产级实现

① 反馈埋点采集配置

# telemetry.yaml —— 飞轮的数据入口
feedback:
  explicit:                       # 显式:对话结束弹 👍/👎 + "是否解决"
    trigger: [conversation_end, key_event]
    form: lightweight             # 坑:绝不让用户填表,3 秒内可完成
  implicit:                       # 隐式:行为信号
    track: [dwell_time, rewrite_rate, copy_rate, abandon_rate]
  privacy:
    anonymize: true               # 去标识化
    consent_required: true        # 个保法:明确同意
    pii_redact: [id_card, phone, email]

② 标注 Pipeline(LLM 标 + 抽样人审)

def label_pipeline(raw_cases):
    labeled = []
    for case in raw_cases:
        if case.is_hard_negative():          # 难例/失败 case 强制人工
            labeled.append(human_label(case))
        else:
            pred = llm_label(case)            # 简单 case LLM 标
            if sample_for_audit(case):        # 10% 抽样人工复核
                pred = human_review(pred)
            labeled.append(pred)
    return labeled

③ 飞轮节奏(生产排期)

  • 每周:新数据入库(隐式 + 显式反馈)
  • 每月:Golden Set 增量更新(回灌第 19 章评测集)
  • 每季度:模型微调 / Prompt 升级
  • 每年:架构升级

生产坑位:(a) 用户隐私 vs 数据飞轮——必须脱敏 + 明确授权 + 可选联邦学习(同态加密);(b) 飞轮有"正反馈偏见":模型越强越容易拿到好评,需用 held-out 评测集打破自嗨。

20.4 实战复盘

坑 1:飞轮把"用户没回复"当成"满意"。 我们早期把沉默会话默认标为正例喂给 DPO,结果模型越训越"敷衍式简短回答"——因为用户懒得差评。复盘后引入"沉默中性"标签 + 用改写率(用户重写答案=不满意)作硬负例。教训:隐式正例是噪声,飞轮数据必须做正负均衡与显式负例。

坑 2:脱敏不彻底导致合规红线。 一次飞轮回灌时,日志里的订单号 + 姓名没被 PII 规则覆盖,险些触碰个保法"最小必要"原则。后改为"字段级脱敏白名单 + 入库前强制扫描"。教训:数据飞轮的第一约束不是模型效果,是合规;脱敏要在采集端而非标注端做。

决策复盘:DPO 还是 RLHF? 我们评估过自建 RLHF 管线(Reward Model + PPO),结论是训练稳定性差、成本高 5 倍,而 DPO 用偏好对直接优化,在我们的客服场景已经够用。最终决策:日常对齐用 DPO(占 60%+),仅"复杂多轮谈判"等少数场景保留 RLHF——与 2026 工业界主流一致。

20.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
飞轮核心 数据飞轮的核心是什么? 自增强闭环:反馈→改进→体验→更多反馈;关键是"低成本采集 + 高质量标注"兼得
DPO vs RLHF DPO 和 RLHF 区别? RLHF 训 Reward Model + PPO,复杂但上限高;DPO 直接优化偏好对更简单;2026 工业界 DPO ~60%、RLHF 留复杂场景
隐私权衡 用户隐私 vs 数据飞轮如何平衡? 脱敏/匿名化、明确授权(个保法)、联邦学习(同态加密);脱敏在采集端做
飞轮节奏 飞轮更新节奏怎么排? 周入库、月更 Golden Set、季微调、年架构升级;节奏要匹配数据成熟度

21. 用户反馈闭环与持续学习

21.0 本章上下文与知识地图

本章是第六部分收尾,依赖第 19 章(评测集作为验证基准)与第 20 章(反馈采集与标注)。它把"用户反馈"真正落到"改进动作"上,形成"反馈 → 分类 → 优先级 → 改进 → 验证 → 上线"的可执行闭环,是第 20 章飞轮在在线侧的驱动轮。核心痛点:隐式反馈充满歧义(停留久可能是满意也可能是困惑),且反馈天然有偏差(沉默大多数≠满意),闭环设计不当会变成"收集了一堆用不上的意见"。

21.1 核心概念与原理

显式反馈(Explicit):👍/👎、文字评价、1–5 星评分、"是否解决了问题"复选框。信号直接但覆盖率低(通常 < 5% 用户会评)。

隐式反馈(Implicit):停留时长、改写率(用户重写 Agent 答案)、复制率、任务完成路径。覆盖率高但语义模糊——停留久可能是满意细读,也可能是困惑卡住;复制可能是认同,也可能是想改。

反馈采集设计三原则

  • 时机:对话结束 + 关键事件(如工具调用失败)双触发
  • 形式:轻量交互(一键 👍/👎),绝不让用户填表
  • 激励:积分、徽章、特权,提升显式反馈覆盖率

反馈归因(Attribution):把负面反馈定位到具体 trace 的某一 span(步骤),才能精准改进——这是闭环区别于"看工单"的关键。

闭环原理(Mermaid):

反馈采集

归因到 trace/span

分类: 事实错误/语气/工具失败

优先级: 频率×严重度

改进: prompt/工具/数据

验证: 回第19章评测

上线 + 通知用户

设计权衡:显式反馈准但稀疏,隐式反馈密但噪;闭环要"显式定方向、隐式定规模"。归因粒度越细改进越准,但归因本身需消耗算力(重跑 trace)。

21.2 主流方案对比

维度 显式反馈 隐式反馈
覆盖率 低(< 5%) 高(近乎全量)
语义清晰度 低(需推断)
采集成本 中(需 UI 激励) 低(自动埋点)
改进可用性 直接可定位 需归因+去歧义
偏差风险 自愿者偏差 沉默者偏差

闭环触发模式对比

模式 特点 适用
实时回流 反馈即时进训练池 高活领域(客服)
批处理周更 每周聚合再改进 稳定场景
A/B 验证 改进先小流量验证 高风险改动

取舍分析:不要只用一种反馈。显式定方向与优先级,隐式定规模与长尾;闭环改进必须经 A/B 或评测验证(回到第 19 章),否则"自以为了解用户"。

21.3 生产级实现

① 反馈归因(定位到坏步骤)

# 把负面反馈归因到 trace 中可疑的 span(步骤)
def attribute(trace, feedback):
    if feedback.sentiment == "negative":
        # 倒序找第一个"可疑"步骤:异常、重试、超长、工具报错
        for span in reversed(trace.spans):
            if span.is_suspicious():        # 重试/超时/异常返回
                return span                 # 返回该步骤供改进定位
    return None

② 闭环 Pipeline(分类→优先级→改进→验证)

# feedback_loop.py
def feedback_to_improvement(feedbacks):
    grouped = classify(feedbacks)                  # 事实错误/语气/工具失败
    ranked = prioritize(grouped, by="freq*severity")
    for item in ranked[:TOP_K]:                    # 只处理高优
        patch = propose_fix(item)                  # 改 prompt/工具/数据
        if eval_gate(patch):                       # 回第19章评测门禁验证
            ship(patch)
            notify_user(item, "已优化")

生产坑位:(a) 归因别只取"最后一步"——很多坏体验源自早期错误步骤的连锁;(b) 闭环改进必须回评测门禁,否则反馈驱动的改动可能拉低其他指标。

21.4 实战复盘

坑 1:把"复制率"当满意度,越训越啰嗦。 我们一度认为用户复制答案=认同,于是强化"详尽回答",结果平均输出涨了 40%、用户停留更久——看起来双赢。后来埋点发现复制后紧随"改写",说明用户是在改我的答案。复盘后把"复制后改写"重定义为负信号。教训:隐式反馈必须组合解读,单指标会骗人。

坑 2:反馈偏差让我们误判新用户满意度。 早期我们整体看 CSAT 很高,但分群(Cohort)后发现新用户满意度比老用户低 22 分——因为老用户已学会"怎么问"。复盘后做用户分群 A/B,针对性优化新用户引导。教训:反馈必须分群(新/老、高/低活),整体均值掩盖结构性问题。

决策复盘:闭环该不该全自动? 我们试过"负面反馈自动触发 prompt 重写 + 自动上线",一次自动改动把退款政策搞错引发客诉。最终决策:自动归类 + 人工确认高优改动,低危(如语气)可自动 A/B、高危(如事实/工具)必须人审——对应第 23 章 HITL 的风险分级。

21.5 知识点 → 面试映射

知识点 面试问题 高分回答要点
隐式反馈陷阱 隐式反馈有什么坑? 用户没回复≠满意;停留久≠满意(可能困惑);复制≠认同(可能想改);须组合+分群解读
反馈偏差 如何避免反馈偏差? 抽样+强制选项破自愿者偏差;用户分群(新/老);A/B 验证破沉默偏差
闭环设计 反馈如何真正驱动改进? 归因到 span → 分类 → 优先级(频率×严重度) → 改进 → 回评测门禁验证 → 上线
采集设计 反馈采集怎么不惹用户烦? 时机(结束+关键事件)、形式(一键轻量)、激励(积分徽章);绝不让填表

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐