面灵AI→

哔哩哔哩 AI Agent 开发一面面经全解析

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 简单介绍一下自己的背景,以及选择 AI Agent 方向的原因。
  2. 一个完整的 Agent 系统通常包含哪些核心模块?相比传统 LLM Chatbot,它最大的区别是什么?
  3. 在 Agent 项目中,常见的规划(Planning)、记忆(Memory)、工具调用(Tool Use)和执行模块分别承担什么职责?
  4. 意图识别模块通常有哪些实现方式?规则匹配、小模型分类和 LLM 分类分别适用于哪些业务场景?
  5. 如果使用大模型完成意图分类,如何选择 Zero-shot、Few-shot 方案?当标注数据较少时,如何提升分类稳定性?
  6. RAG 系统从文档进入到最终生成答案的完整流程是什么?离线知识库构建和在线检索阶段分别包含哪些步骤?
  7. 文档切片有哪些常见策略?RecursiveCharacterTextSplitter 的实现逻辑是什么?针对中文文档处理需要注意哪些问题?
  8. 如果 RAG 系统出现召回效果差的问题,你会如何定位?会优先检查 Embedding、Chunk 策略、Query Rewrite、Hybrid Search 还是 Rerank?
  9. Embedding 模型如何选择?不同 Embedding 模型会对检索效果产生哪些影响?
  10. LangChain 框架主要有哪些核心组件?相比传统 Chain 模式,LCEL 带来了哪些改进?
  11. Function Calling 和 Tool Calling 的执行流程是什么?模型是如何判断需要调用工具,以及生成对应参数的?
  12. 如果 Agent 接入大量工具,如何避免工具描述过长导致 Prompt 膨胀?有哪些优化方式?
  13. Prompt 一般如何设计和组织?System Prompt、Few-shot 示例以及 CoT 通常分别承担什么作用?
  14. 如何降低大模型输出幻觉?除了 Prompt 约束之外,还有哪些工程优化方案?
  15. Agent 执行任务时,如果出现重复调用工具、无法结束或者任务循环的问题,应该如何设计保护机制?
  16. Agent 中的 Memory 通常如何实现?短期记忆和长期记忆分别解决什么问题?
  17. 如何设计一个记忆检索流程?历史信息应该如何筛选、存储和召回?
  18. 手撕代码:合并重叠区间(LeetCode 56),并分析算法复杂度。

《参考解析》

  1. Agent 与 Chatbot 的分界:Chatbot 是「输入 → 一次或有限次生成 → 文本」,Agent 多出来的是一个受约束的闭环——模型只提下一步候选动作,Harness 负责权限、参数校验与执行,环境回真实 Observation,状态更新后再决定下一步,终止由外部验收条件判定而不是模型自称完成。模块上至少要有接入与身份、任务与状态、上下文构建、决策编排、工具执行、知识与记忆、验证治理、可观测与评测这几层。工程上最容易漏的是两件事:把长任务状态只留在 Prompt 里,以及把权限、金额这类硬约束写成 System Prompt 就当成了安全边界。
  2. 意图识别的分层路由:规则匹配延迟低、可审计,适合退款、转人工这类高风险且边界清晰的意图;小模型分类适合意图集合稳定、已有标注数据、对吞吐和成本敏感的线上流量;LLM 分类解决开放语义、层级意图和低样本冷启动,代价是延迟、成本和输出格式的不稳定。落地通常是三级路由:规则吃掉高置信高风险,小模型覆盖大多数稳定请求,低置信与长尾交给 LLM,最后仍由服务端做权限与动作校验。评估别只看总体准确率,要看 macro-F1、各类召回率、拒识准确率和 P95 延迟。
  3. RAG 全流程与「召回差」的定位顺序:离线阶段不是先切片,而是先修数据质量——解析时保留标题、表格、页码等结构,清洗重复与无效内容,切分时写入文档 ID、标题路径、权限与版本等元数据,再建向量与倒排双索引;在线阶段是查询改写 → 稠密向量与 BM25 并行召回 → 融合去重 → Rerank → 按上下文预算注入证据,并要求证据不足时拒答。召回差要拆成索引覆盖、候选召回、排序三类问题,用带标准证据块的离线集逐层回放;Rerank 只能修排序,Top-N 里根本没有正确证据时换 Reranker 是白费。切片参数和 Embedding 都不能照搬通用榜单,要在自己的文档集上比 Recall@K 与证据完整率;中文没有稳定空格,优先按段落和中文句末标点切,别把空格当词边界。
  4. 工具调用的执行流程与工具膨胀治理:工具调用是一种协议,不是运行时——应用注册工具与 JSON Schema,模型输出结构化的调用意图,应用解析后做 Schema、类型、权限、预算和安全校验,再执行并把结构化结果写回上下文。模型并不是在「判断」要不要调工具,而是在上下文条件下预测工具调用或普通文本的概率,所以参数合法不等于业务正确,有副作用的调用还要幂等键、状态回读和人工审批。工具变多时别把所有 Schema 每轮都塞进 Prompt,按渐进披露做:先给工具名和短描述做领域路由,选中后再加载详细 Schema,合并高度相似的工具、按角色下发最小权限集,同时监控工具描述的 Token 占比和工具选择错误率。
  5. Memory 分层与长任务循环保护:短期记忆解决当前任务的连续性(目标、计划、已完成步骤、工具结果),实现上把结构化状态放进 checkpoint、Redis 或数据库,最近消息保留窗口、已完成阶段压成摘要,Prompt 只是这些状态在当前步骤的投影视图;长期记忆解决跨会话复用,每条要带作用域、来源、时间、置信度、有效期和权限,当前明确指令优先于旧偏好,主库事实优先于历史摘要。循环保护按「检测、限制、恢复、验收」四层做:对规范化后的工具名和参数算动作指纹,设置步数、Token、deadline 预算且由运行时强制,用显式状态机和外部完成条件判定 DONE,再对瞬时错误做有上限的退避、写操作走幂等与补偿。注意轮询类任务本来就该重复调用工具,判断要结合状态版本、时间窗口和进度信号,不能「看到两次相同调用就停」。
  6. 手撕:合并重叠区间:按左端点升序排序后单次遍历,维护已合并序列的最后一个区间——当前区间左端点大于它右端点就追加,否则把右端点更新为两者的最大值。复杂度是排序的 O(n log n) 加线性合并的 O(n),不修改输入时额外空间 O(n),原地合并则 O(1)。边界要主动说:空数组、单区间、完全包含、链式重叠,以及 [1,4] 与 [4,5] 这类端点相等(通常视为可合并)。算法成立的关键不变量是:遍历到当前位置时,结果数组已经是此前所有区间的最小不重叠表示。