【LangChain进阶03:Long-term memory】—— LangChain 跨会话存储(Store)实战:让 Agent 记住你,而不是只记住对话
LangChain 跨会话存储Store实战让 Agent 记住你而不是只记住对话Checkpointer 解决了「单个对话内记忆」——同一线程里的多轮对话它能记住。但换个线程、隔天再来它就又把你忘了。因为用户的偏好、学习进度、账号信息这些应该跨对话存在而不是绑死在一次聊天里。这就是 Store跨会话存储的地盘。这篇文章讲清楚Store 和 Checkpointer 的区别、Store 的基本操作、怎么在 Agent 里用 Store以及持久化选型。一、先厘清Checkpointer vs Store这是理解记忆体系最关键的对比。两者分工不同缺一不可维度CheckpointerStore作用域单个对话线程thread_id跨所有对话线程数据类型Agent 状态快照自动管理任意键值数据手动管理典型用途多轮对话记忆用户偏好、知识库、配置数据组织thread_id → checkpoint(namespace, key) → value✅ 一句话总结Checkpointer 负责「对话到哪了」Store 负责「用户是谁、会什么、喜欢什么」。两者配合才能构建有持续记忆的智能 Agent。二、Store 的基本操作Store 用命名空间namespace 键key 值value的层级结构组织数据。namespace 是元组类似文件夹层级key 是字符串类似文件名value 是字典。fromlanggraph.store.memoryimportInMemoryStore storeInMemoryStore()# 写入数据put(namespace, key, value)store.put((users,user_001),# 命名空间preferences,# 键{# 值theme:dark,language:zh-CN,level:入门,})store.put((users,user_001),progress,{completed_courses:[HTML 基础,Python 基础],total_hours:35,})# 读取数据get(namespace, key)prefsstore.get((users,user_001),preferences)print(f偏好设置:{prefs.value})progressstore.get((users,user_001),progress)print(f学习进度:{progress.value})# 搜索数据search(namespace)all_user_datastore.search((users,user_001))print(f\n用户的所有数据 ({len(all_user_data)}项):)foriteminall_user_data:print(f{item.key}:{item.value})# 删除数据delete(namespace, key)store.delete((users,user_001),preferences)deletedstore.get((users,user_001),preferences)print(f\n删除后:{deleted})# None运行结果偏好设置: {theme: dark, language: zh-CN, level: 入门} 学习进度: {completed_courses: [HTML 基础, Python 基础], total_hours: 35} 用户的所有数据 (2 项): preferences: {theme: dark, language: zh-CN, level: 入门} progress: {completed_courses: [HTML 基础, Python 基础], total_hours: 35} 删除后: None四个核心操作操作方法说明写入store.put(namespace, key, value)存数据读取store.get(namespace, key)取单条搜索store.search(namespace)列某个 namespace 下所有条目删除store.delete(namespace, key)删单条三、在 Agent 中使用 Store把 Store 传给create_agent()Agent 里的所有工具都能通过InjectedStore注解访问它。看一个课程顾问的例子——课程目录和用户会员信息都存在 Store 里工具按需读。fromdotenvimportload_dotenv load_dotenv()fromtypingimportAnnotatedfromlanggraph.store.baseimportBaseStorefromlanggraph.store.memoryimportInMemoryStorefromlangchain.toolsimporttool,InjectedStorefromlangchain.agentsimportcreate_agentfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessage# 创建 Store 并预置数据storeInMemoryStore()store.put((runoob,courses),catalog,{Python3 基础教程:{price:免费,hours:20,level:入门},Python 数据分析:{price:会员,hours:30,level:进阶},Java 面向对象:{price:免费,hours:25,level:进阶},})store.put((runoob,users),user_vip_001,{name:小明,membership:VIP,joined:2024-01-15,})tooldefquery_course_info(course_name:str,store:Annotated[BaseStore,InjectedStore()],)-str:查询菜鸟教程 RUNOOB 中课程的详细信息。 Args: course_name: 课程名称 itemstore.get((runoob,courses),catalog)catalogitem.valueifitemelse{}ifcourse_nameincatalog:infocatalog[course_name]return(f《{course_name}》- 价格{info[price]}f时长{info[hours]}小时难度{info[level]})returnf未找到课程《{course_name}》tooldefget_user_membership(user_id:str,store:Annotated[BaseStore,InjectedStore()],)-str:查询用户会员信息。 Args: user_id: 用户 ID itemstore.get((runoob,users),user_id)ifitemisNone:returnf未找到用户{user_id}useritem.valuereturn(f用户{user[name]}{user[membership]}会员f注册日期{user[joined]})modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0)agentcreate_agent(modelmodel,tools[query_course_info,get_user_membership],storestore,system_prompt你是菜鸟教程 RUNOOB 的课程顾问。,)# 查询课程信息数据来自 Storeresultagent.invoke({messages:[HumanMessage(contentPython3 基础教程多少钱)]})print(f查询课程:{result[messages][-1].content})# 查询用户信息数据来自 Storeresultagent.invoke({messages:[HumanMessage(content帮我查一下用户 user_vip_001 的信息)]})print(f查询用户:{result[messages][-1].content})运行结果查询课程: 《Python3 基础教程》是免费的学习时长约20小时难度为入门级别。 查询用户: 用户小明是 VIP 会员注册日期为 2024年1月15日。 重点关键在store: Annotated[BaseStore, InjectedStore()]。它告诉 LangChain「这个参数是注入进来的 Store」——模型看不到它不会出现在工具签名里但工具运行时能直接读写 Store。四、Store 的持久化InMemoryStore数据在程序重启后丢失和InMemorySaver一样只适合开发和测试。生产环境用数据库版。# 开发阶段fromlanggraph.store.memoryimportInMemoryStore storeInMemoryStore()# 生产环境需要 PostgreSQL# from langgraph.store.postgres import PostgresStore# store PostgresStore.from_conn_string(postgresql://...)⚠️ 注意生产环境建议用PostgresStore数据库持久化并配合PostgresSaverCheckpointer一起用——前者管跨会话长期记忆后者管单线程对话状态。五、Store 使用建议场景namespace 示例key 示例说明用户偏好(users, user_id)preferences主题、语言、通知设置学习进度(users, user_id)progress已完成课程、学习时长知识库(kb, collection)doc_id文档、FAQ、产品信息会话摘要(sessions, thread_id)summary长对话的摘要供 Checkpointer 之外使用 重点Store 的数据是跨线程的这正是它和 Checkpointer 的根本区别。今天在 A 线程存的偏好明天在 B 线程也能取到。六、总结你真正需要记住的这几件事Checkpointer 短期记忆对话到哪了Store 长期记忆用户是谁、会什么。Store 用 (namespace, key) → value 的层级结构组织数据四个核心操作put / get / search / delete。在 Agent 里用InjectedStore注解把 Store 注入工具模型看不到、工具能读写。开发用InMemoryStore生产用PostgresStore最好和PostgresSaver一起上。Store 跨线程共享——这是跨会话记忆的关键也是和 Checkpointer 的本质区别。验证清单能put/get/search/delete操作 Store工具里能通过InjectedStore读 Store 数据同一 Store 在不同 thread_id跨会话都能读到InMemoryStore重启后数据丢失、PostgresStore持久化能说出 Store 和 Checkpointer 的职责边界参考资源LangChain 官方 · Long-term memory: https://docs.langchain.com/oss/python/langchain/long-term-memoryLangGraph 官方 · Stores / Persistence: https://docs.langchain.com/oss/python/langgraph/stores菜鸟教程 · LangChain 跨会话存储 Store: https://www.runoob.com/langchain/langchain-store.html说明文中模型名与代码示例以官方文档和菜鸟教程为准具体 API 细节请以你安装的 LangChain / LangGraph 版本为准。