Skip to main content
Stores 允许智能体跨线程持久化信息,包括用户偏好、积累的知识以及应该超越单次对话而存活的事实。与 checkpointers 不同,后者保存的是限定于单个线程的完整图状态,而 stores 则持有可从任何线程访问的任意键值对数据。 共享状态模型
Agent Server 自动处理 stores 使用 Agent Server 时,您无需手动实现或配置 stores。API 会在幕后为您处理所有存储基础设施。
@[InMemoryStore] 适用于开发和测试。在生产环境中,请使用持久化存储,如 PostgresStore、MongoDBStore、RedisStore 或 UpstashStore。所有实现都扩展自 @[BaseStore],这是在节点函数签名中使用的类型注解。
查看 store integrations 以获取可用提供商的完整列表。

基本用法

以下代码片段展示了在不使用 LangGraph 的情况下,单独使用 @[InMemoryStore]: :::python
::: :::js
::: Memories 通过 tuple 进行命名空间划分,在下面的示例中,(<user_id>, "memories")。命名空间可以是任意长度并代表任何内容,不必特定于用户。 :::python
::: :::js
::: 使用 store.put 方法将 memories 保存到 store 中的命名空间。指定上面定义的命名空间以及记忆的键值对:键只是记忆的唯一标识符 (memory_id),而值(字典)就是记忆本身。 :::python
::: :::js
::: 使用 store.search 方法从命名空间中读取 memories,该方法将给定用户的 memories 作为列表返回,最多返回 limit 个参数(默认 10)。使用 InMemoryStore 时,项目按插入顺序返回,因此最新的 memory 位于列表末尾;其他后端可能会以不同方式对 memories 进行排序(参见 Listing items in a namespace)。 :::python
每个 memory type 都是一个具有特定属性的 Python 类 (Item)。我们可以通过使用 .dict 进行转换,将其作为字典访问。 它具有以下属性:
  • value: 此 memory 的值(本身是一个字典)
  • key: 此 memory 在此命名空间中的唯一键
  • namespace: 字符串元组,此 memory type 的命名空间
当类型为 tuple[str, ...] 时,在转换为 JSON 时可能被序列化为列表(例如,['1', 'memories'])。
  • created_at: 此 memory 创建的时间戳
  • updated_at: 此 memory 更新的时间戳
::: :::js
它具有以下属性:
  • value: 此 memory 的值
  • key: 此 memory 在此命名空间中的唯一键
  • namespace: 字符串元组,此 memory type 的命名空间
当类型为 tuple 时,在转换为 JSON 时可能被序列化为列表(例如,['1', 'memories'])。
  • createdAt: 此 memory 创建的时间戳
  • updatedAt: 此 memory 更新的时间戳
:::

列出命名空间中的项目

:::python 调用 store.search(或异步的 store.asearch)而不带 query 和 filter 会返回存储在 namespace_prefix 下的项目,最多返回 limit 个。当你不需要语义排序时,用它来枚举命名空间中的所有内容。 ::: :::js 调用 store.search 而不提供 query 和 filter 将返回在命名空间前缀下存储的项目,最多返回 limit 个。当您不需要语义排序时,使用此方法来枚举命名空间中的所有内容。 ::: :::python
::: :::js
::: 需要注意的三种行为:
  • namespace_prefix 通过前缀匹配,而非精确匹配。 ("alice",) 也会返回 ("alice", "memories")、("alice", "preferences") 等子项。若要限制为单一层级,请传递完整命名空间或在 item.namespace 客户端过滤返回项。
  • 超过 limit 的结果会被静默截断。 没有溢出信号—将 limit 设置为预期最大值以上,或使用 offset 进行分页。
  • 默认排序取决于存储后端。 PostgresStore 和 AsyncPostgresStore 按 updated_at 降序返回结果(最近更新优先)。InMemoryStore 按插入顺序返回结果(最近插入的排在最后)。不要依赖跨实现的特定顺序;若顺序重要,请在 item.updated_at 客户端进行排序。
