Agent 读语义文件,App 读结构化存储
一、两者定位不同
| SQLite(结构化记录) | Markdown(语义文件) | |
|---|---|---|
| agent 读到的东西 | 表、字段、行(需要先懂 schema、写 SQL) | 标题、正文、frontmatter、链接、路径 |
| 强项 | 快、可筛选、可排序、可聚合(万篇级仍稳) | 语义自明、人和外部工具都能直接消费 |
| 弱项 | 语义弱,对人和外部 agent 不透明 | 大规模查询不如 DB |
关键差别不在「能不能读」,而在读到的信息里有没有上下文线索。Markdown 的路径、标题层级、frontmatter、双链天然就是语义;SQLite 的一行只是字段集合。
二、为什么不让 agent 直连 DB
- 耦合内部实现 —— schema 一改,skill / prompt 全要跟着改。
- 容易读到衍生数据 —— FTS 表、缓存表、状态表不是用户知识本身。
- 不利于外部工具 —— 不是每个 agent 环境都方便开 SQLite,但几乎都能读一个 Markdown 目录。
- 上下文质量更差 —— 行数据缺语义线索,agent 更容易误把索引当主数据。
三、推荐分工
Agent 要理解 / 改内容 → 读写 Markdown
App 要检索 / 排序 / 状态 → 读 SQLite
SQLite 坏了 → 从 Markdown 重建
Markdown 坏了 → 那才是真数据损坏
即:Markdown 是唯一真源,SQLite 是可重建的派生层。
四、两者组合的最佳路径:先筛选,再读全文
不要「全扫文件」,也不要「只信 DB 里的摘要」:
SQLite FTS / metadata 找候选(如最近 30 天的 iOS 笔记 → 20 篇)
→ agent 读这 20 篇 Markdown 全文
→ 总结 / 回答
DB 只负责把候选范围缩小,召回质量仍由正文(Markdown)承担 —— 这也解释了为什么检索的改进重点在正文入索引而不是把 DB 字段做多。
相关
- 多源更新按维度取真源 —— 「真源只有一个」的同源判断:Markdown 是本体,DB 可重建
- 关键词检索的三个打分缺陷 —— DB 侧只做候选筛选,正文才承担召回
- 跨源取数据要靠自建代理 —— 同属「数据该由哪一层持有」的取舍
- 真源要按维度显式指定 —— 本条是该骨架的一处实例:真源唯一 + 派生层可重建