为什么需要记忆系统?
- • 大模型本身不存在记忆能力——如果开发agent应用,需要外挂记忆系统进行信息的记忆
- • 大模型本身的上下文阈值是有限的,没有办法直接给它所有的对话或者文本内容,超出后早期对话内容会被丢弃,导致多轮对话中出现“断片”或重复提问。记忆系统通过分层存储(短期/长期记忆)和动态检索(如向量数据库),将历史信息压缩后注入当前上下文,确保对话连贯性。
开发agent系统中,上下文内容该怎么做管理?
我们可以以一个最简对话系统为例,结合短期、中期、长期记忆进行分层处理:
- •短期记忆:聚焦当前对话的最近信息,直接将最新消息体输入模型。这类似大脑对当下信息的清晰即时记录,确保模型能响应最新对话内容。
- •中期记忆:由于模型存在阈值容量限制,需对当前对话中的关键信息进行摘要处理。这如同大脑在记忆容量有限时,自动将知识压缩为核心要点(非逐字记忆,而是保留关键内容),让模型抓住对话的核心逻辑。
- •长期记忆:通过RAG(检索增强生成)等技术,在用户提问时调用外部知识库,提取已沉淀的长期记忆内容。这一机制类比大脑调用过往经验与知识储备,为对话提供更丰富的背景信息支撑。
实际开发中可能遇到的问题
1)messages消息体如何组织?
message数组样例如下,具体role有 system、user、tool、assistant。
- • system:对话的全局导演,设定模型的行为框架和初始规则。交互框架的 “设计者” 与 “规则制定者”。
- • user:交互的 “需求发起者” 与 “信息输入方”。
- • tool:交互中的 “功能执行者” 与 “数据提供者”。
- • assistant:交互的 “问题解决者” 与 “内容整合者”。
messages = [
{
"role":"system",
"content":"""你是一个很有帮助的助手。如果用户提问关于天气的问题,请调用 ‘get_current_weather’ 函数;
如果用户提问关于时间的问题,请调用‘get_current_time’函数。
请以友好的语气回答问题。""",
},
{
"role":"user",
"content":"深圳天气"
}
]
print("messages 数组创建完成\n")
2)上述messages超过模型阈值了怎么办?
由于大模型的阈值始终有限,上述的消息体在一定的对话回复轮次之后会超出大模型的上下文窗口限制。最简单的做法直接如基于时间衰减(近期对话优先保留)或重要性排序(关键信息优先),避免记忆冗余。
| 方法名称 | 核心思路 | 实现步骤 | 优点 | 缺点 |
| 简单截断法 | | 1. 统计每条token数;2. 从最新往前累加;3. 超限时丢弃旧消息 | | |
| 优先级保留法 | 按消息优先级(如system>user>assistant)保留 | 1. 统计token和优先级;2. 按优先级填充直到阈值 | | |
| 摘要压缩法 | | 1. 统计总token数;2. 超限时摘要最早消息;3. 用summary替换多条消息 | | |
| 滑动窗口法 | | | | |
| 动态分段法 | | 1. 按token数分段; 2. 只处理当前段或分批处理 | | |
| 混合策略法 | | 1. 摘要早期消息;2. 保留最新消息;3. 优先级和特殊规则 | | |
3)可能需要调度历史的其他对话消息或者其他信息怎么办?
可以将这些可能需要的信息汇总成一个知识库,然后在实际用户提问的时候,通过RAG的技术来做检索内容→增强内容→生成最后的答案。