面灵AI→

百度测试开发岗面经合集:Agent 评测与 Langfuse 实践

轮次
多轮面试合集
时间
2026-09
来源
牛客网

《面试题目》

  1. 自我介绍
  2. 拷打项目:如何构建测试集?怎么评测 Agent 输出的效果?并行节点遇到冲突怎么解决?
  3. 项目开发系统怎么构建 trace,如何定位问题?Agent 返回结果不理想怎么排查问题?
  4. 讲讲 checkpointer 机制,以及它的原理
  5. 项目中是如何用 state 构建的数据?
  6. 主流大模型有哪些区别
  7. 如何用 codex 进行自动化测试
  8. skill 的原理,讲述一个应用场景
  9. mcp 服务有什么作用
  10. 算法题:删除排序链表中的重复元素
  11. SQL 题:找出至少连续出现三次的数字
  12. 如果让 Agent 完成一份竞品分析报告,如何拆解任务?
  13. 任务中的哪些环节需要人工把控?
  14. 大模型获取竞品销量等外部数据时,如何判断数据准确性?
  15. 在 Agent 工作流中,人的核心作用是什么?
  16. 使用大模型检索外部资料时,如何识别和规避版权风险?
  17. 手撕:合并两个有序数组
  18. 如何为合并有序数组函数设计测试用例?
  19. 如何快速判断一个数组是否有序?
  20. 对外提供函数或接口时,工程上需要遵循哪些步骤?
  21. 合并大规模有序数组时,如何处理性能、内存和线程安全问题?
  22. 两个有序数组达到百万级数据量时,如何优化?
  23. 大模型从零开发到落地会经历哪些阶段?预训练、中训练和后训练分别包含什么内容、解决什么问题?
  24. 是否了解 SWE 数据集?
  25. 如何理解 AI 测试开发岗位?
  26. 你刚才提到用 Langfuse Evaluator 做评估,能具体展开讲讲是怎么做的、做了什么吗?
  27. 能否结合一个实际场景,说明你具体怎样使用 Evaluator,以及评估了哪些内容?
  28. 你关注过 Evaluator 机器评估结果的可信度吗?是否会通过人工标注或复核来验证机器评估的准确率?
  29. Langfuse 中既有预置的评估 Prompt,也可以自定义,你们一般使用预置的还是自己设计?自定义评估 Prompt 时有哪些注意点?
  30. 评估 Prompt 需要包含哪些内容?追问:具体应该怎样设计?
  31. 根据实际打分和人工检查结果,你们会继续优化预设的评估 Prompt 吗?面对规则遗漏、设置不准或评测标准更新时,具体迭代流程是什么?
  32. 你的两段实习都是 Java 开发或 AI 应用开发,为什么选择投 AI 测试开发,而不是 AI 应用开发岗位?
  33. 如果要保障企微侧边栏助手的 RAG 线上问答效果,除了 Langfuse Evaluator 自动评估外,还需要做哪些工作?
  34. 对意图识别、工具编排和工具调度成功率,你们是否做过评估或效果保障?目前准确率大约是多少?
  35. 你们是否做过端到端评估,例如从真实页面输入问题,综合评估回答内容、工具调用和最终产物的整体可用性?
  36. Hakimi Code 是跟着开源项目做的,还是业务中实际使用的项目?
  37. 在你们日常的 Coding 工作中,大约有多少比例的代码是通过 AI Coding 或 Vibe Coding 生成的?对 AI 生成的代码,你们会逐行或比较仔细地 Review 吗?
  38. 涉及实现逻辑、代码复用等问题时会怎样处理?
  39. 你现在还有手写代码相关的工作吗?
  40. 如果要测试这段程序,你会设计哪些测试用例?如果输入内容全部是数字,会有什么问题?如果输入的数字非常长,Python 的 int 会出现溢出吗?
  41. 最近有学习什么新知识吗?你提到的 LLM Wiki 和普通的 Wiki 知识库有什么区别?

《参考解析》

