[更新] VAC:一个让 LLM 记住你的记忆层

发布: (2025年12月7日 GMT+8 12:38)
5 min read
原文: Dev.to

Source: Dev.to

引言

如果你的 LLM 能够真正记住你是谁——跨会话、项目和时间呢?现有系统要么完全依赖输入上下文(长度受限),要么出现幻觉和相关性丢失等问题。

VAC 记忆系统 是一种独特的检索增强生成(RAG)架构,为 LLM 提供持久记忆。LLM 本身在参数中保持静态的统计“记忆”。VAC 的目标是实现动态记忆检索,在不修改模型的前提下提取准确数据。

VAC 的关键优势

  • MCA(候选过滤) – 多候选评估解决了传统向量数据库(如 FAISS)中的误报问题,在进行昂贵计算之前实现实体级精确过滤。
  • 物理启发的排序 – 将文本文档概念化为具有“质量”和“引力”的“行星”,从而实现新颖的检索机制。
  • 模块化编排 – VAC 将对 LLM 的依赖最小化,仅在答案生成阶段使用。

当前 LLM 的局限

  • 无法保留长期上下文。
  • 无法记住过去的对话。
  • 无法更新其“理解”。
  • 无法存储不断演化的用户画像。
  • 运行在无状态的泡沫中。

传统检索的问题

  • 向量搜索检索的是语义相似的文档,而非逻辑正确的文档。
  • 重要记忆会被埋没。
  • 检索结果非确定性。
  • 随着数据集增长,噪声增多。
  • 没有优先级或新近性的概念。

架构

VAC 记忆系统流水线包含八个步骤:

  1. MCA‑PreFilter – 按实体覆盖率过滤候选,以降低计算成本。
  2. 使用 FAISS 的向量处理 – 通过 1024 维向量(BGE‑Large)进行嵌入和语义搜索。
  3. BM25 搜索 – 传统的精确匹配方法。
  4. Cross‑Encoder 重排序 – 对前 N 个候选进行精度优化。
  5. (其余编排步骤省略,以保持简洁)

排序示例代码(Python)

def calculate_query_coverage(query_keywords: set, memory_keywords: set) -> float:
    intersection = len(query_keywords & memory_keywords)
    return intersection / len(query_keywords)
def calculate_force(query_mass, memory_mass, distance):
    G = 6.67430e-11   # gravitational constant (placeholder)
    DELTA = 1e-6      # stability term
    force = G * (query_mass * memory_mass) / (distance ** 2 + DELTA)
    return force
def rank_memories(query, memories):
    query_keywords = extract_keywords_simple(query)
    scored_mem = [
        calculate_mass(mem, query_keywords)   # assumes calculate_mass returns a dict with 'force'
        for mem in memories
    ]
    return sorted(scored_mem, key=lambda x: x['force'], reverse=True)

完整架构概览(8 步)

查询示例: “我在哪里遇到 Alice 的?”

(原文中引用了一个示意图;如有需要可自行替换为自己的可视化。)

评估

基准结果

维度VAC 记忆Mem0Letta/MemGPTZep
LoCoMo 准确率80.1 %66.9 %74.0 %75.1 %
架构MCA + FAISS + BM25 + Cross‑EncoderLLM 提取 + 图谱类 OS 分页 + 归档搜索摘要 + 向量
实体保护✅ MCA 预过滤❌ 仅语义❌ 仅语义❌ 仅语义
延迟2.5 秒/查询~3‑5 秒~2‑4 秒~2‑3 秒
成本 / 1M 令牌<$0.10~$0.50+~$0.30+~$0.20+
可复现性100 %(种子锁定)变量变量变量
对话隔离100 %部分部分部分

验证细节

  • 运行次数: 10 场对话 × 10 个种子 = 100 次运行(共 1,540 条问题)。
  • 问题类型: 单跳 (87 %)、多跳 (78 %)、时序 (72 %)、常识 (87 %)。
  • 组件召回率(真实覆盖率):
    • 单独使用 MCA:40‑50 %
    • 单独使用 FAISS:65‑70 %
    • 单独使用 BM25:50 %
    • 联合召回率(MCA + FAISS + BM25): 85‑95 %

关键洞察: 没有单一检索方法能够覆盖全部需求;联合使用能够捕获各方法遗漏的部分。

入门指南

  • GitHub 仓库: VAC Memory System (请替换为实际 URL)
  • 简单的基于 CLI 的集成方式。

示例运行

# 使用固定种子以保证可复现性
SEED=2001 LOCOMO_CONV_INDEX=0 python orchestrator.py
  • 使用相同的种子会在不同运行之间产生相同的结果。
  • 已验证 100 次运行。

反馈与讨论

欢迎任何正在为 LLM 构建记忆系统或实验 LoCoMo 基准的朋友提供反馈。

  • 你对 MCA + BM25 + FAISS 的组合有什么看法?
  • 有哪些进一步改进的想法?

欢迎在 GitHub 仓库中打开 issue 或提交 pull request。

Back to Blog

相关文章

阅读更多 »

当现实瓦解时

2024年12月,Fei‑Fei Li 在满座的斯坦福礼堂里举起一张破旧的明信片——梵高的《星夜》,因年代久远而褪色并出现折痕。她把它……

你知道吗?(第3部分)

Google Cloud Shell 您可以将 Google Cloud Shell 用作编码环境!它提供了大量针对 JavaScript、.NET 等的工具。最棒的是,您可以安装……