教程来了!LangChain团队DeepAgents开源库更新,多元存储提升智能体长期记忆

129 阅读7分钟

教程来了!LangChain团队DeepAgents开源库更新,多元存储提升智能体长期记忆

两个月前,LangChain发布了DeepAgents,专为构建能处理复杂多步骤任务的智能体而生。该库基于LangGraph架构,受Claude Code、Deep Research及Manus等前沿应用的启发,所构建的深度智能体原生具备规划能力、用于上下文管理的文件系统,以及调度子智能体的完整功能体系。【AI大模型教程】

该产品自推出以来获得热烈反响,如今其0.2版本也正式发布,包括一项重要更新:"后端"抽象,可以将使用的文件系统从本地切换到远程虚拟机、数据库或任何其他系统。

本文将为大家详细介绍DeepAgent 0.2的更新内容,新版后端的使用方法,以及LangChain、LangGraph、DeepAgents的不同定位,助力开发者更高效地构建智能体应用。

01

更新内容

1、可插拔后端(Pluggable Backends)

0.2版本的主要新增功能在于可插拔后端。此前DeepAgents访问的"文件系统"仅为"虚拟文件系统",其通过LangGraph状态来存储文件。

新版本引入了全新抽象,允许将任意存储方案作为"文件系统"接入。内置实现包括:

  • LangGraph状态存储
  • LangGraph跨线程持久化存储
  • 本地文件系统

研究团队还创新性地推出了复合后端(composite backend)。可以先有一个基础后端(如本地文件系统),然后在其之上的特定子目录中映射其他后端。

例如为实现长期记忆功能,可以配置本地文件系统为基础后端,但将/memories/目录下的所有文件操作映射至基于S3的虚拟文件系统,使得智能体存储的内容能够突破本地计算机限制实现持久化。

开发者还可以编写自定义后端,以在任意数据库或数据存储上创建一个“虚拟文件系统”。同时支持通过继承现有后端,实现文件写入权限控制、文件格式校验等安全防护功能。

2、其他升级特性

本次0.2版本还包含一系列功能增强:

  • **大型工具结果回收:**当工具调用结果超出预设的token数量限制时,自动将其转储至文件系统
  • **对话历史总结:**在对话token使用量过大时,自动对历史对话记录进行压缩
  • **工具调用修复:**当工具调用在执行前被中断或取消时,自动修复消息历史,确保一致性

大家纷纷表示,此次更新让DeepAgents更灵活和适合生产了。

02

DeepAgents vs LangChain

vs LangGraph

DeepAgents已是LangChain团队的第三个开源库。许多开发者可能会好奇:究竟该如何在DeepAgents、LangChain与LangGraph之间做出选择?对此,LangChain团队强调,三者各有清晰应用场景和定位。

  • LangGraph:定位为智能体运行时(Agent Runtime),适用于构建工作流与智能体相结合的应用
  • LangChain:定位为智能体框架(Agent Framework),适合想使用核心智能体循环逻辑而不依赖任何内置功能,并从零开始构建所有提示词和工具的场景
  • DeepAgents:定位为智能体工具包(Agent Harness),专为构建更加自主的长期运行智能体而设计,可使用内置功能(如规划工具、文件系统等)

三者构成递进式技术栈:DeepAgents基于LangChain的智能体抽象层构建,而LangChain又依托于LangGraph的智能体运行时环境。

03

如何使用

下面将详细讲解本次更新中各后端的使用方法。

(如果想了解完整deepagent构建流程,可以参考以下链接:docs.langchain.com/oss/python/…

1、内置后端

(1)StateBackend(临时)

# 默认情况下提供一个状态后端
agent = create_deep_agent()

智能体的默认文件系统后端存储在LangGraph状态中。注意此文件系统仅在单个线程持续。

适用于:

  • 作为智能体的临时草稿本,用于写入中间结果
  • 当工具返回的结果太大时,系统会自动将结果写入文件,智能体可以分段读取回这些内容

(2)FilesystemBackend(本地磁盘)

from deepagents.backends import FilesystemBackend
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/Users/nh/Desktop/")
)

这种方法可以:

  • 在可配置的root_dir目录下读写真实文件(root_dir必须是一个绝对路径!)
  • 可选设置virtual_mode=True来沙箱化路径并将其规范限制在root_dir下
  • 使用安全的路径解析,尽可能防止不安全的符号链接遍历,支持使用ripgrep工具来加速文件内容搜索

