ai长期记忆项目功能
┌──────────────────────────────┐ │ 用户输入 │ │ (user_input) │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ Recall Classifier(判定) │ │ - 是否需要长期记忆? │ │ - 是否需要短期记忆? │ │ (LLM / 规则) │ └───────┬──────────────┬───────┘ │否长期 │是长期 │ │ ▼ ▼ 不加载长期记忆 精准长期记忆检索 仅用上下文 (结构化 DB + 长期向量库) │ ▼ 是否使用短期记忆? │否 │是 ▼ ▼ 不加载短期记忆 加入 Redis 原始对话缓存 仅用上下文 - user + assistant - session_id - TTL (1h / 24h) - 直接参与下轮 prompt │ ▼ ┌──────────────────────────────┐ │ Prompt Builder │ │ - 已确认长期记忆(DB/Milvus) │ │ - 短期对话(Redis 原始缓存) │ │ - 当前 user_input │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ LLM 推理 │ │ (一次性、无状态) │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ 返回给用户的回答 │ │ (assistant_output) │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ Redis 会话缓存(原始对话) │ │ - 每轮对话自动加入 │ │ - 短期记忆直接参与下轮 prompt │ │ - TTL 控制生命周期 │ └──────────────┬───────────────┘ │ (异步 / 定时触发) ▼ ┌──────────────────────────────┐ │ Memory Extraction 阶段 │ │ - 从 Redis 拉取最近 N 小时对话│ │ - 由 LLM 提炼候选长期记忆 │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ Memory Gate(审查) │ │ - 是否长期稳定? │ │ - 是否用户确认? │ │ - confidence ≥ 阈值? │ └───────┬──────────────┬───────┘ │否 │是 ▼ ▼ ┌───────────────┐ ┌────────────────────────────┐ │ 丢弃 / 忽略 │ │ 写入长期存储 │ │ 防污染 │ │ │ └───────────────┘ │ ① 结构化 DB(事实真理源) │ │ ② 长期向量库(Milvus) │ │ - 摘要文本 + embedding │ └──────────┬─────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 冲突处理 / 衰减 / 覆盖 │ │ - 新事实覆盖旧事实 │ │ - 长期不用 → 降 confidence │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ 清理 Redis 会话 │ │ (或等待 TTL 自动过期) │ └──────────────────────────────┘
ai调用归纳
1、判断是否需要长期/短期记忆必须调用
2、redis临时记忆整理必须调用
3、用户对话,必须调用
用户输入 │ ▼ 1️⃣ Recall Classifier → 决定是否调用短期/长期记忆 │ ▼ 2️⃣ 拼装 Prompt(长期记忆 + 短期 Redis 对话 + 当前输入) │ ▼ 3️⃣ 用户对话生成回答 → 返回用户 + 写入 Redis 短期缓存 │ ▼ 4️⃣ (异步/定时) Redis 临时记忆整理 → Memory Extraction → Memory Gate → 写入长期存储
整个流程就是,用户输入消息给后端,后端接收到消息调用ai根据规则判断是否需要使用长期/短期记忆,输出是或否,更具ai返回的内容来进行数据查找拼接,例如需要长期记忆就调用向量数据库查看内容和propt和用户输入内容拼接然后丢给ai,如需要使用临时记忆就在redis当中将临时记忆和propt和用户输入拼接丢给ai,如既需要长期又需要短期则一起拼接出来丢给ai。强制要求一个格式比如对话后必须加入[摘要]。。。。,然后用正则给用户的回复的内容去掉这个摘要,将用户的输入和ai的回答[摘要]后面的内容存储在redis当中,这里也要加入一个规则限制考虑添加后端校验逻辑,如果格式不对就重试AI调用。如果用户停止对话超过 N 分钟自动调用ai总结以下redis当中的内容,然根据规则判断是需要写入向量数据库当中。向量数据库当中的内容也要有两个功能,能被用户新的记忆覆盖老的记忆,无用的记忆随着时间衰减。这样的一个带有记忆的长期ai应该就能很好的运行了吧。反馈循环:让用户能手动标记“记住这个”或“忘记那个”,直接影响记忆存储。
记忆拼接前优化建议:在拼接前用AI或工具(如LangChain的summarizer)进一步压缩记忆内容(e.g., 只取top-K相关向量)。监控token使用,如果超限,优先短期记忆。
后续优化重点
向量覆盖策略、衰减算法、prompt模板