过去一个月,LangChain 基于 Deep Agents 框架交付了四个应用:
- DeepAgents CLI: 一个编码 agent
- LangSmith Assist: LangSmith 内置的智能助手
- Personal Email Assistant: 能从用户交互中学习的邮件助手
- Agent Builder: 无代码 agent 搭建平台
在开发和部署这些 agent 的过程中,团队为每个应用都配置了评估系统,积累了不少实战经验。这篇文章会深入探讨评估深度 agent 的几个关键模式:
- 深度 agent 需要为每个测试用例定制测试逻辑 —— 每个案例都有自己独特的成功标准
- 单步运行 特别适合验证特定场景下的决策(还能省 token)
- 完整轮次运行 适合测试 agent 的"最终状态"
- 多轮对话测试 能模拟真实用户交互,但需要保持测试可控
- 环境配置很关键 —— 深度 agent 需要干净、可复现的测试环境
一、术语说明
先解释几个后文会用到的概念。
Agent 的运行方式:
- 单步 (Single step): 限制核心 agent 循环只运行一轮,看它会采取什么行动
- 完整轮次 (Full turn): 让 agent 完整处理一次输入,可能包含多次工具调用
- 多轮对话 (Multiple turns): 让 agent 完整运行多次,模拟用户和 agent 之间的多次交互

可以测试的内容:
- 执行轨迹 (Trajectory): agent 调用了哪些工具,传了什么参数
- 最终响应 (Final response): agent 返回给用户的最终回复
- 其他状态 (Other state): agent 运行过程中产生的其他内容(比如文件、制品等)

二、智能体评估实战
1 深度 Agent 的每个测试用例都需要定制化逻辑
传统的 LLM 评估流程很直接:
- 构建示例数据集
- 写一个评估器
- 用应用处理数据集生成输出,然后用评估器打分
每个数据点的处理方式完全一样 —— 跑同样的应用逻辑,用同样的评估器打分。

深度 Agent 打破了这个假设。除了最终消息,还需要测试更多内容。每个数据点的"成功标准"可能完全不同,需要针对 agent 的轨迹和状态做特定的断言。
看个例子:

有个日历调度 agent,能记住用户偏好。用户说"记住,不要在早上 9 点前安排会议"。需要验证这个 agent 是否在文件系统中更新了自己的记忆。
为了测试这个场景,可能需要验证:
- agent 是否对 memories.md 文件调用了
edit_file - agent 是否在最终消息中告知用户记忆已更新
- memories.md 文件是否真的包含了不安排早会的信息。可以:
- 用正则表达式查找"9am"
- 或者用 LLM-as-judge 配合特定成功标准,做更全面的文件更新分析
LangSmith 的 Pytest 和 Vitest 集成支持这种定制化测试。可以针对每个测试用例,对 agent 的轨迹、最终消息和状态做不同的断言。
# 标记为 LangSmith 测试用例@pytest.mark.langsmithdef test_remember_no_early_meetings() -> None: user_input = "I don't want any meetings scheduled before 9 AM ET" # 可以把 agent 的输入记录到 LangSmith t.log_inputs({"question": user_input}) response = run_agent(user_input) # 可以把 agent 的输出记录到 LangSmith t.log_outputs({"outputs": response}) agent_tool_calls = get_agent_tool_calls(response) # 断言 agent 调用了 edit_file 工具来更新记忆 assert any([tc["name"] == "edit_file"and tc["args"]["path"] == "memories.md"for tc in agent_tool_calls]) # 用 LLM-as-judge 记录反馈: 最终消息是否确认了记忆更新 communicated_to_user = llm_as_judge_A(response) t.log_feedback(key="communicated_to_user", score=communicated_to_user) # 用 LLM-as-judge 记录反馈: 记忆文件是否包含正确信息 memory_updated = llm_as_judge_B(response) t.log_feedback(key="memory_updated", score=memory_updated)
关于如何使用 Pytest 的通用代码示例,可以查看这份文档:
这个 LangSmith 集成会自动把所有测试用例记录到实验中,这样就能查看失败用例的 trace(方便调试),还能跟踪结果的变化趋势。
2 单步评估很实用,效率也高