:::python To page through a large namespace:
::: :::js To page through a large namespace:
::: :::python 要发现哪些命名空间存在(例如,在列出每个用户的记忆之前迭代每个用户),使用 store.list_namespaces 或 store.alist_namespaces:
::: :::js 要发现哪些命名空间存在(例如,在列出每个用户的记忆之前迭代每个用户),使用 store.listNamespaces:
:::

语义搜索

除了简单的检索外,store 还支持语义搜索,允许您根据含义而非精确匹配来查找 memories。要启用此功能,请使用嵌入模型配置 store: :::python
::: :::js
::: 现在在搜索时,您可以使用自然语言查询来查找相关的 memories: :::python
::: :::js
::: 您可以通过配置 fields 参数或在存储 memories 时指定 index 参数来控制 memories 的哪些部分被嵌入: :::python
::: :::js
:::

在 LangGraph 中使用

:::python store 与 checkpointer 紧密配合工作:checkpointer 将状态保存到线程(如上所述),而 store 允许您存储任意信息以供 跨 线程访问。请按如下方式同时使用 checkpointer 和 store 编译图。
::: :::js memoryStore 与检查点协同工作:检查点将状态保存到线程中(如前所述),而 memoryStore 允许您存储任意信息以跨线程访问。以下是如何编译包含检查点和 memoryStore 的图。
::: 然后像之前一样使用 thread_id 调用图,并使用 user_id,它作为此特定用户的记忆命名空间,如前所述。 :::python
::: :::js
::: :::python 您可以通过使用 Runtime 对象从 任何节点 访问存储和 user_id。当您将 Runtime 作为参数添加到节点函数时,LangGraph 会自动注入 Runtime。您可以使用它来保存记忆:
::: :::js 您可以通过 runtime 参数从 任何节点 访问存储和 userId。您可以使用它来保存记忆:
::: 您还可以从任何节点访问存储,并使用 store.search 方法获取记忆。记忆以对象列表的形式返回,可以转换为字典。 :::python
::: :::js
::: 您访问记忆并在模型调用中使用它们。 :::python
::: :::js
::: 如果您创建新线程,只要 user_id 相同,您仍然可以访问相同的记忆。 :::python
::: :::js
::: 当您在本地使用 LangSmith(例如,在 Studio) 或 hosted 中时,基础存储默认可用,编译图时无需指定。然而,要启用语义搜索,您确实需要在 langgraph.json 文件中配置索引设置。例如:
参见 部署指南 获取更多详细信息和配置选项。 :::python

构建自定义存储

要使用除内置实现之外的存储后端,请继承 @[BaseStore] 并实现其所需方法。内置 @[InMemoryStore] 是最简单的参考实现。

基本协议

所有五个异步方法都是必需的。同步对应方法(put、get、delete、search、list_namespaces)是可选的但建议与同步图执行兼容。 实现前请查找确切签名:

命名空间设计

命名空间是字符串元组,例如 ("user_id", "memories")。存储实现必须支持:
  • 前缀匹配:asearch(("alice",)) 返回 ("alice",)、("alice", "memories") 和任何其他子命名空间下的项。
  • 精确键查找:aget(("alice", "memories"), "some-key") 必须是 O(1) 或接近 O(1)。
对于 SQL 后端,常见的架构:

序列化

存储值是普通的 Python 字典——无需特殊序列化器。使用 json.dumps / json.loads 或直接使用 JSONB 列进行序列化。不要存储非 JSON-可序列化的原始 Python 对象。

语义搜索支持

如果您的后端支持向量搜索,请在 asearch 上实现 query 参数:
  • 接受一个 query: str | None 参数。
  • 当 query 不为 None 时,嵌入它并按余弦相似度对结果进行排序。
  • 当提供 query 时,结果应在每个 Item 中包含 score 字段。
如果您的后端不支持向量搜索,当 query 被传递时,请引发 NotImplementedError。

测试

目前还没有自定义存储的兼容性套件。将 @[InMemoryStore] 作为参考进行测试:
:::

下一步


官方原文:src/oss/langgraph/stores.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026