DeepAgents学习笔记三(Backend记忆存储)

一.使用fileSystemBeckEnd实现长期记忆

场景描述: 在本地开发或调试时,我们希望 Agent 生成的文件直接出现在项目文件夹中,方便开发者查看和验证。FilesystemBackend 将 Agent 的虚拟路径直接映射到宿主机的物理文件系统。

功能特点:

  • 直观可见:生成的文件可以直接在 IDE 或文件管理器中打开。
  • 安全隔离 :推荐开启 virtual_mode=True,将 Agent 限制在指定的工作目录(root_dir)内,防止越权访问系统敏感文件。

代码示例:

ini 复制代码
from pathlib import Path  # 导入Path类
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend,StateBackend,StoreBackend,CompositeBackend
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv, find_dotenv
import os

load_dotenv()

# 1. 准备本地工作目录(用Path改写)
workspace_dir = Path("./agent_workspace").resolve()  # resolve() 等价于 os.path.abspath(),获取绝对路径
if not workspace_dir.exists():  # 等价于 os.path.exists()
    workspace_dir.mkdir(parents=True, exist_ok=True)  # 等价于 os.makedirs()

# 演示使用fileSystemBeckEnd实现长期记忆 (跨会话 跨线程)实现数据共享 -》 多轮会话 有之前的环境!!

# 2. 创建FileBackEnd
file_backend = FilesystemBackend(root_dir=workspace_dir,virtual_mode=True)

# 极简初始化(自动读取OPENAI环境变量)
model = init_chat_model(
    model="qwen-max",
    model_provider="openai",
    api_key = os.getenv("DASHSCOPE_API_KEY"),
    base_url = os.getenv("DASHSCOPE_BASE_URL")
)

# 3. 创建deepAgent指定长期记忆类型
main_agen = create_deep_agent(
    model=model,
    tools=[],
    backend=file_backend, # 指定长期记忆类型
    system_prompt="你是一个智能助手,可以使用文件工具进行文件操作和读写!但是只有在用户明确要求的情况下,你才可以创建文件!!"
)

# 4. 运行并且验证
print("1--->>> 不明确,看看会不会创建")
result_1 = main_agen.invoke(
    {
        "messages": [
            {"role": "user", "content": "帮我查询下python语言的介绍!!!"}
        ]
    }
)
print(f"最终结果{result_1['messages'][-1].content}")
print("2--->>> 明确,看看会不会创建")

result_2 = main_agen.invoke(
    {
        "messages": [
            {"role": "user", "content": "帮我查询下java语言的介绍,并且帮我写到 java.txt文件中!!"}
        ]
    }
)
print(f"最终结果{result_2['messages'][-1].content}")

执行结果:

二.内存存储 (StoreBackend)-跨会话存储

deepagents执行StoreBackEnd 具体的存储store = InMemoryStore()

场景描述: 在生产环境或分布式系统中,文件不适合存储在本地磁盘。StoreBackend 利用 LangGraph 的 Store 机制,将文件内容作为 Key-Value 数据存储在数据库(如 Redis、Postgres)或内存中。这对于实现跨线程记忆共享至关重要。

功能特点:

  • 持久化:配合 RedisStore 可实现数据持久保存。
  • 共享性:不同线程(Thread)甚至不同 Agent 可以通过访问同一个 Store 来共享数据。
  • 适配器模式StoreBackend 充当适配器,将文件操作转换为 KV 存储操作。

代码示例:

ini 复制代码
from deepagents import create_deep_agent
from deepagents.backends import StoreBackend, StateBackend,FilesystemBackend,CompositeBackend
from langgraph.store.memory import InMemoryStore
from dotenv import load_dotenv, find_dotenv
from langchain.chat_models import init_chat_model
import os
load_dotenv()

# 生产环境建议使用 RedisStore: from langgraph.store.redis import RedisStore

# 2. 配置 Store 后端
model = init_chat_model(
    model="qwen-max",
    model_provider="openai",
    api_key = os.getenv("DASHSCOPE_API_KEY"),
    base_url = os.getenv("DASHSCOPE_BASE_URL")
)
# 1. 准备 Store (模拟数据库)
# InMemoryStore 是轻量级内存存储,重启后数据丢失。
# 最终存储的位置 内存行的k = v 使用langgraph自带的! 也可以切换成其他的!(redis...)
store = InMemoryStore()

# 3. 创建deepagents执行StoreBackEnd 具体的存储store = InMemoryStore()
main_agent = create_deep_agent(
    model=model,
    store=store, # 具体的存储位置  key (user_profile.txt) = value (重要信息)
    backend=StoreBackend, # 开启了k=v 库存储
    system_prompt="""
    你要把用户的重要信息保存到user_profile.txt文件中!
    获取用户信息可以读取user_profile.txt文件!
    """
)

# 4. 演示跨会话 跨线程进行长期记忆
config_a  = {
    "configurable":{
        "thread_id":"a"
    }
}
config_b  = {
    "configurable":{
        "thread_id":"b"
    }
}

#第一遍执行 -》 存储一些重要信息
result_a = main_agent.invoke(
    {
        "messages":[
            {"role":"user","content":"我是大风哥,我今年19岁!"}
        ]
    },
    config=config_a
)

print(f"第一次回复结果:{result_a['messages'][-1].content}")

print(f"读取store保存的用户信息!!")
# store -> namespace命令空间(库) filesystem  -》 key  user_profile.txt | value  重要信息
items = store.search(('filesystem',)) # ('filesystem',) -> 元组   ('filesystem' 不写, 变成字符串)
for item in items:
    print(f"key = {item.key}")
    print(f"value = {item.value}")

