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