news 2026/5/2 0:20:21

LangChain、LangGraph和DeepAgents如何使用Store实现长期记忆

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain、LangGraph和DeepAgents如何使用Store实现长期记忆

Store 是 LangChain体系提供的跨线程/会话持久化键值存储工具,一个简单的 JSON 文档存储系统,支持分层命名空间,可选向量语义检索与 TTL 过期。它让 Agent 能在多次对话间共享数据,例如用户偏好长期记忆缓存结果

单个对话线程的短期记忆(Checkpointer)会受到thread_id的隔离限制,但是Store可以突破它,生产环境Store底层依靠数据库持久化,配合Namespace就能实现Agent的长期记忆。

1. Store的集成

LangGraph通过compile方法将store对象传入。此时,LangGraph 会自动处理 Store 的生命周期。

from langgraph.store.memory import InMemoryStore from langgraph.graph import StateGraphstore = InMemoryStore() builder = StateGraph(...)graph = builder.compile(store=store)

在LangChain中,create_agent方法支持传入Store。

agent = create_agent( model="claude-sonnet-4-5-20250929", tools=[get_user_info], # Pass store to agent - enables agent to access store when running tools store=store, context_schema=Context)

在DeepAgents中,同样的直接可传入Store,概念上DeepAgents多了个Backend,这个以后我们再讨论。

def make_backend(runtime): return CompositeBackend( default=StateBackend(runtime), # Ephemeral storage routes={ "/memories/": StoreBackend(runtime) # Persistent storage } )agent = create_deep_agent( store=InMemoryStore(), backend=make_backend, checkpointer=checkpointer)

2. Store的基础读写

Store 提供了简洁但功能强大的操作接口,主要围绕putgetsearch展开。存储涉及到IO,大家可能会担心性能问题,Store其实提供了一套异步API(aput,aget,asearch),这在高并发的 Agent生产服务时至关重要。

API 方法描述关键参数
put存储或更新 JSON 文档namespace,key,value
get根据命名空间和键精确获取单条记录namespace,key
search搜索记录,支持语义检索和元数据过滤namespace,query,filter,limit
store = InMemoryStore(index={"embed": embed, "dims": 2}) user_id = "my-user"application_context = "chitchat"namespace = (user_id, application_context) store.put( namespace, "a-memory", { "rules": [ "User likes short, direct language", "User only speaks English & python", ], "my-key": "my-value", },)# get the "memory" by IDitem = store.get(namespace, "a-memory") # search for "memories" within this namespace, filtering on content equivalence, sorted by vector similarityitems = store.search( namespace, filter={"my-key": "my-value"}, query="language preferences")

我们可以通过Tool机制,让Agent使用Store,如果使用LangChain或DeepAgents,我们可以从runtime中获取create_agentcreate_deep_agent传入的store对象。生产需要使用DB实现的Store,需要关注数据库连接池,避免消耗资源。

@tooldef get_user_info(runtime: ToolRuntime[Context]) -> str: """Look up user info.""" # Access the store - same as that provided to `create_agent` store = runtime.store user_id = runtime.context.user_id # Retrieve data from store - returns StoreValue object with value and metadata user_info = store.get(("users",), user_id) return str(user_info.value) if user_info else"Unknown user"# Tool that allows agent to update user information (useful for chat applications)@tooldef save_user_info(user_info: UserInfo, runtime: ToolRuntime[Context]) -> str: """Save user info.""" # Access the store - same as that provided to `create_agent` store = runtime.store user_id = runtime.context.user_id # Store data in the store (namespace, key, data) store.put(("users",), user_id, user_info) return"Successfully saved user info."

3. 如何用好Namespace

Namespace 是 Store 中组织数据的分层路径,以字符串元组表示,类似文件夹结构,用于隔离不同业务域、用户或环境的数据。

设计Store机制的时候,还是folder-like structure,但已经展现了langchain对“万物皆文件”理念的偏爱,和Manus中的“FileSystem as Memory”思路一致。等到了DeepAgents,又设计FileSystem的抽象工具——Backend,真正的为Agent提供了文件系统。这里先聚焦Namespace。

Namespace 通常以元组(Tuple)的形式表示,支持多级嵌套,实现层级化管理。开发者可以根据业务需求灵活组织记忆:

  • 用户级隔离:最常见的模式,确保每个用户的偏好和事实仅在其对应的user_id空间内可见。
  • 组织级共享:可以将 Namespace 设置为("memories", "{org_id}"),使同一组织内的所有 Agent 能够搜索和共享该组织的政策或规则。
  • 按类别划分:可以在用户 ID 下进一步细分,如("agent_smith", "memories", "{user_id}", "preferences"),专门用于存储特定类型的非结构化信息。
# 根级 store.put(("docs",), "report1", {"title": "年报"}) # 用户级 store.put(("docs", "user123"), "notes", {"content": "..."})) # 多级缓存 store.put(("cache", "embeddings", "v1"), "e1", {"vec": [...]})

Namespace除了灵活的组织分级,也提供了高级过滤和通配符,在应对复杂业务场景时非常方便。

# 前缀过滤 store.list_namespaces(prefix=("test",)) # 后缀过滤 store.list_namespaces(suffix=("public",)) # 组合 store.list_namespaces(prefix=("a",), suffix=("f",)) # 通配符 store.list_namespaces(prefix=("a", "*", "f"))

4.语义检索

Store语义检索依赖于底层实现,官方提供了SqliteStorePostgresStoreSqliteStore内置向量支持,仅支持 cosine 距离。PostgresStore需要pgvector 扩展,默认 cosine。

Store 通过在创建时提供index配置启用向量语义检索,写入时指定要索引的字段。可选fields指定要嵌入的 JSON 路径,默认为["$"](整个文档)。

核心使用search(namespace_prefix, query=…, filter=…, limit=…)进行自然语言检索。

conn_string = "postgresql://user:pass@localhost:5432/dbname"with PostgresStore.from_conn_string( conn_string, index={"dims": 1536,"embed": init_embeddings("openai:text-embedding-3-small"),"fields": ["text"] # specify which fields to embed. Default is the whole serialized value }) as store: store.setup() # Do this once to run migrations# Store documents store.put(("docs",), "doc1", {"text": "Python tutorial"}) store.put(("docs",), "doc2", {"text": "TypeScript guide"}) store.put(("docs",), "doc2", {"text": "Other guide"}, index=False) # don't index# Search by similarity results = store.search(("docs",), query="programming guides", limit=2)

向量与原始 JSON 文档分开存储,不影响普通 get/put 操作。

5. Store小结

Store是实现长期记忆(Long-term Memory)的关键,设计理念回归本质,采用简洁的文档存储模式,支持通过命名空间(Namespace)和键(Key)的层级结构来组织 JSON 格式的数据条目。不仅支持基础的存(put)、取(get)操作,更集成了强大的语义搜索(Semantic Search)功能,使 Agent 能够根据“含义”而非仅仅是精确匹配来检索用户的历史偏好、事实知识或过往经验,能从反馈中学习并持续进化。

为了让 Agent 能够以更符合 AI 直觉的方式操作这些长期记忆,DeepAgents 进一步通过其 Backend 机制,将 Store 的底层存取逻辑抽象为了一套 AI 原生的文件系统操作接口,我们下次再详细讨论。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 22:09:04

VCS仿真Debug实战:巧用UCLI的stop -continue命令抓取信号跳变

VCS仿真Debug实战:巧用UCLI的stop -continue命令抓取信号跳变 在数字芯片验证的浩瀚海洋中,仿真调试就像一场精密的外科手术。当波形窗口中那些转瞬即逝的信号异常如同狡猾的猎物般难以捕捉时,UCLI(Unified Command-line Interfa…

作者头像 李华
网站建设 2026/4/10 22:08:02

[随波逐流]CTF编码工具 V5.2:从Base64到Vigenere的全能解码实战指南

1. 为什么你需要这款全能解码工具 第一次参加CTF比赛时,我对着题目里那串诡异的Base64编码发了半小时呆。直到隔壁选手用工具"秒解"后,我才意识到专业工具的重要性。[随波逐流]CTF编码工具V5.2就是这样一个能让你在比赛中快人一步的瑞士军刀&a…

作者头像 李华
网站建设 2026/4/10 21:58:53

Jimeng LoRA入门必看:Z-Image-Turbo底座FP16/BNFP精度选择对LoRA效果影响

Jimeng LoRA入门必看:Z-Image-Turbo底座FP16/BNFP精度选择对LoRA效果影响 1. 项目简介 Jimeng LoRA测试系统是一个专门为LoRA模型效果对比设计的轻量级工具。基于Z-Image-Turbo文生图底座,这个系统能够让你在不重复加载基础模型的情况下,快…

作者头像 李华
网站建设 2026/4/10 21:58:52

忍者像素绘卷:天界画坊Multisim电路模拟灵感:生成电子像素艺术

忍者像素绘卷:天界画坊Multisim电路模拟灵感:生成电子像素艺术 1. 当电路仿真遇上像素艺术 在电子工程领域,Multisim作为经典的电路仿真工具,其输出的波形图和电路图往往被视为纯粹的技术文档。但换个视角看,这些由电…

作者头像 李华
网站建设 2026/4/10 21:49:08

C语言:排序(一)

目录 1. 前言 2. 冒泡排序 2.1 动态演示 2.2 代码实现 3. 插入排序 3.1 直接插入排序 3.1.1 动态演示 3.1.2 代码实现 3.2 希尔排序 3.2.1 代码实现 4. 选择排序 4.1 动态演示 4.2 代码实现 5. 堆排序 5.1 代码实现 1. 前言 本篇主要讲解基础的排序算法&#x…

作者头像 李华