在深度 Agent 的评估中,大约一半的测试用例都是单步评估,也就是说,在特定的输入消息序列之后,LLM 会立即做什么决策?
这对验证 agent 在特定场景下是否用正确的参数调用了正确的工具特别有用。常见的测试场景包括:
- 是否调用了正确的工具来搜索会议时间?
- 是否检查了正确的目录内容?
- 是否更新了记忆?
回归问题往往出现在单个决策点,而不是整个执行序列。如果用 LangGraph,它的流式能力可以在单次工具调用后中断 agent 来检查输出 —— 这样能在不跑完整个 agent 序列的情况下及早发现问题。
在下面的代码中,手动在 tools 节点前设置了一个断点,这样就能轻松地让 agent 只跑一步。然后就可以检查单步之后的状态并做断言。
@pytest.mark.langsmithdef test_single_step() -> None: state_before_tool_execution = await agent.ainvoke( inputs, # interrupt_before 指定要在哪些节点前停止 # 在 tool 节点前中断,就能检查工具调用参数 interrupt_before=["tools"] ) # 可以看到 agent 的消息历史,包括最新的工具调用 print(state_before_tool_execution["messages"])
3 完整轮次运行能看到全貌

把单步评估当作"单元测试",确保 agent 在特定场景下采取预期行动。而完整轮次运行也很有价值 —— 能看到 agent 端到端执行的完整画面。
完整轮次运行可以从多个角度测试 agent 行为:
1) 执行轨迹: 评估完整轨迹的一个常见方法是确保某个特定工具在执行过程中的某个时刻被调用了,但不关心具体时机。在日历调度的例子中,调度器可能需要多次工具调用才能找到适合所有参与者的时间段。

2) 最终响应: 有时候最终输出的质量比 agent 走的具体路径更重要。在编码和研究这类开放式任务中,这种情况更常见。

3) 其他状态: 评估其他状态和评估 agent 的最终响应很相似。有些 agent 不是以聊天格式回复用户,而是创建制品。在 LangGraph 中检查 agent 的状态,就能轻松查看和测试这些制品。
- 对于编码 agent → 读取并测试 agent 写的文件
- 对于研究 agent → 断言 agent 找到了正确的链接或来源
完整轮次运行能看到 agent 执行的全貌。LangSmith 把完整的 agent 轮次以 trace 的形式展示,既能看到延迟和 token 使用量这些高层指标,也能分析每次模型调用或工具调用的具体步骤。
4 多轮对话测试模拟真实用户交互

有些场景需要测试 agent 在多轮对话中的表现,也就是多个连续的用户输入。挑战在于,如果直接硬编码一系列输入,一旦 agent 偏离了预期路径,后续硬编码的用户输入可能就不合理了。
团队的解决方案是在 Pytest 和 Vitest 测试中加入条件逻辑。比如:
- 运行第一轮,然后检查 agent 输出
- 如果输出符合预期,继续下一轮
- 如果不符合预期,提前让测试失败(因为可以灵活地在每步之后加检查,这个方案可行)
这种方法可以运行多轮评估,而不用对 agent 的每个可能分支都建模。如果想单独测试第二轮或第三轮,只需从那个点开始设置测试,配上合适的初始状态就行。
5 搭建合适的评估环境很重要
深度 Agent 是有状态的,专门用来处理复杂的长时任务 —— 通常需要更复杂的环境来做评估。
不像简单的 LLM 评估,环境通常只包含几个无状态工具,深度 Agent 需要为每次评估运行提供一个全新、干净的环境,才能保证结果可复现。
编码 agent 就是个典型例子。Harbor 为 TerminalBench 提供了一个在专用 Docker 容器或沙箱中运行的评估环境。对于 DeepAgents CLI,团队用了更轻量的方案: 为每个测试用例创建一个临时目录,在里面运行 agent。
总结一下: 深度 Agent 评估需要每个测试都能重置的环境 – 否则评估会变得不稳定,难以复现。
小技巧: Mock API 请求
LangSmith Assist 需要连接真实的 LangSmith API。对真实服务运行评估既慢又贵。更好的办法是把 HTTP 请求记录到文件系统,测试时重放它们。Python 可以用 vcr;JS 的话,可以通过 Hono app 代理 fetch 请求。
Mock 或重放 API 请求能让深度 Agent 评估更快、更容易调试,特别是当 agent 严重依赖外部系统状态时。 (这个很重要,Mock假接口可以帮我快速打通流程,验证输入和输出有效性,这个也是笔者经常调试的一个手段)
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

LangChain智能体评估全解析
482

被折叠的 条评论
为什么被折叠?



