langchain短期 + 长期记忆架构

langchain短期 + 长期记忆架构

整体架构

复制代码
  用户输入
      │
      ├── 短期记忆(WindowMemory)── 内存,最近 K 条消息
      │
      ├── 长期记忆(ChromaDB) ──── 语义检索,历史重点
      │
      ├── 知识库(ChromaDB) ────── 文档检索
      │
      └── 拼接 Prompt → LLM → 输出
                              │
                              ├── 写入短期窗口(内存)
                              ├── 写入 MySQL(完整备份)
                              └── 后台提取长期记忆点 → 写入 ChromaDB

三层存储

层级 存储 数据源 用途 容量
短期 内存 OrderedDict 当前会话实时写入 最近 K 轮对话连贯性 k × 2 条消息
长期 ChromaDB longMemory 集合 每次回复后 AI 自动提取 跨 session 的语义记忆 无限制
备份 MySQL chat_messages 表 每次对话实时写入 前端历史展示、审计 无限制

短期记忆(WindowMemory)

实现

python 复制代码
# memory_manager.py
class MemoryManager:
    def __init__(self, window_k=2):
        self.window_k = window_k
        self._windows = OrderedDict()

    def get_context(self, session_id):
        """返回窗口内的最近消息"""
        memory = self.get_window(session_id)
        return memory.load_memory_variables({})["history"]

机制

  • 每个 session 独立一个 ConversationBufferWindowMemory(k=2)
  • k=2 表示保留最近 2 轮对话(= 4 条消息:2 条 user + 2 条 assistant)
  • 新消息通过 save_context 写入,超出 K 轮自动丢弃最早的消息
  • 纯内存操作,不查数据库

写入时机

python 复制代码
# streamInvoke 中
self.memoryger.get_window(session_id).chat_memory.add_user_message(question)
...
self.memoryger.get_window(session_id).chat_memory.add_ai_message(answer)

长期记忆(ChromaDB)

提取

每次对话完成后,后台线程调用 LLM 从对话中提取关键信息:

python 复制代码
# langchain_chat.py generateSummary()
prompt = """
总结以下对话的核心语义。
保留:任务目标、问题描述、解决方案、重要约束
忽略:礼貌用语、重复内容、确认性回复
如果没有任何实质性内容,返回:NONE

用户:...  AI:...

总结:"""

提取结果存入 ChromaDB 的 longMemory 集合:

python 复制代码
chromadb.write_long_memory(
    texts=["提取的摘要"],
    metadata_list=[{"session_id": "xxx"}]
)

检索

用户提问时,从 longMemory 集合中按 session 检索相关内容:

python 复制代码
longMemoryter = chromadb.get_long_memory_retrieve(
    k=10,
    filter={"session_id": input_data.session_id}
)
longMemorys = longMemoryter.invoke(input_data.question)

Prompt 组装

最终发给 LLM 的 prompt 结构:

复制代码
历史对话摘要(ChromaDB 长期记忆):
{longMemorys}

最近通话记录(WindowMemory 短期窗口):
{recentHistory}

资料(知识库 RAG 检索):
{docs}

用户问题:
{input}

各模块职责

模块 文件 职责
MemoryManager memory_manager.py 管理短期窗口,按 session 隔离
Chromadb langchain_chromadb.py 知识库 + 长期记忆的向量存储
LangchainChat langchain_chat.py 主流程编排,流式对话
FinishReasonHandler langchain_chat.py 检测 LLM 输出是否被截断

数据流完整链路

复制代码
用户发送消息
    │
    ▼
1. 从 MemoryManager 取短期窗口消息 ── 内存,不查 DB
2. 从 ChromaDB 检索长期记忆 ──────── 按 session_id 语义检索
3. 从 ChromaDB 检索知识库 ────────── RAG 检索
4. 拼接 Prompt → LLM 流式生成
    │
    ▼
流式输出到前端
    │
    ▼
完成后:
    ├── 写入短期窗口(MemoryManager)
    ├── 写入 MySQL(create_chat_message)
    └── 后台线程 → LLM 提取摘要 → 写入 ChromaDB longMemory

版本历史

版本 变更
v1 MySQL 全量加载 + ContextBudget 手动截断
v2 ConversationSummaryBufferMemory 压缩摘要
v3 短期窗口 + ChromaDB 长期记忆(当前)
相关推荐
dozenyaoyida6 小时前
AI与大模型新闻日报 | 2026-10-17
人工智能·ai·chatgpt·新闻
遇码6 小时前
流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法
大数据·人工智能·ai·rust·数据分析·大模型·agent
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河6 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年7 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
JXJD20047 小时前
224G PAM4 高速线束:阻抗匹配设计与损耗控制的核心逻辑
大数据·ai
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
misty youth7 小时前
Agent-智能体工程方法论
人工智能·ai·llm·agent·智能体
CS创新实验室7 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy7 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构