面灵AI→

快手大模型应用开发二面:Agentic RL 与 RAG 全链路

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

《面试题目》

  1. 自我介绍,重点讲你做过的 Agent 或大模型应用项目。
  2. 你这个 Agent 的整体架构是怎样的?从用户输入到最终输出,完整链路说一下。
  3. 你做的这个对话类 AI 项目,目标用户是谁?实际服务场景是什么?
  4. 智能问答系统是只做信息查询辅助,还是参与最终业务决策?定位是什么?
  5. 智能体强化学习(Agentic RL)与传统 RL 在训练范式和信用分配上的核心差异是什么?
  6. 长时序任务下 Agent RL 训练容易失稳,根本原因是什么?怎么缓解?
  7. PPO 的 Clip 机制和 KL 散度约束是否等价?适用场景有什么差异?
  8. GRPO 的损失函数写一下,它和 PPO 的核心区别是什么?为什么 GRPO 能省掉 critic 网络?
  9. GAE 的公式写一下,解释 λ 和 γ 的物理意义。λ=0 和 λ=1 分别对应什么?
  10. 重要性采样的公式写一下,它在 Off-policy RL 里起什么作用?
  11. 如果重要性权重方差很大、训练不稳定,你怎么处理?
  12. RAG 从文档切分到最终生成,完整讲一遍。
  13. 文档切分策略怎么选?chunk size 怎么定?
  14. 如果 Markdown 没有标题怎么切分?
  15. 短 query 和长 chunk 向量化后怎么比较?
  16. BM25 和向量检索怎么结合?RRF 的 k 值怎么设?
  17. Rerank 模型放在哪个阶段?
  18. 如果检索召回不相关,你怎么排查?
  19. 大模型幻觉怎么定位?事实性幻觉、工具选择错误、参数构造错误分别怎么解决?
  20. 如果模型把无关文本当成证据,怎么处理?
  21. 如果要求模型回答超出证据范围的问题,怎么约束?
  22. RAG 的引用来源怎么控制?如果不额外调用重模型,怎么过滤无关引用?
  23. 长期记忆和短期记忆分别怎么实现?哪些信息适合长期保存?
  24. 记忆冲突怎么处理?如果两条记忆完全冲突怎么办?
  25. SSE 和 WebSocket 有什么区别?SSE 断线重连怎么实现断点续传?
  26. 如果只处理增量内容语义不够、处理全量又时延高,怎么权衡?
  27. 你怎么评估一个 Agent 的服务质量?除了准确率还有哪些指标?
  28. 如果让你设计一个「行程规划 Agent」,结合天气、地域、用户画像做个性化推荐,你怎么做?
  29. 你了解哪些 Agent 开发框架?LangGraph 和 LangChain 的区别是什么?
  30. 手撕:最长递增子序列。给定一个整数数组,找到最长递增子序列的长度,要求 O(n log n) 解法,并输出具体的一个最长递增子序列(不要求唯一)。追问:要输出具体子序列怎么改?如果是二维的最长递增子序列怎么处理?

《参考解析》

Agentic RL 与传统 RL 的差异,以及长时序为什么容易崩

传统 RL 的设定是「状态转移由环境决定、动作是低维的、奖励密度尚可」;Agentic RL 的动作是自然语言与工具调用,动作空间是组合爆炸的离散空间,轨迹长度动辄几十上百步,而且中间还夹着外部工具返回的不可微、非平稳输出。信用分配上的核心区别有两层:① 稀疏奖励——任务成败常常只在最后一步才知道,中间步骤哪个动作起了作用非常难归因;② 动作粒度混合——一句话里既包含「做什么」也包含「怎么说」,同一个语义有多种表达,策略方差的来源比传统 RL 大得多。

长时序失稳的根因可以拆成:奖励稀疏 + 折扣导致早期步骤梯度极弱;rollout 长度增加让 return 方差随步数放大,优势估计噪声压过信号;策略在高维语言空间上更新,一次更新偏移过大就会「崩语言」(输出格式崩坏、复读、工具名乱写),而一旦格式崩了后续所有步都是噪声,形成正反馈式恶化;再加 off-policy 程度随训练推进变大,重要性权重爆炸。缓解手段:把长任务拆成带中间奖励的子任务,或做分层/课程学习;用稠密的过程奖励或规则化奖励(工具调用是否合法、格式是否正确、子目标是否达成);做优势归一化与奖励裁剪、限制单次策略更新幅度(小学习率 + KL 惩罚 + clip)、用过程奖励模型或规则验证器打分;rollout 与训练解耦(异步)但控制 off-policy 程度;以及最关键的——用规则约束输出格式(结构化输出、schema 校验),别让策略自由决定格式。

