今天我们发布 LangMem SDK,一个帮助您的代理通过长期记忆学习和改进的库。
它提供工具来从对话中提取信息,通过提示更新优化代理行为,并维护关于行为、事实和事件的长期记忆。
您可以将其核心 API 与任何存储系统和任何代理框架一起使用,并且它与 LangGraph 的长期记忆层原生集成。我们还推出了一个托管服务,免费提供额外的长期记忆结果 - 如果您有兴趣在生产中使用它,请在此处注册。
我们的目标是让任何人都能更轻松地构建随着时间推移变得更智能、更个性化的 AI 体验。这项工作建立在我们之前托管的 LangMem alpha 服务和 LangGraph 持久的长期记忆层工作之上。
要安装,只需运行
pip install -U langmem
快速链接
关于记忆和自适应代理
代理使用记忆来学习,但记忆形成、存储、更新和检索的方式会影响您的代理可以学习知道或做的事情类型。在 LangChain,我们发现首先确定您的代理需要能够学习的能力,将这些能力映射到特定的记忆类型或方法,然后才在您的代理中实现它们非常有用。在添加记忆之前,我们认为您应该考虑
- 哪些行为应该被学习(用户知情)而不是预定义的?
- 应该跟踪哪些类型的知识或事实?
- 哪些条件应该触发记忆被回忆?
虽然可能存在一些重叠,但在构建自适应代理时,每种记忆类型都有不同的功能
记忆类型 | 目的 | 代理示例 | 人类示例 | 典型存储模式 |
---|---|---|---|---|
语义记忆 | 事实与知识 | 用户偏好;知识三元组 | 知道 Python 是一种编程语言 | 配置文件或集合 |
情景记忆 | 过去的经验 | 少量示例;过去对话的摘要 | 记住您上班的第一天 | 集合 |
程序性记忆 | 系统行为 | 核心个性和响应模式 | 知道如何骑自行车 | 提示规则或集合 |
那么,重新审视我们上面的问题
- 哪些行为应该被学习而不是固定的? 您代理行为的某些方面可能需要根据反馈和经验进行调整,而其他方面应保持一致。这将指导您是否需要程序性记忆来进化行为模式,或者固定的提示规则是否足够。这在精神上类似于 OpenAI 模型规范中“指挥链”的概念,因为学习到的行为是由用户交互塑造的。
- 应该跟踪哪些类型的知识或事实?
不同的用例需要不同类型的知识持久性。您可能需要语义记忆来维护关于用户或领域的事实,情景记忆来从成功的交互中学习,或者两者协同工作。 - 哪些条件应该触发记忆被回忆?
一些记忆(核心程序性记忆)可能是数据独立的 - 它们始终存在于提示中。有些是数据相关的,可能会根据语义相似性被回忆起来。其他记忆可能基于应用程序上下文、相似性、时间等的组合而被回忆起来。
一个相关的担忧是记忆隐私。在 LangMem 中,所有记忆都被赋予一个命名空间。最常见的命名空间将包括 use_id,以防止用户记忆的交叉。一般来说,记忆可以限定于特定的应用程序路由、单个用户、团队共享,或者代理可以学习跨所有用户的核心程序。记忆共享的程度由隐私和性能需求共同决定。
所有这些记忆类型都旨在解决超出单个对话的回忆。给定对话或线程内的记忆已经通过 LangGraph 中的检查点处理得相当好(只要它不超出模型的有效上下文窗口),这可以作为您的代理的“短期”或“工作”记忆系统。
请注意,这在几个方面也不同于标准 RAG。一种是信息获取的方式:通过交互而不是离线数据摄取。另一种是优先考虑的信息类型。下面,我们将更详细地分享关于记忆类型的信息。
语义记忆:事实
语义记忆存储关键事实(及其关系)和其他信息,这些信息是代理响应的基础。它让您的代理记住重要的细节,这些细节不会“预训练”到模型本身中,并且无法从网络搜索或通用检索器访问。