适用于:

  • 本地机器上的项目
  • CI(持续集成)沙箱环境
  • 挂载的持久化存储卷

(3)StoreBackend (LangGraph Store)

from deepagents.backends import StoreBackend
agent = create_deep_agent(
backend=(lambda rt: StoreBackend(rt))   # Note that the tools access Store through the runtime.store
)

这种方法将文件存储在运行时提供的LangGraph BaseStore中,实现跨线程的持久化存储。

适用于:

  • 当已配置并运行LangGraph存储时(例如使用Redis、Postgres或基于BaseStore的云端实现)
  • 当通过LangSmith Deployments部署智能体时(会自动为智能体配置存储空间)

(4)CompositeBackend(路由)

from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend
from deepagents.backends.composite import build_composite_state_backend
composite_backend = lambda rt: CompositeBackend(
# 默认后端:使用 StateBackend(临时存储,仅在当前线程中持久化)
default=StateBackend(rt)
routes={
# /memories/ 路径下的文件使用 StoreBackend(跨线程持久化存储)
"/memories/": StoreBackend(rt),
# /docs/ 路径下的文件使用自定义后端
"/docs/": CustomBackend()
}
)
agent = create_deep_agent(backend=composite_backend)

这种方法会根据路径前缀将文件操作路由到不同的存储后端,并在目录列表和搜索结果中保留原始的路径前缀结构(如/memories/agent.md)。通常用于持久化/memories/*并保持其他所有内容的临时性。

适用于:

  • 当希望为智能体同时提供临时存储和跨线程持久化存储时,CompositeBackend允许同时配置StateBackend和StoreBackend
  • 当有多个信息源需要作为统一文件系统提供给智能体时。例如:将长期记忆存储在/memories/路径下的某个存储中,同时通过自定义后端使文档资料可在/docs/路径下访问

注意:

  • 较长路径前缀具有更高优先级(例如,路由 "/memories/projects/":FilesystemBackend(...)可以覆盖"/memories/": StoreBackend(rt))
  • 对于 StoreBackend 路由,确保智能体运行时提供了存储实例(StoreBackend依赖runtime.store来存储和检索数据)

2、使用虚拟文件系统

构建自定义后端,将远程或数据库文件系统(如 S3 或 Postgres)映射到工具命名空间中。

设计指南:

  • 路径采用绝对路径格式(/x/y.txt)。需确定如何将其映射到存储键/行
  • 高效实现 ls_info 和 glob_info 方法(优先使用服务端列表功能,否则使用本地过滤)
  • 对于文件不存在或无效正则模式的情况,返回用户可读的错误信息
  • 如需外部持久化,在结果中设置files_update=None;仅状态后端应返回files_update字典

如S3风格自定义后端框架:

from deepagents.backends.protocol import BackendProtocol, WriteResult, EditResult
from deepagents.backends.utils import FileInfo, GrepMatch
class S3Backend(BackendProtocol):
def __init__(self, bucket: str, prefix: str = ""):
self.bucket = bucket
self.prefix = prefix.rstrip("/")
def _key(self, path: str) -> str:
return f"{self.prefix}{path}"
def ls_info(self, path: str) -> list[FileInfo]:
# List objects under _key(path); build FileInfo entries(path, size, modified_at)
...
def read(self, file_path: str, offset: int = 0, limit: int = 2000) -> str:
# Fetch object; return numbered content or an error string
...
def grep_raw(self, pattern: str, path: str | None = None, glob: str | None = None) -> list[GrepMatch] | str:
# Optionally filter server‑side; elselistand scan content
...
def glob_info(self, pattern: str, path: str = "/") -> list[FileInfo]:
# Apply glob relative to path across keys
...
def write(self, file_path: str, content: str) -> WriteResult:
# Enforce create‑only semantics; return WriteResult(path=file_path, files_update=None)
...
def edit(self, file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult:
# Read → replace (respect uniqueness vs replace_all) → write → return occurrences
...

04

总结

这次DeepAgents 0.2版本的更新,尤其是可插拔后端的构建,解决了先前版本的存储限制,引入多元化的存储方案,极大地增强了智能体构建的灵活性与可扩展性。为开发者构建能够持久运行、具备长期记忆的真正自主智能体,奠定了坚实的技术基础。