org-supertag 与其它 RAG 的不同
绝大部分 RAG 是针对长篇累牍的文档,这些文档从数据角度,是缺乏结构化的。它们只是在排版方面进行了结构化,比如 Markdwon,用 ## 这些来代表文章里大的分块。这个事实导致了,所有 RAG 系统必须包含 Chunk(切块)机制,将一个长文档,切成均等的文本块。这种方式导致了一个后果,RAG 常常有「信息损失」的风险。
但 org-mode 不同,不光排版,它还在数据层面进行了结构化。一个 org-headline,不光是单纯的语法标记,从数据角度来说,它还代表着一个数据块(大家都应该记得在 org-mode 如何畅快地移动 org-headline 吧,它不光移动一个标题,还移动标题以下的内容)。
这得益于 org-mode 之前一直努力引入的具备 AST 结构的渲染机制——这是 org-mode 可以傲视 MarkDown、Word、PDF 等通用文档格式的地方。我认为这代表着文档格式进化方向,不再为排版服务,而是为数据服务。
org-supertag 不用再包含传统的 Chunk 机制,基于 org-mode 的渲染机制,以及诸多开放 API 接口,org-supertag 可以轻松地将一个 org-headline 以及其所包含的内容,视为一个数据块,就可以了。而且不光如此,由于 org-mode 如此强大和便利,从数据结构的角度记录一个 org-headline 它还记录了大量结构化信息,包括 olp,tags 等等。这些结构化信息,让 org-mode 天然地与 GraphRAG 的方式吻合。
与 org-mode 解耦
关于这一次更新,最大的变化,不光是增加了 AI 与 RAG 方面的支持,还有对 EPC 部分功能的完全重构,其它组件在功能和交互上的精简。
直观结果是代码行数的变化,应该比之前要少了几千行代码。从功能交互来说,更加紧凑聚焦。
其中一个最大的变化是,部分重要功能完全与 org-mode 解耦:
- 标签功能,目前仅支持输入 #inline-tag,放弃支持 org-mode 的 :TAG:
这么做,是因为我自己在日常使用的时候,脑子里总是想什么标签用 :TAG: 什么标签用 #inlien-tag,是很沉重的认知负担。而就我对大部分 org-mode 用家的了解,:TAG: 一般和 org-agenda 或这是日程安排有比较紧密的相连。所以我认为 org-supertag 没必要强行兼容 :TAG: 样式,而应该保留 :TAG: 原本用途的纯粹性,服务于日程、任务的安排。
同时,也能够纯粹 #inline-tag 的用途,就是它完全服务于笔记,只用于记录概念名。
- 属性功能,不再支持 org-mode 的 PROPERTIES,所有属性记录将直接在数据库的记录上进行增删改。
我认为 org-mode 的 PROPERTIES 只需要负责显示它原本的那些内容就已经很多了。更多的 PROPERTIES,会给用户带来很大的视觉压力——我自己用的时候都觉得难受。
另外从精简功能和保持简单逻辑的角度出发, 这也令 org-supertag 的属性组件,不再同时向 2 个地方负责,而只需要负责面向数据库就可以了。这可以减轻我维护的压力。
- 同步策略的变化。
在上一个版本,我最自豪的是引入了 org-supertag-sync.el 这个自动化将文件数据同步到数据库的组件。
之前的同步策略是,扫描 org 文件,为所有 org-headline 创建 ID(这个过程就是转换成 node)。当时我觉得,数据库应当做到「不遗漏」。但最近,我的看法有了变化——一方面是来自 Github 上一名用户跟我的讨论,他提到,他不会为所有的 org-headline 都添加 ID,因为一些任务性的安排,是没有必要添加 ID 的。换言之,他添加 ID 的目的,都是为了知识而服务。
所以,这一次我的同步策略也有了变化,不再强制为每一个 org-headline 添加 ID 了。用户如果要为 org-headline 添加 ID, org-supertag 设计了多种途径:可以用 org-supertag-node-create 命令,也可以直接添加标签,这样子 org-headline 会自动转化成 node。
总而言之,这一次更新最主要的一个目的是降低 org-supertag 的复杂度,让它变得更加简单。
更新记录
新增功能
AI Chat服务
- 用户可以通过
M-x org-supertag-view-chat
打开 AI 聊天界面。-
在
*User:
后输入消息,直接按 RET 发送即可。 -
支持 RAG 上下文检索:展开上下文时,可直接点击源内容快速跳转。
-
支持类似 Claude 的
/commands
命令系统:- 输入
/command-name
即可调用命令。 - 示例:通过
/define <name> "Prompt"
自定义新指令,并支持$INPUT
变量识别。
- 输入
-
支持多语言对话:通过
org-supertag-view-chat-lang
设置。
-
RAG 服务
- RAG 服务将自动检查数据库当中的变更,自动将变化增量更新到 SQLite-vss 数据库中
- 用户可以 M-x org-supertag-backgorund-run-now 手动运行 RAG 同步
- RAG 将在后台为 LLM 提供准确地资料检索
自动标签建议
- LLM 将在后端自动为没有标签的 node 生成标签建议
- 提供统一的标签建议应用界面
智能伙伴:新增智能伙伴功能
- 智能伙伴将自动为没有标签的 node 生成标签建议
- 提供统一的标签建议应用界面
定时任务:用于管理后台各类服务
重构
EPC 模块:完全重构 EPC 服务器后端。
- 改进代码结构,减少冗余。
标签系统
- 统一标签建议界面。
- 放弃“预设标签”机制,仅支持自定义
#inline-tag
标签。 - 放弃对传统 Org TAGS 的支持,避免输入限制。
- 放弃“预设标签”机制,仅支持自定义
关系管理
- 放弃单独保存“同现关系”,统一整合到 LINK 数据对象中。
补全系统
- 放弃直接支持 Company 接口,改用 Emacs 的
completion-at-point
。兼容各种 completion 方式(如 Company、Corfu)。
Behavior 系统
- 各模块定时任务抽离为独立系统
org-supertag-scheduler.el
。
移除
org-supertag-backlink.el
移除。- 功能已整合进 `org-supertag-view-node