面试知识库

AI Agent 通用知识地图#

这是一张「AI Agent 开发通用知识地图 + DocMind 落点索引」。其余 16 篇文档都是「DocMind 怎么做的」,这一篇补的是「这个领域应该知道什么」——L1→L8 分层的通用知识。

用法:面试官问到任何一层,先在这里找到坐标和通用原理,再跳到对应实现文档看 DocMind 的落地。每个主题都标注了「DocMind 落点」:✅ 已落地(指向实现文档)/ ⚠️ 部分落地 / ⭕ 领域通识,DocMind 未实现(知道方向即可,面试坦诚说明)。

原则:DocMind 没真做的,这里只讲原理 + 标 ⭕,绝不假装成项目实现——「句句可追溯到源码」是这套文档的可信度底线。


整体分层#

一句话定位:Agent 的整套工程(L2–L8)本质上都是在补 L1 那些 LLM 的固有短板——幻觉、知识截止、无状态、不可靠推理。理解这条主线,比记住任何单个技术名词都重要。


L1 LLM 基础#

不用会训练大模型,但要懂它作为「组件」的特性和边界。⭕ 本层基本是领域通识,DocMind 是 LLM 的使用方而非实现方。

Transformer / 自回归(直觉)#

  • Self-Attention:每个 token 生成时「看」上下文里所有 token,按相关性加权——这是 LLM 能理解长程依赖的根。直觉上是「软性的、可微的查表」。
  • 自回归生成:LLM 一次只预测下一个 token,把它接到输入末尾再预测下一个,循环直到结束符。⟹ 推论:生成是顺序的、不可并行的,这就是流式输出(逐 token 吐)和 TTFT 指标的物理来源。
  • Tokenization(BPE/subword):文本先被切成 subword token 再喂模型。中文一个汉字常 ≈1–2 token,英文一个词可能拆成多个 token。⟹ 按 token 计费、context 预算都建立在这上面。

上下文窗口与 context rot#

  • Context Window:模型单次能处理的 token 上限(输入+输出共享)。
  • Context Rot(上下文腐烂):⚠️ 关键反直觉——塞进去的 context 越多,召回反而可能下降。模型对长上下文「中间段」的信息利用最差(lost-in-the-middle)。⟹ 这正是 RAG 要做精排、压缩、只塞 Top-K 的根本原因,而不是「context 越大越好」。
  • DocMind 落点:✅ 上下文压缩见 03-检索与排序链路05-工程化实践「上下文压缩」;会话历史膨胀与 context rot 的关系见 08-RAG系统痛点分析 P7。

推理参数#

参数含义取值取向
temperature采样随机性。0 ≈ 确定性贪心,越高越发散决策/抽取/JSON 类任务用 0 或接近 0(要可复现),创作类才调高
top-p(核采样)只在累积概率 top-p 的候选里采样与 temperature 二选一为主,常用 0.8–0.95
max_tokens输出上限控成本 + 防失控

关键认知:temperature>0 是 RAG 系统不确定性的来源之一——同一个问题两次回答可能不同,也是为什么工具选择、路由这类决策 DocMind 用规则引擎而非 LLM(见 L5 / 02)。

LLM 四大固有局限(→ DocMind 补偿机制)#

