乐于分享
好东西不私藏

我给AI助手装了"第二大脑"SQLite + FTS5 零依赖方案,每次对话省下几千 Token

我给AI助手装了"第二大脑"SQLite + FTS5 零依赖方案,每次对话省下几千 Token

我给AI助手装了"第二大脑"

SQLite + FTS5 零依赖方案,每次对话省下几千 Token

2026-07-25 · 实践记录 · 约 3500 字

一、问题:AI 助手的"记忆碎片化"

我日常用一个 AI Agent 帮我做各种事——写材料、记日记、管公众号、做调研。时间长了,一个问题越来越突出:它记不住自己的数据放哪了。

比如每天的工作流程跑完,Agent 在不同环节产出数据——调研笔记、任务日志、知识库卡片——分别散落在笔记文件、Markdown 文件、不同的目录里。第二天对话一恢复,它得重新读一堆文件才能进入状态。

这是典型的"记忆碎片化"问题:

MEMORY.md 越写越长(164 行,7.7KB)——每次对话都要全文读

每日笔记一个文件一天,散落在目录里

调研笔记、任务日志、知识库卡片各用一种格式

cron 定时任务产出的数据,写完文件就丢在那

最直接的后果:每次对话启动,Agent 要读好几个文件才能搞清楚"我是谁,我的数据在哪"。这些文件内容占用了大量上下文窗口——明明大部分信息这一轮根本用不上。

二、先看传统方案为什么太重

解决"Agent 记忆"问题,市面上常见的方案有几类:

方案A:向量数据库

Chromadb / Milvus / Qdrant 这些,适合大规模语义搜索。但为了一个个人 Agent 专门搭一套向量数据库,有点杀鸡用牛刀:

要装服务、配 embedding 模型、管索引

Agent 的数据量级(几十条任务、几百条笔记)对向量数据库来说是大炮打蚊子

每次写入要过 embedding,多了一层网络延迟

方案B:全部写文件,每次对话全读

这是大多数个人用户的做法。MEMORY.md 越长,对话越慢。而且文件读多了,Agent 容易"眼花"——从几百行里翻自己需要的那条信息,准确率并不高。

我们需要的是:零额外依赖、写入快、查询准、Agent 自己就能管。说白了,就是给 Agent 装个"本地数据库"。

三、方案:SQLite + FTS5

SQLite 是 Python 自带的标准库,import sqlite3 就能用,什么也不用装。FTS5 是 SQLite 内置的全文搜索引擎,同样是零依赖。

整套方案就一个文件:data_platform.py(约 400 行),封装了所有读写操作。Agent 通过 CLI 命令操作,不需要写 SQL。

数据模型

5 个核心表,涵盖 Agent 日常产出的主要数据类型:

表 用途 数据量

task_logs 任务执行日志 持续增长

daily_notes 每日笔记 37 天

memories 关键记忆(带 FTS5) 30 条

resources 知识库资源(带 FTS5) 51 条

english_exercises 英语练习记录 按需

FTS5 实现精准搜索

resources 表和 memories 表都挂了 FTS5 虚拟表,支持 BM25 排序的全文搜索。Agent 查资料时直接跑搜索,不用 grep 翻文件:

# 改前:翻文件

read_file MEMORY.md

