为 LLM 代理构建持久化长期记忆:RAG 与 FAISS 实战教程

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

你是否曾与 AI 进行过一次深度交流,但第二天回来时发现它已经把你忘得干干净净?这就是现代 AI 的“金鱼脑”问题。虽然像 GPT-4o、Claude 3.5 Sonnet 或 DeepSeek-V3 这样的大语言模型(LLM)非常聪明,但它们受限于“上下文窗口(Context Window)”。一旦会话结束或超出 Token 限制,所有的记忆都会烟消云散。

为了解决这个问题,我们需要为 LLM 构建一套长期记忆系统。这不仅能提升用户体验,还能让 AI 在处理复杂任务时表现得更像一个真正的个人助理。在本教程中,我们将使用 Python、LangChain、FAISS 向量数据库和 SQLite 关系型数据库,配合 n1n.ai 提供的稳定 API,手把手教你实现这一功能。

为什么 LLM 需要长期记忆?

目前的 LLM 主要依赖“上下文注入”来获取信息。然而,这种方式存在三个致命缺陷:

  1. 成本高昂:每次对话都把整个历史记录塞进 Prompt,会消耗大量的 Token。
  2. 延迟增加:Context 越长,模型推理的速度就越慢。
  3. 信息干扰:模型在处理极长文本时,容易出现“迷失在中间(Lost in the Middle)”的现象,忽略关键信息。

通过构建一个专门的存储与检索系统(即 RAG,检索增强生成),我们可以让 AI 像人类一样:短期记忆处理当前对话,长期记忆存储重要事实并在需要时精准调取。

系统架构设计

一个完整的 AI 记忆系统需要具备以下四个核心能力:

  • 记忆提取器(Extractor):利用 LLM 自动识别对话中的关键事实(如:用户的偏好、正在使用的工具、职业背景)。
  • 向量存储(FAISS):将记忆转化为向量(Embedding),实现语义搜索。例如,当用户提到“我最近在用 Vim”,系统能通过语义关联找到与“编辑器”相关的记忆。
  • 结构化存储(SQLite):保存记忆的原文、分类、创建时间及重要程度,用于精确管理。
  • 检索调度层:在用户提问时,先去数据库“翻找”相关记忆,再交给 LLM 生成回答。

在开发过程中,调用高质量的 Embedding 和 Chat 接口至关重要。推荐使用 n1n.ai 接入各类主流模型,确保系统在高并发下的稳定性。

第一步:定义记忆数据结构

记忆不仅仅是文本,它需要元数据来支撑“遗忘”和“更新”逻辑。

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

@dataclass
class MemoryNode:
    id: str
    text: str
    category: str  # 分类:如“技术栈”、“个人习惯”、“工作背景”
    importance: float  # 重要程度 0.0 - 1.0
    timestamp: float
    metadata: Optional[Dict] = None

第二步:智能记忆提取逻辑

我们不能把用户的每一句“你好”都存入数据库。我们需要一个“过滤器”。通过精心设计的 System Prompt,我们可以让 LLM 充当记忆管理员。这里我们通过 n1n.ai 调用 GPT-4o-mini 来完成这个任务,因为它在保持高准确率的同时成本极低。

# 核心提示词设计
PROMPT_TEMPLATE = """
你是一个记忆提取专家。请从以下对话中提取有价值的事实信息:
- 用户偏好(如:喜欢 Python,讨厌 Java)
- 关键实体(如:所在公司、使用的设备)
- 长期目标(如:正在学习分布式系统)

请排除无意义的寒暄。以 JSON 格式输出,并附带 0-1 之间的重要性评分。
"""

第三步:混合存储策略(FAISS + SQLite)

为什么不只用向量数据库? 虽然 FAISS 搜索“语义相似度”非常强,但它在处理“删除特定 ID 的记忆”或“按时间范围筛选”时非常笨拙。因此,我们采用双库并行方案:

  • FAISS:负责计算余弦相似度(Cosine Similarity),找出“意思相近”的内容。
  • SQLite:负责存储完整的文本内容、分类标签和时间戳,作为“数据真相源”。

当我们需要检索时,先从 FAISS 获取相关记忆的 ID,再从 SQLite 中提取详细信息。这种方案兼顾了搜索的灵活性和数据的可靠性。

第四步:冲突处理与记忆更新

用户的需求是会变化的。如果用户去年说“我住在北京”,今年说“我搬到了上海”,系统必须能够处理这种冲突。我们的逻辑如下:

  1. 提取新记忆时,先根据 category 检索相关旧记忆。
  2. 使用 LLM 判断新旧记忆是否冲突。
  3. 若冲突,则将旧记忆标记为“已过期”或直接更新。

这种动态更新机制使得 AI 能够随着时间的推移不断“进化”,变得越来越懂你。

第五步:实战代码实现(简化版)

class LongTermMemory:
    def __init__(self, api_key):
        # 通过 n1n.ai 获取 Embedding 服务
        self.embeddings = OpenAIEmbeddings(openai_api_base="https://api.n1n.ai/v1")
        self.index = faiss.IndexFlatL2(1536) # 针对 OpenAI 1536 维向量

    def remember(self, user_input):
        # 1. 提取事实
        facts = self.extract_facts(user_input)
        # 2. 存入 SQLite 并获取 ID
        # 3. 将事实转化为向量并存入 FAISS
        self.index.add(self.embeddings.embed_query(facts))

    def recall(self, query):
        # 1. 向量搜索最相关的 3 条记忆
        # 2. 从 SQLite 获取详情
        # 3. 拼接成 Context 返回
        return context

性能优化:时间衰减算法

为了模拟人类的记忆,我们可以引入时间衰减(Time Decay)。对于重要性较低且时间久远的记忆,我们可以在检索权重上进行惩罚。公式如下: 最终权重 = 基础重要性 * exp(-衰减系数 * 距离天数) 这样可以确保 AI 优先关注你最近的动态,而不是三年前的一个过时想法。

为什么选择 n1n.ai 支撑你的记忆系统?

构建长期记忆系统涉及大量的 API 调用——从 Embedding 向量化到 LLM 的事实提取,再到最后的回答生成。任何环节的超时都会导致 AI 响应迟钝。使用 n1n.ai 的优势在于:

  1. 极速响应:优化的路由算法确保 Embedding 和 Chat 接口的延迟降至最低。
  2. 多模型无缝切换:你可以用 GPT-4o 提取记忆,用 DeepSeek-V3 生成回答,所有操作只需一个 n1n.ai 账号。
  3. 高可用性:企业级 SLA 保证,避免因单一供应商故障导致 AI “断片”。

总结

通过 RAG 和 FAISS,我们成功为 LLM 装备了一个“外挂大脑”。这不仅解决了大模型的短时记忆瓶颈,更为构建个性化、智能化的 AI 应用奠定了基础。无论你是开发智能客服、私人助手还是角色扮演类应用,这套系统都能显著提升 AI 的表现力。

立即开始构建你的持久化 AI 吧!在 n1n.ai 获取免费 API 密钥。