字节跳动 AI应用开发实习 一面:Agent Loop 的失败恢复与长期记忆
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 简单做个自我介绍,你平常都是怎么学习的?
- 假设你做的是一个短视频创作 Agent,这几个模块里你觉得哪个对你挑战最大?
- 你们团队如何做的技术选型?
- 如果 Agent Loop 中某个工具超时或者执行到一半失败,怎么保证整个任务不会失控?
- 怎么定义短期和长期记忆?
- Memory 和工具调用,你觉得这两个哪个比较难做?展开说一下。
- 长期记忆应该在什么时机写入?是不是每轮对话结束都总结一次?
- 你们是怎么评估你们的记忆是否正确、有效的?
- 你说的是经典的 Agent Loop 实现吧,它其实也有很多开源实现,你们觉得你们实现的和这些有什么特殊点吗?
- 如果长期记忆已经有上百万条,召回链路你会怎么设计?
《参考解析》
短视频创作 Agent 最难的模块通常不是「生成」,而是「一致性 + 可编辑」。 一条视频要经过脚本、分镜、素材检索、画面生成、配音配乐、剪辑合成多个环节,任何一环的风格漂移都会让成片不可用:同一个角色在不同镜头里长相变了、字幕和口播对不上、背景音乐压过人声。生成模型只能保证单帧或单段的质量,工程上要靠角色设定、参考图、种子、风格提示词和统一的素材库来约束一致性;剪辑侧则要把每一步做成可回滚的时间线操作,让用户能改一句台词而不必整条重生成。判断哪个模块挑战最大,要看你衡量的失败成本:生成失败可以重试,一致性崩了和不可编辑会让整个产品无法交付。
技术选型要按约束排序,而不是按榜单选模型。 先列清楚延迟、成本、可控性、合规、团队维护能力这几条硬约束,再决定哪些环节自研、哪些用现成框架。通用执行骨架可以用开源方案,真正要自己做的是业务状态机、工具 schema、权限与审计、以及评测集;模型侧可以按任务分流,简单分类走小模型,生成和规划走大模型,失败再升级,不要把全部请求压在最贵的模型上。选型还要留出可观测性和回滚能力,否则上线后连「哪一步变差了」都说不清。
Agent Loop 不能写成无限 while,核心是预算、错误分类和可恢复状态。 每次任务要有最大步数、token 预算和墙钟超时,工具执行器再单独设超时与重试;网络抖动这类瞬时错误可以指数退避,参数非法、权限不足这类确定性错误不该重试,而是把结构化错误回给 Planner 让它改计划。有副作用的工具必须幂等,例如创建任务时由客户端生成幂等键,服务端按 key 去重,避免「第一次成功但响应超时」导致重复创建。长链路要把状态持久化,记录当前步骤、待执行的工具、已完成的结果和失败原因,恢复时从状态继续,而不是把整段对话再丢给模型让它猜「刚刚做到哪」。
短期记忆和长期记忆应按生命周期、作用域和任务耦合度划分,而不是按保存时长。 短期记忆更像工作内存,服务当前会话或当前任务:用户刚改的风格、当前脚本版本、正在等待哪个工具返回,任务结束就可以丢。长期记忆要跨会话复用:稳定的语言偏好、品牌规范、项目背景、历史决策和验证过的操作经验,这类信息应该脱离上下文窗口持久化。还有一类容易被混淆的是情景记忆,比如「上次用户最终选了第二版脚本」,它是历史事件,不应该直接变成永久偏好;长期记忆系统的重要一步是从事件里提取稳定事实,而不是把聊天记录原样塞进向量库。
工具调用和记忆的难点不在一个维度:前者是可靠性工程,后者是长期数据治理。 工具调用直接连接真实系统,涉及参数校验、权限、超时、重试、幂等和副作用,一次错误可能真的创建资源、删除数据或产生费用,但成功与否通常可判定。记忆的难点是「值不值得存、三个月后还能不能用、召回出来有没有帮助」没有天然标准答案,而且错误会累积:一条错误的用户偏好被保存后,可能在后续几十次对话里持续影响模型,模型还会把它当成可信上下文。所以记忆系统要同时解决写入准确性、冲突处理、版本管理、召回质量、遗忘机制和在线效果评测。
记忆写入要经过候选、过滤、去重与冲突消解,不能每轮总结一次就落库。 每轮都写很快会把记忆库变成垃圾场。比较合理的流水线是:先从对话里抽取候选事实,再判断稳定性、未来复用价值、置信度和敏感程度,例如「今天有点累」没有长期价值,「这个项目统一用 pnpm」对 Coding Agent 就值得保存;然后做去重和冲突检测,如果已有「项目使用 Python 3.10」,后来又得到「已升级到 3.12」,正确做法不是保存两条同权重事实,而是记录版本、生效时间和来源,把旧事实标记为已失效。LLM 可以参与抽取,但最终写入策略最好由确定性规则和元数据共同约束。写入之后还要评估,而且要把「正确」和「有效」分开:正确性看保存内容是否忠实于原始信息,比如用户说「不吃辣」,记忆却总结成「喜欢清淡饮食」,语义已经扩张;可以用人工标注或 LLM Judge 评事实一致性、作用域和时效性。有效性看这条记忆有没有改善最终任务,最直接的是做消融:同一批任务分别开启和关闭记忆,比较任务完成率、人工修改次数、模型调用次数和输出质量。还要看负收益,记忆不是召回越多越好,错误或不相关的记忆会污染上下文,线上要同时观察记忆命中率、使用率、任务成功率变化、坏记忆率和 token 开销;命中率高但成功率没涨,说明只是「找到了很多东西」。
开源 ReAct Loop 本身没有壁垒,壁垒在约束、可靠性和可评估性。 LangChain、LangGraph、AutoGen 这类框架提供的是通用执行骨架,业务真正要解决的是:哪些步骤可以重新规划、哪些完成后不能重复执行、工具参数如何做 schema 校验、高风险操作何时必须人工确认。把 Planning 和 Execution 分离,Planner 可以改后续计划,Executor 只能执行经过校验的动作;再配一条完整的 Trace,把用户请求、规划决策、记忆召回、提示词、模型输出、工具参数、工具结果和状态迁移串起来,才能回答一次失败到底是模型规划错了、记忆召回错了,还是工具本身失败。
百万级记忆召回不能只做一次 Embedding Top-K。 查询进来先做 query understanding,抽取用户、项目、实体、时间和意图,再用 metadata 缩小搜索空间;召回层同时跑稠密向量和稀疏检索,各自取 Top-K 后融合去重,然后按时间、来源可信度、使用频率和任务相关性重排。对超长历史可以做分层摘要,原始事件留在冷存储,稳定事实进热索引;高频查询走缓存,冷门查询走完整链路。评测既看召回层(正确记忆是否进 Top-K),也看端到端(任务成功率、引用正确率、token 开销),否则召回指标好看但答案没用。