PPO 的 Clip 与 KL 约束、GRPO 为什么能省 critic

PPO 的 clip 是在目标函数上做截断:概率比 r = π_new/π_old 被限制在 [1-ε, 1+ε],超出部分梯度为零,等价于「不让这一步更新把策略带太远」。KL 约束(固定 KL 或自适应 KL)惩罚新旧策略的分布距离,是显式写进目标或作为早停条件。两者不等价:clip 作用在单个样本的概率比上是逐样本、硬截断的,KL 是分布级、平滑的惩罚;表现上 KL 惩罚允许某些样本比很大只要整体分布没跑远,clip 则一刀切。适用差异:在线、样本同分布、需要简单稳定时用 clip;有参考策略需要软约束(如 RLHF 里约束别偏离 SFT 模型太远)时用 KL,两者常一起用。

GRPO 针对的是 PPO 要额外训练一个 value/critic 网络(参数量可与策略同量级)带来的显存与训练复杂度。它把优势估计换成组内相对比较:同一个 prompt 采 G 个回答,用组内奖励的均值做基线、标准差做归一化,得到每个回答的优势,于是完全不需要 critic。损失形式是在 PPO 的 clip 目标上乘以这个组内归一化优势,并加上对参考模型的 KL 正则。省 critic 的代价是:每个 prompt 要采一组(G 条)样本,采样成本上升;组内奖励若全相同则优势全为 0、没有梯度(这也是为什么需要难度适中的 prompt 和可靠的奖励)。面试时把「基线从 value 网络换成组内均值」这一句点出来,比背公式更能说明理解。

GAE 与重要性采样

GAE 是把多步 TD 误差做指数加权平均:A_t = Σ (γλ)^l · δ_{t+l},其中 δ_t = r_t + γV(s_{t+1}) - V(s_t)。γ 是折扣因子,控制「看得多远、未来奖励打几折」;λ 是偏差-方差权衡旋钮:λ=0 退化成单步 TD 误差(δ_t),偏差最大但方差最小;λ=1 退化成蒙特卡洛回报减基线,方差最大但无偏。实践常用 λ≈0.95,配合 advantage 归一化使用。

重要性采样解决的是 off-policy 问题:数据由行为策略 μ 采集、要评估目标策略 π,于是用比值 π(a|s)/μ(a|s) 修正期望,使 E_μ[ρ·f] = E_π[f]。它是所有 off-policy 方法的数学基础,但方差随轨迹长度指数级放大——这是 PPO 要限制新旧策略距离的根本原因。方差过大时的处理:截断重要性权重(min(ρ, c))、做权重归一化(self-normalized IS)、用 V-trace/Retrace 这类带截断的离策略估计、缩短 off-policy 的滞后(提高采样与训练的同步频率)、或干脆以 on-policy 为主(PPO 的做法)。同时要监控有效样本量 ESS = (Σw)² / Σw²,ESS 太低说明少数样本主导了梯度。

RAG 全链路:切分、混合检索与重排

链路是「文档解析 → 切分 → 向量化/建索引 → 查询改写 → 召回 → 重排 → 上下文组装 → 生成 → 引用回填」。切分策略按文档类型选:结构化文档(Markdown、HTML、代码)优先按标题层级/代码块边界切,保住语义完整;无标题的 Markdown 用分隔线、空行、列表边界做二级切分,再退化到按句子聚合成固定长度;纯文本用递归字符切分(段落 → 句子 → 子句)+ 重叠滑窗。chunk size 没有万能值:chunk 的大小应该由「一个可独立回答问题的语义单元」决定,经验区间 256~1024 token,短问答/FAQ 偏小、技术文档偏大;重叠 10%~20% 防切断;关键是同一条链路上做评测对比,用召回率和「答案是否落在召回块内」来定,而不是拍数字。

短 query 与长 chunk 向量化后不在一个语义尺度上(query 是一个意图,chunk 是一段论述),直接算余弦相似度容易偏。缓解手段:给 chunk 生成摘要向量或「问题式向量」(预生成该块能回答的问题),检索时与摘要比;用 HyDE 让模型先把 query 展开成一段伪文档再检索;或用双塔模型专门微调短-长匹配;再不行就上 cross-encoder 重排兜底。

