Core API提供了记忆转换功能,但在实际运用中,需要持久化存储长期保存记忆的存储功能。
为此,LangMem利用了LangGraph的持久化功能(BaseStore)作为存储后端,并提供用于长期记忆持久化的API。
本文为了便于验证,使用了BaseStore的内存实现InMemoryStore([1]).

Store Manager
Store Manager与Memory Manager类似,但用于更新实际的长期记忆存储。
以下是将Memory Manager的代码以Store Manager版本实现的示例(省略了重复部分例如schema)
create_memory_manager 是生成 Store Manager 的 API。 与Memory Manager类似,用于长期记忆的结构(schemas)可以通过Pydantic指定任意的schema。
此外,通过指定namespace,Memory Manager可以以分层结构管理记忆数据。 在此例中,第一层为chat
(固定值),第二层为用户ID(占位符),从而使得可以针对每个用户管理记忆。
有关与LangGraph持久化功能的集成,请参见以下官方文档。

下面的代码请确保启动了本地的Ollama并且有bge-m3的嵌入模型。当然换成其余也是可以的。
全部源代码
from langgraph.func import entrypoint
from langgraph.store.memory import InMemoryStore
from pydantic import BaseModel, Field, conint
from langmem import create_memory_store_manager
import os
import f_common
class UserFoodPreference(BaseModel):
"""用户饮食偏好的详细信息"""food_name: str = Field(..., description="菜名")
cuisine: str | None = Field(
None, description="料理类型(和食、洋食、中餐等)"
)
preference: conint(ge=0, le=100) | None = Field(
None, description="喜好程度(以0~100的分数表示)")
description: str | None = Field(
None, description="其他补充说明(例如,特定的调味或配料等)"
)
# create_memory_manager 是生成 Store Manager 的 API。
# 与Memory Manager类似,用于长期记忆的结构(schemas)可以通过Pydantic指定任意的schema。
# 此外,通过指定namespace,Memory Manager可以以分层结构管理记忆数据。
# 在此例中,第一层为chat(固定值),第二层为用户ID(占位符),从而使得可以针对每个用户管理记忆。
# 生成 Store Manager
manager = create_memory_store_manager(
#"openai:gpt-4o-2024-11-20", # 用于记忆提取和更新的模型
f_common.my_grok_llm,
namespace=("chat", "{user_id}"), # 按UserId进行记忆管理
schemas=[UserFoodPreference],
instructions="请详细提取用户的偏好。如果将偏好中的`preference`更新为0,则从记忆中删除(RemoveDoc)",
enable_inserts=True, # 默认True
enable_deletes=True, # 默认False(不删除)
)
def print_memory(num: int, memories: list):
"""输出长期记忆"""print(f"### conversation:{num}")
for m in memories:
print(m)
# 生成 LangGraph 内存存储 (BaseStore)
store = InMemoryStore(
index={
"dims": 1536,
# "embed": "openai:text-embedding-3-small", # 用于向量化的模型
"embed": "ollama:bge-m3",
}
)
# LangGraph工作流程(Functional API)
@entrypoint(store=store)
def app(params: dict):
# 从 LangGraph 上下文中获取 Store,因此不需要像 Memory Manager 一样传入 existing
manager.invoke({"messages": params["messages"]}, config={"configurable": {"user_id": params["user_id"]}})
# 添加
conversation = [
{"role": "user", "content": "我非常喜欢拉面!!"},
{"role": "user", "content": "我也喜欢意面"},
]
# 长期记忆反映
app.invoke({"messages": conversation, "user_id": "MZ0001"})
memories = store.search(("chat", "MZ0001"))
print_memory(1, memories)
# 更新 or 删除
conversation = [
{"role": "user", "content": "我喜欢味噌拉面"},
{"role": "user", "content": "我不喜欢意面了"},
]
# 长期记忆反映(更新/删除现有长期记忆)
app.invoke({"messages": conversation, "user_id": "MZ0001"})
memories = store.search(("chat", "MZ0001"))
print_memory(2, memories)
但是我这里的输出有点奇怪

官方输出是

Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/9703