智能体记忆模块
在 LangChain,我们最感兴趣的概念之一就是记忆。
每当我们对一个概念感兴趣时,我们都喜欢构建一个示例应用来展示这个概念。为了记忆,我们决定构建一个日记应用!
我们最看好的 LLM 系统组件之一是记忆。正是这种“记忆”能力让我们热衷于探索。
我们认为,用户与LLM)之间的互动将会越来越多——聊天机器人将成为 LLM 应用的主流。这意味着,在对话中,用户将交换越来越多有价值的信息——例如,用户的喜好、他们的朋友是谁、他们的目标是什么。学习这些属性,并将其融入到应用程序中,可以极大地提升用户体验。
在探索记忆的过程中,我们认为整理一个用例示例会很有帮助,它可以激励我们开展大量工作,并为后续工作奠定基础。
更多资讯参考https://www.2img.ai 和 https://www.2video.cn

参考文档
两篇主要的学术论文对我们的记忆研究有所启发。
第一个:MemGPT。这篇论文由加州大学伯克利分校的研究人员开发,简而言之,它赋予了LLM调用一些函数的能力。这些函数可以执行诸如记住特定事实、回忆相关事物等操作。
大型语言模型 (LLM) 彻底革新了人工智能,但却受限于有限的上下文窗口,阻碍了它们在扩展对话和文档分析等任务中的应用。为了能够在有限的上下文窗口之外使用上下文,我们提出了虚拟上下文管理 (VCM) 技术。该技术借鉴了传统操作系统中的分层内存系统,通过在物理内存和磁盘之间进行分页,营造出一种扩展虚拟内存的错觉。基于这项技术,我们引入了 MemGPT (MemoryGPT),该系统能够智能地管理不同的存储层,以便在 LLM 有限的上下文窗口内有效地提供扩展上下文。
第二:生成代理。这篇论文由斯坦福大学的研究人员提出,简而言之,他们利用对经验的反思来形成记忆,然后通过编程的方式存储和检索这些记忆。
我们通过消融实验证明,我们代理架构的组成部分——观察、规划和反思——对代理行为的可信度都至关重要。通过将大型语言模型与计算交互代理融合,这项工作引入了架构和交互模式,以实现对人类行为的可信模拟。
这两篇论文之间一个有趣的区别在于,LLM 主动决定使用记忆的程度,而不是将其更多地作为后台进程。MemGPT 强制 LLM 使用记忆功能,而生成代理则更多地作为后台进程。
相关公司
有几家公司在内存方面做出了令人惊叹的成果。
Plastic Labs 是一家正在构建类似TutorGPT项目的初创公司。
LangChain LLM 应用。用于心智理论辅导的动态元提示。
Good AI是一家刚刚开源了具有长期记忆功能的聊天助手的初创公司。
乍一看,Charlie 可能与 ChatGPT、Claude 和 Gemini 等现有的 LLM智能体类似。然而,Charlie 的独特之处在于其 LTM 的实现,使其能够 从每一次交互中学习。这包括 将用户消息、助手响应和环境反馈存储并集成到 LTM 中, 以便在将来与当前任务相关时进行检索。
OpenAI最近将记忆功能融入到 ChatGPT 中。
观察这些公司还会发现,将记忆实现为 LLM 需要有意识调用的主动过程(ChatGPT)与自动合并的后台进程(TutorGPT)之间存在差异。
研究日记应用
为什么要使用日记应用程序?
当我们思考一个测试长期记忆的良好用例时,一个日记应用跃然纸上。主要原因是,我们相信这款应用的交互比标准的聊天应用包含更多需要记住的相关信息。
使用标准聊天应用程序时,可能会有很多多余的交流 – “嘿!”,“嗨”,“怎么了”等等。在日记设置中,您可以更快地分享真实,有趣的感受和见解。
尽管如此,我们还是想在这个应用中添加一个聊天组件。这样做的主要原因是为了表明我们的应用正在学习并记住用户的信息。它能够利用这些信息为用户提供个性化的回复。
在这里您可以看到,记住我是意大利美食的粉丝,锻炼后我会感到神清气爽。