混合检索的经典组合是 BM25(精确词、专有名词、编号命中的强项)+ 稠密向量(语义泛化的强项),融合方式有加权求和、RRF(Reciprocal Rank Fusion,按排名而非分数融合,score = Σ 1/(k + rank))和先过滤后排序。RRF 的 k 是平滑常数,常用 60,作用是压低头部排名的绝对优势;k 越大,不同名次的权重越接近。Rerank 放在召回之后、上下文组装之前:先粗召回 top-50100,再用 cross-encoder 精排取 top-510;这样既省算力又明显提升准确率。召回不相关时的排查顺序是:query 改写与分词有没有问题 → 向量模型是否适配该领域/语言 → chunk 切分是否把答案切碎 → 索引是否漏建/元数据过滤条件是否把它过滤掉了 → 最后才是排序策略。逐层做「把标准答案所在的块手工喂进去看能不能答对」的隔离实验,能快速定位是检索问题还是生成问题。

幻觉归因与引用控制

先分类再解决:事实性幻觉(编造不存在的事实)→ 提高检索质量、强制「无证据不回答」、降低温度、必要时用更强模型或加事实校验;工具选择错误(该查库却去查网页)→ 优化工具描述与枚举、做工具检索/按场景裁剪可用工具、在 prompt 中给正反例;参数构造错误(工具选对了、参数编错)→ 服务端 schema 强校验 + 枚举约束 + 把关键参数从对话里显式抽取而不是让模型生成。模型把无关文本当证据,通常是「上下文里塞了太多噪声」造成的:要做相关性过滤(先 rerank 再截断)、在 prompt 里明确「只允许使用标注为证据的片段」、并要求回答中每个论断都附证据编号。要求模型回答超出证据范围的问题时,正确约束是让它可以明确拒答(给出「现有资料不足以回答」的模板),并给出拒答的判定标准;同时给一个兜底通道(转人工或提示补充信息)。

引用控制不额外调重模型也能做:生成时要求输出结构化的 [证据编号],然后用代码校验每个引用编号是否真实存在、引用片段与论断是否有词面/语义重叠(字符 n-gram 或小模型相似度即可),不达标就整段剔除或降级成「未引用」;同时限制答案只能引用 rerank 后的 top-k 块。这套规则化后处理比让模型自我审查更稳、更便宜。

记忆、SSE 与 Agent 服务质量评估

短期记忆是当前会话上下文(窗口 + 摘要),长期记忆是跨会话持久化的用户画像、偏好、历史结论,写入走结构化抽取 + 去重(关键是只存稳定、可复用、有明确出处的信息)。记忆冲突的处理原则是「新覆盖旧 + 保留时间戳与来源」:偏好类信息以最近一次显式表述为准(用户改主意是常态),事实类信息若两条互斥且无法判断时效,就不要擅自二选一,而是追问用户或同时保留并标注不确定性;同时要给记忆设 TTL 和复核机制,避免过期信息污染。

SSE 是基于 HTTP 的单向服务端推送(文本协议、自动重连、可穿大多数代理),WebSocket 是全双工长连接(需要心跳与连接管理,代理兼容性更麻烦)。聊天类流式输出用 SSE 就够了,只有需要客户端持续上行(协同编辑、语音)才上 WS。SSE 的断点续传靠 Last-Event-ID:服务端为每个事件编号,客户端重连时带上最后收到的 ID,服务端从该 ID 之后续发;实现上要把生成中的消息落库或用可重放的事件缓冲(Redis Stream / 内存队列),否则断线期间的事件就永久丢了。增量与全量的权衡看语义完整性要求:只处理增量延迟低但可能语义不全(比如跨块的指代),全量语义完整但贵;工程上折中是「增量流式给用户看 + 后台对关键结论做一次全量校验」,或者按事件类型区分——闲聊走增量、涉及计算与结论的走全量。

评估 Agent 服务质量,除了准确率还要看:任务完成率(端到端是否达成目标)、工具调用成功率与参数合法率、平均交互轮数与平均 token 成本、人工介入/转人工率、超时与错误率、P95 延迟、以及用户侧信号(追问率、重试率、点踩率)。评测要按能力维度分层看,整体指标好看但某一层崩掉是最常见的问题。