Agent反思之Eval(3)

评估与调整

​ 在本文中,我们来讨论一个问题,这是我在学习Agent中的记忆模块时遇到的麻烦。仅以本文来进行简单的记录。

背景

​ 本文旨在探讨如何为 Agent 设计一套切实有效的记忆系统,而非阐述集成记忆系统的必要性。在多数教程中,通常以标准化的语言描述记忆功能:诸如使智能体铭记过往交互、汲取历史经验,从而在连续对话或复杂任务中展现更优性能。诚然,随之而来不乏诸如’四层记忆’、’扩展记忆’等听起来颇为优雅的设计方案。然而,坦白讲,初涉此领域时,我往往只是机械地背诵这些概念,对其背后的设计初衷及其效能原理并未真正参透。因此,本文将摒弃流于表面的概念堆砌,转而深究’为何如此设计及其发挥效用的内在逻辑’。


疑惑

​ 在我开始设计一个记忆系统之后,我很快的陷入一个问题:我应该设计一个怎么样的记忆系统?这个问题的基础回答很简单,我想要设计一个高效的记忆系统,其能够在整个Agent的表现上提供比较好的贡献。在明确了这个回答之后,我立马又陷入了一个问题:什么才能够算是高效的呢?对于这个问题,我阅读了一些文章,并与一些LLM进行了一定程度的讨论,最后才稍微有了一定的思路:为了来实现一个”高效”的记忆系统,我缺乏的重要一环是评估(eval)。


思考

​ 借用我所阅读的A社一篇文章中的一段话。

Good evaluations help teams ship AI agents more confidently. Without them, it’s easy to get stuck in reactive loops—catching issues only in production, where fixing one failure creates others. Evals make problems and behavioral changes visible before they affect users, and their value compounds over the lifecycle of an agent.

gen1

​ 这一段论述精准地击中了我过往系统设计中的痛点。由于缺乏科学、完善的评估体系,我此前的设计流程往往陷入了’方案迭代-运行验证-实操排查-漏洞修补’的粗放循环。正如文中所言,这种被动的’事后查漏’模式极其低效,不仅可能引入连锁故障,更耗费巨大精力。因此,我们必须跳出这种原始的排错循环,寻求更为高雅且成体系的解决方案,让评估前置,而非仅作为事后验证。

​ 其实对于我们来说,对于这种场景,更加常规以及更加正是的做法正是”测试”。通过应用测试这一概念,将我们整个的设计流程进行约束。实际上,这个想法在之前做一些Lab的实现就开始萌芽了。在我之前学习15445或者6.824的Lab的时候,其的学习历程正是设计出一些代码并期望其能够通过约定好的测试。在那几段经历之后,我不时在思考:测试,到底对于设计来说,是处于一个怎么样的地位?在近期的沉淀,我逐渐有了一定的感触。测试,其本身是一种程序行为约束的形式化表达,抽象点说的话,其是一种我们对于程序期望的一种baseline,其表达的是我们期望程序达到的一个最小行为集合。在明确了这一点之后,我们再回过头来看问题后有了一个全新的角度。


评分

​ 正如前文所说,通过测试,我们能够明确一个系统所应该达到的最小行为集合标准。那么,在此基础上,我考虑了测试之于我们当前的记忆系统。实际上,在Agent这个场景中,传统的测试将会有点水土不服。对于Agent来说,其很多的内容/组件实际上并没有一个标准,一个能够运行的系统与一个运行的好的系统之间是存在很大的差距的。

而这也正是我在这次实践里最先想明白的事情:对于记忆系统来说,评估本身并不是为了给它下一个简单的“对”或“错”的结论,而是为了回答一个更实际的问题——它到底有没有在帮助系统变得更好。这个“更好”并不只是指某一次回答对了,而是指它能不能在一批真实的场景里稳定地提供帮助,能不能在有噪声和冲突的时候保持住自己的判断,能不能在带来收益的同时不过度放大成本。


