百度 Agent 秋招算法岗一面二面面经(附 Top-K 采样手撕)
- 轮次
- 一面+二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
一面
- 简单做一下自我介绍。
- 讲讲多 Agent 这套方案的整体业务背景,说说你对多 Agent 整体架构设计的理解。
- 在多 Agent 系统内部,各个智能体分别承担什么样的职责分工?
- 整个多 Agent 体系采用了分层架构,具体分层逻辑是如何设计落地的?
- 如果某个子 Agent 运行异常,出现崩溃、超时或者任务执行失败的情况,系统会设计什么样的容错兜底机制?
- 当前这套多 Agent 系统整体任务完成成功率表现如何?
- 在项目流程当中,是否会由 Agent 自主调用工具 skills?
- 是否可以交由大模型本身来动态编写 skills?比如只给模型下达修改目标、明确修改方向,由模型完成工具代码改动。
- 系统的长期记忆模块选用什么存储方案,记忆片段的匹配检索逻辑如何实现?
- 聊聊你项目采用的整套评估手段。
- 介绍下你校园相关项目,讲清楚项目整体实现思路。
- 动态路由模块拆解之后,包含哪些子模块?
- 项目里面因果驱动的机制是怎么实现的?
- 实验所使用数据集,是直接使用公开现成数据集吗?
- 最终验证效果,主要依靠下游任务指标做对比吗?
- 算法题:区间差集问题。
- 编码实现带温度系数的 Top-K 采样,入参包含 logits、Top-K 数值、温度 temperature 参数。
- 面试官反问:你主观上会不会和咱们这块业务存在适配问题,是否会对该业务方向缺乏兴趣?
二面
- 请做一个简单自我介绍。
- 挑选一个你最熟悉的项目,完整展开介绍。
- 结合真实业务场景,讲讲这套方案的实际落地使用案例。
- 项目架构设计了三级记忆体系,为什么不能直接用单级架构完成,引入三级结构的必要性是什么?
- 短期记忆直接复用对话上下文即可,那中长期记忆部分是如何做处理维护?
- 记忆数据需要落库保存,记忆相关标注工作是否交由大模型自主完成?如何校验落库记忆数据的正确性?
- 项目里面记忆数据整体规模大概是什么量级?
- 如果要对记忆模块做效果评估,会设计哪些评估指标,举个例子比如记忆覆盖率怎么测?
- 是不是依据这份知识被调用之后是否成功解决问题,反过来给文档打上可信度标签?
- 项目提到双引擎存储 + 混合检索策略,请问具体是哪两套存储引擎?
- 两套存储引擎分别服务中期记忆、长期记忆,还是分配别的用途?
- 生成向量嵌入的时候选用什么向量模型?
- 混合检索由向量检索 + 字面检索共同构成,字面检索的实现原理是什么?
- 算法题:生成有效括号;面试官继续追问多种不同实现思路,探讨两种、三种解法的优劣。
- 确认实习情况:如果正式入职,是否接受 base 定在实习所在城市?
《参考解析》
带温度系数的 Top-K 采样怎么实现:顺序是「除以温度 → 取 top-k → softmax → 按概率采样」。第一步数值稳定处理:先减去 max(logits) 再除以 temperature,否则 logits 稍大就会 exp 溢出;温度为 0 或极小值时应退化成贪心(直接取 argmax),避免除零和 one-hot 数值问题。第二步取 top-k:对缩放后的 logits 做一次部分排序(std::partial_sort 或维护大小为 k 的小顶堆),拿到第 k 大的阈值 theta,把小于 theta 的位置置为 -inf;k 的边界要处理(k <= 0 视为不裁剪、k >= vocab_size 视为全保留)。第三步 softmax 只在保留的 k 个位置上做(分母只累加这 k 项,这样才真正改变分布形状),最后用累积分布 + 均匀随机数采样。常被追问的细节有三点:① k 裁剪与温度缩放的顺序——必须先缩放再裁剪,否则温度会改变候选集合(温度高时分布更平,同一个 k 保留的集合会变);② 「top-k 采样」与「top-p / 典型采样」的区别——前者按固定个数截断,后者按累积概率截断,候选数随分布自适应;③ 工程实现上不要真的 sort 整个词表(vocab 十几万,每次都排序很浪费),partial sort 或堆足够;另外采样要能接随机种子以便复现实验。用 PyTorch 写核心就是 logits = logits / temperature; v, i = torch.topk(logits, k); p = torch.softmax(v, -1); j = torch.multinomial(p, 1); return i[j]。
记忆模块的评估指标与记忆覆盖率怎么测:记忆系统的评估要拆成「写得对不对」和「读得准不准」两层。写入侧看:抽取准确率/召回率(对照人工标注的应记事实清单,看漏抽了什么、编造了什么)、去重与冲突率(同一事实是否被写成多条、新事实有没有覆盖旧事实、矛盾条目的比例)、时效性(过期的偏好是否被标记失效)。读取侧看:检索命中率 Recall@k / MRR(构造「这个问题必须用到某条记忆」的评测集,看那条记忆是否出现在 top-k)、答案有据性(模型回答里的关键断言能否被召回的记忆支撑,即忠实度)、以及不该召回时的正确拒答率(用户没提过的事不要假装记得)。记忆覆盖率是写入侧指标,可操作的定义是:从会话里由人工或强模型标注出「值得长期记住的事实集合 G」,再看系统实际落库的集合 M 与 G 的交集,|M ∩ G| / |G| 就是覆盖率;分母用标注集合而不是全部 token,才能避免「记得越多分越高」的假象,同时要配一个精确率一起看,否则堆量就能刷分。再加一层端到端指标:跨会话任务成功率、需要用户重复交代信息的比例、以及长期使用后个人化回答的采纳率。最后补一句评测纪律:评测集要固定并版本化,改了抽取 prompt 或 embedding 模型必须回归,不然指标变化分不清是改好了还是评测集漂了。
中长期记忆的落库、标注与校验:会话结束后做一次「抽取—归并—落库」的批处理:抽取出候选记忆(按实体/偏好/事实/任务状态分类,每条带来源消息 id 与时间戳),与库中已有条目做相似度比对,走「新增 / 更新(保留历史版本)/ 标记失效」三条路,写入时带 source、confidence、valid_from、version 字段。标注要不要交给大模型自主完成?实践中是分层策略:低风险、易验证的信息(用户自述的偏好、明确的结论)由模型抽取后直接落库,但必须带来源引用;高风险或推断类信息(对用户能力的判断、涉及金额与健康的结论)只作为「候选」入待确认区,或干脆不写。校验落库数据正确性有四道闸:① 溯源校验——每条记忆必须指回原始消息,抽取结果无法引用来源就丢弃;② 交叉一致性——与库中已有条目比对,矛盾时按时间与置信度择新不择旧、并保留冲突记录;③ 抽样人工/强模型复核——固定周期抽检并计算准确率,作为这条链路的回归指标;④ 线上反馈闭环——用户纠正(「不是这样」)要能反写回记忆并降低该类抽取的权重。此外要区分事实与推断:推断必须显式标记,回答时以「你之前提到过……」这类可被否认的方式呈现,避免把模型的猜测当成用户的真实情况。
混合检索里的字面检索与区间差集思路:字面检索的主流实现是 BM25 倒排索引,打分 = 查询词项的 IDF 加权 × 词频饱和项 × 文档长度归一化项,强在精确 token(型号、错误码、API 名、人名),弱在同义改写;向量检索恰好相反,语义泛化好但稀有专有名词容易漂移。所以工程上是两路召回后融合——用 RRF 按排名倒数加权(不依赖两路分数量纲),再上交叉编码器 rerank;中文还有分词的坑,术语要加自定义词典,否则专有名词会被切碎导致召回骤降。至于「区间差集」这类手撕题,写之前先跟面试官确认定义:常见两种——给定若干区间求它们的并集补集(即未被覆盖的部分),或给定两个区间集合求 A 中有而 B 中没有的部分。以「求补集」为例,解法是先把区间按左端点排序、合并重叠(注意边界相等是否算重叠要和面试官对齐,闭区间 [1,2] 与 [2,3] 不同处理会影响结果),再在合并后的相邻区间之间取空隙;如果是两个集合求差,则用双指针扫两个有序区间列表,按 max(l1,l2)、min(r1,r2) 逐段裁剪,复杂度都是 O(n log n)(排序主导)。要主动说清的边界:空输入、单点区间、完全包含、以及结果是否需要合并输出。