)
一、概述长期记忆让你的代理能够在不同对话和会话中存储和回忆信息。记忆类型作用域载体短期记忆单个线程单次对话Checkpointer State长期记忆跨线程随时可调用LangGraphStore长期记忆是建立在LangGraph Store基础上的数据保存为按命名空间namespace和键key分类的 JSON 文档。二、用法要为代理添加长期记忆创建一个 store 并传给create_agentfromlangchain.agentsimportcreate_agentfromlangchain_core.runnablesimportRunnablefromlanggraph.store.memoryimportInMemoryStore# InMemoryStore 将数据保存到内存字典中。生产环境请使用 DB 支撑的 store。storeInMemoryStore()agent:Runnablecreate_agent(claude-sonnet-4-6,tools[],storestore,)更多 store 后端包括 Redis 和 MongoDB参见「存储集成清单」。MongoDB 攻略参见「MongoDB 的长期记忆」。工具随后可以使用runtime.store参数从存储器读取和写入。深入探讨关于记忆类型语义记忆、情景记忆、程序记忆及记忆书写策略参见「记忆概念指南」。三、内存存储Memory storeLangGraph 将长期记忆存储为 JSON 文档存储在 store 中。每个内存分别被组织在自定义的namespace类似文件夹和独立的key类似文件名下。namespace 通常包含用户或组织 ID 或其他标签以便于信息组织。这种结构使记忆能够进行层级组织并通过内容筛选支持跨命名空间搜索。fromcollections.abcimportSequencefromlanggraph.store.baseimportIndexConfigfromlanggraph.store.memoryimportInMemoryStoredefembed(texts:Sequence[str])-list[list[float]]:# 替换为实际的 embedding 函数或 LangChain embeddings 对象return[[1.0,2.0]for_intexts]# InMemoryStore 将数据保存到内存字典中。生产环境请使用 DB 支撑的 store。storeInMemoryStore(indexIndexConfig(embedembed,dims2))user_idmy-userapplication_contextchitchatnamespace(user_id,application_context)store.put(namespace,a-memory,{rules:[User likes short, direct language,User only speaks English python,],my-key:my-value,},)# 通过 ID 获取该 memoryitemstore.get(namespace,a-memory)# 在该命名空间内搜索 memories按内容等价性过滤按向量相似度排序itemsstore.search(namespace,filter{my-key:my-value},querylanguage preferences)关于 memory store 的更多信息参见「Persistence guide」。Store 核心 API方法作用备注store.put(namespace, key, data)写入namespace 为元组如(user_id, context)store.get(namespace, key)按键读取返回含value和元数据的对象store.search(namespace, filter..., query...)搜索filter按内容过滤query按向量相似度排序需配IndexConfig向量检索配置InMemoryStore(indexIndexConfig(embedembed,dims2))embed可以是任意 embedding 函数或 LangChain embeddings 对象dims为向量维度。生产用替换成真实 embedding。四、在工具中读取长期记忆工具通过runtime.store访问 store与传给create_agent的是同一个。fromdataclassesimportdataclassfromlangchain.agentsimportcreate_agentfromlangchain.toolsimportToolRuntime,toolfromlangchain_core.runnablesimportRunnablefromlanggraph.store.memoryimportInMemoryStoredataclassclassContext:user_id:str# InMemoryStore 将数据保存到内存字典中。生产环境请使用 DB 支撑的 store。storeInMemoryStore()# 使用 put 方法写入示例数据store.put((users,),# 命名空间用于将相关数据分组users 命名空间存放用户数据user_123,# 命名空间内的键这里用 user ID 作为键{name:John Smith,language:English,},# 为该用户存储的数据)tooldefget_user_info(runtime:ToolRuntime[Context])-str:Look up user info.# 访问 store - 与提供给 create_agent 的相同assertruntime.storeisnotNoneuser_idruntime.context.user_id# 从 store 检索数据 - 返回带有 value 和 metadata 的 StoreValue 对象user_inforuntime.store.get((users,),user_id)returnstr(user_info.value)ifuser_infoelseUnknown useragent:Runnablecreate_agent(modelopenai:gpt-5.5,tools[get_user_info],# 把 store 传给 agent - 使 agent 在运行工具时能访问 storestorestore,context_schemaContext,)# 运行代理agent.invoke({messages:[{role:user,content:look up user information}]},contextContext(user_iduser_123),)要点runtime.store类型为Optional使用前建议assert runtime.store is not Noneget()返回的是StoreValue 对象需通过.value取数据未命中时返回None示例中兜底返回Unknown user用户身份从runtime.context.user_id取需在create_agent配context_schema五、从工具中写入长期记忆fromdataclassesimportdataclassfromlangchain.agentsimportcreate_agentfromlangchain.toolsimportToolRuntime,toolfromlangchain_core.runnablesimportRunnablefromlanggraph.store.memoryimportInMemoryStorefromtyping_extensionsimportTypedDict# InMemoryStore 将数据保存到内存字典中。生产环境请使用 DB 支撑的 store。storeInMemoryStore()dataclassclassContext:user_id:str# TypedDict 定义给 LLM 看的用户信息结构classUserInfo(TypedDict):name:str# 允许代理更新用户信息的工具对聊天应用很有用tooldefsave_user_info(user_info:UserInfo,runtime:ToolRuntime[Context])-str:Save user info.# 访问 store - 与提供给 create_agent 的相同assertruntime.storeisnotNonestoreruntime.store user_idruntime.context.user_id# 在 store 中存储数据 (namespace, key, data)store.put((users,),user_id,dict(user_info))returnSuccessfully saved user info.agent:Runnablecreate_agent(modelopenai:gpt-5.5,tools[save_user_info],storestore,context_schemaContext,)# 运行代理agent.invoke({messages:[{role:user,content:My name is John Smith}]},# user_id 在 context 中传入用于标识正在更新谁的信息contextContext(user_iduser_123),)# 你也可以直接访问 store 来获取值itemstore.get((users,),user_123)要点用TypedDict定义参数结构让 LLM 知道该填什么store.put((users,), user_id, dict(user_info))—— TypedDict 需转成普通 dict 存入store 对象在工具外部仍可直接访问store.get(...)便于验证与调试六、速查表短期 vs 长期记忆维度短期记忆State长期记忆Store作用域单线程单次对话跨线程 / 跨会话载体代理 State含messagesLangGraphStore传入方式create_agent(..., checkpointer...)create_agent(..., store...)工具内访问runtime.stateruntime.store写入方式返回Command(update{...})store.put(namespace, key, data)数据结构扁平字段messages 等层级namespace元组 key检索直接读字段get/search支持内容过滤 向量相似度生产方案PostgresSaver/AsyncPostgresSaverPostgres /Redis/MongoDBstore典型用途当前消息、上传文件、认证状态用户偏好、提取的洞察、历史数据Store API操作代码写入store.put((ns1, ns2), key, data_dict)读取store.get((ns1, ns2), key)→StoreValue.value搜索store.search(ns, filter{...}, query...)启用向量检索InMemoryStore(indexIndexConfig(embedfn, dimsn))工具内标准写法tooldefmy_tool(runtime:ToolRuntime[Context])-str:...assertruntime.storeisnotNoneuser_idruntime.context.user_id# 从 Context 取身份itemruntime.store.get((users,),user_id)# 读runtime.store.put((users,),user_id,{...})# 写returnstr(item.value)ifitemelseUnknown user常用导入fromlangchain.agentsimportcreate_agentfromlangchain.toolsimporttool,ToolRuntimefromlanggraph.store.memoryimportInMemoryStorefromlanggraph.store.baseimportIndexConfig# 生产后端PostgresStore / RedisStore / MongoDBStore七、要点小结长期记忆跨线程持久随时可调用短期记忆只在单线程内有效——二者互补、常一起使用。底层是LangGraph Store数据为 JSON 文档按namespace key组织namespace 类似文件夹key 类似文件名。启用方式极简create_agent(..., storestore)。namespace通常包含用户/组织 ID 或其他标签便于信息组织与层级划分。三种 APIput写、get读返回 StoreValue 的.value、search内容过滤 向量相似度排序。向量检索需显式配置IndexConfig(embed..., dims...)embed可用任意函数或 LangChain embeddings 对象。工具通过runtime.store访问与传给create_agent的是同一个实例。⚠️runtime.store是Optional使用前应assert ... is not None或做 None 判断。用户身份通常从runtime.context取需配context_schema再拼到 namespace/key 上做隔离。给 LLM 的结构化入参用TypedDict定义存入前用dict(...)转换。⚠️生产环境不要用InMemoryStore数据存内存字典进程重启即失——换 Postgres / Redis / MongoDB store。记忆类型语义 / 情景 / 程序与记忆书写策略参见「记忆概念指南」。