|
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin-top: 30px;margin-bottom: 15px;"> | 一、困境:记忆越多越聪明,但Token有上限 |
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">在AI对话系统开发中,我们面临一个经典的矛盾: 记忆越多,AI表现越"聪明",但记忆多了又会触发Token上限。 ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin-top: 20px;margin-bottom: 25px;"> 很多开发者会说:“我已经用Redis/数据库存储所有对话历史了。” 但这只解决了服务端存储性能问题,并没有解决核心矛盾——当对话记录积累到一定程度,依然会超过模型的上下文窗口限制。 | |
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">我们恰恰希望存储更多的聊天记录,因为只有这样,AI才能真正做到"像人一样"对话。问题的本质是:
不是存不存得下,而是“传给模型”时受限于Token上限。
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin-top: 30px;margin-bottom: 15px;">
二、破局之道:多层次记忆架构 |
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">人类大脑处理记忆的方式给了我们启发:不是所有信息都需要时刻在"工作台"上,记忆应该分层管理,按需调取。由此,我们设计了一个三层记忆架构。
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin: 25px 0px;">
| 第一层:近期记忆 (Short-term)策略:保留最近的10 条对话,维持即时连贯性。 |
| ↓ |
| 第二层:中期记忆 (Mid-term)策略:通过 RAG 检索与当前最相关的5 条历史对话。 |
| ↓ |
| 第三层:长期记忆 (Long-term)策略:固化总结关键信息,形成用户画像/知识摘要。 |
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin-top: 25px;margin-bottom: 15px;">
2.1 第一层:近期记忆 (Short-term Memory) |
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">这是AI的"工作记忆",通过一个固定大小的滑动窗口(如最近10轮对话)来维持对话的流畅性。超出部分自动"降级"到中期记忆。
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.5px;orphans: 2;text-align: start;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;width: 357.273px;border-collapse: collapse;margin-top: 15px;margin-bottom: 15px;">
// 使用Spring AI的ChatMemory MessageChatMemory chatMemory =newInMemoryChatMemory(); chatMemory.add(newUserMessage(userInput)); chatMemory.add(newAssistantMessage(aiResponse)); if(chatMemory.get().size() > 10) { archiveToMidTerm(chatMemory.get(0));// 异步转存 }
|
2.2 第二层:中期记忆 (Mid-term Memory) |
核心是RAG(检索增强生成)。它不按时间顺序,而是按"语义相似度"从海量历史中检索出最相关的5条记录,从而破解时间限制,节省Token。
2.3 第三层:长期记忆 (Long-term Memory) |
这一层不是存储对话原文,而是存储**精华的结构化总结**,类似于人类的"长期记忆"。我们提供两种实现方式:
通过定时任务(如每天凌晨)批量处理对话,提炼用户偏好和关键事实。这种方式成本低,适合大规模处理。
@Scheduled(cron ="0 0 2 * * ?")// 每天凌晨2点 publicvoidbatchProcessMemory() { List<Conversation> conversations = getRecentConversations(); String summary = llm.call("分析对话,提取偏好..."); longTermMemoryRepo.save(summary); }
|
在对话中实时识别关键信息点(如用户明确表达偏好、提供个人信息),并立即提取存储。这种方式响应快,用户体验好。
触发器示例: 用户说:“以后回答我时都用代码示例。” 系统立即触发,更新长期记忆中的规则:`response_format: code_examples`。 |
|
| ↓ |
| ① 加载近期记忆 |
| ↓ |
| ② RAG检索中期记忆 |
| ↓ |
| ③ 读取长期记忆 |
| ↓ |
|
| ↓ |
|
Token估算:近期(~1500) + 中期(~800) + 长期(~200) ≈2500 Tokens。远低于上限,且信息高度相关! |
多层次记忆架构的核心思想是:模拟人类记忆的分层特性,让AI在有限的Token预算内,拥有近乎无限的记忆能力。
这不仅是技术问题的解决方案,更是AI从"对话工具"向"智能伙伴"进化的关键一步。