固有局限含义DocMind 怎么补
幻觉一本正经编造不存在的事实RAG 注入真实证据 + Self-Reflection 二次校验 + 规则否定矛盾检测(02/05
知识截止训练数据有时间边界,不知道之后的事web_search 工具联网兜底(时效查询触发)
无状态单次调用不记得历史,每次都是「失忆」会话历史拼接(短期)+ 跨会话长期记忆(MySQL SoR + Redis 缓存 + Milvus 向量召回,05
数值/逻辑推理不可靠算术、多跳逻辑容易错决策类逻辑(工具选择、路由、时效判断)交给规则引擎而非 LLM(02 RetrievalPlanner)

面试话术

“我理解 Agent 工程的主线就是补 LLM 的四个固有短板:幻觉用 RAG + 反思补,知识截止用联网补,无状态用记忆补,推理不可靠就把确定性决策从 LLM 手里拿出来交给规则引擎。DocMind 的每个模块基本都能对应到这四条里的某一条。“


L2 Prompt 工程#

Prompt 不是「咒语」,是可控的接口设计。⚠️ DocMind 在 05「Prompt 工程」节有落地(7 模板 + PromptAssembler 三模式),本节补通用方法论。

  • 清晰指令 + 角色设定:给模型明确身份和任务边界,比模糊指令稳定得多。
  • Few-shot:给 1–N 个输入输出范例,让模型「照着做」——对格式约束、风格对齐尤其有效。DocMind 的 query_decompose.txt 就含 3 个 few-shot 例子(05)。
  • CoT(思维链):让模型「先推理再给答案」(“让我们一步步想”),显著提升多步推理准确率。代价是更多 token、更长延迟——简单任务别滥用
  • 输出约束(正向)
    • JSON mode / 结构化输出:API 层强制模型只吐合法 JSON,降低解析失败率。
    • XML 标签分隔:用 <context>...</context> / <question>...</question> 把指令区和数据区分开,既提升遵循度,也是抗 prompt 注入的缓解手段(文档内容藏指令时不易越界)。
    • ⚠️ 关键认知:正向约束(JSON mode)降低出错概率,但不能 100% 保证——仍需输出后容错(剥壳、白名单、降级),见 05「LLM 的 JSON 不可信」。两者是「事前约束 + 事后兜底」的组合。

面试话术

“对小模型吐结构化结果这件事,我的态度是双保险:prompt 侧用 JSON mode / few-shot 例子做正向约束把出错率压下来,代码侧做剥壳 + 字段白名单 + fallback 兜底——因为再强的约束也挡不住偶发的格式抽风。这也是为什么我把它当成接口设计而不是写咒语。“


L3 工具调用(Function Calling)#

Agent 区别于纯聊天机器人的分水岭。✅ DocMind 用 Spring AI @Tool 暴露 6 个工具端点(02「MCP 工具双路复用」/14);但 MCP 协议全貌 DocMind 只用了 tool 子集,本节补协议规范(⭕ 部分为通识)。

Function Calling 协议本质#

  • 模型只「输出」调用意图,不执行:LLM 返回「我想调 web_search(query="...")」这个结构化意图,真正的执行在你的代码里。执行结果再回喂给 LLM 决定下一步。这是 Agent loop 的核心一拍。
  • JSON Schema 定义工具:每个工具用 JSON Schema 描述名字、参数、类型——模型据此知道有哪些工具、怎么填参。
  • 错误回灌(error feedback):⭕ 工具执行失败时,把错误信息作为 observation 回喂给 LLM,让它重试或换策略——这是「让 LLM 自主纠错」的通用做法。DocMind 未用 LLM 原生错误回灌:工具调度走规则引擎并行派发,失败走确定性降级链(02「完整降级链」),而非让 LLM 看着错误重想。这是有意取舍——确定性 > 灵活性。
  • 并行工具调用:⭕ 现代模型支持单轮返回多个工具调用意图并行执行。DocMind 的并行是规则引擎层面的 Worker 并行派发(RetrievalPlanner 决定调哪几个 Worker → 线程池并发),不是 LLM 原生并行 tool calls——概念上区分清楚。

MCP(Model Context Protocol)规范#

维度要点
传输Streamable HTTP(新,单端点双向流)vs SSE(旧,server→client 单向流 + 单独 POST 回传)。DocMind 用 spring-ai-starter-mcp-server-webmvc 暴露
消息格式JSON-RPC 2.0(method / params / id 请求-响应,支持 notification)
三类原语tool(可调用的动作,DocMind 用的就是这个)/ resource(可读的数据源,如文件/DB)/ prompt(可复用的 prompt 模板)。DocMind 只暴露了 tool
session 与生命周期initialize 握手 → 能力协商(capabilities)→ tool 列表发现(tools/list)→ 调用(tools/call)→ 关闭。有状态 session

面试话术

“MCP 我落地的是 tool 这一类原语——把 DocMind 的 6 个检索工具用 Spring AI 暴露成 MCP 端点,外部 Agent/IDE 能直接调。但 MCP 协议本身比这大:底层是 JSON-RPC 2.0,传输有 Streamable HTTP 和 SSE 两种,原语除了 tool 还有 resource(读数据)和 prompt(共享模板),有完整的 initialize 握手和能力协商。我现在只用了 tool 子集——这是 MVP 阶段够用的选择,安全边界和 resource 暴露是规划里的下一步(见 02 MCP 安全边界)。”

追问预判:“你的工具调用是 LLM 选的还是规则选的?” → DocMind 主路径是规则引擎选工具(RetrievalPlanner,4 信号映射),保留 LLM Function Calling 作降级路径。理由见 02/05 规则引擎四层价值。


L4 RAG(DocMind 主场,✅ 覆盖最全)#

本层 DocMind 几乎全覆盖,这里只做「通用知识点 → 实现文档」的索引,不重复细节。

通用知识点一句话原理DocMind 落点
chunking / embedding / 向量检索 / Top-K文档切块→向量化→按相似度召回03「文本切分」「向量检索」「Parent Document」
hybrid retrieval + RRF向量(语义)+ BM25(关键词)多路召回,RRF 按排名融合03「RRF 融合」
cross-encoder 重排用交叉编码器对 (query, chunk) 对精排,比双塔召回准03「Cross-Encoder」
query 改写 / 扩展 / HyDE改写问题或生成假设文档再检索,提召回03「Query Rewrite / HyDE」
语义缓存按向量相似度命中缓存,而非字符串精确匹配05「语义缓存」
Agentic RAG检索不再一次性——Agent 决定要不要检索/检索什么/够不够再补,带 self-critique 和 sub-query✅ 全套见 02(CRAG 三档 + 条件补偿 + Query Decomposition)
GraphRAG实体/关系图 + 图查询,擅长多跳推理;坑在构建成本和抽取质量⚠️ 轻量版规划见 08 P3、07;通用原理也见 08 P3
评估Golden Set + 检索/生成分别评估;judge model 有自评偏差09/10(含 judge 偏差与方差测量)

面试话术

“RAG 是我这个项目的主场,从基础的混合检索 + RRF + Cross-Encoder 重排,到 Agentic RAG 的 CRAG 三档评分 + 条件补偿检索 + 问题拆解,再到离线评估体系都做了。要展开哪一块我都能指到具体的类和评测数据。“


L5 Agent 架构#

核心范式要能讲清适用场景和 trade-off。✅ DocMind 当前落地了真·LLM 工具调用 agentic 循环(受约束的 ReAct:4 个读工具 + 1 个沙箱计算工具白名单 + 手动控环 + max_iterations 兜底)与 Supervisor-Worker(一次性检索兜底路径)。Plan-and-Execute、自研 Query Decomposition、自研串行多跳、Self-Reflection 均曾落地、后在「对标主流四刀改造」中移除——拆解 / 多跳由 agentic 循环运行时自驱,置信度改由结构化引用覆盖率给出(见 04 #21/#2220-改造实现设计)。本节补真多 Agent 拓扑(⭕)和 HITL(⭕)。

三种核心范式对比#

ReAct                  Plan-and-Execute        多 Agent
─────                  ────────────────        ────────
思考→行动→观察→再思考    先规划全流程→逐步执行     按角色拆分:
(边走边想)            (可重规划)             Planner/Worker/Critic/Router
适合:探索性、          适合:步骤明确、          适合:复杂任务分治、
不确定路径             减少中途漂移             需要专业化分工
plaintext
范式DocMind 落点
ReAct02「ReAct Agent 执行模型」
Plan-and-Execute⚠️ Phase 2 实现过(PlanGenerator + PlanExecutor 拓扑调度),已在链路精简中移除——无法处理链式多跳且与 Query Decomposition 重叠,改用串行有界迭代(见 04 #2118
多 Agent(Supervisor-Worker)⚠️ 02——但 DocMind 的 Supervisor 是规则编排器、Worker 无自主推理,不是真正的多 Agent 协作。真多 Agent(Critic/Router 各自是独立 LLM Agent)DocMind 未做,见 L8

其余能力#

  • 任务分解:✅ Query Decomposition,见 03
  • 记忆管理:短期(对话历史拼接)vs 长期(外部存储)。✅ 跨会话长期记忆见 05——三层存储 MySQL SoR + Redis 缓存 + Milvus 向量召回;通用记忆体系(episodic/semantic/consolidation)作为扩展方向见 07
  • 反思 / Reflexion:✅ DocMind 的 Self-Reflection 是单轮重写02)。⭕ 学术上的 Reflexion 范式更进一步:把每次失败的反思写入 episodic memory,跨多次尝试积累经验——DocMind 未做这种带记忆的多轮反思循环。
  • 人在回路(HITL):⭕ 关键动作前暂停等人确认/修正(如高风险操作、低置信答案让人介入)。DocMind 未实现 HITL;最接近的是低置信度警告徽章(提示用户人工核验),但不是阻断式的人工确认。

面试话术

“ReAct、Plan-and-Execute、多 Agent 我会按任务确定性来选:路径不确定的探索型用 ReAct 边走边想,步骤明确要防漂移的用 Plan-and-Execute 先规划后执行,需要专业化分工的才上多 Agent。DocMind 落地了 ReAct 和 Supervisor-Worker;Plan-and-Execute 我 Phase 2 实现过,但发现它规划早于检索、处理不了链式多跳,就删了改用串行有界迭代——这本身是个’加了又删’的取舍故事。我也会坦诚说我的 Supervisor-Worker 是规则编排 + 无推理 Worker,不是真正意义上每个 Worker 都能自主推理的多 Agent——那是下一步方向。“


L6 框架与协议#

⭕ 本层多为横向对比知识。DocMind 用 Spring AI(✅),其余框架/协议作为通识掌握,重点是「能区分各自解决什么问题」。

编排框架定位#

框架生态定位一句话
LangGraphPython图式状态机把 Agent 建模成有状态的图(节点=步骤,边=转移),主流的复杂 Agent 编排选择
LangChainPython链式 + 组件库早期主流,组件丰富,复杂控制流偏弱
LlamaIndexPythonRAG 为中心数据接入 + 索引 + 检索一条龙,RAG 场景顺手
Spring AIJavaSpring 原生集成DocMind 用的就是它——Security/MCP Server/DI 都原生,无需 Python 微服务

Agent 相关协议对比#

协议解决什么一句话
MCP(Model Context Protocol)Agent ↔ 工具/数据标准化「模型怎么调外部工具和读数据源」(见 L3)。DocMind ✅ 用
A2A(Agent-to-Agent)Agent ↔ Agent标准化「Agent 之间怎么互相发现、通信、协作」。DocMind ⭕ 未涉及
ACP(Agent Communication Protocol)Agent 互操作另一套 Agent 间通信/编排标准,与 A2A 同赛道

「不用框架怎么实现这个 loop」(高频追问)#

面试官常问这个来探底层理解。答案就是手写 Agent loop:

loop:
  1. 把 (system prompt + 历史 + 工具 schema) 喂给 LLM
  2. LLM 返回:要么是最终答案 → 结束
              要么是工具调用意图 → 解析出 tool + args
  3. 在代码里执行该工具,拿到 observation
  4. 把 observation 追加进上下文,回到第 1 步
  直到 LLM 给出最终答案或达到 max_iterations
plaintext

DocMind 的 02「ReAct Agent 执行模型」本质就是这个手写 loop 的工程化版本——不依赖 LangGraph 这类框架,用 Java 直接编排。底层原理比框架 API 更重要,框架只是把这个 loop 包装得更好用。


L7 工程化(DocMind 最强项,后端出身的护城河)#

✅ 本层几乎全覆盖,是相对算法背景候选人的差异化优势。这里做索引,细节全在 05

维度通用要点DocMind 落点
可观测性trace 每步的 token / 延迟 / 工具调用05/02 Langfuse + OTel;「LLM 应用必看指标」
成本控制模型分级 / 上下文压缩 / prompt caching✅ 双模型分级 + 上下文压缩(02/05);⚠️ prompt caching 尚未接入,见 06 T2-6
容错重试 / 超时 / 降级 / 幂等05「稳定性」全节 + 02「完整降级链」
延迟优化并行检索 / 流式 / TTFT / sub-query 并发05「流式首 token 延迟」+ 专用线程池
安全prompt injection / 工具权限边界 / 输出过滤05「注入防护与权限隔离」+ 02 MCP 安全边界
部署并发 / 限流 / 状态管理 / 反压05 有界线程池 + CallerRunsPolicy 反压

补充概念:context editing(运行时动态裁剪/重写已进入上下文的内容,区别于一次性压缩)——⭕ DocMind 未单独实现,上下文压缩是入 prompt 前的一次性裁剪。

面试话术

“工程化是我作为后端工程师的护城河。算法背景的候选人可能 L1–L5 更扎实,但’怎么把 Agent 稳定、低成本、高可用地跑在生产’——超时分层、降级链、有界线程池反压、Langfuse 全链路 trace、双模型成本分级——这些是我能拿满分的地方,也是大厂 Agent 工程岗最缺的能力。“


L8 前沿方向#

⭕ 面试加分项,知道方向即可,不必假装做过。DocMind 大多未实现,诚实标注。

方向一句话DocMind 现状
多 Agent 协作拓扑多个能自主推理的 Agent 按角色(Planner/Critic/Router/Executor)协作、辩论、投票⭕ 未做(现有 Supervisor-Worker 是规则编排,非真多 Agent)
长期记忆系统MemGPT/Letta 式分层记忆 + 自动 consolidation,让 Agent 跨会话「成长」⚠️ 有 Redis KV 长期记忆雏形,分层/整合见 07 扩展方向
Agent 自动评估Agent 自评 / 自动生成评测集 / LLM-as-judge 闭环⚠️ 离线评估见 09/10,自动化闭环未全做
computer use / 浏览器 AgentAgent 直接操作 GUI / 浏览器完成任务⭕ 未涉及
Agent 的 RL 训练用强化学习(如 RLHF / 过程奖励)训练 Agent 的决策策略⭕ 未涉及(DocMind 是 LLM 使用方,不训练)

面试话术

“前沿方向我保持关注但不会硬包装成做过的。真正的多 Agent 协作、MemGPT 式的长期记忆、computer use 这些我知道在解决什么问题、技术路线大概是什么,但 DocMind 没实现——我更愿意把已经做的工程化深度讲透,而不是堆没落地的名词。“


实操建议:面试该怎么用这张地图#

真正的优势在 L7。 算法/研究背景的候选人 L1–L5 可能更扎实,但「如何把一个 Agent 系统稳定、低成本、高可用地跑在生产环境」,正是后端工程师该拿满分、也是 ByteDance/Alibaba 这类公司招 Agent 工程岗最缺的能力。

建议在 DocMind 上把 「评估平台 + 成本/延迟优化 + 容错」 讲成完整故事(05/09/10),这比再堆一个新框架更有说服力。

用法口诀:被问到任何一层 → 在本图找坐标和通用原理 → 跳对应文档讲 DocMind 落地 → 遇到 ⭕ 标记就坦诚说「这是方向,我没做,但我知道它解决什么问题」。坦诚边界比假装全做过更可信。