news 2026/9/30 11:14:57

长期记忆如何让AI真正“记住你”?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
长期记忆如何让AI真正“记住你”?

一、什么是长期记忆?

长期记忆(Long-term memory)能够让智能体(agent)在不同对话、会话之间存储和调取信息

长期记忆基于 LangGraph 的存储模块实现,该模块将数据保存为 JSON 文档,通过命名空间(namespace)和键(key)做数据组织。

二、语法使用

Tips:不管是长期记忆还是短期记忆,都有内存和持久化两种方式

2.1 InMemoryStore 语法

from langchain.agents import create_agent from langchain_core.runnables import Runnable from langgraph.store.memory import InMemoryStore # `InMemoryStore` 将数据保存在内存字典中。生产环境请使用基于数据库的存储。 store = InMemoryStore() agent: Runnable = create_agent( "claude-sonnet-4-6", tools=[], store=store, )

2.2 PostgreSQL语法

# pip install -U langgraph-checkpoint-postgres "psycopg[binary]" from langchain.agents import create_agent from langchain_core.runnables import Runnable from langgraph.store.postgres import PostgresStore # type: ignore[import-not-found] DB_URI = "postgresql://postgres:postgres@localhost:5432/postgres?sslmode=disable" with PostgresStore.from_conn_string(DB_URI) as store: store.setup() agent: Runnable = create_agent( "claude-sonnet-4-6", tools=[], store=store, )

三、存储方式

LangGraph 将长期记忆以 JSON 文档的形式存储在存储层(stores)中:

  • •namespace + key组合定位一条记忆:namespace 做分组隔离,key 在分组内唯一

  • • 典型命名空间示例:["memories", "user_123"],代表用户 123 的记忆文件夹

3.1 InMemoryStore

  • •不传 query:只依靠filter做结构化精确匹配,不进行向量相似度排序,返回顺序由存储实现决定。

  • •传入 query:自然语言语义检索,会基于向量相似度对结果排序。可以搭配filter,先过滤再排序。

def embed(texts: Sequence[str]) -> list[list[float]]: # 假定返回一个向量 return [[1.0, 2.0] for _ in texts] # InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production use. store = InMemoryStore(index=IndexConfig(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", ], "area": "北美", }, ) store.put( namespace, "b-memory", { "rules": [ "我喜欢国语", "我只会说一顶点点英文", ], "area": "炎黄子孙", }, ) # 通过ID获取存储数据 item = store.get(namespace, "a-memory") rprint(item) # 在该命名空间内搜索记忆条目,按内容等值条件过滤,并以向量相似度排序返回结果 items = store.search( namespace, filter={"area": "炎黄子孙"}, query="国语" ) rprint(items)

3.2 PostgreSQL

DB_URI = "postgresql://postgres:postgres@localhost:5432/postgres?sslmode=disable" with PostgresStore.from_conn_string(DB_URI) as store: store.setup()

其中setup() 函数会创建所需要的表:store,store_migrations,vector_migrations

  • •store:存业务 / 记忆 KV 数据

  • •store_migrations:跟踪 store 表结构版本

  • •vector_migrations:跟踪向量索引 / 向量表的版本(需要 pgvector)

3.2.1store【核心业务数据主表】

作用:保存普通键值数据(非向量),对应store.put()/store.get()读写的内容(Agent 记忆、用户配置、会话元数据等)。

关键字段:

  • •prefix:命名空间(类似文件夹,用来分组数据,比如("users","123"))

  • •key:记录的键

  • •value:JSONB 存储的值

  • •created_at/updated_at:创建更新时间

  • •expires_at:TTL 过期时间(可选自动清理)

简单理解:LangGraph 内置 KV 存储,Agent 的长期记忆就存在这张表里。

3.2.2store_migrations【KV 表的迁移版本记录表(框架内部)】

作用:记录store表的 schema 迁移版本,属于框架内部管理表,业务代码不要手动读写。

逻辑:

  • • 每次调用setup(),会先读这张表,判断当前数据库的表结构版本

  • • 如果版本低,自动执行对应的 ALTER/CREATE 迁移 SQL;版本一致就跳过,幂等,重复调用 setup 不会重复建表

  • • 保证不同版本 LangGraph 升级时,自动更新store表结构,不会破坏已有数据

3.2.3vector_migrations【向量索引迁移版本记录表(框架内部)】

作用:管理向量索引的迁移版本,依赖 pgvector 扩展。

  • • 只有开启index_config(启用向量检索)才会用到这套逻辑

  • • 记录向量相关表、索引(hnsw/ivfflat 向量索引)的迁移版本

  • •setup()会检查这个表,自动创建 / 升级向量表、向量索引

四、在工具中读写Store

4.1 在工具(tools)中读取长期记忆

通过ToolRuntime获取store信息

