面试知识库

面试速查卡(考前 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 专项速查#

主题故事核心要点
工具设计096 @Tool Bean(对外 5/6 方法 + executeCode 仅内部)、AgentToolContext 隔离、白名单 4 读 + executeCode 沙箱计算、store_memory 硬排除
MCP 协议104 层协议(transport/tool/resource/prompt)、Streamable HTTP、API-Key 鉴权、Cursor 实测 5/6
Prompt 工程116 模板分场景、双源透明分区、10 字段 JSON 容错解析、不暴露预算防锚定
推理与规划12隐式规划(tool-calling loop)、空轮早停、多跳/空转/过早停止三个调试案例
安全约束1316 硬约束 + 6 软约束、对标 OWASP LLM06、间接注入事件发现与修复
多 Agent 编排14三模式路由、Worker 15s 超时+fallback、CrewAI PoC 延迟+3-5s 放弃
记忆管理15三层去重(exact/semantic/conflict)、MySQL SoR + Redis 缓存 + Milvus 索引三层(#34)、recency×frequency 淘汰、滚动摘要、上下文溢出排查

技术选型速查#

组件选型一句话理由
LLMDashScope qwen-plus/turboOpenAI 兼容 API,中文优化,成本可控
Embeddingtext-embedding-v3 (1024d)DashScope 原生,中文 MTEB 前列
向量库Milvus 2.3 (COSINE+HNSW)开源自部署,支持 filter expression
全文索引Lucene 8.11 (IK Analyzer)Java 原生,中文分词成熟
RerankerDashScope gte-rerankCross-Encoder,API 调用简单
缓存/记忆Redis 7语义缓存 + 长期记忆,TTL 管理
可观测Langfuse (OTel OTLP)开源,Spring Boot 原生 autoconfig
对象存储MinIO (S3 兼容)原始文档持久化
前端Vue 3 + TypeScript + Element PlusSSE 流式 + 引用卡片交互