评估深度代理:我们的经验教训
学习评估深度代理的5种模式:定制测试、单步验证、完整回合、多轮模拟和环境设置。
在过去的一个月里,LangChain 在深度代理框架上发布了四个应用:DeepAgents CLI(编码代理)、LangSmith Assist(应用内助手)、个人邮件助手(从用户交互中学习)以及 Agent Builder(无代码代理构建平台)。构建和发布这些代理意味着需要为每个代理添加评估,在此过程中我们学到了很多。本文将深入探讨评估深度代理的几种模式。
深度代理需要为每个数据点定制测试逻辑。传统的 LLM 评估是直接的:构建数据集、编写评估器、运行应用并评分。但深度代理打破了这一假设。你需要测试的不只是最终消息,每个数据点的成功标准可能更具体,涉及对代理轨迹和状态的特定断言。例如,一个日历调度代理被要求记住“不要在上午9点前安排会议”,你需要断言它调用了编辑 memories.md 文件的工具,最终消息确认了记忆更新,且文件内容确实包含相关信息。我们可以使用 LangSmith 的 Pytest 集成来为每个测试案例编写不同的断言。
单步评估既有效又高效。在深度代理的评估中,大约一半的测试案例是单步评估,即 LLM 在特定输入后立即做出的决定。这对于验证代理在特定场景中是否调用了正确的工具和参数特别有用,例如:是否调用了正确的搜索会议时间的工具?是否查看了正确的目录内容?是否更新了记忆?回归问题通常发生在单个决策点而不是整个执行序列中。利用 LangGraph 的流式能力,可以在单次工具调用后中断代理以检查输出,从而在不影响完整序列的情况下及早发现问题。
完整代理回合提供了完整的视图。单步评估是“单元测试”,而完整回合则展示代理端到端行动的全景。它允许你测试多种行为:轨迹(确保某个工具被调用)、最终响应(对于开放式任务如编码和研究,最终输出质量比路径更重要)以及其他状态(如代理创建的文件)。完整回合让你看到代理执行的全貌,LangSmith 可以以追踪形式显示完整回合,包括延迟和令牌使用等高级指标,以及每个模型调用或工具调用的具体步骤。
跨多轮运行代理模拟完整的用户交互。某些场景需要测试多轮对话,但若代理偏离预期路径,后续硬编码的输入可能无效。我们通过在 Pytest 和 Vitest 测试中添加条件逻辑来解决:运行第一轮后检查输出,若符合预期则继续下一轮,否则提前失败。这种方法使我们能够在无需模拟每个分支的情况下运行多轮评估。若想单独测试第二或第三轮,只需从该点开始设置测试,并提供适当的初始状态。
设置正确的评估环境至关重要。深度代理是有状态的,通常需要更复杂的环境来评估。与简单的 LLM 评估(环境有限且通常无状态)不同,深度代理每次评估运行都需要一个干净、新鲜的环境,以确保结果可复现。编码代理就是一个典型例子:Harbor 提供了在专用 Docker 容器或沙箱中运行的 TerminalBench 评估环境;对于 DeepAgents CLI,我们采用轻量级方法:为每个测试案例创建临时目录并在其中运行代理。关键点是:深度代理评估需要每次测试重置环境,否则评估会变得不稳定且难以复现。
提示:模拟你的 API 请求。LangSmith Assist 需要连接真实的 LangSmith API,针对实时服务运行评估可能既慢又昂贵。取而代之,将 HTTP 请求记录到文件系统,然后在测试执行期间重放。对于 Python,vcr 效果很好;对于 JS,我们通过 Hono 应用代理 fetch 请求。模拟或重放 API 请求使深度代理评估更快、更易调试,尤其是当代理严重依赖外部系统状态时。
上述技术是我们为深度代理应用编写测试套件时常见的模式。你可能只需要这些模式中的一部分,因此评估框架的灵活性很重要。如果你正在构建深度代理并开始评估,请查看 LangSmith 的测试集成!