Tips:从源码中可以看到,ToolRuntime不仅可以获取store,还能获取state和context上下文

ToolRuntime定义如下:

案例代码:

@dataclass class Context: user_id: str with PostgresStore.from_conn_string(DB_URI) as store: store.setup() store.put(("users",), "user_123", {"name": "John Smith", "language": "English"}) @tool def get_user_info(runtime: ToolRuntime[Context]) -> str: """Look up user info.""" assert runtime.store is not None # 根据用户id获取用户信息 user_info = runtime.store.get(("users",), runtime.context.user_id) return str(user_info.value) if user_info else "Unknown user" agent = create_agent( model = model, tools = [get_user_info], store = store, context_schema = Context, ) result = agent.invoke( {"messages": [{"role": "user", "content": "查看用户信息"}]}, context = Context(user_id = "user_123"), ) for m in result["messages"]: m.pretty_print()

4.2 在工具(tools)中写长期记忆

使用put保存信息

@tool def save_user_info(user_info: UserInfo, runtime: ToolRuntime[Context]) -> str: """保存用户信息.""" assert runtime.store is not None runtime.store.put(("users",), runtime.context.user_id, dict(user_info)) return "成功保存用户信息." with PostgresStore.from_conn_string(DB_URI) as store: store.setup() agent: Runnable = create_agent( model=model, tools=[save_user_info], store=store, context_schema=Context ) result= agent.invoke( {"messages": [{"role": "user", "content": "My name is John Smith"}]}, context=Context(user_id="user_123"), ) for m in result["messages"]: m.pretty_print()

4.3 从数据库中store表中可以看到存储的结果

五、小总结

  • •长短期区别:短期记忆管“眼前这摊事”(单线程),长期记忆管“下次还认得你”(跨线程)。

  • •存储核心:基于 LangGraph Store 实现,数据以JSON 文档形式保存,通过namespace + key定位。

  • •两种姿势:开发用InMemoryStore(内存字典),生产用PostgresStore(需pgvector支持向量检索)。

  • •读写入口:在工具内部通过ToolRuntime拿到store实例,用get读取、put写入,实现 Agent 的“经验沉淀”。

没有长期记忆的 Agent 只是个金鱼脑,有了 Store,它才算真正有了“积累”。

如果觉得有用,别忘了点赞、在看、转发三连支持!

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

90DaysOfDevOps 第四天:Agile 与 DevOps 的本质差异与融合之道

文档/教程 【免费下载链接】90DaysOfDevOps This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Pri…

作者头像 李华
网站建设 2026/9/30 11:07:58

Vue3 + VS Code 插件清单:从 Volar 到 ESLint 的工程化配置指南

开始切 Vue3 项目的那段时间,我做过最蠢的事就是把 VS Code 插件商店里的热门插件装了个遍,结果编辑器比电脑还卡,真正干活时总有几个插件在左下角疯狂报错。后来我重新梳理了一遍,才发现 Vue3 开发真正需要的插件其实就那十几个&…

作者头像 李华
网站建设 2026/9/30 11:05:42

一亩田客服咨询AI流量赋能,一亩田科技重塑智能体验新标杆

近期,由湖南改变生物科技有限公司主办、本因内酵未徕品牌协办的“生物科技健康论坛暨AI赋能大健康产业启动会”在长沙市步步高福鹏喜来登酒店隆重举行。活动以“AI流量赋能实体破局——中小企业增长峰会”为主题,汇聚全国大健康行业专家、中小企业负责人、机构代表及…

作者头像 李华
网站建设 2026/9/30 11:05:02

阿里国际站代运营的坑有哪些?新手老板必看的防套路清单

核心摘要代运营行业鱼龙混杂,“保效果”“低价包年”往往是套路的起点,签约前需重点审查服务流程和团队配置。判断代运营是否靠谱的关键,不在于对方承诺多少,而在于是否提供透明的数据汇报、明确的关键词和直通车操作方案。国际站…

作者头像 李华
网站建设 2026/9/30 11:03:23

网络编程实战:从socket入门到TCP服务调优与排障

搞网络编程的人,十个有八个是从socket入门的,又有九个在入门阶段被socket折磨过。这不是劝退,是事实。socket这套接口看着就那几步,socket、bind、listen、accept,但等到你真去做一个需要扛流量的服务时,就…

作者头像 李华
网站建设 2026/9/30 11:02:41

Spring Boot用户数据管理实战:从CRUD到事务、缓存与安全配置

上周帮朋友公司重构内部系统的用户管理模块,需求拆开其实不算复杂:部门树、人员列表、账号状态、登录日志,外加上一个管理后台。但业务上看着简单,真正动手之后你会发现,“用户数据管理”这五个字牵扯到的东西远不止增…

作者头像 李华