添加你的第一篇日记并与我们的同伴聊天后,你会在导航栏中看到一个“回忆”按钮。点击此按钮将显示我们从你的日记中提取的所有主要回忆。

您会注意到列表很精简,包含的信息并不多。这些只是我们提取的最重要的、高层次的事实。在后台,我们还从您的条目中提取了更多事实,您可以搜索所有这些事实!
开始输入“搜索记忆…”输入,您将实时看到 LangFriend 存储的有关您的各种事实:

定制
我们希望尽可能让 LangFriend 对所有用户都具有吸引力。因此,我们允许任何人更新系统消息,这些消息会作为前缀,并设定与 LangFriend 聊天的基调。LangFriend 包含一个默认消息,我们精心设计了它以满足众多用户的需求。但是,如果您希望进行一些略微或完全不同的调整,您可以根据需要进行少量或大量更改。
找到系统提示符,并通过访问“日志”页面并点击“配置”按钮来更新它。从这里,将会弹出一个对话框,其中包含您的系统提示符。
所做的任何更改都将在会话之间保留,并将成为您所有未来聊天对话的前缀!
总体来说,这个App主要展示了Langmem的记忆能力并且予以扩展。
以下展示主要的记忆能力。
其中自行准备LLMProvider和嵌入模型。如有问题,加群问或联系我们
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph.store.memory import InMemoryStore
from langgraph.utils.config import get_store
from langmem import (
# Lets agent create, update, and delete memories
create_manage_memory_tool,
)
def prompt(state):
"""Prepare the messages for the LLM."""
# Get store from configured contextvar;
store = get_store() # Same as that provided to `create_react_agent`
memories = store.search(
# Search within the same namespace as the one
# we've configured for the agent
("memories",),
query=state["messages"][-1].content,
)
system_msg = f"""You are a helpful assistant.
## Memories
<memories>
{memories}
</memories>
"""
return [{"role": "system", "content": system_msg}, *state["messages"]]
store = InMemoryStore(
index={ # Store extracted memories
"dims": 1536,
"embed": "openai:text-embedding-3-small",
}
)
checkpointer = MemorySaver() # Checkpoint graph state
agent = create_react_agent(
"anthropic:claude-3-5-sonnet-latest",
prompt=prompt,
tools=[ # Add memory tools
# The agent can call "manage_memory" to
# create, update, and delete memories by ID
# Namespaces add scope to memories. To
# scope memories per-user, do ("memories", "{user_id}"):
create_manage_memory_tool(namespace=("memories",)),
],
# Our memories will be stored in this provided BaseStore instance
store=store,
# And the graph "state" will be checkpointed after each node
# completes executing for tracking the chat history and durable execution
checkpointer=checkpointer,
)
config = {"configurable": {"thread_id": "thread-a"}}
# Use the agent. The agent hasn't saved any memories,
# so it doesn't know about us
response = agent.invoke(
{
"messages": [
{"role": "user", "content": "Know which display mode I prefer?"}
]
},
config=config,
)
print(response["messages"][-1].content)
# Output: "I don't seem to have any stored memories about your display mode preferences..."
agent.invoke(
{
"messages": [
{"role": "user", "content": "dark. Remember that."}
]
},
# We will continue the conversation (thread-a) by using the config with
# the same thread_id
config=config,
)
# New thread = new conversation!
new_config = {"configurable": {"thread_id": "thread-b"}}
# The agent will only be able to recall
# whatever it explicitly saved using the manage_memories tool
response = agent.invoke(
{"messages": [{"role": "user", "content": "Hey there. Do you remember me? What are my preferences?"}]},
config=new_config,
)
print(response["messages"][-1].content)
# Output: "Based on my memory search, I can see that you've previously indicated a preference for dark display mode..."
Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/9735