背景快速入门指南¶
记忆可以通过两种方式创建
- 在热路径中:代理使用工具自觉地保存笔记(参阅热路径快速入门)。
- 👉在后台(本指南):记忆从对话中“潜意识地”自动提取。
本指南向您展示如何使用create_memory_store_manager
在后台提取和整合记忆。代理将正常运行,而记忆在后台处理。
先决条件¶
首先,安装 LangMem
使用您喜欢的LLM提供商的API密钥配置您的环境
基本用法¶
API: init_chat_model | entrypoint | ReflectionExecutor | create_memory_store_manager
from langchain.chat_models import init_chat_model
from langgraph.func import entrypoint
from langgraph.store.memory import InMemoryStore
from langmem import ReflectionExecutor, create_memory_store_manager
store = InMemoryStore( # (1)!
index={
"dims": 1536,
"embed": "openai:text-embedding-3-small",
}
)
llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")
# Create memory manager Runnable to extract memories from conversations
memory_manager = create_memory_store_manager(
"anthropic:claude-3-5-sonnet-latest",
# Store memories in the "memories" namespace (aka directory)
namespace=("memories",), # (2)!
)
@entrypoint(store=store) # Create a LangGraph workflow
async def chat(message: str):
response = llm.invoke(message)
# memory_manager extracts memories from conversation history
# We'll provide it in OpenAI's message format
to_process = {"messages": [{"role": "user", "content": message}] + [response]}
await memory_manager.ainvoke(to_process) # (3)!
return response.content
# Run conversation as normal
response = await chat.ainvoke(
"I like dogs. My dog's name is Fido.",
)
print(response)
# Output: That's nice! Dogs make wonderful companions. Fido is a classic dog name. What kind of dog is Fido?
-
什么是存储(store)?它是一个文档存储,您也可以添加向量搜索功能。顾名思义,“InMemoryStore”是保存在内存中且非持久化的。
用于生产环境
使用持久化存储,例如
AsyncPostgresStore
而不是InMemoryStore
,以便在重启之间持久化数据。 -
namespace
参数允许您隔离存储和检索的记忆。在此示例中,我们将记忆存储在全局的“memories”路径下,但您也可以使用模板变量根据配置限定到用户特定的路径。有关更多信息,请参阅如何动态配置命名空间。 -
我们使用记忆管理器来处理每次新消息到来时的对话。对于更高效的处理模式,您可以进行防抖(即避免冗余)工作,请参阅延迟记忆处理。如果您不需要后台处理,您也可以直接使用
memory_manager.process(messages)
来处理记忆。
如果您想查看已提取的记忆,可以搜索存储
# (in case our memory manager is still running)
print(store.search(("memories",)))
# [
# Item(
# namespace=["memories"],
# key="0145905e-2b78-4675-9a54-4cb13099bd0b",
# value={"kind": "Memory", "content": {"content": "User likes dogs as pets"}},
# created_at="2025-02-06T18:54:32.568595+00:00",
# updated_at="2025-02-06T18:54:32.568596+00:00",
# score=None,
# ),
# Item(
# namespace=["memories"],
# key="19cc4024-999a-4380-95b1-bb9dddc22d22",
# value={"kind": "Memory", "content": {"content": "User has a dog named Fido"}},
# created_at="2025-02-06T18:54:32.568680+00:00",
# updated_at="2025-02-06T18:54:32.568682+00:00",
# score=None,
# ),
# ]
为了更高效地处理
💡 对于活跃的对话,处理每条消息可能会很昂贵。请参阅延迟记忆处理,了解如何将处理延迟到对话活动稳定下来。
下一步¶
- 配置动态命名空间 - 了解更多按用户、代理或其他值组织记忆的方式。