代码
from langmem import create_memory_manager
manager = create_memory_manager(
"anthropic:claude-3-5-sonnet-latest",
instructions="Extract user preferences and facts",
enable_inserts=True
)
# Process conversation to extract facts
conversation = [
{"role": "user", "content": "Alice manages the ML team and mentors Bob, who is also on the team."}
]
memories = manager.invoke({"messages": conversation})
# Extract and store new knowledge
conversation2 = [
{"role": "user", "content": "Bob now leads the ML team and the NLP project."}
]
update = manager.invoke({"messages": conversation2, "existing": memories})
memories = [
ExtractedMemory(
id="27e96a9d-8e53-4031-865e-5ec50c1f7ad5",
content=Memory(
content="Alice manages the ML team and mentors Bob, who is also on the team."
),
),
ExtractedMemory(
id="e2f6b646-cdf1-4be1-bb40-0fd91d25d00f",
content=Memory(
content="Bob now leads the ML team and the NLP project."
),
),
]
根据我们的经验,语义记忆是工程师在首次寻求添加记忆层时最常要求和想象的“记忆”形式(也许在短期“对话历史”记忆之后)。
它也(可以说是)与传统的 RAG 系统有最多的重叠。如果知识可以从另一个存储库(文档站点、代码库等)获得,并且如果该存储库是真理的来源(而不是交互本身),那么您的代理可能只需直接检索该知识语料库即可正常工作。或者您可以定期摄取该知识以将其集成到语义记忆系统中。如果知识是关于个性化(关于用户)或在原始材料中找不到的概念关系,那么语义记忆非常适合您。
程序性记忆:进化行为
程序性记忆代表了执行任务的方法的内在知识。它与情景记忆不同,因为它侧重于通用的技能、规则和行为。对于 AI 代理,程序性记忆保存在模型权重、代理代码和代理提示的组合中,这些共同决定了代理的功能。在 LangMem 中,我们专注于将学习到的程序保存为代理提示中的更新指令。

代码
from langmem import create_prompt_optimizer
trajectories = [
(
[
{"role": "user", "content": "Tell me about Mars"},
{"role": "assistant", "content": "Mars is the fourth planet..."},
{"role": "user", "content": "I wanted more about its moons"},
],
{"score": 0.5, "comment": "Missed key information about moons"}
)
]
optimizer = create_prompt_optimizer(
"anthropic:claude-3-5-sonnet-latest",
kind="metaprompt",
config={"max_reflection_steps": 3}
)
improved_prompt = optimizer.invoke({
"trajectories": trajectories,
"prompt": "You are a planetary science expert"
})
"""
You are a helpful assistant..
If the user asks about astronomy, explain topics clearly using real-world examples and current scientific data.
Use visual references when helpful and adapt to the user's knowledge level.
Balance practical observational astronomy with theoretical concepts, providing either viewing advice or technical explanations based on user needs.
"""
优化器被提示识别成功和不成功交互中的模式,然后更新系统提示以加强有效的行为。这创建了一个反馈循环,代理的核心指令根据观察到的性能而进化。
根据我们在提示优化方面的工作,LangMem 提供了多种用于生成提示更新建议的算法,包括:metaprompt
使用反思和额外的“思考”时间来研究对话,然后使用元提示来提出更新;gradient
明确地将工作划分为批判和提示建议的单独步骤,以进一步简化每个步骤的任务;以及一个简单的 prompt_memory
算法,试图在一个步骤中完成上述操作。
情景记忆:事件和经验
情景记忆存储过去交互的记忆。它与程序性记忆不同,因为它侧重于回忆特定的经验。它与语义记忆的区别在于它侧重于过去的事件而不是一般的知识,回答代理“如何”解决特定问题,而不仅仅是“什么”答案。它通常采用少量示例的形式,每个示例都从较长的原始交互中提取出来。LangMem 尚不支持情景记忆的倾向性实用程序。
立即试用
查看文档,了解有关如何使用 LangMem 实现自定义记忆系统的更多示例,包括关于如何
- 创建一个主动管理自身记忆的代理
- 在代理之间共享记忆
- 命名空间记忆以按用户或团队组织信息。
- 将 LangMem 集成到您的自定义框架中
如果您的团队想为您的代理添加个性化或终身学习功能,请填写我们的兴趣表单。
加入我们的团队
我们正在招聘工程师来构建世界上最好的自适应代理运行时。如果您有兴趣与我们一起设计和构建,请查看我们的空缺职位。