site logo

Marico's space

Markdown文件击败0M向量数据库:Agent内存中的存储与搜索分离

AI技术与应用 2026-07-02 14:49:10 6

最近折腾 AI Agent 的长期记忆系统,踩了几个坑,这篇把问题说清楚。

一开始大家都觉得长期记忆必须得上向量数据库,得搭 RAG 管道。但看了一圈真正扛住大流量的 Agent 产品,发现它们不约而同选了更简单的方案:纯文本文件。

这不是技术退步,反而是个更强的工程选择。文件可追溯、可对比、可迁移,还能直接 Git 版本管理。

不过光有一堆文本还不够,想让这种方案真正 work,必须把存储和搜索彻底分开。

核心原则:存储与搜索分离

Agent 记忆系统中最高杠杆的决策,就是把存储层和搜索索引彻底解耦。

  • 存储层(唯一真相来源): 版本化的、人类可读的文件(Markdown + YAML frontmatter)。
  • 搜索层(衍生索引): 从存储层衍生的搜索结构(向量数据库、全文 BM25 索引、实体图、关键词索引等)。

在这个架构下,所有搜索索引都被当作可丢弃的临时产物。你可以随时删掉向量嵌入数据库或重建实体图,底层记忆零损失。

这带来了三个优势:

  1. 天然可审计: 记忆存在文本文件里,直接用 Git 做版本控制。每次更新、替换、修正都有 diff、可溯源、可回滚,不需要任何自定义的数据库版本控制逻辑。
  2. 算法自由: 随时切换 embedding 模型、调整分块策略、改排名算法。只要从 Markdown 文件重建索引就行,核心数据永远不会被锁定。
  3. 可移植性: 记忆存储完全脱离任何特定供应商的数据库格式。迁移运行时就是复制文件(cp),而不是一场数据库迁移大战。

写入端智能:结构化记忆

检索质量是写入质量的下游。一个检索简单但记忆干净的结构化系统,往往比在嘈杂记忆上跑复杂 RAG 管道效果更好。

要实现这一点,每条记忆必须在写入时就结构化。文件优先运行时的一条典型记忆文件长这样:

---
id: mem_7c10e3
created: 2026-07-02T16:40:00Z
source: user_message
durability: durable
confidence: high
tags: [preference, deployment]
entities: [tekmemo, staging-env]
supersedes: mem_4f2a91
---
User now prefers staging deploys on any weekday, since the team added
automated rollback and no longer needs the Friday buffer.

通过强制执行结构化的 frontmatter 模式:

  • 原子性: 一条记忆文件编码一个事实或偏好。这使得去重和冲突解决非常精确。
  • 元数据追踪: 来源、时间戳、置信度、实体在写入时就记录,而不是在读取时试图从原始文本推断。
  • 完整审计链: 注意 supersedes 字段。如果用户偏好变了,我们从不原地编辑文件,而是写一个新文件并关联旧文件。旧文件从活跃搜索索引中排除,但保留在 Git 历史里,审计链完整保留。

让搜索索引变成可丢弃的

因为存储层是安全的磁盘文件,检索层可以激进调优。不依赖单一的原始向量相似度(这玩意儿在精确关键词匹配和时间查询上很拉胯),而是构建一个可丢弃的混合索引。

一个健壮的读路径使用多信号融合(Multi-Signal Fusion)

  1. 语义搜索: 对文本 body 建立向量索引。
  2. 关键词搜索: BM25 索引匹配精确 token。
  3. 实体匹配:entities 数组建立轻量级索引。

互惠排名融合(Reciprocal Rank Fusion,RRF)把这三个信号合并成一个统一排名列表:

RRF_Score(d) = Σ 1 / (k + rank of document d in each retrieval method)

其中 rank 是文档 d 在某检索方法中的排名,k 是常数(通常设为 60)。这解决了直接把余弦相似度得分和 BM25 得分做平均的量纲不兼容问题。

真实世界的取舍

诚实的架构必须直面自己的局限。文件优先记忆的两个主要挑战:

1. 并发

文件是单写人的绝佳真相来源。但当多个 Agent 或并行进程试图同时写入时就麻烦了。

  • 方案: 单用户环境用简单的 advisory 文件锁就够了。对于多 Agent 分布式系统,在文件写入前放一个轻量级事务门卫(比如 SQLite)来仲裁并发,让文件本身作为规范的备份。

2. 记忆投毒(MINJA)

如果 Agent 能读取不可信的外部来源(网页、第三方邮件),攻击者可以注入恶意文本,让它被索引为"持久记忆"。后续查询召回这个被污染的记录,Agent 行为就被劫持了。

  • 方案: source 标签是关键。不可信来源必须以低置信度标签写入记忆,并通过信任阈值分类器审核后才能进入主搜索索引。

介绍 TekMemo

这正是我们在 TekMemo 要解决的问题。我们正在构建一个生产就绪的、文件优先的 AI Agent 长期记忆运行时,内置写入端智能、多信号融合和自动 Git 原生审计。

即将发布。如果你想构建持久、可审计、有韧性的 Agent 记忆,而不用折腾复杂的外部向量数据库,保持关注。