Archive pre-refactor interview notes and add current deep-dives on architecture evolution, issue-derived stories, and evidence gates.
381 lines
16 KiB
Markdown
381 lines
16 KiB
Markdown
# 从 Issues 提炼的面试故事
|
||
|
||
**更新日期**:2026-07-24
|
||
**用途**:从 `mvp/issues` 已解决问题中,筛出可讲、值得讲、能举一反三的案例
|
||
**配套**:[architecture-evolution-deep-dive.md](architecture-evolution-deep-dive.md)(讲演进骨架);本文讲**具体踩坑与决策**
|
||
|
||
---
|
||
|
||
## 0. 怎么用
|
||
|
||
| 场景 | 用法 |
|
||
|---|---|
|
||
| 行为面试 / 项目深挖 | 选 2–3 个 ★★★ 故事,用 STAR 讲 |
|
||
| 架构追问 | 把故事挂回演进阶段(Phase2 证据 / Phase3 重构 / 工程化) |
|
||
| 避免踩坑 | ★ 仅作补充,勿当主叙事;过时方案要说「后来被什么吸收」 |
|
||
|
||
**总原则**
|
||
|
||
> 面试官要的不是 Issue 编号,而是:**现象 → 根因分层 → 你选了什么杠杆 → 如何验证 → 后来边界怎么演进**。
|
||
|
||
---
|
||
|
||
## 1. 全景评分(先看这张表)
|
||
|
||
| Issue / 主题 | 面试价值 | 最适合回答的问题类型 | 一句话钩子 | 注意 |
|
||
|---|:---:|---|---|---|
|
||
| **证据归因幻觉** + Gatekeeper 链路 | ★★★ | 防幻觉 / 质量门禁 | 「工具调了,结论仍是编的」 | 旧角色名要映射到现在 Guard |
|
||
| **ISS-014** 单 Agent + Harness | ★★★ | 架构重构 / 为什么简化 | 「不是砍验证,是换装载层」 | 主故事,深读文档已覆盖 |
|
||
| **ISS-008** 窄范围越界 | ★★★ | Agent 约束 / Prompt 不够 | 「只问 CPU,却去查全家桶」 | 好举一反三 |
|
||
| **ISS-009** 负向证据 | ★★★ | 证据建模 / no-hit | 「没查到也是证据」 | 区分「无问题」vs「无数据」 |
|
||
| **ISS-001→002→004→015** 重复检索族 | ★★★ | 迭代加深 / Prompt vs 硬约束 | 「去重了仍狂调 20 次」 | 讲演进链,别只讲一次补丁 |
|
||
| **ISS-010** session/run 隔离 | ★★★ | 可观测 / 多轮正确性 | 「同会话多轮 Trace 串台」 | 和 runId 真理源强绑定 |
|
||
| **ISS-012** Token/上下文膨胀 | ★★★ | 成本 / ACI / 上下文工程 | 「工具返回把上下文撑爆」 | 接到 projection 三层数据 |
|
||
| **ISS-006 + fixtures + baseline diff** | ★★ | 工程化 / 回归 | 「改 Prompt 怎么知道没退步」 | 体现测试思维 |
|
||
| **ISS-007** 摘要失真 → 自证循环 | ★★★ | 信息通路设计 | 「证据在,摘要丢了关键句」 | 可与归因幻觉合并讲 |
|
||
| **ISS-013** SSE / 入口解耦 | ★★ | 后端工程 / 协议边界 | 「假流式 + Controller 过重」 | 偏工程,Agent 味稍淡 |
|
||
| **ISS-005** 证据状态契约 | ★★ | 契约 / 失败语义 | 「failed/no_evidence/deduped 语义乱」 | 作 001/007 的基础设施铺垫 |
|
||
| **RAG 子问题集** | ★★ | RAG 专题 | L0 降级、显式 Tool、breadcrumb | 合成一条 RAG 故事,勿逐条念 |
|
||
| **ISS-003** 总 Review | ★ | 过程 | 问题发现清单 | 不宜单独讲 |
|
||
| **ISS-015**(进行中) | ★★ | 诚实收尾 / 判断力 | 「架构冻了,策略还在收」 | 讲未完成,勿假装已完美 |
|
||
|
||
---
|
||
|
||
## 2. 推荐主故事包(面试只带这 5 个就够)
|
||
|
||
### 故事包怎么组合(15 分钟项目介绍)
|
||
|
||
```text
|
||
1) 开场架构(2 min) → 深读文档 / ISS-014 结论
|
||
2) 质量核心(4 min) → 证据归因幻觉 + Gatekeeper/EvidenceGuard
|
||
3) 约束演进(3 min) → 重复检索 001→002→硬预算 / 窄范围 008
|
||
4) 工程底座(3 min) → run 隔离 010 + eval harness 006
|
||
5) 重构与未完(3 min) → ISS-014 为什么合并 + ISS-015 诚实项
|
||
```
|
||
|
||
---
|
||
|
||
## 3. ★★★ 故事详解(可直接练口述)
|
||
|
||
### 3.1 证据归因幻觉(最高辨识度)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 来源 | `executor-evidence-attribution-hallucination` + ISS-007 + design-note 自证循环 |
|
||
| 完整深读 | [topic-evidence-attribution-and-gates.md](topic-evidence-attribution-and-gates.md) |
|
||
| 阶段 | Phase 2 正确性建设 |
|
||
| 现象 | 多次 E2E:工具已调 `lookup_knowledge/logs/metrics`,Verifier 仍大面积 `LOW_CONFID`;答案里出现 OOM、Full GC 次数等**工具返回里没有的「精确事实」** |
|
||
| 错误归因(你要主动否定) | 「是不是 Verifier 太严 / 只认 RAG?」——查 `evidence_refs` 后发现并非如此 |
|
||
| 真根因 | **Executor 证据归因幻觉**:把 runbook/历史模式/模型常识写进「当前已证实事实」,未区分 direct / reference / hypothesis / missing |
|
||
| 解法演进 | ① 结构化 claim + binding(invocation/path/excerpt)② **代码 Gatekeeper** 验引用 ③ Verifier 只判可推导 ④ Composer 控表达 → 后来迁到 EvidenceGuard + SemanticGuard + Release |
|
||
| 验证 | 固定 session 表(groundedness、no_evidence 计数);eval fixture;Trace 可指出「哪条 claim 无 binding」 |
|
||
| 现行映射 | Gatekeeper → **EvidenceGuard**;Verifier → **SemanticGuard**;最终出门 → **Release** |
|
||
|
||
**STAR 口述(约 90 秒)**
|
||
|
||
> 我们诊断链路经常 LOW_CONFID。第一反应像是验证器太狠,但拉 Trace 发现工具其实调用成功了。
|
||
> 对比答案和 tool raw 后定位到:模型会把知识库里的「常见故障模式」写成「这次故障已观测事实」。
|
||
> 所以我们把「有没有这句证据」从 LLM 判断里拆出来,做成代码级引用校验;模型只负责在已验真片段上做推导。
|
||
> 这直接把问题从「提示词求稳」升级成「证据所有权与类型系统」。
|
||
> 后来重构单 Agent 时,这层语义保留了,只是从流水线角色变成了 Harness 门禁。
|
||
|
||
**追问预备**
|
||
|
||
- Q: 为什么不靠更强模型?
|
||
A: 分布上仍会混用常识与观测;确定性校验可回归、可解释。
|
||
- Q: excerpt 子串匹配会不会太死?
|
||
A: 对防伪造必须偏严;表达层再允许归纳,但不允许无根引用。
|
||
- Q: 和 RAG 引用角标有何不同?
|
||
A: 角标常是生成时装饰;我们校验的是**当次 Run 的 tool_call 所有权**。
|
||
|
||
**举一反三**
|
||
|
||
- 客服:「政策规定 7 天」≠「本单已同意退款」
|
||
- 代码 Agent:「README 说应有测试」≠「本 PR 已有测试」
|
||
|
||
---
|
||
|
||
### 3.2 窄范围查询越界(ISS-008)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 现象 | 用户只要确认 `payment-service` 是否有 HighCPU 告警;Agent 却扩展到内存、日志、根因故事 |
|
||
| 根因 | ReAct 默认「有工具就多查」;Prompt 未区分 **observation 任务** vs **root-cause 任务**;claim 类型未收窄 |
|
||
| 解法 | 窄范围只允许 `observation` / `negative_observation`;禁止随手 root_cause;工具选择与输出 schema 双约束 |
|
||
| 验证 | narrow-highcpu 类 fixture:该 PASS 的 observation 不因「没讲根因」被打成失败 |
|
||
| 现行 | DiagnosisDraft 分析项仍强调证据绑定;范围控制在 Agent 指令 + Guard 语义审查 |
|
||
|
||
**金句**
|
||
|
||
> Agent 的能力上限往往不是「会不会查」,而是「知不知道何时停、查什么算完成」。
|
||
|
||
**举一反三**
|
||
|
||
- SQL Agent:用户要 `SELECT count` 时禁止顺手 `UPDATE`
|
||
- 调查 Agent:「只要时间线」时禁止输出处置工单
|
||
|
||
---
|
||
|
||
### 3.3 负向证据(ISS-009)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 现象 | 工具明确 no-hit 时,模型要么不说,要么说成「已排除该根因」,且引用对不上 |
|
||
| 根因 | 只建模「命中证据」,没有一等公民的 **no_evidence 路径**(如 `$.no_evidence`) |
|
||
| 解法 | `negative_observation` + 固定 raw_path/excerpt 契约;Gatekeeper 校验「无证据」也可以是合法引用 |
|
||
| 价值 | 排障里「查过没有」改变后验;也避免虚假排除 |
|
||
|
||
**金句**
|
||
|
||
> 在证据系统里,空结果若不可引用,模型就会用语言填补真空——那就是幻觉温床。
|
||
|
||
---
|
||
|
||
### 3.4 重复检索演进链(ISS-001 → 002 → 004 → 015)
|
||
|
||
这是**最好的「迭代加深」故事**:同主题三次升级约束强度。
|
||
|
||
```text
|
||
ISS-001 同文档内容重复进上下文
|
||
→ session 文档去重 / Prompt「别重复」
|
||
|
||
ISS-002 去重后仍 lookup 20+ 次(换 query 刷同一域)
|
||
→ 根因:约束只打在 Planner,Executor 不知情
|
||
→ Executor 注入 map + 每域一次等 Prompt 约束
|
||
|
||
ISS-004 Prompt 仍挡不住「再确认一次」
|
||
→ 设计域级水位 / 硬限制(后被架构变更吸收)
|
||
|
||
ISS-014/015 约束归属变化
|
||
→ 不再靠 Executor 旁路状态打补丁
|
||
→ Harness 预算 + Agent 硬停止 + 重复 lookup 策略(015 进行中)
|
||
```
|
||
|
||
**面试怎么讲这条链**
|
||
|
||
> 第一阶段我们以为是重复文档,做了内容去重。
|
||
> 第二阶段发现模型换关键词继续刷,说明**去重粒度错了**,且约束注入点错了(只告诉了 Planner)。
|
||
> 第三阶段承认 Prompt 约定不是安全边界,必须**预算/次数硬停止**。
|
||
> 架构重构后,这些不再散落在 Tool 旁路,而进入统一 Harness 控制面。
|
||
> 这说明我处理 Agent 问题的习惯是:先观测 → 分层根因 → 逐步把约束从「软」推到「硬」,并在架构变了以后迁移装载点,而不是叠补丁。
|
||
|
||
**对应业界概念**:Action masking / tool budget / circuit breaker;不是调参玄学。
|
||
|
||
---
|
||
|
||
### 3.5 Session / Run Trace 隔离(ISS-010)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 现象 | 同 `sessionId` 多轮诊断时,步骤/工具/评价串台或「取最新一条」导致回放错乱 |
|
||
| 根因 | 缺少把**一次执行**定为真理源的 `runId`;查询与写入未全程 exact id |
|
||
| 解法 | `diagnosis_run`;step/invocation/trace 均挂 run;API 强制 `runId`;禁止 latest 语义 |
|
||
| 价值 | 评测、排障、面试 Demo 都依赖可复现回放 |
|
||
|
||
**金句**
|
||
|
||
> 可观测性若不能精确到一次 Run,就只是日志堆,不是诊断系统的记忆。
|
||
|
||
**举一反三**
|
||
|
||
- 工作流引擎的 `workflowId` vs `runId`
|
||
- CI 的 pipeline vs job attempt
|
||
|
||
---
|
||
|
||
### 3.6 Token 与上下文膨胀(ISS-012)→ ACI / 三层数据
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 现象 | Executor 上下文暴涨;工具结果含 debug/rerank/大段重复;成本与截断不可控 |
|
||
| 根因 | Tool 返回**面向开发者**而非 Agent;完整 raw 与模型可见视图未分离 |
|
||
| 解法方向 | Token 可观测;硬预算;结果投影;证据引用带稳定 id(后由 ISS-014 的 Redis canonical + projector 落地) |
|
||
| 现行 | canonical / projection / durable audit 三层 |
|
||
|
||
**金句**
|
||
|
||
> 上下文工程首先是接口设计问题:Agent 的观察通道必须有界,验真通道才能完整。
|
||
|
||
---
|
||
|
||
### 3.7 单 Agent + Harness 重构(ISS-014)
|
||
|
||
深读文档已写透,这里只留**Issue 视角的故事钩子**:
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 触发 | 多角色 = 外层重复 ReAct;JSON 接力;Token;失败语义组合爆炸 |
|
||
| 保留 | 物理验真 → 语义审查 → 发布 的正确性模型 |
|
||
| 迁移 | 角色流水线 → 执行边界(Harness) |
|
||
| 证据 | 阶段 E2E:成功诊断 ~8k tokens / 1 次 tool;Knowledge Query 独立路径修复 invalid schema |
|
||
|
||
**和 3.1 的关系(必说清)**
|
||
|
||
> 014 不是推翻 007/归因幻觉的成果,而是避免用「五个 LLM 角色」去实现本该由一个 ReAct + 一层确定性门禁完成的事。
|
||
|
||
---
|
||
|
||
### 3.8 评测 Harness(ISS-006 + fixtures + baseline diff)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 动机 | 只有 Demo 无法判断改 Prompt/Tool 是否退步 |
|
||
| 做法 | 固定 case;expected tools/verdict/keywords;**确定性** trace 校验(非一上来 LLM-as-judge);baseline + diff |
|
||
| 价值 | 把 Agent 质量从「感觉」变成「回归」 |
|
||
|
||
**金句**
|
||
|
||
> 没有 baseline diff 的 Agent 迭代,只是在用生产用户当测试集。
|
||
|
||
**注意**:面试强调「先确定性检查,再考虑 LLM judge」,显得克制。
|
||
|
||
---
|
||
|
||
### 3.9 SSE 与入口解耦(ISS-013)
|
||
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 现象 | `/api/chat` 与 `/api/chat_stream` 双入口;stream 实为整答后假分片;Controller 编排过重 |
|
||
| 解法 | 唯一 `POST /api/chat` named SSE;UseCase 拥有业务;Controller 只协议;disconnect → cancel Run |
|
||
| 适合 | 问到 Spring/API 设计、背压、职责边界时 |
|
||
|
||
---
|
||
|
||
## 4. ★★ 可合并讲的「专题束」
|
||
|
||
### 4.1 RAG 专题束(不要逐 Issue 报菜名)
|
||
|
||
把 `mvp/issues/rag/*` 收成 **一条 2 分钟故事**:
|
||
|
||
```text
|
||
问题簇:
|
||
L0 关键词当终局、breadcrumb 不进向量、切片丢层级、
|
||
无 packing/rerank、分数语义不清、Advisor 隐式注入 vs 显式 Tool
|
||
|
||
收敛原则:
|
||
1) 检索决策要对 Agent 可见 → lookup_knowledge 保持 Tool
|
||
2) L0 降级为 hint,不替代语义召回
|
||
3) 向量主路径可演进(VectorStore)+ 过渡期 fallback
|
||
4) 召回质量与「能否被引用验真」一起设计
|
||
```
|
||
|
||
**面试官若只问 RAG**:用这条;若问 Agent 质量:退回 3.1。
|
||
|
||
### 4.2 证据契约束(ISS-005 + 007 + 结构化输出设计笔记)
|
||
|
||
```text
|
||
统一 evidence 状态:supported / no_evidence / deduped / failed
|
||
摘要不可当唯一证据源
|
||
Executor 产出可绑定结构,Gatekeeper 验,Verifier 判
|
||
```
|
||
|
||
适合接在「你们怎么保证工具结果语义一致」类问题。
|
||
|
||
---
|
||
|
||
## 5. 不建议当主故事的
|
||
|
||
| 项 | 原因 | 若被问到怎么说 |
|
||
|---|---|---|
|
||
| ISS-003 总 Review | 清单型,缺单点冲突 | 「那是问题发现基线,具体落地看 005/006/014」 |
|
||
| ISS-004 原文方案细节 | 实现被 014/015 吸收,细节易过时 | 「方向是硬水位,装载点已迁到 Harness 预算/停止策略」 |
|
||
| 归因幻觉的旧 Prompt 补丁 alone | 不完整 | 必须接到 Gatekeeper/Guard |
|
||
| 未归档的「计划中」口吻 | 很多已 done | 统一用「已归档 / 被 014 吸收 / 015 进行中」三态 |
|
||
|
||
---
|
||
|
||
## 6. 问题类型 → Issue 速查
|
||
|
||
| 面试官问… | 优先故事 |
|
||
|---|---|
|
||
| 怎么防幻觉? | 3.1 归因幻觉 + Guard 映射 |
|
||
| Prompt 够不够? | 3.4 重复检索链 + 3.2 窄范围 |
|
||
| 多 Agent 为什么又合并? | 3.7 ISS-014(挂 3.1 证明没砍质量) |
|
||
| 成本 / Token? | 3.6 + 数据三层 |
|
||
| 如何回归? | 3.8 eval |
|
||
| 如何调试一次错误诊断? | 3.5 run 隔离 + Timeline |
|
||
| 没找到证据怎么办? | 3.3 负向证据 + Release fallback |
|
||
| SSE / 接口设计? | 3.9 |
|
||
| RAG 怎么做的? | 4.1 专题束 |
|
||
| 还有什么没做完? | ISS-015:硬停止、Repair schema、reasoning 治理、信息化 fallback |
|
||
|
||
---
|
||
|
||
## 7. 与架构演进的挂载图
|
||
|
||
```text
|
||
Phase1 能跑
|
||
└─ 暴露:重复检索 001/002
|
||
|
||
Phase2 能验
|
||
├─ 证据状态 005
|
||
├─ 归因幻觉 + 007 自证循环
|
||
├─ 窄范围 008 / 负向证据 009
|
||
├─ eval 006 / baseline
|
||
└─ run 隔离 010
|
||
|
||
Phase2 负债
|
||
└─ Token 012、入口 013、角色编排税
|
||
|
||
Phase3 能控
|
||
└─ 014 单 Agent + Harness(吸收 004/012/013 与证据门禁语义)
|
||
|
||
Phase4 治理中
|
||
└─ 015 停止策略 / Repair / reasoning / fallback 信息量
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 建议你精炼的「个人贡献表述」模板
|
||
|
||
按真实参与度改主语,结构建议:
|
||
|
||
```text
|
||
我负责/主导了 ___(问题)。
|
||
通过 Trace 看到 ___(证据),排除了 ___(错误假设)。
|
||
方案上选择 ___ 而不是 ___,因为 ___。
|
||
用 ___(fixture/E2E/指标)验证。
|
||
后续在 014 重构中,该能力迁移为 ___,我学到 ___。
|
||
```
|
||
|
||
示例(归因幻觉):
|
||
|
||
```text
|
||
我负责排查 Chat 诊断大面积 LOW_CONFID。
|
||
通过对比 tool raw 与最终答案,确认是证据归因幻觉而非 Verifier 误杀。
|
||
推动「结构化 claim + 代码 Gatekeeper + Verifier 只做推导」而不是继续堆 Prompt。
|
||
用固定 E2E session 与 eval fixture 回归。
|
||
014 重构后该语义保留为 EvidenceGuard/SemanticGuard/Release。
|
||
```
|
||
|
||
---
|
||
|
||
## 9. 源文件索引
|
||
|
||
| 故事 | 路径 |
|
||
|---|---|
|
||
| 归因幻觉 | `mvp/issues/archived/executor-evidence-attribution-hallucination.md` |
|
||
| 自证/摘要 | `mvp/issues/archived/ISS-007-...` / `design-notes/executor-self-evidence-loop-design-note.md` |
|
||
| 窄范围 | `mvp/issues/archived/ISS-008-...` |
|
||
| 负向证据 | `mvp/issues/archived/ISS-009-...` |
|
||
| 重复检索 | `ISS-001` `ISS-002` `ISS-004` |
|
||
| Run 隔离 | `ISS-010` |
|
||
| Token | `ISS-012` |
|
||
| SSE | `ISS-013` |
|
||
| 重构 | `ISS-014-single-react-agent-harness-aci-ptk-refactor.md` |
|
||
| 评测 | `ISS-006` `expand-diagnosis-eval-fixtures` `diagnosis-eval-baseline-diff` |
|
||
| 进行中 | `mvp/issues/active/ISS-015-...` |
|
||
| RAG 簇 | `mvp/issues/rag/*` |
|
||
|
||
---
|
||
|
||
## 10. 自测
|
||
|
||
1. 不看文档,讲清「工具调用成功为何仍 LOW_CONFID」的根因与门禁分层。
|
||
2. 用 001→002→004→015 说明你如何升级约束强度。
|
||
3. 画旧 Gatekeeper 到新 EvidenceGuard 的映射,并说明 014 保留了什么。
|
||
4. 举一个负向证据防止的错误用户话术。
|
||
5. 用一句话说明 eval harness 为什么先做确定性检查。
|
||
|
||
能答 1–3,项目深挖通常已够用;4–5 用于区分「做过功能」和「有质量体系」。
|