设计

 所以这次我在设计的时候,并没有急着去追求一个看起来很完整的记忆实现,而是先把评估这件事想清楚。因为一旦没有评估,设计很容易变成一种“凭感觉修修补补”的过程:看见哪里不顺眼就改哪里,跑起来似乎也能用,但并不知道到底是变好了,还是只是暂时没有暴露问题。相反,如果先把评估框架搭起来,那么很多设计决策就会变得自然一些,因为它们都可以回到同一个问题上来——这个改动究竟让什么指标变好了,又让什么地方变差了。

 在这个思路下,我把记忆系统拆成了几个更清晰的层面。第一层是“问题本身”,也就是我们到底想让记忆解决什么:是补全历史事实,是抵抗噪声干扰,还是让系统在连续交互中保持一致性。第二层是“用例”,也就是把这些问题具体写成一组可以重复运行的输入输出场景。第三层是“对照”,也就是把不同的实现路径拆开来看,避免最后只看到一个总分,却不知道收益从哪里来。第四层才是“评分”,也就是把成功率、召回、精确率、token、延迟这些信息放到一起去看,而不是只盯着某一个单独的数字。

 这样做的好处在于,记忆模块不再是一个抽象的“增强功能”,而是一个可以被拆解、被比较、也可以被反复验证的对象。它的价值不再只来自直觉,而是来自一整套可重复的判断方式。

流程

 如果把这次的实践过程说得更具体一点,大致可以概括成“先定问题,再定用例,最后定指标”。我先从实际会遇到的记忆场景里抽取出一些最典型的情形,比如哪些问题应该靠历史记忆来回答,哪些问题应该在噪声干扰下仍然保持稳定,哪些问题本来就不应该依赖记忆却可能被记忆拖累。然后,我把这些情形整理成一组可以运行的用例,让每个用例都带着明确的答案、明确的记忆事实和明确的干扰信息。

 接下来,我再把不同的记忆路径拆开。这样做的目的不是为了让系统更复杂,而是为了把“到底是谁在起作用”这件事看清楚。因为一个系统看起来变好了,并不代表记忆真的起作用了;它也可能只是因为别的路径更容易命中答案。所以,只有把无记忆、基础记忆、记忆加工具这些路径放在一起比较,才能比较清楚地知道,记忆带来的提升到底是实打实的,还是只是一种表面上的改善。

 最后,我再把这些结果收束到几个更容易解释的指标里。成功率告诉我系统有没有真正把问题做对,召回和精确率告诉我记忆有没有拿到该拿的信息,token 和延迟告诉我这个收益是不是值得付出。也就是说,评估不只是为了“算分”,而是为了把一个系统的行为、代价和收益同时摆到桌面上,让我能够比较踏实地判断下一步该往哪里改。

方法论

 此次实践深刻重塑了我对评估(Eval)本质的理解。过往,我仅将其视作设计完成后的辅助性验证工具,旨在证明系统的正确性;而今,我坚信评估应是设计本身不可分割的一环。缺乏评估的设计,极易沉溺于'貌似合理'的细节而迷失方向;反之,评估如同标尺,能强制具象化模糊设想,使主观判断变得客观可比。本次记忆系统设计的历程,还带给我一个核心启示:优秀的智能体组件,不仅应追求'功能达标',更应追求'行为可解释',通过稳定的用例与指标持续洞察其行为。综上所述,若要概括这一转变,便是:**将评估内化为设计核心,以设计精准回应评估需求**。唯有如此,记忆系统才能超越'概念化的优美',真正构筑起支撑智能体复杂行为的基石能力。

 这次的记忆系统设计,其实也给了我一个很直接的启发:一个好的 Agent 组件,不应该只是“能工作”,而应该是“能被解释地工作”。所谓能被解释,不只是说它内部逻辑可以讲清楚,更重要的是,它的行为可以被一组稳定的用例和指标持续地观察到。这样一来,后续的迭代就不再是盲目的试错,而是带着方向感的修正。

 所以如果要把这次讨论压缩成一句话,我觉得可以这样说:先把评估当成设计的一部分,再把设计当成对评估的回答。只有这样,记忆系统才不会停留在“概念上很漂亮”,而是真正变成一个能支撑 Agent 行为的基础能力。

gen2

参考文献

[1] Anthropic. Demystifying evals for AI agents. Available at: https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents Published: Jan 2026.

-------------本文结束 感谢阅读-------------