主题
第 23 周 · Day 1:AI Agent 八股第一弹 · 核心概念 20 题
对应手册任务:学习「Agent 八股:ReAct / RAG / MCP / A2A / 评估 / Agent 安全 + 框架横向对比」,动手「刷 20 道核心概念题,每道写 3 句话答案」,产出「八股笔记 v1」。本篇只解决一个问题:冲刺周把二十几周散落的概念收拢成一张能背、能默、经得起追问的清单,每题给 3 句参考答案加 1 句深挖点,口径按面试标准收窄。
今日目标
- 20 题全部过一遍,每题不看答案能说出 3 句主干
- 每题的深挖点至少接得住一层追问,接不住的标红进错题本
- 晚上留 30 分钟,把 20 题默写成自己的「八股笔记 v1」
使用方法(怎么刷)
三遍法。 第一遍通读,看题目读答案,求理解不求背诵。第二遍遮答,遮住参考答案对着题目口头说 3 句,说得出就过,说不出就标记。第三遍只看深挖点,把它当成面试官的追问,自问自答。三遍总耗时 2 小时上下。
3 句是上限不是目标。 每题答案压进 3 句,多一句都说明主干没拎清。面试的节奏本来就是先给结论、再给机制、最后补一句工程取舍,照这个结构背,答出来自然像老手。
错题进笔记。 今天的产出是「八股笔记 v1」:20 题每题自己写 3 句话,写不出的抄参考答案并标红,明天 day2 刷题前先重背标红题,冲刺周内错题滚动三轮。
第一组:Agent 循环与工具调用(第 1~3 题)
第 1 题:ReAct 是什么?循环什么时候终止?
参考答案:ReAct 让模型在同一个循环里交替输出 Thought(先想)和 Action(再做),每步执行结果作为 Observation 拼回上下文,形成「推理 → 行动 → 观察」的轨迹。一轮完整循环是:模型生成下一步 → 运行时执行工具调用 → 把观察结果追加进上下文 → 模型基于全部历史再生成。终止条件两个:模型这次输出里不再包含工具调用,直接给出最终答案;或者步数、Token 预算耗尽被运行时强制截断,兜底防死循环。
深挖点:被追问「死循环怎么办」,答案是最大迭代次数、重复动作检测、预算控制都放在运行时层做,不指望模型自觉。
第 2 题:Function Calling 的完整调用链是什么?流式下 tool_calls 分片怎么拼?
参考答案:链路五步:工具 schema 随请求发给模型 → 模型返回带 tool_calls 的 assistant 消息(只是声明想调,并不执行)→ 应用解析参数并本地真正执行 → 结果以 role: "tool"(带 tool_call_id)追加回消息列表 → 再次请求模型,直到它不再发起调用。流式下每个 tool_call 的 arguments 是 JSON 字符串的增量片段,必须按 index 累积拼接,等 finish_reason 为 tool_calls 之后再整体解析。边流边 parse 会撞上半个 JSON,这是流式 Agent 最常见的翻车点。
深挖点:两个加分细节:arguments 是字符串不是对象;多个 tool_call 并行时,结果要按 tool_call_id 一一对应回填。
第 3 题:结构化输出有哪三种路线?可靠性怎么排?
参考答案:三种路线:纯 prompt 约定格式加手动解析、JSON Mode(保证是合法 JSON,不保证符合 schema)、原生 Structured Outputs(约束解码,按 schema 逐 token 采样,语法层面不可能跑偏)。可靠性排序:约束解码 > JSON Mode > 纯 prompt,前提是模型真的实现了约束解码,而不是提示词口头承诺。生产纪律是不管走哪条路,出口处都放一道 schema 校验(zod 或 Pydantic),校验失败带着错误信息重试。
深挖点:约束解码的原理是把不符合 schema 的 token 概率置零,格式合法是采样层面保证的,不是模型「努力遵守」。
第二组:LangGraph 图模型(第 4~6 题)
第 4 题:LangGraph 的 State / Node / Edge 各是什么?Annotated reducer 为什么需要?
参考答案:State 是所有节点共享读写的类型化字典,Node 是接收 state 返回更新的函数,Edge 决定执行走向,三者把 Agent 循环从看不见的 while 变成一张显式的图。reducer 解决并发写冲突:Annotated[list, add_messages] 声明这个字段的写入策略是追加合并,而不是整体覆盖。没有它,两个并行分支里后写的会静默覆盖先写的,消息丢了都不报错,这是图并发下省掉 reducer 的经典事故。
深挖点:一句话记牢:State 管数据,Node 管计算,Edge 管控制流,reducer 管并发写规则。
第 5 题:checkpointer 和 thread_id 分别干什么?
参考答案:checkpointer 在每个 superstep 结束后把整份 state 快照落盘(内存、SQLite、Postgres、Redis 都有现成实现),是持久化、故障恢复、时间旅行调试的共同地基。thread_id 是线程隔离键:同一个 thread_id 接着上次的快照继续,不同 thread_id 各自独立、互不可见。LangGraph 的多轮对话记忆默认就靠这套机制,不需要自己拼历史消息数组。
深挖点:追问会打在「这算长时记忆吗」:checkpointer 是会话内短时记忆,跨会话要靠 store(跨线程键值存储)或外挂数据库。
第 6 题:interrupt() 的执行语义是什么?
参考答案:interrupt() 抛出特殊异常中断执行,state 回滚到上一个 checkpoint,当前节点事务作废,等人类输入后用 Command(resume=...) 从头重放该节点。重放意味着节点函数会再执行一遍,interrupt 之前已经发出的外部调用不会消失,所以副作用要么写成幂等,要么挪到 interrupt 之后。这个「回滚加重放」的语义,是 LangGraph 做 Human-in-the-loop 审批的官方姿势。
深挖点:答出「回滚 + 重放」两个词基本就过,再补一句副作用幂等就是满分口径。
第三组:RAG 与检索(第 7~11 题)
第 7 题:RAG 的完整流程是什么?
参考答案:离线链路:文档解析 → 切块 → embedding 向量化 → 写入向量库建索引。在线链路:query 改写 → 检索(向量或混合)→ 重排序 → 拼装上下文 → LLM 生成,讲究的再加引用溯源和评估回流。RAG 的本质是拿检索换上下文窗口,解决私有知识和时效问题,成本远低于微调,知识更新只需重灌库。
深挖点:追问常落在 query 改写:多轮指代消解、HyDE、拆子查询,这块最容易被忽略,也最影响命中率。
第 8 题:切块策略有哪些?overlap 为什么需要?
参考答案:从粗到细:固定长度切、递归字符切(优先按段落和句子断开,如 RecursiveCharacterTextSplitter)、按文档结构切(Markdown 标题、代码 AST)、语义切(相邻句向量相似度骤降处断开)。overlap 让相邻块保留 10%~20% 重叠,防止关键句恰好压在边界上被拦腰截断。常见规格 512~1024 token、overlap 50~200,选择原则是有结构优先按结构切,切出来的块要能脱离原文独立被理解,最终以自己语料的评估结果为准。
深挖点:能报出「块头注入元数据」加分:给每块拼上文档标题路径,块的可读性和命中率一起上一个台阶。
第 9 题:Hybrid 检索是什么?RRF 怎么融合?
参考答案:Hybrid 是向量检索(管语义)加 BM25 关键词检索(管精确术语、型号、编号),两路召回互补,任何单路都会漏。RRF(Reciprocal Rank Fusion)只看排名不碰分数,每篇文档的融合得分是各路 1/(k+rank) 之和,k 常取 60。用排名不用原始分数,是因为余弦相似度和 BM25 分数量纲不可比,直接加权融合得按数据集调权,RRF 免调参效果还稳。
深挖点:反问「为什么不分数加权融合」时,答「分数不可比、调权成本高」即可,能顺手写出公式更好。
第 10 题:重排序的两阶段架构是什么?
参考答案:第一阶段召回:向量库粗筛 top 100~1000,快且便宜,牺牲精度保 Recall。第二阶段精排:cross-encoder 对每对 query-doc 逐条深度打分,取 top 5~10,准但贵,管 Precision。cross-encoder 之所以准,是 query 和 doc 拼在一起过模型做全层级交互,而双塔各自编码,只在最后碰一次余弦。
深挖点:常用 reranker 要能点名:Cohere Rerank、bge-reranker 系列,或者自己部署 cross-encoder。
第 11 题:引用溯源怎么实现?
参考答案:主流是 chunk 级引用:检索时每个块带 ID 和元数据(来源、标题、页码),生成时要求模型在断言后标 [1][2],渲染时把编号映射回原文块供点开核对。更严的路线是先生成后溯源(post-hoc attribution):对答案逐句去库里找支持证据,找不到的标为无依据或直接拒答。生产底线是每个事实断言都能点回原文,因为让模型自己标引用会有幻觉引用,标了但原文里根本没有。
深挖点:两条路线的取舍一句话:模型自标便宜但会幻觉引用,事后校验兜得住但成本翻倍。
第四组:评估(第 12~14 题)
第 12 题:Agent 评估分哪三层?golden set 是什么?
参考答案:三层:结果评估看最终答案对不对(端到端),轨迹评估看中间步骤对不对(工具选没选对、参数对不对、有没有绕路),组件评估看局部指标(检索命中率、单工具可用性)。golden set 是人工标注的标准问答对集合,可含标准轨迹,是一切评估的地基,没有它,LLM-as-judge 和回归测试都无从谈起。实践口径:50~100 条起步,覆盖典型场景加已知失败案例,随版本迭代持续补。
深挖点:一句话定位:结果评估告诉你挂没挂,轨迹评估告诉你挂在第几步。
第 13 题:LLM-as-judge 有哪些偏差?怎么校准?
参考答案:常见四种:位置偏差(偏爱和呈现顺序有关)、长度偏差(偏爱长答案)、自我偏好(偏爱同家族模型的输出)、打分过宽或挤在高分段。校准手段:pairwise 评测交换位置跑两次、rubric 具体化(给维度和锚点样例,别给空泛的 1~10 分)、与少量人工标注对齐算一致性、定期人工抽检。关键认知:judge 适合大规模粗筛和相对比较,不承担最终仲裁。
深挖点:加分句:judge 模型选和被评模型不同的家族,能压掉一部分自我偏好。
第 14 题:promptfoo 和 DeepEval 定位差在哪?
参考答案:promptfoo 是声明式评测流水线:YAML 配 prompt 和用例,矩阵式对比多模型多提示词版本,出通过率报告,接 CI 顺手。DeepEval 是 Pytest 风格的测试框架:faithfulness、answer relevancy 这类 RAG 指标开箱即用,断言直接写进单测跑。一句话分工:promptfoo 管对比实验和持续评测,DeepEval 管细粒度指标和测试化,两边不冲突,经常配合用。
深挖点:追问和 LangSmith 的关系:LangSmith 偏线上追踪和数据闭环,定位是观测平台,不是评测框架。
第五组:协议与多 Agent(第 15~18 题)
第 15 题:MCP 的三个原语是什么?N+M 价值怎么算?
参考答案:三个服务端原语:tools(模型可调用的函数)、resources(可读取的数据和文件)、prompts(预置提示模板),客户端侧另有 sampling 等能力协商。N+M 指:没有协议时 N 个应用接 M 个工具要写 N×M 份胶水代码,有了标准协议,应用和工具各自实现一次即可互连,N×M 塌缩成 N+M。MCP 是 Anthropic 2024 年 11 月发布的开放协议,走 JSON-RPC 2.0,传输支持 stdio 和 Streamable HTTP,已是行业事实标准。
深挖点:类比记忆:MCP 之于模型工具,约等于 USB-C 之于外设,这个类比面试官都爱听。
第 16 题:什么时候用 MCP,什么时候直接写工具?
参考答案:直接写 function calling 胜在链路短、延迟低、行为完全可控,适合单一应用私有的固定工具组合。MCP 胜在复用和解耦:一次实现处处挂载、生态可插拔、跨应用共享,适合工具要跨团队跨产品复用,或者想直接吃现成的社区生态。经验法则:一两个应用专用就手写,要复用、要分发给别的客户端就上 MCP,别为了协议而协议。
深挖点:追问成本:MCP 多一层进程或网络加 schema 协商,延迟敏感的链路先压测再上。
第 17 题:A2A 和 MCP 是什么关系?
参考答案:A2A(Agent2Agent)是 Google 2025 年发起、后捐给 Linux Foundation 的协议,解决 Agent 之间互相发现和协作,核心概念是 Agent Card(能力自描述)和 Task(任务生命周期)。MCP 解决 Agent 与工具、数据的连接,A2A 解决 Agent 与 Agent 的对话,两者分层互补,不是竞争关系。一张图记住:Agent 往下用 MCP 接工具,横向用 A2A 找同伴,一个 Agent 可以同时挂多个 MCP server,再通过 A2A 与其他 Agent 协作。
深挖点:一句话记忆:MCP 给 Agent 装手,A2A 让 Agent 找同事。
第 18 题:什么时候才真的需要多 Agent?
参考答案:判据三条:单一 prompt 装不下职责(工具太多导致指令冲突)、任务天然可并行拆分、需要不同角色互相校验。代价同样真实:上下文割裂(互相看不到完整状态)、Token 成本成倍涨、调试链路指数变长。经验是把单 Agent 加好的工具和 prompt 推到极限,撑不住再拆,并且按上下文边界拆,不按组织架构拆。
深挖点:追问编排模式时,supervisor(主管分派)、hierarchical(多层树)、handoff(接力)各举一个场景。
第六组:记忆与缓存(第 19~20 题)
第 19 题:记忆分哪四类?三层存储怎么摆?
参考答案:四分类:工作记忆(当前上下文窗口)、情景记忆(过往交互的具体经历)、语义记忆(沉淀出的事实和偏好)、程序记忆(固化的技能和流程,落成工具或 SOP)。三层存储:上下文内(窗口里即用即弃)、向量库或图数据库(跨会话按相关度检索)、结构化表(Profile 和状态字段,精确读写)。工程要点是流转:对话结束后异步抽取归档,把情景提炼成语义,下次按相关度召回加 Profile 双路注入。
深挖点:最难也最常被追问的是遗忘和冲突:旧记忆何时失效、新偏好怎么覆盖旧事实,这是运维问题,不是算法问题。
第 20 题:语义缓存的阈值怎么权衡?
参考答案:语义缓存拿新 query 和历史 query 算 embedding 余弦相似度,超过阈值就复用缓存答案,省一次 LLM 调用。阈值是核心权衡:调低命中率高,但相近不等于同义,容易答非所问;调高安全,但命中率塌掉,缓存形同虚设,常见从 0.95 起步按 badcase 调。上线铁律:只缓存确定性高的事实检索类答案,个性化、时效敏感的一律不缓存,并且配失效机制。
深挖点:经典反例要能秒答:「2024 年营收」和「2025 年营收」embedding 很近,答案完全不同。
附:框架对比速答(2026 格局)
面试常考一句话定位,按这个口径答:
- LangGraph:生产默认项。显式图模型加 checkpointer、interrupt,控制力和周边生态最全,代价是学习曲线陡,复杂 Agent 落地的事实标准。
- OpenAI Agents SDK:极简轻量。agents、handoffs、guardrails、tracing 开箱即用,深度绑 OpenAI 生态,快速起步和原型首选。
- CrewAI:角色化多 Agent 协作框架,上手最快,适合演示和内部工具,复杂控制流会碰到天花板。
- MS Agent Framework:微软 2025 年把 AutoGen 并入、与 Semantic Kernel 合流后的统一方案,占住 .NET 和 Azure 生态位,微软技术栈企业的选择。
一句总结:默认 LangGraph,微软栈用 MS Agent Framework,快速验证用 OpenAI Agents SDK 或 CrewAI。AutoGen 这个名字到 2026 已不再单独演进,面试还答它,只会显得信息是旧的。
自测方式
刷完不等于记住,按这个流程验收:
- 遮答默写:把 20 道题目抄到白纸上,逐题默写 3 句主干,写不出的进错题本
- 深挖追问:自己扮演面试官,只念深挖点那句话,看能不能接住,接不住回正文重读
- 笔记产出:晚上 30 分钟整理「八股笔记 v1」,每题自己写 3 句话,参考答案只用来纠偏
- 错题滚动:标红题明天 day2 刷题前先重背,冲刺周内错题至少滚动三轮
延伸阅读
- ReAct: Synergizing Reasoning and Acting in Language Models,ReAct 原始论文,第 1 题的出处,精读 Figure 1 的轨迹示例就够
- MCP 官方文档,三原语和传输协议的权威定义,第 15~16 题扫一遍概念页即可
- A2A 协议官网,Agent Card 和 Task 生命周期的原始出处,对应第 17 题
- LangGraph 文档的 Persistence 章节,checkpointer、thread_id、interrupt 的执行语义,第 4~6 题的细节源头
- RRF 原始论文,第 9 题 k=60 的出处,篇幅短,值得全文读
系列起点在第 1 周 Day 1。那时候还在为 ApiResponse<T> 纠结,现在张口就是 checkpointer 和 interrupt,这二十几周没白走,冲刺周也该有这个底气。