面试速查卡(考前 15 分钟翻一遍)#
项目一句话#
DocMind 是面向研发团队的 Agentic RAG + MCP 知识问答系统(Java 全栈),核心是路径决策三模式 + 真·LLM 工具调用 agentic 检索循环 + 结构化引用覆盖率置信度,经 52 条离线评测量化验证。
RAG 管线全景(6 层 + 2 横切)#
文档 ──→ ① 知识工程 ──→ ② Query改写 ──→ ③ 检索召回 ──→ ④ Rerank截断 ──→ ⑤ 可信生成 ──→ ⑥ 反馈闭环
切块/索引 改写/分类/路由 混合检索/Agentic Cross-Encoder 引用/CRAG/评测 观测/记忆/缓存
│
⑦ 架构收敛("加了又删")──────────────────── 贯穿全链路
⑧ 全链路降级(10 层独立兜底)──────────────── 贯穿全链路
plaintext
必记 8 个数字#
| 指标 | 数值 | 一句话 |
|---|
| Recall@5 提升 | +0.115(0.673→0.788) | 混合检索 RRF 融合的贡献 |
| 事实类 Recall@5 | +0.200(0.733→0.933) | BM25 精确匹配的价值 |
| 全链路 MRR | +0.310(0.421→0.731) | RRF(+0.173) + Rerank(+0.137) |
| 规则路径覆盖 | ~85% | 简单查询不进 agentic 循环 |
| 路径决策延迟 | <1ms(原 300ms) | 规则引擎替代 LLM 路由 |
| 单查询成本 | -50%(¥0.012→¥0.006) | 规则引擎 + 删自反思 + 缓存 |
| 代码瘦身 | 1683→595 行 | SupervisorAgent 四刀改造后 |
| 评测规模 | 52×7×4×3=624 行 | 离线评测覆盖 7 类查询 |
开场 30 秒#
“DocMind 是我独立设计实现的企业级知识问答系统,核心是 Agentic RAG。架构上做了三件事:
第一,路径分流——85% 简单查询走规则引擎 <1ms,只有复杂题才进 LLM 工具调用的 agentic 循环;
第二,混合检索 + 统一重排——向量+BM25+RRF 融合,Cross-Encoder 统一标尺,全链路 MRR 提升 0.31;
第三,结构化引用替代自反思——纯 Java 解析引用覆盖率做置信度,省掉一整条 LLM 往返。
整个过程经历了 28 次迭代,每次有评测数据支撑。最有意思的是——我先后实现了拆解、多跳、自反思三条分支,最终对标 Anthropic 后全部删掉,收敛成一个 agentic 循环。“
3 个必讲故事#
| 优先级 | 故事 | 核心信号 | 在哪讲 |
|---|
| ⭐⭐⭐ | 架构收敛:5 条分支→1 个 agentic 循环 | 能加是能力,知道何时该删是判断力 | 开场提及,被追问展开 |
| ⭐⭐ | 多路分数不可比:RRF+Cross-Encoder 两层统一标尺 | 理解检索系统核心难题 | 问”检索/排序”时 |
| ⭐⭐ | CRAG 三档 + 结构化引用:生成前闸+生成后校验 | 系统性解决幻觉,不是一个 prompt trick | 问”幻觉”时 |
5 个必杀题应答要点#
| 问题 | 要点 |
|---|
| ”是不是过度设计?“ | 85% 走规则路径,agentic 只给复杂题;收敛过,不是堆功能 |
| ”有真实用户吗?“ | 自己团队+IDE MCP;坦诚规模但强调工程标准(RBAC/热配/可观测) |
| “幻觉怎么解决?“ | 三道防线:CRAG 生成前闸 + 结构化引用生成后校验 + 兜底模板硬化 |
| ”为什么不用 LangChain/Dify?“ | 两个原因:MCP 协议原生支持+深入理解每一层(每层有评测数据) |
| “评测数据哪来的?“ | 52 条×7 类自建 golden set,不复用 Agent(避免缓存/短路污染对照) |
| “Agent 安全怎么做?“ | 16 硬约束 + 6 软约束;白名单不是黑名单;kbIds/userId 代码覆盖不信 LLM |
| ”MCP 协议怎么理解?“ | 4 层协议(transport/tool/resource/prompt);同 Bean 双路复用;Cursor 实测 5/6 准确 |
| ”为什么不用 CrewAI/框架?“ | CrewAI PoC 延迟+3-5s、CRAG 判断不如代码稳定、Python 集成成本;RAG Worker 只需执行+返回 |
反击引导句(讲完一个话题后主动引向你准备最充分的方向)#
- “这个选型背后更有意思的是取舍过程——我先实现了三条分支,最后对标 Anthropic 全删了,要不要我讲讲?” → 引向 Story 7
- “这个 bug 的排查体现了我们的可观测性建设——从 Langfuse trace 里直接定位到证据在哪一层被丢的…” → 引向 Story 6
- “其实降级路径的设计也很有意思——每一层组件失败都有独立的兜底…” → 引向 Story 8
- “这个工具设计背后更有意思的是安全约束——白名单怎么做、16 处硬约束如何对标 OWASP…” → 引向 Story 13
- “调试这个推理失败的关键是trace 回溯——每轮 agentic 循环都有 tool_call 参数记录…” → 引向 Story 12
- “我们评估过 CrewAI/AutoGen 做了 PoC——延迟+3-5s、CRAG 判断不如代码稳定,最终选了自研…” → 引向 Story 14
Agent 专项速查#
| 主题 | 故事 | 核心要点 |
|---|
| 工具设计 | 09 | 6 @Tool Bean(对外 5/6 方法 + executeCode 仅内部)、AgentToolContext 隔离、白名单 4 读 + executeCode 沙箱计算、store_memory 硬排除 |
| MCP 协议 | 10 | 4 层协议(transport/tool/resource/prompt)、Streamable HTTP、API-Key 鉴权、Cursor 实测 5/6 |
| Prompt 工程 | 11 | 6 模板分场景、双源透明分区、10 字段 JSON 容错解析、不暴露预算防锚定 |
| 推理与规划 | 12 | 隐式规划(tool-calling loop)、空轮早停、多跳/空转/过早停止三个调试案例 |
| 安全约束 | 13 | 16 硬约束 + 6 软约束、对标 OWASP LLM06、间接注入事件发现与修复 |
| 多 Agent 编排 | 14 | 三模式路由、Worker 15s 超时+fallback、CrewAI PoC 延迟+3-5s 放弃 |
| 记忆管理 | 15 | 三层去重(exact/semantic/conflict)、MySQL SoR + Redis 缓存 + Milvus 索引三层(#34)、recency×frequency 淘汰、滚动摘要、上下文溢出排查 |
技术选型速查#
| 组件 | 选型 | 一句话理由 |
|---|
| LLM | DashScope qwen-plus/turbo | OpenAI 兼容 API,中文优化,成本可控 |
| Embedding | text-embedding-v3 (1024d) | DashScope 原生,中文 MTEB 前列 |
| 向量库 | Milvus 2.3 (COSINE+HNSW) | 开源自部署,支持 filter expression |
| 全文索引 | Lucene 8.11 (IK Analyzer) | Java 原生,中文分词成熟 |
| Reranker | DashScope gte-rerank | Cross-Encoder,API 调用简单 |
| 缓存/记忆 | Redis 7 | 语义缓存 + 长期记忆,TTL 管理 |
| 可观测 | Langfuse (OTel OTLP) | 开源,Spring Boot 原生 autoconfig |
| 对象存储 | MinIO (S3 兼容) | 原始文档持久化 |
| 前端 | Vue 3 + TypeScript + Element Plus | SSE 流式 + 引用卡片交互 |