#第二遍执行 -》 读取一些重要信息

result_b = main_agent.invoke(
    {
        "messages":[
            {"role":"user","content":"我叫啥和我的年龄!"}
        ]
    },
    config=config_b
)

print(f"第二次次回复结果:{result_b['messages'][-1].content}")

执行结果:

三.CompositeBackend 混合存储

文件存储FilesystemBackend+ 内存存储StoreBackend ,其中StoreBackedn具体存储到store=InMemoryStore里面。

场景描述: 这是最灵活且推荐的生产环境配置。CompositeBackend 允许你根据文件路径的前缀,将文件路由到不同的后端。例如,将临时文件存本地,将重要记忆存数据库。

配置逻辑:

  • 默认路由 (Default) :处理普通路径,通常映射到 FilesystemBackend(本地)或 StateBackend(临时)。
  • 特定路由 (Routes) :处理特定前缀路径(如 /store/),映射到 StoreBackend(数据库)。

代码示例:

ini 复制代码
from deepagents import create_deep_agent
from deepagents.backends import StoreBackend, FilesystemBackend, CompositeBackend
from langgraph.store.memory import InMemoryStore
from dotenv import load_dotenv, find_dotenv
from langchain.chat_models import init_chat_model
import os
from pathlib import Path  # 新增导入 Path 类

load_dotenv(find_dotenv())

# 1. 准备 Store
store = InMemoryStore()
model = init_chat_model(
    model="qwen-max",
    model_provider="openai",
    api_key = os.getenv("DASHSCOPE_API_KEY"),
    base_url = os.getenv("DASHSCOPE_BASE_URL")
)
# 2. 配置 LLM

# 3. 定义混合后端工厂函数
def create_composite_backend(runtime):
    # 后端 A: 本地文件系统 (存普通文件)
    # 1. 准备本地工作目录(用Path改写)

    # fileBackEnd  文件
    workspace_dir = Path("./agent_workspace").resolve()  # resolve() 等价于 os.path.abspath(),获取绝对路径
    if not workspace_dir.exists():  # 等价于 os.path.exists()
        workspace_dir.mkdir(parents=True, exist_ok=True)  # 等价于 os.makedirs()
    fs_backend = FilesystemBackend(root_dir=workspace_dir, virtual_mode=True)

    # 后端 B: 数据库存储 (存重要记忆)
    # storeBackEnd 内存库
    store_backend = StoreBackend(runtime)

    # 组合后端: 配置路由规则
    # 组合存储方式
    return CompositeBackend(
        default=fs_backend,  # 默认走本地文件系统 【没有触发存储路径的! 】 需求:用户信息 存储到 /erdaye/user.txt
        routes={
            "/store/": store_backend  # 以 /store/ 开头的路径走数据库存储   需求:用户信息 存储到 /store/user.txt
        }
    )


agent = create_deep_agent(
    model=model,
    store=store, # 组合中StoreBackEnd
    backend=create_composite_backend,  # 传入工厂函数 返回组合back
    tools=[],
    system_prompt="""你是一个智能助手。
    - 普通文件:直接写入文件名(如 `report.txt`),保存到本地 workspace。
    - 重要记忆:写入 `/store/` 目录(如 `/store/profile.txt`),保存到store指定的存储方式中。
    """
)

# 4. 运行 Agent
print("\n=== 测试混合存储 ===")
config = {"configurable": {"thread_id": "thread_composite"}}

# 任务:同时触发两种存储路径
user_input = "1. 创建本地文件 local.txt,内容'本地文件'。\n2. 创建记忆文件 /store/memory.txt,内容'重要记忆'。"
print(f"用户指令: {user_input}")

result = agent.invoke({
    "messages": [{"role": "user", "content": user_input}]
}, config=config)

print("Agent 回复:", result["messages"][-1].content)

print("\n=== 验证数据库存储 (Store) ===")
# CompositeBackend 会自动剥离路由前缀,所以 /store/memory.txt 在 Store 中的 Key 为 /memory.txt
items = store.search(("filesystem",))
for item in items:
    print(item)

执行结果:

相关推荐
Alan Lu Pop1 小时前
前端开发助手
前端·智能体
程序员鱼皮1 小时前
我用 GitHub 仓库养 AI 龙虾,自动开发上线项目!保姆级教程
前端·人工智能·ai·程序员·github·编程·ai编程
27669582921 小时前
京东随机变速滑块拼图验证码识别(京东E卡)
java·服务器·前端·python·京东滑块·京东变速滑块·京东e卡绑卡
এ慕ོ冬℘゜2 小时前
手写生产级 jQuery Toast 轻量提示组件|零插件依赖、动画流畅、极简高
前端·javascript·jquery
Oneslide2 小时前
UI设计-企业OA风格
前端
程序员海军2 小时前
我用了 8 个月 Codex CLI,总结出这套 AI 编程工作流
前端·后端·aigc
এ慕ོ冬℘゜3 小时前
手写一款高兼容、零BUG图片预览组件|前端
前端·bug
铁链鞭策大师3 小时前
javaEE之多线程(2)
java·前端·java-ee
KaMeidebaby3 小时前
卡梅德生物技术快报|生信实操:ChIP 染色质免疫共沉淀技术流程、短板与替代方案详解
前端·人工智能·物联网·百度·新浪微博