1. checkpointer 机制与 state 设计。在 LangGraph 这类 Agent 框架里,图被编译成「超级步」执行:每一步执行完若干个节点后,框架会把当前的 state 快照连同执行位置、待执行的下一批节点、以及必要的元数据(线程 id、checkpoint id、父 checkpoint)持久化成一条记录,这就是 checkpointer。它的价值有三层:断点续跑(进程挂了或用户中途插话,从最近的 checkpoint 恢复而不是从头执行)、人工介入(在某个节点前中断,等人确认后继续,即 human-in-the-loop)、以及时间旅行调试(回到任意历史快照重放,定位是哪一步跑偏)。存储后端通常选 Postgres(事务性强、便于并发控制与查询)或 Redis(快、适合高频写但要注意持久化策略),线程/会话 id 决定恢复点,所以同一会话的 checkpoint 必须按 id 隔离。state 的设计原则是「可序列化、显式、最小」:只放真正需要在节点间传递的数据(消息列表、已收集证据、任务状态枚举、重试计数),不放数据库连接、模型客户端这类运行时对象;对并行分支要明确每个字段的归并语义——LangGraph 用 reducer 定义同一字段被多路并发写入时怎么合并(追加列表、取最大值、后者覆盖),如果一个字段被两个并行节点同时写而没有 reducer,框架会直接报冲突,这正是「并行节点遇到冲突怎么解决」的标准答法:要么给字段配一个语义正确的 reducer,要么把共享字段拆到各自分支的私有字段再在汇合节点显式合并,别用锁去硬扛。

2. 如何评测 Agent 的输出,以及 trace 怎么建。Agent 的输出不是一段文本,而是「最终答复 + 调用链 + 中间产物」,所以评测要分层:单步评测工具选择是否正确、参数是否正确、检索结果是否相关;轨迹评测整条链路是否走了合理的最短路径(步数、有无冗余调用、错误重试次数);端到端评测最终产物是否可用(答案正确性、是否引用了真实证据、是否越权操作、延迟与成本)。测试集构建分三来源:线上真实流量分层抽样(覆盖高频意图)、人工设计的边缘场景(空输入、多轮指代、超长上下文、工具返回异常)、对抗样本(诱导编造、prompt 注入、越权提问)。trace 的构建靠框架自带的可观测层(Langfuse、LangSmith、OpenTelemetry 语义约定):一次请求一个 trace,每个节点/模型调用/工具调用一个 span,span 上挂输入输出、耗时、token 数、模型名、检索命中 id 和状态码,用统一的 session/thread id 串起多轮。排查「Agent 返回结果不理想」的正确姿势是从 trace 自上而下看:先看检索命中的文档对不对(数据问题),再看工具是否被正确调用、参数是否合理(编排问题),再看模型拿到的上下文里有没有答案(上下文问题),最后才怪模型(生成问题)——这样每一步都能用 trace 里的证据排除,而不是靠猜。

3. Langfuse Evaluator 的用法与可信度校准。用法上分三块:数据集(dataset)承载黄金样例,每条含输入与期望输出/关键事实;评估器(evaluator)分两类,一类是无模型的确定性检查(正则、JSON schema 校验、关键词命中、工具调用断言,便宜且稳定,应该优先覆盖),另一类是用 LLM 打分的 judge(相关性、忠实度、答案正确性、语气合规),在 trace 或 dataset run 上批量跑,产出可比较的分数趋势;再配上线上采样评估,对真实流量按比例打分并把低分 trace 挑出来人工看。评估 Prompt 的设计要点:给出明确的评分维度与分档定义(每题 1~5 分要写清每档什么样子)、要求先复述事实依据再打分(迫使模型看上下文而不是凭感觉)、给出无答案/无法判断时的处理方式、输出强结构化字段便于统计、少样本示例里必须包含「看起来对但实际错」的负例。可信度校准是面试官最爱追的点:LLM judge 会系统性偏乐观,所以要做三件事——固定一批人工标注样本作为「金标准」,算 judge 与人的一致性(准确率、Kappa),一致率不达标就改 prompt 或换模型;用人工标注做定期抽检(例如每周几百条)而不是一次性校准;把「规则检查 + LLM judge + 人工抽检」三层组合起来,凡是 judge 判高分但人工看是错的样本,都要回收进负例集反哺评估 Prompt。迭代流程则是标准闭环:发现漏检 → 归类错因(规则缺失 / 分档模糊 / 场景未覆盖)→ 改评估规则或 prompt → 在固定回归集上验证不会把原来的好样本判坏 → 再上线。

