如何为 LLMs 构建长期记忆(RAG + FAISS 教程)

发布: (2026年2月1日 GMT+8 16:43)
8 min read
原文: Dev.to

Source: Dev.to

《如何为大型语言模型构建长期记忆(RAG + FAISS 教程)》的封面图片

Devendra Parihar

构建一个记忆系统,使大型语言模型能够在对话之间记住用户偏好,使用 Python、LangChain、FAISS 和 SQLite。

tags: ai, python, langchain, machinelearning

问题:上下文窗口 vs. 长期记忆

LLMs 有一个 上下文窗口 —— 它们一次能处理的文本量是有限的。你可以把用户历史塞进这个窗口,但这很快就会变得昂贵,最终空间会耗尽。而且,仅仅为了回忆用户的名字或喜欢的编程语言而重新阅读整个对话历史也是低效的。

我们需要一个像人脑一样的系统:

  • 短期记忆 – 当前的对话。
  • 长期记忆 – 重要的事实被存储起来,仅在相关时检索。

解决方案:RAG + 语义搜索

我们将构建一个专门的检索增强生成(RAG)管道。我们不再检索通用文档,而是检索关于用户的个人记忆

关键组件

组件用途
Memory Extractor一个 LLM 代理, “监听” 聊天并识别值得保存的事实。
Vector Store (FAISS)存储每条记忆的 含义(嵌入),用于模糊搜索。
SQL Database存储结构化数据(内容、时间戳、类别),确保可靠性。
Retrieval System根据当前用户查询获取相关记忆。

第一步:定义记忆

记忆不仅仅是原始文本;它还携带元数据。

from dataclasses import dataclass
from typing import List, Dict, Optional

@dataclass
class Memory:
    id: str
    content: str
    category: str          # e.g., 'tools', 'personal', 'work'
    importance: float      # 0.0 to 1.0
    timestamp: str
    embedding: Optional[List[float]] = None
    metadata: Optional[Dict] = None

步骤 2:使用 LangChain 提取记忆

我们只保留以后有用的信息(例如,“我使用 VS Code 进行 Python 开发”)。精心设计的系统提示引导 LLM 输出结构化的 JSON。

# memory_system.py (Simplified)

prompt = ChatPromptTemplate.from_messages([
    ("system", """You are an expert at extracting factual information.
Focus on preferences, tools, personal info, habits.
Return a list of memories with an importance score (0‑1)."""),
    ("human", "Message: {message}")
])

# Example input:
# User: "I mostly code in Python but use Rust for side projects."
# Expected output:
# [
#   {"content": "Codes primarily in Python", "category": "skills", "importance": 0.9},
#   {"content": "Uses Rust for side projects", "category": "skills", "importance": 0.7}
# ]

第 3 步:“大脑”(向量存储 + 数据库)

为什么选择 FAISS?

向量搜索能够回答诸如“我使用哪些工具?”之类的查询,即使记忆的表述是“我使用 NeoVim”。关键词搜索会错过这些,但嵌入能够捕捉语义相似性。

为什么选择 SQLite?

向量非常适合相似度搜索,但不适合可靠的读取/更新。SQLite 用来存储实际的文本、时间戳、ID 以及其他结构化字段。

import faiss
import numpy as np
from langchain.embeddings import OpenAIEmbeddings

class VectorStore:
    def __init__(self, openai_api_key: str):
        self.embeddings = OpenAIEmbeddings(
            model="text-embedding-3-small",
            openai_api_key=openai_api_key
        )
        self.index = faiss.IndexFlatIP(1536)  # Inner Product for Cosine Similarity

    def add_memory(self, text: str):
        vector = self.embeddings.embed_query(text)
        self.index.add(np.array([vector]))

Source:

第4步:连接点

主循环负责协调工作流:

  1. 用户发送消息。
  2. Extractor 识别任何新事实并将其存储。
  3. Updater 检查更正(例如,“实际上,我改用了 Java”。)
  4. Retriever 根据当前查询获取相关记忆。
  5. LLM 使用检索到的记忆作为上下文生成响应。
def answer_with_memory(self, question: str) -> str:
    # 1. Search vector DB for similar memories
    relevant_memories = self.vector_store.search_similar(question)

    # 2. Build context from those memories
    context = "\n".join([m.content for m in relevant_memories])

    # 3. Prompt the LLM
    prompt = f"Based on these memories:\n{context}\n\nAnswer: {question}"
    return self.llm.invoke(prompt)

实时演示

我构建了一个 Streamlit 应用来可视化这个“脑”。你可以实时观看记忆的形成,搜索记忆,并查看系统如何对你的生活进行分类。

👉 尝试实时演示

这很重要

这不仅仅是记住名字,而是关于 个性化

  • 记住你偏好库的编码助手。
  • 记住你上周遇到困难的导师。
  • 记住你长期目标的心理治疗机器人。

未来改进

  • Graph Database – 将记忆关联起来(例如,“巴黎”与“法国”相关)。
  • Local LLMs – 运行 Llama 3 以确保隐私。
  • Time Decay – 随着时间的推移,逐渐“遗忘”不重要的记忆。

查看代码

完整代码已在 GitHub 上提供。它包含了记忆提取器、向量存储管理以及 Streamlit UI 的全部详细实现。

GitHub logo

仓库: Devparihar5/llm-long-term-memory

一个复杂的记忆存储与检索系统,为大型语言模型(LLM)提供持久、可搜索的长期记忆能力。该系统能够从对话中提取、存储、更新和检索记忆,使 AI 代理能够在多个会话之间保持上下文。

🧠 Advanced Long-Term Memory System for LLM Agents

一个复杂的记忆存储和检索系统,为大型语言模型(LLM)提供持久、可搜索的长期记忆能力。该系统可以:

  • 提取 对话中的记忆。
  • 存储 它们以供将来参考,确保安全。
  • 更新 现有记忆,当有新信息时。
  • 检索 相关记忆,以在多个会话之间保持上下文。

通过集成此系统,AI 代理能够保持连续性,提升个性化,并随时间改进决策制定。

✨ 功能

  • 智能记忆提取 – 使用 OpenAI GPT 自动从对话中提取事实信息。
  • 语义搜索 – 使用 OpenAI 嵌入和 FAISS 的基于向量的相似度搜索。
  • 记忆管理 – 添加、更新和删除记忆,并进行冲突解决。
  • 持久化存储 – SQLite 数据库实现可靠的记忆持久化。
  • 类别组织 – 自动对记忆进行分类(工具、偏好、个人、习惯等)。
  • 重要性评分 – 基于加权的重要性系统对记忆进行优先级排序。
  • 实时更新 – 从自然语言中检测并处理记忆的更新和删除。
  • 网页界面 – 基于 Streamlit 的全面测试与管理界面。
  • LangChain 集成 – 使用 LangChain 构建,提供强大的 LLM 交互。
  • 模块化架构 – 清晰的关注点分离。

你在 LLM 应用中如何处理状态?在下方留言吧! 👇

最初发布于 Medium.

Back to Blog

相关文章

阅读更多 »