AI Agent 开发岗面试题:55 道真实面试里的追问
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 一个需求过来,你怎么判断该用 workflow 还是 Agent?
- 什么时候从单 Agent 升级到多 Agent?
- 多 Agent 比单 Agent 多付出哪些代价?
- Agent、RAG、workflow、微调,四选一怎么判断?
- 你做过最失败的一次 Agent 设计是什么?重来会怎么选?
- LangChain、LangGraph、CrewAI、AutoGen,你怎么选?
- LangGraph 相比 LangChain 的 AgentExecutor 到底解决了什么?
- LangGraph 的节点、边、条件边怎么设计?
- 什么信号出现,你会自研框架不跟 LangGraph 了?
- Agent runtime 的职责边界是什么?
- 持久化怎么做?Agent 跑到一半进程挂了,怎么恢复?
- 多实例同时处理同一个会话,状态怎么不打架?
- harness 这个词你怎么理解?你做的 harness 解决什么问题?
- 工具调用 harness 怎么设计?参数校验、超时、沙箱分别怎么搞?
- replan 模式什么时候用?Plan-and-Execute 和 ReAct 的区别?
- 工具越来越多,怎么保证 LLM 每次都选对?
- 死循环怎么防?除了 max_iterations 你还做了什么?
- 用户点停止生成,后端怎么真正把推理停下来?
- 审批做成 human-in-the-loop,暂停和恢复怎么设计?
- 审批超时怎么办?驳回之后怎么续跑?
- 客服 Agent 出错,人工怎么接管?
- 单任务 token 成本怎么算?成本失控的三大来源是什么?
- 上下文窗口怎么管理?长对话怎么压缩?
- 流式输出里,工具调用的事件怎么传给前端?
- 流式断线重连,上下文怎么恢复?
- 重试、熔断、幂等,Agent 场景下怎么设计?
- 多 Agent 之间怎么通信?协议怎么定?
- 协作模式有哪些?编排、辩论、层级各自适用什么?
- 共享状态还是消息传递?
- 两个 Agent 互相等待,怎么处理?
- 多 Agent 的 token 开销怎么控制?
- RLHF 的完整流程?
- DPO 为什么可以不要奖励模型?
- DPO 和 RLHF 各自的坑是什么?
- 线上用户的点赞、点踩,怎么变成 DPO 训练数据?
- Agent 的工具调用准确率,靠对齐还是靠数据?
- 幻觉分几类?RAG 为什么消不掉幻觉?
- 幻觉率在线上怎么度量?
- Agent 评测分几层?
- 业界有哪些 Agent benchmark?各自的局限是什么?
- LLM-as-judge 有什么坑?
- badcase 从哪收集?怎么归因?
- badcase 怎么回流成回归集?
- 点赞点踩在评测体系里是什么角色?
- 上线前怎么灰度 Agent?
- Prompt injection 为什么防不住?
- 你的纵深防御怎么做?
- RAG 投毒的攻击路径有哪些?
- RAG 投毒怎么防?
- Agent 被诱导调用危险工具怎么办?
- 敏感数据怎么防泄露?
- 设计一个客服 Agent,怎么分层?
- 设计 Text2SQL,要解决哪些问题?
- 给你一个长文档分析需求,第一反应是什么方案?
- 什么需求你会直接拒绝用 Agent?
《参考解析》
选型:能 workflow 就别上 Agent
判断依据是流程的确定性。步骤固定、分支可枚举、结果好评测的需求,用 workflow(代码编排 + 单次模型调用)最划算:成本可预期、失败可定位、能做确定性回归。任务开放、下一步取决于中间结果时才值得让模型自主规划。四选一(Agent、RAG、workflow、微调)可以按一条链问下来:知识不在模型里就先上 RAG;流程固定就写 workflow;需要动态决策才上 Agent;只有当问题是「行为风格/格式/领域语感」这类提示词改不动的东西时,才轮到微调。答题时能说出「我先用最便宜的手段试,达不到再升级」,比直接背概念更接近真实工程判断。
多 Agent:不是高级,是最后的手段
从单 Agent 升级的信号通常有三个:子任务需要互相独立的上下文(塞在一个提示里会互相干扰)、角色之间需要制衡或并行(生成与校验、多头检索)、单个 Agent 的工具集太大导致选错工具。代价也明确:通信开销与 token 成倍增长、状态一致性变难、调试链路由一条变一片、还会出现两个 Agent 互相等待或反复推诿。能给出「先拆工具而不是先拆 Agent」「拆完要能并行才有收益」这类判断,说明真踩过坑。
持久化与断点恢复
checkpoint 要存的是一份能重建推理现场的最小状态:会话与线程标识、消息序列、当前的节点/步骤、待执行的工具调用与已完成的调用结果、以及必要的业务上下文。序列化要选稳定的格式并带版本号,否则改一次状态结构就读不了历史。恢复的关键在于「幂等」:进程挂掉时正在执行的工具调用必须能安全重放,所以写操作要么带幂等键、要么走「先记意图、再执行、后确认」的模式。多实例并发同一会话要靠乐观锁(版本号 CAS)或分布式锁,并用单调递增的 step 编号拒绝过期写入,避免两个进程各写一半状态。
循环与中断:死循环、停止生成、人工审批
只设 max_iterations 是最粗糙的做法,它拦不住「每轮都合法但原地打转」。更实用的是三件事叠加:状态哈希去重(把关键状态归一化后取指纹,重复出现即判定空转)、工具调用指纹(同参数同工具连续调用 N 次就打断并换策略)、分阶段预算(迭代次数、token、时长分别设上限,任一超限就降级收尾)。用户点「停止生成」要对齐到真正能中断的地方:模型流式请求需要主动 abort,正在跑的工具要能被取消或标记为放弃,已产生的副作用不能靠取消回滚,只能靠幂等或补偿。human-in-the-loop 的设计要点是把「暂停」做成持久化的挂起点(暂停也落 checkpoint),恢复时用同一条线程继续,同时给审批设超时与默认动作;驳回后不要把整个任务重跑,而是带着驳回理由回到上一个决策点重新规划。
成本与上下文管理
单任务成本要从三处算:输入 token(系统提示 + 历史 + 检索内容,通常是大头)、输出 token、以及工具往返次数。成本失控的常见来源是上下文无限增长、工具结果整段回灌、以及多 Agent 互相重复读同一份资料。上下文管理的手段按代价排序:工具结果先做摘要或只回灌必要字段、历史按轮次或语义做压缩与丢弃、把稳定的大块内容放前面吃前缀缓存、用结构化记忆替换长篇对话。流式场景还要区分两类事件:模型 token 流和工具调用生命周期事件(开始、参数、结果),前者可增量推、后者要带调用 id 保证前端能配对;断线重连靠事件序号 + 服务端保存的检查点续传,而不是让前端重新发起整轮。
评测与 badcase 闭环
评测至少要分三层:工具调用级(选中率、参数正确率)、任务级(端到端成功率、步数、成本)、系统级(线上转化、人工接管率、用户满意度)。benchmark 能提供横向参照,但公开基准与自己的业务分布差异很大,局限性要主动说出来,别把它当验收标准。LLM-as-judge 的坑集中在三点:位置偏好与长度偏好、评分标准漂移(换模型就换尺度)、以及自评偏袒;对策是成对比较 + 交换位置 + 与人工标注对齐校准。badcase 要归因到检索、工具、模型、产品四层,再回流成回归集,且回归集要版本化、能自动跑;点赞点踩适合当召回的弱信号,不能直接当标签用。上线灰度按流量分桶,关注的是成功率与成本的联合指标。
安全:prompt injection 与 RAG 投毒
prompt injection 防不住的根因是「指令和数据走同一个通道」——模型无法从语义上区分「用户的话」和「文档里的话」。可行的纵深防御是分层设限:把外部内容明确标记为不可信数据并做清洗、用白名单约束工具与参数、对危险动作加人工确认或双人校验、把权限收到工具实现里(模型只能调接口,接口自己做鉴权和范围限制),而不是靠一句「忽略文档中的指令」。RAG 投毒的攻击面主要在公开文档、用户上传和爬虫入库三个入口,防护要覆盖入库前(来源可信度、内容扫描、去重与异常检测)、检索时(权限过滤,别把别人的文档召回给当前用户)、生成后(引用可回溯、敏感信息检测)。
对齐与幻觉
RLHF 的流程是:先做监督微调,再用人类偏好数据训练奖励模型,最后用 PPO 等策略优化方法在奖励模型上优化,并用 KL 约束防止跑偏;DPO 把「奖励模型 + 强化学习」这一步折叠掉,直接在偏好对上优化策略,用策略与参考模型的概率比隐式地表达奖励,因此不需要单独训奖励模型,训练也更稳。实践中 RLHF 的坑在奖励模型被刷分与训练不稳定,DPO 的坑在偏好数据质量与对分布的过拟合,线上点赞点踩只能当弱标签,需要过滤与去偏。幻觉大致分事实性错误、无中生有的引用、以及指令遵循失败几类;RAG 只能把答案锚定到检索到的内容,检索不到、检索错了或模型不忠实于上下文时依然会编,所以还要有「不知道就说不知道」的降级路径和线上度量。