grep "某个关键词" memory/*.md

# 改后:精准查询

python3 scripts/data_platform.py resource-search --query "关键词"

python3 scripts/data_platform.py memory-search --query "关键词"

四、Token 到底省在哪

这不是数学游戏,是实打实的上下文优化。来算一笔账:

改造前,每次对话启动:

读 MEMORY.md        ≈ 1600 tokens(7.7KB)

读今日笔记        ≈ 600-1500 tokens

读任务日志        ≈ 400 tokens

合计:≈ 2600-3500 tokens

这些是每次对话无论用不用都得加载的上下文。而且随着时间推移,MEMORY.md 越长、笔记越多,消耗越大。

改造后,启动注入:

startup 命令输出    ≈ 400 tokens(精选的关键信息)

按需查询            ≈ 100-300 tokens/次

合计:≈ 400 tokens

每次对话省下 2200-3100 tokens。

按一天 50 次对话算,就是 12 万-16 万 tokens/day。一个月下来节省的上下文空间相当可观。

但这还不是全部。真正的"省 token"发生在精准度上——

旧方式:把一整份 MEMORY.md 塞进上下文,模型得自己翻找需要的信息,翻不到就胡说

新方式:模型直接问数据库要精确数据,不给上下文塞无关内容,生成的回答也更准

省 token 的终点不是省钱,是让模型把有限的上下文窗口,花在真正重要的事情上。

五、怎么接入 cron 自动化

这套方案另一个关键设计:cron 定时任务直接写库。

以前 cron 跑完把结果写成文件,Agent 下次对话时翻。现在 cron 跑完一步到位写进 SQLite:

# cron 任务结束时

python3 scripts/data_platform.py task-log 工作材料采集 success \

  --detail "采集28篇,来源8个公众号"

python3 scripts/data_platform.py note-write --append \

  "【工作材料采集】今日采集28篇,新增术语7条"

第二天对话启动,startup 自动拉出昨天的采集摘要。全过程零人工干预,不产生新的文件要读。

六、效果:不只是省 Token

上线跑了一周,几个直观变化:

对话启动快了 — 以前要等 Agent 读完 MEMORY.md 才能进入正题,现在秒回

数据不会丢 — 写到 SQLite,有事务保障,不像写文件可能因为权限/路径问题失败

查询更可靠 — "上周调研了哪些课题"这类问题,Agent 直接查表返回,不会从笔记里"猜"

历史好追溯 — 一个数据库文件全搞定,备份也简单

一个小插曲:建库后的第一次 cron 自动运行,采集了 28 篇文章,成功写入了 SQLite。我甚至没注意到它已经跑完了——直到去查数据库,发现记录在那里躺着。这就是"默默工作了"的理想状态。

七、适用边界

这套方案不是万能的。它适合的场景:

✅ 个人/小团队 Agent(数据量 < 10 万条)

✅ 结构化数据为主(任务日志、笔记、知识库资源)

✅ 需要 cron 自动写入、Agent 自动读取

✅ 不想引入额外基础设施

它不适合:

❌ 大规模语义搜索(那是向量数据库的领域)

❌ 非结构化文档全文检索为主的场景(FTS5 中文分词有限)

❌ 需要多 Agent 高并发写入(SQLite 写锁是单线程的)

八、从问题到方案的时间线

这不是一步到位的设计,是迭代出来的:

阶段 做法 问题

第一阶段 全写 MEMORY.md 越来越长,启动越来越慢

第二阶段 拆成每日笔记文件 文件太多,查询靠 grep

第三阶段 加上 JSON 配置文件 格式不统一,管理混乱

第四阶段(现在) SQLite + FTS5 统一、快速、零依赖

每个阶段都是在解决上一个阶段暴露的问题。没有一开始就设计"完美的架构",而是方案跟着需求长。

九、技术栈一览

Python 标准库 · sqlite3 + FTS5

单文件 CLI:data_platform.py(约 400 行)

数据库文件:data_platform.db(约 560KB)

集成方式:Agent startup 流程 + cron 任务直接调用

依赖情况:零外部依赖(Python 自带)

十、即用方案:Skill 化

这套数据平台已经打包成 QwenPaw 的独立 Skill:sqlite-fts5-data-platform。

安装后在 Agent 的启动流程中调用 startup 注入上下文,cron 任务末尾直接写库,不需要改框架代码。

Skill 包含:

完整 SKILL.md 文档(命令参考、集成模式)

data_platform.py 脚本(单文件,约 400 行,Python 标准库零依赖)

5 张基础表 + 2 个 FTS5 索引,开箱即用

想用这套方案又不想自己从头搭的,直接把 Skill 拉到本地就能跑。

📦 GitHub 仓库: lt91888/sqlite-fts5-data-platform

包含 SKILL.md 完整文档 + data_platform.py 脚本,clone 即用。

后记

这篇文章记录的不是一个完美的方案,而是一个在实践中长出来的方案。如果你也在折腾 Agent 记忆问题,希望这些经验能让你少踩几个坑。

最想传达的就一句话:别一上来就上重武器。先用 SQLite + 一个脚本跑起来,觉得不够了再升级——大概率你会发现,SQLite 撑到 10 万条数据都没问题。

代码片段和数据均来自实际运行环境。文中提到的 Agent 基于 QwenPaw 框架运行。

数据量统计截止 2026-07-25。