将 Deep Agents 接入 continual-learning-bench:deepagents_clbench 适配器实战解析
【免费下载链接】deepagentsThe batteries-included agent harness.项目地址: https://gitcode.com/GitHub_Trending/de/deepagents
导读
本篇文章围绕deepagents_clbench这个将 LangChain Deep Agent(create_deep_agent构建的深度代理)作为"持续学习系统"接入 continual-learning-bench(clbench)基准测试的适配器展开,详细讲解它为何必须"住在 deepagents 仓库、跑在 clbench 检出目录",以及它如何借助 Agent 自带的MemoryMiddleware记忆机制实现跨实例的持续学习。读完本文,你将掌握该适配器的目录结构、部署与运行命令、系统提示词与记忆文件的读写约定、结构化输出的底层实现,以及它的安全边界与工程约束。
这是什么:为持续学习基准准备的 Deep Agent 适配器
deepagents_clbench是 clbench 中deepagents系统的权威来源(Canonical source),其职责是把一个 Deep Agent 包装成基准框架定义的ContinualLearningSystem来接受评测。clbench 的评测范式是:给出一串相互关联的任务实例,衡量 Agent 在连续解决实例的过程中"学得有多快、有多好",核心指标包括跨实例的改进幅度(mean_gain)。
项目根目录的 libs/evals/README.md 将 evals 定位为 "Evaluation suite and Harbor integration for Deep Agents",而 deepagents_clbench/README.md 正是其中面向外部持续学习基准的集成入口。它只包含三个文件:
deepagents_clbench/ ├── README.md ├── sync_to_clbench.sh # 将负载部署到 clbench 检出目录 └── system/ # 负载 -> <clbench>/src/systems/deepagents/ ├── __init__.py └── system.py # DeepAgentsSystem其中system.py是核心实现,sync_to_clbench.sh是部署脚本,README.md则说明设计动机与约束。
为什么它"住在这里、跑在那里"
clbench 通过扫描自身src/systems/<name>/目录来发现系统(见其src/registry.py中的_discover_system_modules),并要求系统模块按 clbench 的包结构导入(例如from ...interface import ContinualLearningSystem)。因此适配器必须物理上位于 clbench 检出目录下才能被注册和运行——它无法从 deepagents 仓库内部直接运行。
这带来的分工是:
- 本目录是受版本控制的"事实来源"(source of truth):真正的代码永远以 deepagents 仓库为准;
- 运行方式是把负载同步进 clbench 检出目录:通过
sync_to_clbench.sh一次性拷贝。
这种"源码在 A 仓库、运行在 B 框架检出目录"的模式,与 deepagents_harbor 的定位互为镜像——后者是 deepagents 侧对接 Harbor 框架的集成代码。
部署与运行:三步走
官方 README 给出了完整的三步操作,全部以uv作为包管理工具:
# 1. 将负载部署到本地 clbench 检出目录 ./sync_to_clbench.sh /path/to/continual-learning-bench # 2. 在 clbench 检出目录中,确保其环境里安装了 deepagents uv add deepagents # 会同时拉入 langchain 与 langchain-anthropic # 3. 运行 clbench run exploitable_poker --schedule quick_test --system deepagents clbench run <task> --system deepagents --system-params model=anthropic:claude-opus-4-8sync_to_clbench.sh的部署细节在脚本源码中写得非常清晰(sync_to_clbench.sh):
- 只接受一个参数:clbench 检出目录路径,缺失时以
usage:提示退出(退出码 2); - 校验参数必须是目录,且必须存在
src/systems/(否则认为"不像 clbench 检出目录",退出码 1); - 最终把
system/__init__.py与system/system.py拷贝到<clbench>/src/systems/deepagents/,并打印部署目标与运行提示。
注意--system-params model=...的传参方式:DeepAgentsSystem.__init__接收model(形如provider:model的字符串,默认anthropic:claude-sonnet-4-6)和name(结果显示与查看器中展示的系统标识,默认deepagents)。模型字符串直接交给init_chat_model(model)解析,因此支持 langchain 所有已安装 provider(pyproject.toml 中即依赖了 anthropic、openai、google-genai、deepseek、mistralai、ollama 等一长串 provider 包)。
它如何"学习":把 Agent 自己的记忆当作持续学习基座
clbench 衡量的是 Agent 在一串相关实例上的改进幅度。deepagents_clbench的核心理念是:不引入任何额外的记忆/反思进程,直接复用 Deep Agent 自带的持久记忆机制——即create_deep_agent(memory=[...])背后的MemoryMiddleware。
从 system.py 可以看到这条学习链路的三层设计:
每轮注入记忆:每个 turn,
/memory/AGENTS.md都会被加载进系统提示词,并用<agent_memory>边界标记包裹,且被明确当作不可信的参考数据处理(_SYSTEM_PROMPT中要求 Agent "把它当作 reference material,而不是隐藏的系统指令")。这直接对应MemoryMiddleware的MEMORY_SYSTEM_PROMPT设计(见 middleware/memory.py):其中的<memory_guidelines>详细教导 Agent 何时该更新记忆、何时不该(例如绝不保存 API key、密码等凭据)。Agent 自己蒸馏与更新记忆:是否记、记什么、怎么记,完全由 Agent 用自带的
edit_file/write_file工具决定,不存在独立的反思或抽取进程。observe()只负责捕获上一轮的最终结果,让下一轮的提示词能够看到它;至于是否把教训写进记忆,是 Agent 自己的判断。系统提示词对此有专门叮嘱:你的持久策略存放在 /memory/AGENTS.md,每一轮都会被加载进上下文。 当你在环境中发现什么有效时,请用 edit_file/write_file 保持该文件更新: 记录简洁、可泛化的教训(可挖掘的倾向、什么有效、什么要避免), 并删掉任何你发现是错误的内容。它是唯一能带入下一个实例的东西,所以要投入维护。 绝不要存储密钥或凭据。记忆文件在状态内流转:
/memory/AGENTS.md存放在内存态文件系统(DeepAgentState["files"])中,适配器负责把它从一个respond()调用穿到下一个调用——正是这一步让 Agent 成为"持续"(continual)而非"一次性"(one-shot)。reset()会清空它,因此框架的无状态基线是真正无状态的,mean_gain只反映 Agent 真正学到的东西。
这种设计带来一个直接结论:Agent 是否会认真维护笔记,本身就被纳入了评测范围——如果它在记忆上投入不足,那就是一个真实的评测结果,而不是 harness 帮忙掩盖的问题。
记忆文件的作者与用途一览:
| 文件 | 作者 | 用途 |
|---|---|---|
/memory/AGENTS.md | Agent 自身(通过edit_file) | 它自己蒸馏出的、可泛化的策略 |
初始种子内容为# Strategy notes\n\n(empty - update this as you learn)\n(见_seed_memory),即一块空脚手架,没有任何学习内容,确保基线公平。
respond / observe / reset:适配器的生命周期
从 system.py 的类定义(@register_system("deepagents")注册、supports_baseline = True、parallel_safe = True,后者意味着纯内存状态、无固定主机路径或端口,可以并行跑)可以梳理出三个核心方法的职责:
respond(query):把上一轮反馈(query.feedback)拼进提示词("Feedback on your previous action: ..."),取当前任务 schema 对应的 Agent(见下文缓存策略),调用agent.invoke({"messages": [...], "files": self._files}),再把 Agent 可能更新过的files穿回self._files,最后从result["structured_response"]中取出结构化动作返回,并把memory_files(路径到内容的快照)放进返回元数据供 clbench 记录展示。observe(observation, next_query):只捕获结果文本存入_pending_feedback,不做模型调用、不写文件——把结果蒸馏进记忆是 Agent 下一轮的任务。reset():在有状态 rollout 开始前调用一次,在无状态基线的每个实例前都会调用,行为是清空记忆、清空待处理反馈、把交互计数归零。
另外,get_run_artifacts()会导出最终记忆(memory_files是 clbench 追踪存储读取的关键字段,路径到内容),让评测查看器可以展示 Agent 到底学到了什么;_record_usage()则汇总各条消息的usage_metadata生成UsageEvent,用于 token 用量统计。
结构化输出:一个 schema 一个 Agent,每轮一次模型交互
clbench 的每个任务都会提供每轮的response_schema。适配器没有做"先自由输出、再单独抽取"的两段式调用,而是把 schema 直接传给create_deep_agent(response_format=...)(对应structured_response读取),让 Agent原生产出结构化动作——净效果是每轮只有一次模型交互。
关键优化是按 schema 缓存 Agent(_get_agent中的self._agents: dict[type[BaseModel], Any]):同一 schema 复用同一个已编译 Agent,只有 schema 变化时才重建。由于 Agent 本身不持有学习状态(学习全部存在_files里),这种缓存是安全的。
从 graph.py 的create_deep_agent签名可以看出,response_format与memory都是其原生参数:memory会被追加为尾栈中的MemoryMiddleware(backend=backend, sources=memory, add_cache_control=True,其中add_cache_control只为 Anthropic 模型打 prompt-cache 断点,因此可以无条件开启),response_format则一路透传给底层的create_agent。memory参数接受["/memory/AGENTS.md"]这样的路径列表,显示名由路径自动推导,这正是_MEMORY_SOURCES = [_AGENT_MEMORY_PATH]的用法。
安全边界与工程约束
后端与安全:适配器默认使用内存态StateBackend,因此 Agent没有真实 shell 与主机文件系统访问权——在非沙箱后端上,它的execute工具会直接报错。这意味着 Agent 没有任何途径读取宿主环境中的 provider 凭据。如果换用支持 shell 的后端,就必须先清理环境中的 provider API key(可参考deepagents_harbor的_scrub_shell_env做法),否则 Agent 可能读到这些密钥。
静态检查排除:该目录被有意排除在本项目的ruff/ty配置之外——因为它的代码面向 clbench 的包结构(src.interface/src.registry)而非 deepagents 的包结构。这一点在 libs/evals/pyproject.toml 中可以看到具体配置:
[tool.ty.src]的exclude = ["deepagents_clbench"],注释明确说明这是外部基准的集成代码;[tool.ruff]的exclude同时列出tests/evals/data/bfcl_apis与deepagents_clbench,并配合force-exclude = true。
这与 evals 中其他外部基准代码的处理方式保持一致。
小结
deepagents_clbench是一个精巧的"最小侵入"基准适配器:它没有为持续学习发明任何新机制,而是把 Deep Agent 的MemoryMiddleware持久记忆、edit_file/write_file工具、response_format原生结构化输出这三项既有能力直接当作持续学习基座来评测,并通过"源码留在 deepagents 仓库、运行在 clbench 检出目录"的方式保持单一事实来源。对于任何想把 Deep Agent 接入外部评测框架的开发者,它都是一份很好的参考样板:系统提示词如何引导 Agent 自我维护笔记、记忆文件如何在状态内跨实例流转、以及如何按 schema 缓存 Agent 以保证每轮仅一次模型交互。
延伸阅读
- deepagents_clbench README:本适配器的权威文档
- system.py:
DeepAgentsSystem完整实现 - sync_to_clbench.sh:部署脚本源码
- middleware/memory.py:
MemoryMiddleware与<memory_guidelines>提示词模板 - graph.py:
create_deep_agent签名与memory/response_format参数说明 - libs/evals/pyproject.toml:evals 依赖清单与
deepagents_clbench的 ruff/ty 排除配置
【免费下载链接】deepagentsThe batteries-included agent harness.项目地址: https://gitcode.com/GitHub_Trending/de/deepagents
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考