当智能体需要在多次对话中持续记住用户偏好和历史交互时,可使用长期记忆功能实现跨会话的持久化记忆。开启后,智能体通过向量检索获取相关记忆数据,提供个性化响应。本文介绍如何开启长期记忆、管理记忆条目以及集成到智能体中使用。
什么是长期记忆
长期记忆(Long-Term Memory)用于跨会话持久化用户记忆数据。每条记忆以文本形式存储,关联到特定的 User ID、Agent ID 和 Run ID(可选),支持通过向量语义搜索快速检索。
长期记忆是记忆存储功能的三个子模块之一:
-
长期记忆
-
会话历史
-
会话状态
使用场景
-
用户偏好记忆:记住用户的语言偏好、常用设置等,在后续对话中自动应用
-
历史交互回顾:跨会话检索用户过往对话内容,避免重复提问
-
个性化推荐:基于用户历史行为和偏好,提供个性化的推荐和建议
前提条件
-
已创建记忆存储实例,可参考创建和管理记忆存储。
-
长期记忆需要配置大语言模型(LLM)和向量模型(Embedder),即
llmConfig和embedderConfig均非空
如果记忆存储创建时未配置 LLM 和向量模型,需在概览页的「长期记忆」卡片中点击开启长期记忆按钮,然后在弹出的配置面板中手动填写 LLM 和向量模型信息。
限制说明
|
限制项 |
说明 |
|
列表默认加载上限 |
200 条,更多记忆请使用搜索功能 |
|
搜索条件要求 |
需同时提供搜索关键词和至少一个 ID(User ID / Agent ID / Run ID) |
|
向量数据库支持 |
长期记忆支持 OTS(表格存储)和 RDS(MySQL)两种向量数据库类型 |
计费说明
长期记忆功能本身不收取功能费用,但会消耗以下付费资源:
-
LLM 模型调用:用于记忆内容生成和处理,按大语言模型服务计费
-
向量检索:记忆搜索时触发,按向量模型服务计费
-
存储资源:OTS 表格存储或 RDS MySQL,按各自产品的存储和读写容量计费
各资源的计费详情参见对应产品的计费文档。
管理记忆
在记忆存储实例详情页,选择长期记忆,管理记忆条目。在集成与使用中,可了解如何通过 MCP 集成和代码集成方式使用记忆能力。
添加记忆
-
进入记忆存储实例详情页,选择长期记忆。
-
点击添加记忆按钮,打开添加用户记忆表单。
-
填写记忆信息:
字段
说明
示例
用户ID
必填,标识记忆所属的用户
test-user-001记忆内容
必填,记忆的具体内容
居住在杭州
元数据
可选,自定义键值对。点击添加元数据动态增加
{"category": "food"}
-
点击保存,等待创建完成。
首次调用 API 可能存在冷启动延迟,操作后等待 10~30 秒再重试即可。
创建成功后,记忆出现在记忆列表中,显示用户 ID、创建时间、记忆内容等信息。每个记忆卡片提供查看详情、编辑、查看历史、删除等操作按钮。
查看记忆列表
记忆列表默认展示最多 200 条记忆。每条记忆卡片包含以下信息:
-
第一行:User ID(粗体),搜索模式下额外显示匹配度分数标签
-
第二行:记忆内容原文
-
第三行:元信息格式为
{Agent ID} · {Run ID} · {日期},Agent ID 和 Run ID 为可选,无值时不显示
支持通过复选框批量选择记忆条目。当有选中项时,列表右上角出现批量删除按钮。
搜索和筛选记忆
当记忆数量超过 200 条时,使用搜索功能查找特定记忆。搜索时需同时提供关键词和至少一个 ID(User ID / Agent ID / Run ID)。
-
在记忆列表页面顶部的搜索框中输入关键词。
-
展开高级筛选面板,填写至少一个筛选条件(用户 ID、Agent ID 或 Run ID)。
-
搜索结果按向量相似度从高到低排序,每条结果显示匹配度分数。
仅输入关键词会报错"请打开高级筛选,用户 ID、Agent ID 或 Run ID 至少需要填写一个";仅输入 ID 无关键词会报错"请输入搜索查询内容"。
高级筛选条件
|
筛选条件 |
占位符 |
说明 |
|
用户 ID |
输入用户 ID |
按用户标识筛选 |
|
Agent ID |
输入 Agent ID |
按 Agent 标识筛选 |
|
Run ID |
输入 Run ID |
按 Run 标识筛选 |
支持同时填写多个 ID 进行筛选,至少需填写一项。点击应用执行筛选,点击重置清空条件。
查看记忆详情
-
在记忆列表中,点击记忆卡片右侧的查看按钮(Eye 图标)。
-
详情抽屉展示以下信息:
-
Memory ID、User ID、Agent ID(无值显示 -)、Run ID(无值显示 -)、创建时间
-
记忆内容区域,保留原始换行格式
-
元数据区域(如有),以 JSON 格式展示
-
修改记忆
-
在记忆列表中,点击目标记忆右侧的编辑按钮。
-
在编辑表单中修改记忆内容字段。
-
点击保存更改。
编辑表单底部展示 User ID、Agent ID、Run ID、创建时间和更新时间等只读信息。
删除记忆
单条删除
-
在记忆列表中,点击目标记忆右侧的删除按钮。
-
在确认对话框中确认记忆内容预览,点击确认删除。
批量删除
-
在列表中,通过复选框勾选多条记忆,或点击「全选」复选框。
-
点击列表上方的批量删除按钮。
-
在确认对话框中点击确认。
批量删除采用逐条并行方式,部分成功时会提示成功数和失败数。删除操作不可恢复。
查看记忆历史
记忆的版本历史记录了每次新增、更新、删除操作的变更轨迹。
-
在记忆详情抽屉中,点击查看历史按钮。
-
历史列表按时间倒序排列,每条记录包含:
-
版本信息:版本号 + 「当前版本」标签(最新版本)+ 事件类型(新增/更新/删除)
-
时间戳:格式为 YYYY/MM/DD HH:mm:ss
-
操作者:actor_id + role(如有)
-
记忆内容:当前版本的记忆文本
-
变更详情(如有变更):旧值(红色背景)和新值(绿色背景)对比
-
|
事件类型 |
标签颜色 |
说明 |
|
新增(ADD) |
绿色 |
创建新记忆 |
|
更新(UPDATE) |
蓝色 |
修改记忆内容或元数据 |
|
删除(DELETE) |
红色 |
删除记忆 |
集成与使用
MCP 集成
记忆存储支持通过 MCP(Model Context Protocol)服务将记忆能力集成到智能体中。在 MCP 集成中,可以启动/关闭 MCP 服务、获取服务 URL、查看动态配置,并将服务接入智能体。
MCP 服务状态
MCP 服务状态包括:
|
状态 |
说明 |
可执行操作 |
|
未启动 |
MCP 服务尚未启动 |
点击启动服务配置按钮 |
|
启动中 |
服务正在部署中,等待部署完成 |
无需操作,等待状态变为运行中或启动失败 |
|
运行中 |
MCP 服务已就绪,可正常使用 |
查看 MCP 配置或关闭服务 |
|
启动失败 |
服务部署失败,通常因权限不足或配置异常导致 |
检查权限或配置后重新启动服务配置 |
启动 MCP 服务
-
在记忆存储实例详情页,选择长期记忆,切换到MCP集成。
-
若 MCP 服务状态为未启动,点击启动服务配置按钮。
-
检查权限:系统需要
AliyunDevsFCServicesDeployPolicy策略。若提示权限缺失,前往 RAM 控制台为当前账号授予该策略,然后返回重新点击启动服务配置。 -
等待系统自动安装 Toolset 并检查状态,直至达到终态:
-
Toolset 状态为
Installed且internetUrl存在 → 服务状态变为运行中 -
Toolset 状态为
Failed→ 服务状态变为启动失败
-
-
服务启动成功后,页面展示两个子 Tab:
-
配置MCP服务器:展示动态生成的 MCP 配置 JSON,包含 MCP 服务 URL 和工具定义,可直接复制到智能体配置中使用
-
使用MCP工具:提供 JavaScript 代码示例,演示如何在代码中调用 MCP 工具
-
获取 MCP 服务 URL
MCP 服务 URL 是智能体连接记忆存储的端点地址。服务启动成功后,可在配置 MCP 服务器子 中的配置 JSON 里获取,该 URL 来源于 Toolset 部署成功后的 toolset.status.outputs.urls.internetUrl 字段。
查看动态 MCP 配置
服务启动成功后,在配置 MCP 服务器子 中展示动态生成的 JSON 配置。该配置包含 MCP 服务 URL 和可用工具定义,会随服务状态实时更新。将此配置复制到智能体的 MCP 服务配置中,即可在运行时通过 MCP 工具访问记忆存储。
关闭 MCP 服务
-
在 MCP 集成页面,点击关闭服务按钮。
-
在确认关闭MCP服务对话框中确认操作。单击确认关闭后系统将删除工具集。
关闭服务将删除工具集,此操作不可恢复。关闭后需重新启动服务才能使用 MCP 功能。
关闭成功后,服务状态变为未启动,配置 MCP 服务器和使用 MCP 工具子 将不再显示。
接入智能体
MCP 服务运行中后,在创建智能体时,在记忆配置项中选择已创建的记忆存储实例,并启用 MCP 选项。智能体即可在运行时通过 MCP 工具访问记忆存储。
代码集成
通过 AgentRun SDK 可集成记忆存储功能。以下示例演示如何通过 MemoryCollection 获取记忆存储配置,并转换为 mem0 Memory 客户端进行记忆操作。
环境准备
-
安装 AgentRun SDK:
pip install agentrun -
配置访问凭据。确保已设置环境变量
ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,SDK 将自动读取这些凭据进行身份验证。 -
将示例代码中的记忆存储名称
mem-OGzJ替换为您自己的记忆存储实例名称,实例名称可在记忆存储列表页面查看。
如果记忆存储使用 RDS(MySQL)向量数据库,本地调试需配置环境变量 AGENTRUN_MYSQL_PUBLIC_HOST 为 MySQL 公网地址,并将本地出口 IP 加入 RDS 白名单,否则连接会失败。
from agentrun.memory_collection import MemoryCollection
# 获取记忆存储META信息
memory_collection = MemoryCollection.get_by_name("mem-OGzJ")
print(f"获取成功: {memory_collection}")
# 转换为mem0_memory客户端
memory = MemoryCollection.to_mem0_memory("mem-OGzJ")
# 使用mem0ai Memory客户端进行操作
user_id = "user123"
# 添加记忆
result = memory.add(
"我喜欢吃苹果和香蕉",
user_id=user_id,
metadata={"category": "food"},
)
for idx, res in enumerate(result.get("results", []), 1):
print(f" {idx}. ID: {res.get('id')}, 事件: {res.get('event')}")
# 搜索记忆
search_results = memory.search("用户喜欢吃什么水果?", user_id=user_id)
for idx, result in enumerate(search_results.get("results", []), 1):
print(
f" {idx}. 内容: {result.get('memory')}, 相似度: {result.get('score', 0):.4f}"
)
生态集成
记忆存储可与 LangChain 等开源智能体开发框架集成,实现基于记忆的对话系统。以下示例展示如何将记忆存储集成到 LangChain 对话链中,实现基于历史记忆的个性化响应。
运行以下示例前,需先完成环境准备(安装 SDK、配置访问凭据等),参见上方环境准备。示例代码中的记忆存储名称需替换为您自己的实例名称。
from typing import List, Dict
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from agentrun.integration.langchain import model
from agentrun.memory_collection import MemoryCollection
# 从模型名称创建
llm = model("qwen3-max")
# 从记忆存储名称创建
mem0 = MemoryCollection.to_mem0_memory("mem-OGzJ")
prompt = ChatPromptTemplate.from_messages([
SystemMessage(content="""You are a helpful travel agent AI. Use the provided context to personalize your responses and remember user preferences and past interactions.
Provide travel recommendations, itinerary suggestions, and answer questions about destinations.
If you don't have specific information, you can make general suggestions based on common travel knowledge."""),
MessagesPlaceholder(variable_name="context"),
HumanMessage(content="{input}")
])
def retrieve_context(query: str, user_id: str) -> List[Dict]:
"""Retrieve relevant context from Mem0"""
try:
memories = mem0.search(query, user_id=user_id)
memory_list = memories['results']
print(f"Memory search successfully: {memory_list}")
serialized_memories = ' '.join([mem["memory"] for mem in memory_list])
context = [
{
"role": "system",
"content": f"Relevant information: {serialized_memories}"
},
{
"role": "user",
"content": query
}
]
return context
except Exception as e:
print(f"Error retrieving memories: {e}")
# Return empty context if there's an error
return [{"role": "user", "content": query}]
def generate_response(input: str, context: List[Dict]) -> str:
"""Generate a response using the language model"""
chain = prompt | llm
response = chain.invoke({
"context": context,
"input": input
})
return response.content
def save_interaction(user_id: str, user_input: str, assistant_response: str):
"""Save the interaction to Mem0"""
try:
interaction = [
{
"role": "user",
"content": user_input
},
{
"role": "assistant",
"content": assistant_response
}
]
result = mem0.add(interaction, user_id=user_id)
print(f"Memory saved successfully: {len(result.get('results', []))} memories added")
except Exception as e:
print(f"Error saving interaction: {e}")
def chat_turn(user_input: str, user_id: str) -> str:
# Retrieve context
context = retrieve_context(user_input, user_id)
# Generate response
response = generate_response(user_input, context)
# Save interaction
save_interaction(user_id, user_input, response)
return response
if __name__ == "__main__":
print("Welcome to your personal Travel Agent Planner! How can I assist you with your travel plans today?")
user_id = "alice"
while True:
user_input = input("You: ")
if user_input.lower() in ['quit', 'exit', 'bye']:
print("Travel Agent: Thank you for using our travel planning service. Have a great trip!")
break
response = chat_turn(user_input, user_id)
print(f"Travel Agent: {response}")
故障排查
开启长期记忆失败
|
现象 |
可能原因 |
处理方法 |
|
无法选择大语言模型或向量模型 |
尚未创建模型服务 |
先通过添加模型创建模型服务,然后再开启长期记忆 |
|
无法选择执行角色 |
RAM 角色未授权 OTS 或 AgentRun 访问权限 |
在 RAM 控制台为角色添加 |
MCP 服务启动失败
|
现象 |
可能原因 |
处理方法 |
|
MCP 服务状态显示为启动失败 |
缺少 |
前往 RAM 控制台为当前账号授予该策略,然后返回 MCP 集成页面重新点击启动服务配置 |
|
MCP 服务状态显示为启动失败 |
记忆存储配置异常(如 LLM 或向量模型未正确配置) |
在记忆存储实例详情页的概览页确认长期记忆已正确配置,然后重新启动 MCP 服务 |
添加记忆失败
|
现象 |
可能原因 |
处理方法 |
|
首次添加记忆时响应超时或报错 |
首次调用存在冷启动延迟 |
首次操作后等待 10~30 秒,重试即可 |
|
提示「用户ID不能为空」 |
User ID 字段为空 |
填写有效的 User ID 后重新提交 |
|
提示「记忆内容不能为空」 |
记忆内容字段为空 |
填写有效的记忆内容后重新提交 |
搜索记忆失败
|
现象 |
可能原因 |
处理方法 |
|
提示「请打开高级筛选,用户 ID、Agent ID 或 Run ID 至少需要填写一个」 |
仅输入关键词,未填写任何 ID |
展开高级筛选面板,至少填写一个 ID(User ID / Agent ID / Run ID) |
|
提示「请输入搜索查询内容」 |
仅填写了 ID,未输入搜索关键词 |
在搜索框中输入搜索关键词 |