LangMem学习第三天 记忆存储管理

Core API提供了记忆转换功能,但在实际运用中,需要持久化存储长期保存记忆的存储功能。

为此,LangMem利用了LangGraph的持久化功能(BaseStore)作为存储后端,并提供用于长期记忆持久化的API。

本文为了便于验证,使用了BaseStore的内存实现InMemoryStore([1]).

LangMem学习第三天 记忆存储管理

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持久化功能的集成,请参见以下官方文档。

LangMem学习第三天 记忆存储管理

下面的代码请确保启动了本地的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)

但是我这里的输出有点奇怪

LangMem学习第三天 记忆存储管理

官方输出是

LangMem学习第三天 记忆存储管理

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

(0)
上一篇 1天前
下一篇 10小时前

相关推荐

发表回复

登录后才能评论
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn