# SuperBizAgent 架构演进深读 **用途**:巩固知识 + 面试准备 + 举一反三 **不是**:逐字讲稿、纯知识点清单、当前 API 手册 **材料日期**:2026-07-24 **依据**:`mvp/architecture/*` 现行文档、`archive/2026-07-05-legacy`、`archive/2026-07-22-legacy`、ISS-014 / ISS-015 --- ## 0. 怎么用这份材料 | 目标 | 用法 | |---|---| | 巩固 | 按「决策环」读:目标 → 设计 → 失效模式 → 修复 → 留下的原则 | | 面试 | 每个决策都能答三句:为什么、出过什么问题、和业界差在哪 | | 举一反三 | 每节末尾的「迁移问题」用来练:换场景你会怎么选 | **一条总主线(先背这句)** > 这个项目一直在解同一个题:**概率系统(LLM)如何在故障诊断里给出可审计、可约束、可回放的结论。** > 演进不是换框架追热点,而是不断重划边界:**什么交给模型推理,什么必须由确定性系统强制。** **读的时候盯住四个轴** 1. **谁推理**:单 Agent / 多角色 / Graph 2. **谁约束**:Prompt 约定 / 代码门禁 / Harness 3. **证据如何成立**:隐式检索 / 显式 Tool / 引用验真 / 语义审查 4. **如何证明系统可信**:Trace、Eval、Release、Feedback **图目录(面试白板优先练带 ★ 的)** | 图 | 位置 | 白板优先级 | |---|---|---| | 核心矛盾:推理放大 / 越界阉割 | §1.2 | ★★ | | 四阶段演进 | §2 | ★★★ | | Phase0 医院会诊愿景 | §3.1 | ★ | | Phase1 三角色 + 双入口 | §4.1 | ★★ | | Phase2 五段证据流水线 | §5.1 | ★★★ | | 证据绑定外键模型 | §5.1 | ★★★ | | Phase2→3 职责迁移 | §6.2 | ★★★ | | 当前系统总览 | §6.2 | ★★★ | | Diagnosis 时序 | §6.2 | ★★ | | 数据三层 | §6.3-C | ★★★ | | 业界定位 | §6.5 | ★★ | | Trace / Run 模型 | §7.2 | ★★ | | 白板 60 秒速画 | §15 | ★★★ | --- ## 1. 问题域:为什么不是「套一个 Chatbot」 ### 1.1 故障诊断对系统的真实要求 | 要求 | 普通 Chatbot | 诊断 Agent | |---|---|---| | 答案形态 | 通顺、有帮助即可 | 结论必须能指向证据 | | 错误成本 | 用户再问一次 | 误导排障、误操作风险 | | 可解释 | 可选 | 必须能回放「查了什么、为何这样说」 | | 工具 | 可有可无 | 日志/指标/知识库是事实来源 | | 失败 | 道歉重试 | 要区分:没查到 / 查到了推不出 / 系统故障 | 所以早期文档就把定位写成:**面向故障诊断的可追踪 Agent 工程,不是通用对话机器人。** ### 1.2 核心矛盾(后面所有设计都围着它转) ```text LLM 擅长:规划路径、归纳症状、组织语言、在不确定下提出假设 LLM 不擅长:保证引用真实、遵守预算、不越权、不在失败时编造 因此: 推理能力要放大 越界能力要阉割 ``` ```mermaid flowchart LR subgraph Prob["概率侧 · 交给模型"] P1["规划排查路径"] P2["选择下一个 Tool"] P3["归纳症状与假设"] P4["组织诊断表达"] end subgraph Det["确定性侧 · 交给系统"] D1["只读 / Schema / 预算"] D2["引用是否真实存在"] D3["是否属于本 Run"] D4["能否对用户发布"] end User["用户问题"] --> Prob Prob -->|"Draft / tool_call"| Det Det -->|"放行或 Fallback"| Out["公开通道 SSE"] Det -.->|"拒绝越界"| Prob ``` **面试一句话** > 我们不是在提高模型智商,而是在给模型装护栏,并让每次越界都可观测。 **举一反三** - 客服退款 Agent:同样要把「查订单」与「执行退款」拆成不同权限边界。 - 代码修改 Agent:同样要把「提议 diff」与「落地 apply/merge」拆开。 - 任何 Tool-using Agent:先问「模型输出里哪些字段必须能被系统复验」。 --- ## 2. 演进总图:四个阶段在解决什么 ```text Phase 0 愿景:医院会诊式多角色协作 解决「复杂诊断需要分工」的组织问题(设计层) Phase 1 MVP:Planner / Executor / Verifier + 显式 Tool + Trace 解决「先跑通可追踪闭环」的落地问题 Phase 2 证据工程化:Gatekeeper + Composer + evidence_v2 + 双入口 + Skill 解决「幻觉与证据不可核验」的质量问题 Phase 3 重构:单 Diagnosis ReAct Agent + 确定性 Harness 解决「把 ReAct 拆成多 LLM 角色后的编排税与成本失控」 Phase 4 收敛:ISS-015 停止策略 / Repair / Reasoning 治理 / 信息化 Fallback 解决「架构对了但运行质量与审计治理未完成」 ``` ```mermaid flowchart TB P0["Phase 0 愿景
医院会诊 Multi-Agent"] P1["Phase 1 MVP
Planner → Executor → Verifier"] P2["Phase 2 证据工程化
+ Gatekeeper + Composer"] P3["Phase 3 重构 ★当前
单 ReAct Agent + Harness"] P4["Phase 4 收敛
ISS-015 运行质量"] P0 -->|"复杂度前置,先收敛"| P1 P1 -->|"幻觉:引用不可核验"| P2 P2 -->|"编排税 / Token / 重复 ReAct"| P3 P3 -->|"架构冻结后的策略债"| P4 P0 -.- N0["组织问题"] P1 -.- N1["闭环问题"] P2 -.- N2["正确性问题"] P3 -.- N3["运行时问题"] P4 -.- N4["治理与体验"] ``` ```mermaid flowchart LR subgraph Add["Phase 0→2:做加法"] A1["加角色"] A2["加证据契约"] A3["加代码验真"] A4["加双入口 / Skill"] end subgraph Move["Phase 3:做迁移,不是做减法能力"] M1["推理 → 回到单 Agent"] M2["约束 → 上收 Harness"] M3["验真语义 → Evidence/Semantic/Release"] end Add -->|"负债:编排重复实现 ReAct"| Move ``` **重要心智模型** - Phase 0→2 是在加能力、加约束。 - Phase 3 不是否定证据工程,而是**把证据工程从「角色流水线」搬进「执行边界」**。 - 面试时最容易说错的是:「我们从复杂架构简化成单 Agent,所以更粗糙」。 正确说法是:「推理合并回 Agent,约束上收到 Harness,证据门禁更硬而不是更软。」 --- ## 3. Phase 0:为什么一开始会想到「多 Agent 医院会诊」 ### 3.1 为什么这么设计 早期完整架构用医院隐喻: | 角色 | 隐喻 | 意图 | |---|---|---| | Supervisor | 院长 | 调度谁来干、何时停 | | Planner | 分诊 | 判类型、拆步骤、选专科 | | SubAgent | 专科医生 | API/DB/Cache 各有工具与 Prompt | | Verifier | 质检 | 防误诊 | ```mermaid flowchart TB U["用户输入"] --> Sup["Supervisor
院长:谁来干 / 何时停"] Sup --> Pl["Planner
分诊:fault_category + 步骤"] Pl --> SA["SubAgent 层"] SA --> API["ExternalApi"] SA --> DB["Database"] SA --> Cache["Cache ..."] API --> V["Verifier 质检"] DB --> V Cache --> V V -->|PASS| R["诊断报告"] V -->|REVISE| Pl ``` 这在**组织设计**上合理:真实 SRE 排障也是「先分流、再专科、再交叉验证」。 同时规划了 Skill、进程隔离、MCP、进化引擎——那是生产级愿景,不是第一周实现清单。 ### 3.2 会出现什么问题(如果直接实现) 1. **复杂度前置**:还没证明通用 Executor 不够用,就先拆专科,评测和 Prompt 成本指数上升。 2. **边界模糊**:Planner 既分诊又写报告、SubAgent 既查证又下结论时,出了幻觉不知道该改谁。 3. **没有触发条件的演进**:为“架构完整”而拆,而不是为“可测量的失败模式”而拆。 ### 3.3 如何解决(当时的正确收敛) 演进路线文档明确: - 当前文档只写已可运行的能力。 - SubAgent / MCP / 隔离都要有触发条件(Executor 过载、工具权限差异、评测能量化收益)。 - **没有 baseline 前,不自动优化 Prompt,不拆进程。** ### 3.4 和业界主流的关系 | 方向 | 业界常见 | 本项目早期 | 评论 | |---|---|---|---| | Multi-Agent 分工 | CrewAI / AutoGen / 手写角色群 | 医院会诊模型 | 叙事强,落地成本高 | | 先单 Agent 再拆 | Anthropic 等实践更常从单循环长出来 | 先愿景后收敛 MVP | 本项目最终也回到「先单后拆」 | | 专科路由 | 大厂内部常按域拆服务/Agent | 作为 P2 演进项 | 触发条件写清楚是加分项 | **迁移问题** > 如果你负责一个「销售 + 售后 + 财务」客服,你会第一天就拆三个 Agent 吗? > 什么指标出现后你才拆? --- ## 4. Phase 1:MVP 为什么是「Planner → Executor → Verifier」 ### 4.1 为什么这么设计 目标从“完整医院”收敛为“可演示、可追踪的诊断闭环”: ```text 用户问题 →(意图:只有诊断才走全链路) → Planner:定排查方向 → Executor:调 lookup_knowledge / logs / metrics → Verifier:质量门禁 → session / step / tool_invocation 可回放 ``` ```mermaid flowchart TB subgraph Entries["双入口"] ChatIn["POST /api/chat"] AiOpsIn["POST /api/ai_ops"] end ChatIn --> CS["ChatService"] AiOpsIn --> AS["AiOpsService"] CS --> Intent{"意图"} Intent -->|闲聊/文档| Light["轻量路径"] Intent -->|诊断| P["Planner"] P --> E["Executor"] E --> T["Tools
knowledge / logs / metrics"] T --> E E --> V["Verifier LLM"] V --> Ans["答案 + self_evaluation"] AS --> Sup["Supervisor"] Sup --> P2["Planner"] Sup --> E2["Executor"] E2 --> T2["Prometheus / logs / knowledge"] T2 --> Rule["Rule Evaluation"] Ans --> Trace["session / step / tool_invocation"] Rule --> Trace ``` 并行还有 AIOps 入口:告警驱动,Supervisor 调度 Planner/Executor,先用**规则评估**做轻量聚焦检查。 **设计动机拆解** | 决策 | 动机 | |---|---| | 意图识别前置 | 闲聊/文档问答不该付全链路 Token | | Planner 与 Executor 分离 | 避免「边想边查」时计划被工具噪声带偏(当时的假设) | | Verifier 独立 | 写答案的人不该同时当唯一质检 | | 工具显式 | 决策可见,才能进 Trace | | Chat 与 AIOps 双入口 | 交互诊断 vs 告警诊断触发方式不同 | ### 4.2 出现的问题 1. **Verifier 是模型**:能抓“说不通”,难抓“引用根本不存在”。 2. **Executor 输出形态不稳**:有时直接写用户答案,有时罗列工具结果,后续难自动验。 3. **RAG 早期 L0 可跳过 L1**:关键词唯一命中被当成高置信,语义上可能完全不相关。 4. **AIOps 与 Chat 验证强度不一致**:一边规则、一边 LLM,故事难统一。 ### 4.3 如何解决(通向 Phase 2) - 坚持 `lookup_knowledge` 是 Tool,不用隐式 Chat Advisor 吞掉检索。 - L0 从“可终局召回”降为 hint(domain/entity + filter 信号)。 - 开始要求更结构化的证据输出,并引入代码级验真(下一阶段 Gatekeeper)。 ### 4.4 和业界主流的区别 | 主题 | 业界常见做法 | Phase 1 选择 | 差异本质 | |---|---|---|---| | RAG 接入 | Spring AI Advisor / 中间件静默注入上下文 | 显式 `lookup_knowledge` Tool | **可观测的 Agent 决策** vs 隐式增强 | | 质量 | 输出后再人工抽检,或单一 LLM-as-Judge | 链路内 Verifier | 已有门禁意识,但还偏“模型审模型” | | 编排 | 直接单 ReAct | 先拆 Planner/Executor/Verifier | 用角色表达生命周期,后续证明这是重复实现 | | 告警场景 | 独立 SOAR/runbook 系统 | 同进程 AIOps Agent + rule eval | MVP 一体,但入口语义分叉 | **面试深挖答法** > 问:为什么 RAG 不走 Advisor? > 答:Advisor 适合“聊天时附带资料”。诊断系统要回答的是「第几步为什么查库、查到了什么、结论绑哪条证据」。 > 隐式检索会让 Trace 里只剩最终答案,丢了决策过程。这是可审计性要求,不是接口偏好。 **迁移问题** > 法律问答系统能否用隐式 RAG?若答案必须附法条编号,你的检索还敢静默注入吗? --- ## 5. Phase 2:证据工程化——本项目最「重」也最有辨识度的阶段 ### 5.1 为什么这么设计 到这个阶段,团队已经看清:**诊断 Agent 的第一敌人不是文笔,是证据幻觉。** 于是 Chat 复杂链路变成: ```text Planner → Executor(只产微观事实,不产最终用户答案) → Gatekeeper(代码验引用:invocation / raw_path / excerpt) → Verifier(只判断:已验真 excerpt 能否推出 claim) → Composer(只表达被允许的内容) ``` ```mermaid flowchart LR PL["Planner
plan / skill"] EX["Executor
只产微观事实"] GK["Gatekeeper
0 LLM 引用验真"] VF["Verifier
能否推出 claim"] CM["Composer
只表达允许内容"] OUT["用户答案"] PL --> EX EX --> Tools["Tools"] Tools --> EX EX -->|"executor_evidence_v2"| GK GK -->|"verified bindings"| VF VF -->|"PASS / LOW / REJECT"| CM CM --> OUT Tools -.->|"tool_invocation
+ evidence_refs"| GK ``` 并固化契约 `executor_evidence_v2`: ```text 每条 claim 必须带 evidence_bindings: tool_name + source_invocation_id + raw_path e.g. $.alerts[0] / $.no_evidence + evidence_excerpt 必须能在工具返回中找到的原文片段 ``` ```mermaid flowchart TB Claim["claim
CPU=92% 告警 firing"] Bind["evidence_binding"] Inv["tool_invocation id=517"] Raw["raw_response JSON"] Path["raw_path: $.alerts[0]"] Ex["evidence_excerpt 原文片段"] Claim --> Bind Bind --> Inv Bind --> Path Bind --> Ex Inv --> Raw Path -->|"必须能定位"| Raw Ex -->|"必须是子串/抽取"| Raw GK["Gatekeeper = 外键 + 路径 + 原文检查"] Bind --- GK Raw --- GK ``` **这是在学数据库的什么?** > 有点像「外键约束」:claim 不能指向不存在的 invocation,也不能指向对不上的路径。 > Gatekeeper 就是约束检查器;Verifier 才是业务规则引擎。 ### 5.2 分层门禁在解决哪类错误 | 错误类型 | 例子 | 谁抓 | |---|---|---| | 伪造调用 | 编造 invocation id | Gatekeeper | | 路径漂移 | id 对但 raw_path 指到别的字段/条目 | Gatekeeper | | excerpt 编造 | 引用了工具没返回的句子 | Gatekeeper | | 推不过去 | excerpt 真实,但推不出 root cause | Verifier | | 表达越权 | 把 no-evidence 说成“已排除根因” | Composer / 规则 | | 告警跑偏 | payload 是 A,报告大谈 B 告警 | AIOps rule evaluation | **负向证据(negative_observation)为什么重要** 排障里「查了但没有」也是信息。 若不建模 `$.no_evidence`,模型要么沉默,要么把“没查到”说成“不存在问题”。 ### 5.3 这个阶段实际暴露/放大的问题 ISS-014 后来总结得很准——**设计在质量上前进了,在运行结构上负债了**: #### 问题 A:ReAct 被外层重复实现 ```text 完整 ReAct 生命周期: 想 → 动 → 观察 → 再想 → 最终答 被拆成多个 LLM 角色后: Planner ≈ 想 Executor ≈ 动/观察循环 Verifier ≈ 自检 Composer ≈ 最终答 ``` ```mermaid flowchart TB subgraph Native["框架已具备的 ReAct"] direction LR T["Thought"] --> A["Action"] --> O["Observation"] --> T O --> F["Final"] end subgraph Outer["Phase2 外层又演一遍"] direction LR PL["Planner≈Thought"] --> EX["Executor≈Act/Obs"] EX --> VF["Verifier≈自检"] VF --> CM["Composer≈Final"] end Native -.->|"重复实现 + JSON 接力税"| Outer ``` 于是你要额外维护:多 Prompt、多 Schema、角色间 JSON 搬运、多套重试、ThreadLocal 隐式状态、失败×低置信×补证据的分支组合。 #### 问题 B:Tool 返回面向开发者,不面向 Agent(违反 ACI) 一次检索结果里混着: - Agent 真正需要的证据 - rerank/debug 字段 - 重复正文与打包上下文 - 不一致的空结果/错误语义 后果:上下文膨胀、模型抓错字段、Token 预算被噪声吃掉(ISS-012)。 #### 问题 C:确定性约束与业务编排耦合 Gatekeeper 本质是**纯函数式校验**,却以流水线“角色/步骤”的姿态嵌在业务编排里,导致: - 生命周期和业务步骤缠在一起 - 失败语义要和 LLM 节点失败一起解释 - 后续想做预算/取消/投影时,没有统一执行边界 #### 问题 D:双入口与多验证器让产品语义分叉 Chat 与 AIOps 两套服务、两套验证强度、两套叙事,Demo 很全,但“系统到底是什么”变难讲,实现分叉成本高。 ### 5.4 当时为什么仍值得做(面试一定要会辩护) 即使后来重构掉多角色,Phase 2 不是弯路,而是**必要的认知阶段**: 1. 证明了「引用必须可机器复验」。 2. 证明了「写证据的人 / 验证引用的人 / 判断推导的人 / 对外表达的人」关注点不同。 3. 沉淀了 eval fixture、trace 检查清单、bad case(幻觉、窄范围越权、负向证据等)。 4. 为 Phase 3 提供了**可迁移的门禁语义**(不是推倒重来,是换装载位置)。 **面试金句** > Phase 2 解决的是正确性模型;Phase 3 解决的是运行时模型。 > 没有 Phase 2,单 Agent 只会更快地产生不可验的漂亮废话。 ### 5.5 和业界主流的区别 | 能力 | 常见开源 Agent 示例 | Phase 2 | 你的辨识度 | |---|---|---|---| | 工具调用 | ReAct / OpenAI tool calls | 有 | 常规 | | 引用标注 | 让模型自己说 sources | **强制 binding + 代码核验** | 强 | | 输出分层 | 直接 final answer | evidence 草稿与用户答案分离 | 强 | | 验证 | 单次 LLM judge | 确定性 Gatekeeper + 语义 Verifier | 强 | | 编排 | 一个 loop 或一个 graph 节点集 | 固定 Sequential 五段 | 偏重,后成负债 | | RAG | 中间件注入或单次 retrieve | Tool 化 + L0 hint + VectorStore/fallback | 工程化中等偏上 | 对比常见口号: - **RAGAS / LLM-as-Judge**:偏离线或事后评估;本项目把一部分检查**前移到请求路径**。 - **LangGraph hitl / interrupt**:偏人工确认;本项目 Phase 2 偏自动门禁。 - **Guardrails 类库**:常做 schema/topic/toxicity;本项目护栏围绕**证据所有权与可推导性**。 **迁移问题** > 若你做「根据内部 Wiki 答合规问题」,最小可行的 Gatekeeper 要校验哪些字段? > (文档 id、chunk id、原文 offset、quote 是否子串匹配……) --- ## 6. Phase 3:为什么重构为「单 ReAct Agent + Harness」 ### 6.1 重构触发条件(不是审美驱动) ISS-014 的判定可以翻译成四个可对外讲的信号: 1. **结构重复**:外层编排 ≈ 框架已提供的 ReAct。 2. **成本症状**:上下文重复搬运、Token 易爆、多角色固定税。 3. **失败语义组合爆炸**:每个角色的 FAIL/LOW_CONFID/RETRY 交叉。 4. **安全能力放错层**:该确定性的事还在业务流水线里“扮演角色”。 ### 6.2 目标结构 ```text POST /api/chat (唯一执行入口, SSE) → ChatApplicationUseCase → Intent Router SYSTEM_CHAT | KNOWLEDGE_QUERY | DIAGNOSIS DIAGNOSIS: Diagnosis ReAct Agent 规划 / 选 Tool / 观察 / 写 DiagnosisDraft → EvidenceGuard (0 LLM, 结构+引用+Run ownership) → SemanticGuard (隔离单轮 LLM, 无 Tool/无记忆) → Release Policy (SUPPORTED 才公开, 否则 SAFE_FALLBACK / stable failure) ``` ```mermaid flowchart TB Browser["Browser / API Client"] --> Chat["POST /api/chat
named SSE"] Chat --> App["ChatApplicationUseCase"] App --> Router{"Intent Router"} Router --> Sys["SYSTEM_CHAT
无 Tool"] Router --> Know["KNOWLEDGE_QUERY
单次 lookup + 引用校验"] Router --> Diag["DIAGNOSIS"] Diag --> Agent["Diagnosis ReAct Agent"] Agent --> TB["Harness ToolBoundary"] TB --> Redis["Redis canonical"] TB --> Agent Agent --> Draft["DiagnosisDraft"] Draft --> EG["EvidenceGuard
0 LLM"] EG --> SG["SemanticGuard
隔离单轮"] SG --> RP["Release Policy"] RP -->|SUPPORTED| SSE["公开 content"] RP -->|否则| FB["SAFE_FALLBACK / failure"] App --> Run["diagnosis_run"] Agent --> Step["agent_step metadata"] TB --> Inv["tool_invocation metadata"] App --> TL["diagnosis_trace_event"] Agent --> RA["agent_reasoning_audit"] ``` **职责迁移图(面试最常画)** ```mermaid flowchart LR subgraph Old["Phase 2 角色"] O1["Planner"] O2["Executor"] O3["Gatekeeper"] O4["Verifier"] O5["Composer"] end subgraph New["Phase 3 归属"] N1["Diagnosis Agent 内部"] N2["Agent + ToolBoundary"] N3["EvidenceGuard"] N4["SemanticGuard"] N5["Draft + Release Policy"] end O1 --> N1 O2 --> N2 O3 --> N3 O4 --> N4 O5 --> N5 ``` ```mermaid sequenceDiagram participant C as Client participant App as UseCase participant A as Diagnosis Agent participant TB as ToolBoundary participant R as Redis participant EG as EvidenceGuard participant SG as SemanticGuard participant RP as Release C->>App: POST /api/chat App->>C: metadata(session_id, run_id) App->>A: query + safe previous_turn loop ReAct A->>TB: tool + tool_call_id + args TB->>R: canonical raw + projection TB-->>A: bounded agent_result end A-->>App: DiagnosisDraft App->>EG: Draft + current Run invocations EG-->>App: verified snapshot / fail App->>SG: query + Draft + snapshot SG-->>App: SUPPORTED / UNSUPPORTED App->>RP: decide RP-->>C: content | fallback RP-->>C: done(SUCCESS|FALLBACK|FAILED) ``` **职责重划一览** | 旧角色 | 新归属 | 说明 | |---|---|---| | Planner | Diagnosis Agent 内部 | 不再单独付一次“只规划”的链路税 | | Executor Tool loop | Diagnosis Agent + ToolBoundary | 循环回到 Agent;边界在 Harness | | Gatekeeper | EvidenceGuard | 仍 0 LLM,更明确是执行约束 | | Verifier | SemanticGuard | 保留“独立上下文审查”,去掉工具与记忆 | | Composer | Agent Draft + Release Policy | 表达权在 Agent,**发布权**在 Harness | | ChatService 大流程状态机 | UseCase + RunControl | 生命周期 first-terminal-wins | | AIOps 独立入口 | (收敛到统一 Chat 叙事) | 减少产品分叉(以现行文档为准) | ### 6.3 关键设计为什么“长这样” #### A. 单 Agent:把推理完整性还给一次上下文 **为什么** - 诊断需要根据观察动态改计划;硬切成 Planner 产出静态 plan 再交给 Executor,容易在信息到齐前定死路线,或为修正路线再开重试环。 - 同一 Run 内共享连贯工作记忆,比 JSON 接力更符合 ReAct。 **不是什么** - 不是取消规划,而是取消“规划必须是另一个 Agent 节点”。 - 不是取消验证,而是验证不再以“业务协作角色”存在。 #### B. Harness:确定性控制面 Harness 管的是: - Run/deadline/cancel/预算 - Tool schema/只读/次数 - canonical invocation(Redis)与 Agent projection - Evidence / Semantic / Release - metadata Trace 与 reasoning 审计隔离 **一句话** > Agent 是员工;Harness 是门禁、报销制度、权限系统和发布流程。 #### C. 数据三层(ACI 的核心落地) ```text Redis canonical invocation 完整 request / raw_response / agent_result 短 TTL,Harness only Agent projection 有界、聚合、可继续推理的观察 唯一允许回流 Agent 的视图 Durable audit (MySQL) 长期 metadata:谁、何时、哪个 tool、状态、字节数… 不存 Prompt 全文、不存 raw、不存 Thought 当事实 ``` ```mermaid flowchart TB ToolExec["Tool 真实执行"] --> Raw["raw_response 可能很大"] Raw --> Canon["Redis canonical
Harness only · TTL · 完整"] Canon --> Proj["ToolResultProjector"] Proj --> AgentView["agent_result 有界投影"] AgentView --> Agent["Diagnosis Agent 继续推理"] Canon --> EG["EvidenceGuard 验真"] AgentView --> EG ToolExec --> Meta["MySQL tool_invocation
metadata-only 长期审计"] Agent -.->|"禁止直连"| Canon Agent -.->|"禁止见 raw"| Raw ``` ```mermaid flowchart TB Q["同一 Tool 调用,三份不同视图"] Q --> C["① canonical raw
验真用 · 短 TTL · Harness only"] Q --> P["② projection
推理用 · 有界 · 回 Agent"] Q --> M["③ metadata audit
长期用 · MySQL · 无正文 raw"] ``` 这直接回应 Phase 2 的上下文膨胀: **验真需要完整事实,推理只需要有界观察,审计需要长期元数据——三者不是同一份 JSON。** #### D. EvidenceGuard vs SemanticGuard 为什么拆开 | | EvidenceGuard | SemanticGuard | |---|---|---| | 要不要模型 | 否 | 是(隔离单轮) | | 问什么 | 引用是否真实、是否属于本 Run、结构是否合法 | 整份报告是否被证据支持、是否越界表达 | | 失败含义 | 数据/契约问题 | 语义/推理问题 | | 类比 | 类型检查 / 外键 | 代码 review / 逻辑审查 | ```mermaid flowchart TB Draft["DiagnosisDraft"] --> EG{"EvidenceGuard
物理/结构/归属"} EG -->|fail| FB1["不可发布
契约/引用问题"] EG -->|verified snapshot| SG{"SemanticGuard
整份语义是否越证"} SG -->|UNSUPPORTED| FB2["SAFE_FALLBACK"] SG -->|SUPPORTED| RP["Release
公开 typed report"] EG -.- E1["0 LLM"] SG -.- E2["隔离 · 无 Tool · 无记忆"] ``` 混成一个“超级 Verifier”会重新出现:模型既要装法官又要装扫描仪,且失败原因不可分。 #### E. Release Policy 为什么必须存在 即使 Draft 写得漂亮: - Evidence 失败 → 不能当成功答案出去 - Semantic UNSUPPORTED → 只能 SAFE_FALLBACK - cancel/timeout → 禁止 late content ```mermaid flowchart LR Internal["内部 Draft
staging 制品"] --> Gate{"Release Policy"} Gate -->|SUPPORTED| Pub["公开 SSE
production"] Gate -->|UNSUPPORTED / evidence fail| Safe["SAFE_FALLBACK
有界说明"] Gate -->|tech fail| Fail["stable failure"] Gate -->|cancel/timeout| Stop["终态 · 禁 late content"] ``` **公开通道与内部草稿必须切断。** 这对应安全发布思想:staging 制品不能直接当 production。 #### F. Reasoning 分表 Provider 若返回 `reasoning_content` 等字段: - 可进 `agent_reasoning_audit`(截断、计字节) - 不进普通 Trace / SSE / Evidence / 业务判断 - Provider 没返回时记 unavailable,**禁止伪造** 这是在学: **思维链若存在,它是敏感审计数据,不是可引用事实,更不是产品功能输出。** ### 6.4 重构时明确放弃/降级的东西 | 放弃 | 原因 | |---|---| | 业务层 StateGraph/多角色 Sequential | 与框架 ReAct 重复,编排税高 | | 以 DB `tool_invocation.id` 为引用主键的重协议 | 改为框架 `tool_call_id` + 当前 Run ownership,贴合运行时 | | 完整历史进下一轮 | PreviousTurn 仅最近一次成功发布的有界字段 | | 把 self_evaluation 多种 LLM 评估缠在主叙事 | 收敛到 Guard + Release + Timeline | | 推倒证据思想 | **保留**“先物理验真、再语义审查、再发布” | ### 6.5 和业界主流架构的对照(面试高频) #### 6.5.1 总表 | 架构族 | 代表形态 | 优点 | 风险 | 与本项目 | |---|---|---|---|---| | 单 ReAct + Tools | 多数 Demo / 助手 | 简单、动态 | 易幻觉、难审计 | **骨架相同**,本项目多了硬 Harness | | Multi-Agent 协作 | Crew / 手写角色群 | 分工清晰 | 重复上下文、权责漂移 | Phase 2 接近;Phase 3 退出主路径 | | Graph 编排 | LangGraph 等 | 可控分支、打断、持久状态 | 易把业务状态机写重 | **业务层不用 Graph**;框架内部实现无关 | | Router + Experts | 意图路由到专科 | 域深 | 需分类准、评测全 | Intent Router 轻量存在;专科专家未拆 | | Agent + Guardrail 管道 | 输入/输出护栏产品 | 合规快 | 常缺“证据所有权” | 本项目护栏更偏 **tool evidence** | | SOAR / Runbook | 固定剧本自动化 | 稳定可预期 | 难覆盖长尾自然语言 | Playbook 是演进项,不是当前主路径 | #### 6.5.2 你要能讲清的「三个不一样」 **1)和“纯 ReAct Demo”不一样** ```text 纯 ReAct: model ↔ tools ↔ final text 本项目: model ↔ (ToolBoundary/projection) ↔ draft ↔ EvidenceGuard ↔ SemanticGuard ↔ Release ↔ public SSE + Run budget/cancel + Timeline + reasoning audit ``` ```mermaid flowchart TB subgraph Demo["纯 ReAct Demo"] M1["Model"] <--> T1["Tools"] M1 --> F1["final text 直接出门"] end subgraph Ours["本项目"] M2["Model"] <--> TB["ToolBoundary + projection"] M2 --> D["Draft 仅内部"] D --> G1["EvidenceGuard"] G1 --> G2["SemanticGuard"] G2 --> R["Release"] R --> PUB["public SSE"] H["Harness: budget / cancel / timeline / reasoning audit"] H -.-> M2 H -.-> TB H -.-> R end ``` **2)和“Multi-Agent 很强”叙事不一样** > 多 Agent 的正确动机是:权限不同、知识不同、失败域不同、需要并行。 > 错误动机是:用角色名重新描述一遍 ReAct 步骤。 > 我们踩过后面这种坑,所以合并。 ```mermaid flowchart TB subgraph Wrong["错误动机:给 ReAct 步骤起名"] W1["Planner"] --> W2["Executor"] --> W3["Verifier"] --> W4["Composer"] end subgraph Right["合法动机:真正的失败域/权限不同"] R1["只读诊断 Agent"] R2["变更执行 Agent
需审批"] R3["财务退款 Agent
强权限"] end Wrong -.->|"本项目 Phase2 偏这类"| X["合并回单 Agent"] Right -.->|"才值得 Multi-Agent"| Y["保持拆分"] ``` **3)和“上 LangGraph 就企业级”不一样** > Graph 解决的是状态与边;企业级还依赖:预算、取消、发布、数据分层、评测、审计隔离。 > 没有这些,Graph 只是更复杂的 if-else。 ```mermaid flowchart TB subgraph Axes["横轴:编排复杂度 →  纵轴:控制面完整度 ↑"] direction TB Q2["② 目标区
编排克制 + 控制面强
★ 本项目当前"] Q1["① 重 Graph 且有护栏
企业工作流 + 审批/预算"] Q3["③ Demo 常见区
纯 ReAct · 控制面弱"] Q4["④ 重编排轻护栏
裸 Graph / 角色流水线过重"] end Q2 ~~~ Q1 Q3 ~~~ Q4 P2["Phase2 五段"] -.->|"偏右上但仍角色税高"| Q4 Now["Phase3 Agent+Harness"] --> Q2 Demo["纯 ReAct Demo"] --> Q3 ``` 白板口述版(不必画象限,画两点对比即可): ```text 控制面强 ^ | ★ 本项目(单 Agent + Harness) | · 企业 Graph+护栏 | | Phase2 五段(能力强,编排税高) | | 纯 ReAct Demo 裸 Graph 无护栏 +-------------------------------------> 编排复杂 ``` #### 6.5.3 和 OpenAI/Anthropic 工具调用范式 | 点 | 主流 API 范式 | 本项目 | |---|---|---| | tool_call_id | 协议层已有 | **直接作为证据引用主键之一**,不另造平行 ID 体系 | | tool result | 多原样回灌 | **必须经 projector**,raw 进 Redis canonical | | 并行 tools | 常见 | 受预算与只读边界约束 | | 输出 | 自由文本或 JSON mode | 结构化 `DiagnosisDraft` + 分析项绑定 tool_call_id | #### 6.5.4 和 RAG 主流(Modular RAG / Agentive RAG) | 点 | 主流 | 本项目 | |---|---|---| | Query rewrite / rerank | 管线模块可选 | 可作为检索内部能力,但**对 Agent 应投影掉调试细节** | | 引用 | 答案角标 | 运行时绑定 tool_call + Guard | | 知识问答 vs 诊断 | 常混一个 bot | Intent 拆 SYSTEM / KNOWLEDGE / DIAGNOSIS | | 评测 | 离线黄金集 | 有 diagnosis eval;RAG 有历史闭环设计 | ### 6.6 重构后仍未结束的问题(诚实加分) ISS-015 说明架构冻结后的运行质量债: - 重复检索直到预算耗尽 - Evidence Repair 的 schema/parse 问题 - Reasoning 真实 Provider 与访问治理未完 - Fallback 信息量不足(用户不知道已经看到了什么) **面试怎么讲** > 重构完成不等于产品完成。我们把架构风险从“结构错误”推进到了“策略与治理”,并用独立 Issue 跟踪,而不是偷偷在主链打补丁改变架构。 **迁移问题** > 你在什么情况下会把已经合并的单 Agent 再拆开?请给出 3 个可量化触发条件。 > (参考本项目旧路线:Executor prompt 膨胀、工具权限显著分叉、分类评测证明拆分收益。) --- ## 7. 横切演进:五条独立故事线 面试官不一定按时间问,可能横切打穿。下面每条都按「为什么 → 问题 → 解决 → 业界」压缩。 ### 7.1 RAG | 阶段 | 策略 | 失效 | 收敛 | |---|---|---|---| | 早期 | L0 唯一命中可跳过 L1 | 关键词≠语义 | L0 降级为 hint | | 中期 | VectorStore 主路径 + SDK fallback | 迁移期 schema/score 语义变 | auto 模式保主链 | | 全程 | 显式 Tool | 隐式 Advisor 丢决策 | 坚持 Tool 化 | | 当前 | projector 后的有界 evidence | 原始检索大包撑爆上下文 | canonical/projection 分离 | ```mermaid flowchart TB subgraph Early["早期 L0 可终局"] E0["L0 关键词"] -->|唯一命中| Skip["跳过 L1 · 当答案"] E0 -->|0/多命中| L1a["L1 向量"] end subgraph Now["当前"] A["Agent 显式 lookup_knowledge"] --> L0["L0 hint
domain/entity/filter"] L0 --> L1["L1 VectorStore"] L1 -->|fail| FB["Milvus SDK fallback"] L1 --> Proj["projector 有界 evidence"] FB --> Proj Proj --> AgentObs["Agent 观察"] Proj --> Canon["canonical 供 Guard 验真"] end Early -.->|"关键词≠语义"| Now ``` **业界差在**:很多系统优化召回率;本项目同等强调**召回结果如何成为可引用证据**。 ### 7.2 Trace 与数据模型 ```text 早期: session + step + tool_invocation → 中期: + diagnosis_run 精确一次运行 → 当前: run 为真理源 + 统一 diagnosis_trace_event Timeline + agent_step / tool_invocation metadata-only + agent_reasoning_audit 独立 ``` ```mermaid flowchart TB CS["chat_session
sessionId 多轮目录"] CS --> R1["diagnosis_run runId=1"] CS --> R2["diagnosis_run runId=2"] R1 --> S1["agent_step metadata"] R1 --> I1["tool_invocation metadata"] R1 --> T1["diagnosis_trace_event Timeline"] R1 --> A1["agent_reasoning_audit 受限"] API1["GET .../trace?runId="] --> T1 API1 --> S1 API1 --> I1 API2["GET .../trace/reasoning?runId="] --> A1 API1 -.->|"不返回 reasoning 原文"| X["普通审计面"] API2 -.->|"敏感审计面"| Y["独立治理 ISS-015"] ``` 原则: - 禁止“取最新一条”代替 exact `runId` - Trace 写失败可观测,但不应改变业务结果 - 普通 Trace API 不返回 reasoning 原文 **业界差在**:很多 Demo 只有 LangSmith 外部 tracing;本项目把**业务可读 Timeline** 当作产品能力(并对敏感 reasoning 另通道)。 ### 7.3 入口与会话 ```text 双入口 Chat/AIOps → 统一 Chat + Intent PreviousTurn: 全历史 / 失败上下文 → 仅最近 SUCCESS published 有界字段 ``` 原则:多轮要的是**安全状态接力**,不是把噪声和未验证草稿接着喂给下一轮。 ### 7.4 质量体系 ```text 人工看 Demo → Gatekeeper/Verifier 在线门禁 → diagnosis eval fixtures + baseline → Trace inspection checklist → 重构后 E2E + ISS-015 运行质量 ``` 原则:架构变更必须能指出**哪类 case 从红变绿/从绿变红**。 ### 7.5 安全发布 ```text 模型直接吐最终答案 → Verifier 后再答 → Draft 永不为公开,除非 Release 点头 ``` 类比持续交付:构建产物 ≠ 生产流量。 --- ## 8. 决策环模板(用来巩固任意设计点) 对任何一个设计点,用同一模板自问自答: ```text 1. 威胁模型:若没有它,最可能出现什么坏结果? 2. 责任人:这件事该由模型判断,还是系统强制? 3. 数据面:完整事实 / 模型可见 / 长期审计 是否分层? 4. 失败语义:失败时用户看到什么?内部能诊断什么? 5. 可证伪:用什么 eval/trace 证明它有效? 6. 演进触发:什么指标会让我们改掉它? ``` ### 练习:套到「SemanticGuard 无 Tool」 1. 威胁:Guard 自己再查库 → 主 Agent 与 Guard 证据集不一致,审查失去基线。 2. 责任:语义是否成立交给模型;能否再取证不交给它。 3. 数据:只给 query + full draft + verified snapshot。 4. 失败:技术失败有限重试后降级,不把内部异常吐给用户。 5. 可证伪:unsupported-claim、fabricated-invocation 等 fixture。 6. 触发:若误杀率过高,优先生证据投影与 Draft schema,而不是给 Guard 加 Tool。 --- ## 9. 面试题库(按深度) ### 9.1 2 分钟:你的系统是什么 **结构建议** 1. 领域:故障诊断,不是通用聊天。 2. 当前形态:单 Diagnosis Agent + Harness 门禁 + 唯一 Chat 入口。 3. 演进一句:多角色证据流水线教会我们验真,再重构掉重复的 ReAct 编排。 4. 差异化:证据所有权、发布策略、Run 级回放。 ### 9.2 为什么题(必练) | 问题 | 得分要点 | |---|---| | 为什么最终单 Agent? | 多角色重复 ReAct;合并推理,上收约束 | | 为什么还要 SemanticGuard? | 物理真不等于语义成立;且必须隔离上下文 | | 为什么 EvidenceGuard 不用模型? | 引用归属是确定性的;用模型会引入不可复现误判 | | 为什么 Redis 存 raw、MySQL 不存? | 验真要完整、长期存要控敏控体积、Agent 不能见 raw | | 为什么 reasoning 单独 API? | 敏感、非事实、防污染普通审计与产品通道 | | 为什么 PreviousTurn 极简? | 防把失败/fallback/raw 污染下一 Run | | 为什么不业务层上 Graph? | 要的是边界清晰不是边更多;框架内部实现另算 | ### 9.3 对抗题(高级) **Q:多 Agent 不是更清晰吗?你们是不是退步了?** A:清晰应体现在**边界**(谁能写生产、谁能看 raw、谁能发布),不是体现在**角色数量**。 我们把 Gatekeeper/Verifier/Composer 的**语义**保留为 Guard/Release,把重复的 LLM 角色去掉。 角色变少,强制约束变多——这是进展。 **Q:和 LangGraph 生产案例比,你们会不会太简陋?** A:Graph 擅长长流程状态、人机回环、复杂分支。 我们当前主路径是短周期诊断 ReAct,瓶颈在证据与发布,不在多图分支。 若以后出现:多日工单、人工批准变更、跨系统编排,再评估 Graph/工作流引擎——那是触发条件,不是名片。 **Q:SemanticGuard 不还是 LLM-as-Judge 吗?靠谱吗?** A:是,所以它被降权: - 只能看已验真快照; - 无 Tool 不能“补证据自圆其说”; - 不能单独发布,必须过 Release; - 技术失败有降级路径。 它不是唯一真理,而是**最后一道语义保险丝**。 **Q:你们如何证明重构没有丢掉 Phase 2 的防幻觉能力?** A:映射门禁 + 回归夹具 + E2E trace: 伪造引用、无证据负向观察、unsupported claim、narrow scope 等 case; 并看 release_outcome 与 timeline 事件是否仍能解释失败阶段。 ### 9.4 让你“现场设计”的题(举一反三) 1. 给「SQL 查询 Agent」设计 EvidenceGuard:如何防止 `DROP`、如何防止编造查询结果? 2. 给「改代码 Agent」设计 Release Policy:什么情况下允许自动 PR?什么必须 human approval? 3. 工具从 3 个变成 30 个时,你先上 MCP 还是先上 Tool Registry + 权限组?为什么? 4. 若产品要“展示思考过程”,你如何在不污染事实证据的前提下做 UI? 每题都试着用第 8 节模板答。 --- ## 10. 一张总对照表(背这张就够串场) | 维度 | Phase 1 | Phase 2 | Phase 3(当前) | |---|---|---|---| | 主问题 | 跑通闭环 | 证据可核验 | 去掉重复编排、收敛控制面 | | 推理结构 | 三角色 | 五段流水线 | 单 ReAct Agent | | 确定性验真 | 弱/无 | Gatekeeper | EvidenceGuard | | 语义审查 | Verifier | Verifier | SemanticGuard(隔离) | | 对外表达 | 多在 Executor/Verifier 后直接 | Composer | Draft + Release | | 工具结果 | 较原始 | 进 DB 细节多 | canonical / projection / audit 三层 | | 入口 | Chat + AIOps | 同左 + Skill | 统一 Chat + Intent | | 回放 | step/tool | + run + self_eval | Timeline + 独立 reasoning | | 主要负债 | 幻觉 | 编排税/Token | 运行策略与治理(ISS-015) | | 业界近似 | 初级 Tool Agent | 重型 multi-agent 流水线 | ReAct + 强 Guardrail/Harness | ```mermaid flowchart LR P1["Phase1
P→E→V"] --> P2["Phase2
+GK +Composer"] P2 --> P3["Phase3
Agent + Harness"] P1 -.- L1["能跑"] P2 -.- L2["能验"] P3 -.- L3["能控"] ``` **一图串三阶段(面试收口用)** ```mermaid flowchart TB subgraph P1["Phase1 闭环"] direction LR A1["Plan"] --> A2["Act"] --> A3["Verify"] end subgraph P2["Phase2 正确性"] direction LR B1["Plan"] --> B2["Act"] --> B3["Gate 0LLM"] --> B4["Verify"] --> B5["Compose"] end subgraph P3["Phase3 运行时"] direction LR C1["单 Agent ReAct"] --> C2["Evidence"] --> C3["Semantic"] --> C4["Release"] end P1 -->|"引用不可核验"| P2 P2 -->|"外层重复 ReAct"| P3 ``` --- ## 11. 可复用的原则清单(收口) 1. **先威胁模型,后角色图** 2. **能确定性检查的,不要交给模型装公正** 3. **模型可见数据必须有界(ACI)** 4. **完整事实、推理视图、长期审计三者分离** 5. **公开通道与内部草稿切断(Release)** 6. **Run 级身份贯穿:禁止“最新一条”** 7. **显式 Tool 决策优于隐式中间件魔法**(在可审计领域) 8. **多 Agent 的合法理由是权限/知识/失败域,不是给 ReAct 步骤起名** 9. **演进要有触发条件与评测,反自动炫技** 10. **重构保留语义,迁移装载位置,不把历史能力一笔勾销** --- ## 12. 建议复习路径(3 天) ### Day 1 巩固 - 读现行 4 篇架构:`current-mvp-architecture` / `agent-orchestration` / `harness-quality-gates` / `session-trace-lifecycle` - 用第 8 节模板重写:ToolBoundary、EvidenceGuard、Release - **默画 §15 图 A + 图 D**(当前主链、数据三层) - 输出:一页「当前系统边界图」(手绘即可) ### Day 2 演进与辩护 - 读 `executor-evidence-pipeline-refactor` + ISS-014 摘要 - 练习:为 Phase 2 辩护 2 分钟,再为 Phase 3 重构辩护 2 分钟 - **默画 §15 图 B + 图 C**(五段流水线、职责迁移) - 输出:10 行「旧角色 → 新组件」映射表(不看文档默写) ### Day 3 业界与迁移 - 用第 6.5 节表格,挑 2 个外部架构(如 LangGraph multi-agent、纯 ReAct SaaS 助手)做优缺点 - **默画 §15 图 E + 图 F**,并按 §15.7 组合练 3 个开场 - 做第 9.4 两道现场设计题 - 读 ISS-015:准备一段“未完成但可控”的诚实收尾 --- ## 13. 附录:关键文件索引 | 主题 | 路径 | |---|---| | 当前架构入口 | `mvp/architecture/README.md` | | 单 Agent 重构总因 | `mvp/issues/archived/ISS-014-single-react-agent-harness-aci-ptk-refactor.md` | | 运行质量后续 | `mvp/issues/active/ISS-015-diagnosis-runtime-quality-and-reasoning-audit.md` | | 旧五段编排 | `mvp/architecture/archive/2026-07-22-legacy/agent-orchestration.md` | | 旧证据契约 | `mvp/architecture/archive/2026-07-22-legacy/executor-evidence-pipeline-refactor.md` | | 旧演进路线 | `mvp/architecture/archive/2026-07-22-legacy/evolution-roadmap.md` | | 早期愿景 | `mvp/architecture/archive/2026-07-05-legacy/agent-architecture.md` | | 早期 MVP | `mvp/architecture/archive/2026-07-05-legacy/agent-architecture-mvp.md` | --- ## 14. 最后一道自测(不看文档回答) 1. 用一句话说清:Phase 2 与 Phase 3 各自解决的**不同类问题**是什么? 2. 为什么说 Gatekeeper 和 EvidenceGuard “神似”但“层不同”? 3. 若去掉 SemanticGuard,只留 EvidenceGuard,系统会怎样坏? 4. 若去掉 EvidenceGuard,只留 SemanticGuard,系统会怎样坏? 5. 举一个**不该**再拆多 Agent 的场景,和一个**该**拆的场景。 6. 你的系统与“LangChain + 向量库问答机器人”的本质三点差异? 7. ISS-015 若只准做一件事,你先做哪个?为什么?(停止策略 / Repair / Reasoning 治理 / Fallback 信息量) 能流畅答完 1–6,面试架构部分通常已经稳;第 7 题用来展示判断力而非背诵。 **加试:默画** 8. 60 秒画出「当前 Diagnosis 主链」(入口 → Agent → 三道门 → SSE)。 9. 90 秒画出「Phase2 五段」并标注哪一段是 0 LLM。 10. 60 秒画出「数据三层」并标出 Agent 能看见哪一层。 --- ## 15. 白板默画清单(面试实战) > 目标:不是画得好看,而是**边画边讲决策**。 > 建议每天抽 1 张限时默画,画完对照本节「必须出现的框」。 ### 15.1 图 A · 60 秒:当前主链(必考) ```text Client │ POST /api/chat (SSE) ▼ UseCase ── Intent ──┬─ SYSTEM ├─ KNOWLEDGE └─ DIAGNOSIS │ ▼ Diagnosis Agent ◄── projection │ tool_call_id ▼ ToolBoundary ──► Redis canonical │ ▼ DiagnosisDraft │ ┌────────────┼────────────┐ ▼ ▼ ▼ EvidenceGuard SemanticGuard Release (0 LLM) (隔离LLM) (发布权) │ │ │ └────────────┴────► SSE content / fallback ``` **边画边说的三句** 1. 唯一入口,意图分流,诊断才进 Agent。 2. Agent 只见投影,raw 只在 Harness。 3. Draft 默认不公开,Release 点头才出门。 **必须出现的框**:Intent、Agent、ToolBoundary/Redis、Evidence、Semantic、Release、SSE。 ### 15.2 图 B · 90 秒:Phase2 五段 + 证据外键 ```text Planner → Executor ⇄ Tools │ ▼ executor_evidence_v2 Gatekeeper (0 LLM) │ check id / path / excerpt ▼ Verifier (LLM) ▼ Composer → Answer ``` 证据外键小图: ```text claim ──binding──► invocation_id ├──► raw_path └──► excerpt ⊆ raw_response ``` **边画边说** > 这段解决的是正确性:先代码验引用,再模型验推导,最后控表达。 ### 15.3 图 C · 60 秒:职责迁移(回答“是不是退步”) ```text Planner ─────────────► Agent 内部 Executor loop ────────► Agent + ToolBoundary Gatekeeper ───────────► EvidenceGuard Verifier ─────────────► SemanticGuard Composer ─────────────► Draft + Release ``` **金句**:角色变少,强制约束变多;语义保留,装载位置变了。 ### 15.4 图 D · 60 秒:数据三层(ACI) ```text Tool 执行 │ ├──────────────► MySQL metadata(长期、无 raw) │ ▼ Redis canonical(完整 raw,短 TTL,Harness only) │ ▼ projector agent_result 投影 ──────────► 只回 Agent │ └─────────────────────► EvidenceGuard 也可读 canonical ``` **必须标**:Agent 禁止直连 Redis / 禁止见 raw。 ### 15.5 图 E · 45 秒:业界定位两点对比 ```text 纯 ReAct: Model ↔ Tools → 文本直接出门 本项目: Model ↔ Boundary → Draft → Guard → Guard → Release → 出门 + budget/cancel/timeline ``` ### 15.6 图 F · 45 秒:演进箭头(开场用) ```text 愿景 Multi-Agent → MVP P/E/V(能跑) → +Gate/Composer(能验) → 单 Agent + Harness(能控) → ISS-015(治运行) ``` ### 15.7 现场组合策略 | 面试官问题类型 | 先画哪张 | 再补哪张 | |---|---|---| | 介绍项目 | F 演进 | A 当前主链 | | 如何防幻觉 | B 或 A 的 Guard | D 数据三层 | | 为什么重构 | C 迁移 | B→A 对比 | | 和 LangGraph/多 Agent 比 | E 定位 | C 合法拆分动机 | | 数据怎么存 / 怎么审计 | D 三层 | Trace session/run 树 | ### 15.8 默画评分(自评) | 分数 | 标准 | |---|---| | 5 | 限时内画完 + 边讲决策 + 主动说取舍 | | 4 | 画完且框齐全,讲解连贯 | | 3 | 框基本全,但讲成组件清单 | | 2 | 漏 Release / 数据分层 / 0LLM 门禁 | | 1 | 只画了 Model↔Tools | **红线(扣分项)** - 把 SemanticGuard 画成带 Tool 的第二 Agent - 让 raw_response 直接回到 Agent - Draft 不经 Release 就连到用户 - 说“我们简化成单 Agent 所以不做验证了”