4. RAG 线上效果保障与端到端评估。自动评估只覆盖了「模型输出文本质量」这一层,要保障线上问答效果还得补齐这些:检索侧监控召回质量(人工标注小批量线上的「问题 → 正确文档」对,看 Recall@K;再看无召回时的空结果率),数据侧保证知识库新鲜度(文档更新后多久能进索引、有没有增量同步的失败告警、过期文档有没有下线),性能侧盯首 token 延迟与超时率,安全侧做越权与敏感信息泄漏的抽查。业务层还要拆细指标:意图识别准确率(用混淆矩阵看哪两类在混)、工具编排成功率(是否选了正确的工具)、工具调度成功率(参数是否合法、下游是否返回成功),这三者要分别设阈值告警,因为它们的修法完全不同。端到端评估是最有说服力的:从真实页面入口跑一批标准任务,断言最终产物(报告、表格、工单)是否满足可用性要求,而不只是看聊天回复是否通顺;配上会话级指标(一次解决率、用户追问次数、人工返工率),才算真正闭环。

5. 合并两个有序数组:从手撕到百万级优化。基础解法用双指针从后往前填(nums1 尾部预留了空间时)可以做到 O(m+n) 时间、O(1) 额外空间,比新建数组再拷贝更优;面试时要顺手说出边界:其中一个数组为空、有重复元素、相等时取哪一个(影响稳定性)。测试用例设计要覆盖:空数组、单元素、全部相等、一个数组整体小于/大于另一个、含重复值、超大规模、nums1 尾部空间刚好够用。工程化封装(对外提供接口时)要讲清契约:入参是原地修改还是返回新数组、是否允许修改输入、空间复杂度承诺、异常与非法输入如何处理(长度越界、容量不足),再配文档与单测。百万级 / 超大数组要谈的是性能与内存:单机内存放不下时分块处理,把两个数组按块读入、用败者树或小顶堆做 k 路归并(k 路归并是「合并 k 个有序数组」的推广),块间用顺序 IO 流式写盘降低内存峰值;多线程并行归并要注意线程安全——每个线程只写自己负责的输出区间(按前缀和预先切分边界),避免共享写;还要考虑缓存友好(顺序访问、避免随机跳写)与是否值得用并行(规模不够时线程开销反而更大)。判断数组是否有序用一次顺序扫描即可,O(n) 且可以对逆序或局部有序做提前返回。

6. SQL:找出至少连续出现三次的数字。经典写法有几种。窗口函数法最清晰:用 ROW_NUMBER() 减去行号构造分组键,让连续相同的值落到同一组,再 GROUP BY 筛出计数 ≥ 3 的组:

SELECT DISTINCT num AS ConsecutiveNums
FROM (
  SELECT num,
         id - ROW_NUMBER() OVER (ORDER BY id) AS grp
  FROM Logs
) t
GROUP BY num, grp
HAVING COUNT(*) >= 3;

这里的关键洞察是「连续」等价于「值相同且 id 与行号的差恒定」。自连接法(l1.id = l2.id - 1 AND l2.id = l3.id - 1 AND l1.num = l2.num AND l2.num = l3.num)直观但只能处理固定长度 3,扩展到「连续 N 次」就得写 N 个自连接,不通用;窗口函数法把 N 当成常量参数,还天然支持「连续出现至少 N 次并给出区间起止」。要主动提的坑:如果 id 不连续(有删除)自连接法会漏判,而 id - ROW_NUMBER() 的写法正好能容忍空洞;去重用 DISTINCT;如果要求返回所有连续区间而不只是数字,就用 MIN(id)/MAX(id) 聚合;MySQL 8.0 以下没有窗口函数,只能退化成自连接或用户变量法。

7. 关于「AI 测试开发」这个岗位的理解。它和传统测开的区别在于被测对象的输出不再是确定性的:同一输入可能得到不同文本,断言不能只靠等值比较,所以工作重心从「写用例执行用例」转向「建评测体系 + 建可观测 + 建回归门禁」。日常大概包含:为 Agent/RAG 系统建数据集与评测流水线(确定性检查 + LLM judge + 人工抽检),做线上 trace 分析与 bad case 归因(定位到检索、编排还是生成),把评测接进 CI 做成发布门禁(指标回退就拦住上线),以及传统的接口/性能/自动化测试能力打底。回答「为什么从 AI 应用开发转测试开发」时,比较有说服力的角度是:自己既写过 Agent 应用、熟悉它的失效模式,又愿意把精力放在「怎么证明它是好的」这件事上,这比纯开发视角更容易发现系统性问题;同时要准备好被追问「你更想写代码还是做质量」,别回避。