DaiDocs 发布 5.1.1:.dai 文档记忆与 .cai 代码图谱合并
Show HN: Open-Source DaiDocs now beats Graphify by 218x low tokens, 83% on LME
Kerneta 发布开源记忆系统 DaiDocs 5.1.1,用纯文本 .dai 存文档与会话历史、.cai 存代码调用图谱,两者通过 ask 路由合并回答。
English · 简体中文
.dai + .cai
为 AI 开放纯文本记忆,同时覆盖你的历史和代码。
你助手的记忆变成磁盘上的文件,你可以打开、grep 并保留:.dai 用于文档和会话历史,.cai 用于代码图谱。
目前最完整的记忆系统之一。 大多数工具只记住一半:要么是你的对话,要么是你的代码。这个系统两者都记住,采用相同的纯文本、本地优先格式,并且有一个路由器知道一个问题属于哪一半。
在 LongMemEval-S 排行榜上位列第二,在所有可复现的记忆系统中,比同一模型无记忆时高出 22.40 分,每个问题读取的 token 少 10 倍。.cai 代码图谱以读取文件所需 token 的一小部分回答调用者、被调用者和重命名影响。
这里的每个数字都附带其逐问题评判结论和 sha256 清单。
快速开始 · 指南 · 基准测试 · 格式 · 代码层 · 复现
发布 5.1.1 版,2026 年 10 月 6 日:代码记忆加入文档和历史。 其中包含什么。
如果 .dai 对你有用,一个 star 能帮助其他人找到它。
两半,一种格式:.dai 用于历史,.cai 用于代码
大多数记忆工具只记住一件事。代码图谱工具知道你的调用图,但不知道你决定它该如何工作的那次对话。聊天记忆工具知道那个决定,但无法告诉你谁调用了你即将修改的函数。这个系统两者兼备,在一个纯文本、本地优先的层中,并有一个路由器将每个问题发送到能回答它的那一半。
.dai |
.cai |
|
|---|---|---|
| 记住 | 文档和会话历史:过去的对话、决定、事实、偏好 | 你的代码:调用者、被调用者、导入、定义和传递依赖的确定性图谱 |
| 构建者 | 一个观察者模型,每个对话一次(在 Claude 订阅上免费,由会话中已有的助手写入) | tree-sitter,确定性地,无需模型和 API 成本 |
| 语言 | 任何文本,任何人类语言 | 10 种编程语言:Python、JavaScript、TypeScript、Go、Rust、Java、C、C++、Ruby、C# |
| 引擎 | Node(参考实现),外加一个纯 Python 读取器 | Python,pip install kerneta-cai |
| 安装 | npx daidocs setup |
pip install kerneta-cai,然后 kerneta setup |
两者都是你磁盘上的纯文本,两者都响应 grep 和 git,两者存在的原因相同:让模型读取一个小的、针对问题的切片,而不是整个历史或整个仓库。它们也相互交叉链接。一个命名了代码符号的文档会双向链接到它,因此一次查询可以返回代码和解释它的文字。然后 ask 路由器决定哪一层来回答:代码图谱、文档还是过去的会话。代码层在 Kerneta-Cai/ 中有自己的指南。
你不必两个都装。.dai 本身就是一个完整的文档和历史记忆;.cai 本身就是一个完整的代码图谱。安装一个,或者两个都安装并让路由器将它们连接起来。
.Cai 用于代码:与 Graphify 对比测量
.Cai 是一个纯文本代码图谱。在真实仓库上,它在准确率上匹配或超过 Graphify,同时呈现给模型的 token 只是一小部分。几个头条数据,全部从源代码离线重建(无 API,不含 XERJ):
| 代码检索(真实仓库) | .Cai |
Graphify | 原始文件 | .Cai 对比 Graphify |
.Cai 对比原始 |
|---|---|---|---|---|---|
| psf/requests,16 个 ast 评分问题 | 16/16 在 55 tok | 13/16 在 689 | 16/16,9,023 | 少 13 倍 | 少 164 倍 |
| httpx 导入(谁导入了 X) | 100%,22 tok | 91%,4,696 | 100%,64,075 | 少 218 倍 | 少 2,976 倍 |
| 做这个改动,6 处 httpx 编辑 | 1.00 召回率,6/6 组,38 tok | 0.64,3/6,1,651 | 0.61,1/6,64,075 | 少 43 倍 | 少 1,686 倍 |
在 35 倍规模下(CPython 标准库,7,469 个符号),每次查询的成本保持平稳:
.Cai 平均 69 个 token,而 Graphify 为 178 个。
语言无关,模型无关
一个 .dai 文件是三个纯文本区域:一个 YAML 头部、一个围栏 JSON 块和正文。没有二进制,没有数据库,读取它不需要 SDK。
- 任何编程语言。参考引擎是 Node。用 Python、Rust 或 Go 写一个读取器只需一个下午的工作量,而且规范是规范性的,其编写方式确保两个独立实现能够一致。
- 任何模型。存储由一个廉价的观察者模型写入一次,然后由任何负责回答的模型读取。同一个存储用五个回答模型测量:78% 到 92%。更换模型,保留记忆。
- 任何工具。
grep、git log、diff、你的编辑器、一个 shell 脚本。能响应普通工具的记忆。
用另一种语言构建一个读取器并提交 PR:那才是最重要的贡献。
本仓库中包含:读写 .dai 文件的 Kerneta Engine V4.4n、
将其连接到你的助手的 MCP 服务器、Kerneta-Cai/ 中构建并读取代码图的 .cai 代码层,以及下文引用的每一个数字的完整证据:基准运行、评判者对 500 个问题中每一个的裁决,以及五模型对比。每个证据文件都在 MANIFEST.sha256 中做了哈希,
这样你可以核对所描述的内容就是所测量的内容;具体做法见
docs/PROVENANCE.md。
排行榜第二。每一行都采用同一设置:LongMemEval-S、GPT-4o 作答、全部 500 个问题、微平均,且只包含非厂商员工能够重新运行的配置。最后一行是同一个 GPT-4o 在没有记忆系统的情况下,读取粘贴进其上下文的完整历史:比我们低 22.40 分。这里的每个数字都带有注意事项,且注意事项随数字一同出现,见 docs/RESULTS.md。
不在那张表里?Graphify、Hindsight、Mem0 及其他发布的数据是在不同的作答模型、不同的分母或不同的基准上测得的,因此无论哪个方向都无法与 GPT-4o 500/500 那一行并列。它们每一个都在 daidocs.com/results.html,附有其数字实际衡量的内容以及我们的数字与之相比的位置。
一个记忆层,五个作答模型,每个 500 个问题。每一行的检索完全相同(由字节完全一致的诊断文件证明)。详情和注意事项见 RESULTS-ACTORS.md。
为什么会有这个
市场上的每一个记忆产品都把您的历史保存在自己的服务里,并通过自己的 API 交还。.dai 押的是相反的注:记忆是一种文件格式,就像照片是 JPEG 一样。每段对话三个纯文本区域,旁边一个小型派生索引,任何模型、任何工具或 grep 都能读取它。
| 记忆即服务 | 记忆即格式(.dai) |
|
|---|---|---|
| 您的历史存放在哪里 | 他们的数据库 | 您的磁盘,纯文本 |
| 谁能读取它 | 他们的 SDK | Claude、GPT、Gemini、Cursor、本地模型、grep、git |
| 当供应商消失时 | 记忆也随之消失 | 文件在任何编辑器中都保持可读 |
| 你如何检查一次召回 | 日志,如果有的话 | 打开答案所引用的文件 |
| 一个基准数字意味着什么 | 一个产品的流水线 | 一个存储,按回答模型分别测量,这样你可以挑选模型 |
该存储由廉价的 observer 模型一次性构建,并由任意 actor 模型读取。用好的模型进行转换,然后用最便宜、最快或本地的模型来回答。数字见下。
适用于
一个存储,通过 MCP 连接,由你已经在使用的工具读写。node setup.js 检测并配置其中每一个,并备份它所触及的内容;Install 中有各工具的命令。
| 助手 | 编辑器和 IDE | CLI 和任何 MCP 客户端 |
|---|---|---|
| Claude Desktop、Claude Code、任何通过 MCP 的模型 | Cursor、Windsurf、Zed、Cline、Continue | Codex CLI,以及任何通过 --client generic --config <file> 的 MCP 客户端 |
任何支持 MCP 的运行时也一样。该服务器是一个普通的 stdio MCP 服务器,因此支持 MCP 的框架无需编写适配器即可调用 save_memory 和 recall_memory:OpenAI Agents SDK、Vercel AI SDK、LangGraph、LangChain、CrewAI 和 LlamaIndex 都将 MCP 服务器作为工具来源。将它们指向 node mcp_server.mjs。
带上你的历史记录。本机上的 Claude Code 会话会自动转换。从任何其他工具中,导出一个包含 .txt、.md 或 .jsonl 的文件夹,然后运行 node daidocs.js convert。从更多工具原生导入历史记录已在路线图上。
浏览器扩展
DaiDocs 还附带一个浏览器扩展,可捕获你的 AI 聊天(ChatGPT、Claude、Gemini),并可选择加入捕获你的 X 时间线和所选网站,直接存入本地 DaiDocs 存储。它仅限本地:任何内容都不会离开你的机器,捕获默认关闭,敏感网站(银行、健康、网页邮件、密码管理器)绝不会被触及。
它位于 browser-extension/,且不会自动安装:你需要在浏览器中加载一次。完整的分步说明见 browser-extension/GETTING-STARTED.md。简而言之:
- 从
browser-extension/启动本地捕获服务器:node capture_server.mjs(无需额外安装)。 - 在 Chrome 或 Edge 中,打开扩展页面,开启开发者模式,然后加载已解压的
browser-extension/extension文件夹。在 Firefox 中,打开about:debugging并加载browser-extension/extension/manifest.json。 - 接受一次性同意,然后使用页面上的胶囊按钮为某个网站开启捕获。
安装
两半,两个包管理器。安装你想要的那个,或两者都安装以获得完整系统。
npx daidocs setup # .dai: documents + session history (Node 18+) pip install kerneta-cai # .cai: the code graph (Python 3.10+)
两个都要?两个都安装,一个用 npm,一个用 pip。npx daidocs setup --ask 还在其流程中提供 .cai 代码层级。这两半在安装时互不共享,也绝不会冲突:.dai 是 Node,.cai 是 Python,各自独立有用,当两者都存在时,ask 路由器将它们连接起来。
.dai:文档和会话历史(npm)
Node 18 或更新版本。
npx daidocs setup
一条命令。它检测 Claude Desktop、Claude Code、Cursor、Windsurf、Codex、Cline、Continue 和 Zed,配置所有这些,安装会话钩子、阅读协议和 .dai 图标,并备份它触及的每个文件。在 Claude 订阅上,没有 API 密钥,也无需付费。
还想要源代码和基准测试产物?克隆它并从那里运行 setup:
git clone https://github.com/Kerneta/daidocs daidocs-app
cd daidocs-app
node setup.js该克隆被有意命名为 daidocs-app。否则 git clone 会创建一个名为 daidocs 的文件夹,而默认记忆存储是 DaiDocs:在 Windows 和 macOS 上,这些是同一个文件夹,因此从你的主目录克隆会覆盖你自己的记忆。如果发生这种情况,setup 会拒绝从存储内部运行。
.cai:代码图(pip)
Python 3.10 或更新版本。一次安装即可带来引擎、全部 10 种语言的 tree-sitter 语法,以及一个驱动所有操作的 kerneta 命令:
pip install kerneta-cai kerneta doctor kerneta setup <project_dir> --corpus <code_dir>
kerneta doctor 会验证解释器、引擎和语法。kerneta setup 随后为项目自动完成 .cai:它一次性构建代码图,安装一个技能,让 Claude Code 查询存储而不是读取源文件(token 少得多),并添加一个 PostToolUse 钩子,在每次编辑后刷新存储,因此代码图始终是最新的,无需手动重建。要让它一次性在所有项目中加载,kerneta setup --global --auto。
代码图是确定性的,由 tree-sitter 而非模型构建,因此不需要 API 密钥,保持更新也不花钱。当项目旁边有一个 .dai 会话存储时,kerneta setup 会自动链接它,ask 路由器就能用一条命令回答代码、文档和历史问题。代码层的自述文件里有完整的命令集(build、update、watch、query、ask、history、doctor):Kerneta-Cai/README.md。
在 PyPI 发布上线之前,直接从本仓库安装:
pip install "git+https://github.com/Kerneta/daidocs#subdirectory=Kerneta-Cai".dai 的 Python 读取器(pip)
这是 .dai 一侧,与上面的 .cai 代码层是独立的包。更喜欢 Python?用代码读取你的 .dai 存储,并用 daidocs 命令驱动引擎:
pip install daidocs
from daidocs import Store store = Store("~/DaiDocs") # your memory store for entry in store.manifest(): # every document print(entry["id"], entry["title"]) doc = store.read(store.ids()[0]) # one document, fully parsed print(doc["understanding"]["summary"]) print(store.search("deploy")) # find documents by keyword
一次安装包含两样东西:
- 读取器(纯 Python,无需 Node):
from daidocs import Store读取清单、任意文档,以及facts/events/profile索引。 daidocs命令:驱动 Node 引擎,因此daidocs setup和daidocs convert的行为就像npx daidocs。这需要 Node 18+;如果缺少 Node,它会说明并提供安装。完整指南:readers/python/。
setup.js 在首次运行时安装依赖,然后配置一切。npm run setup 做同样的事,但在 Windows 上应该用 node setup.js:在你更改执行策略之前,PowerShell 完全拒绝运行 npm,而 node 不受此影响。上面每一行都是独立的命令,因为 Windows PowerShell 5.1 没有 &&。
安装过程什么都不问。它会检测你已有的东西并全部配置好:Claude Desktop、Claude Code、会话钩子、Cursor、Windsurf、Codex、Cline、Continue、Zed、阅读协议以及 .dai 文件图标。它会备份它触碰的每个文件。
node setup.js --status what is on, and the command that changes each one
node setup.js --ask choose each surface yourself instead
node setup.js --restore put the machine back exactly as it was它唯一不会自行做的一件事是转换你已有的历史记录,因为这可能会运行一段时间,而且使用 API 密钥会花钱。想要时它只是一条命令,而且值得想要:见 带上你已有的东西。
另一个 MCP 客户端?各用一条命令,而不是编辑配置:node setup.js --client codex(或 cursor、windsurf、cline、continue、zed),其他情况用 node setup.js --client generic --config <that client's config file>。node setup.js --client list 显示名称以及每个客户端把配置保存在哪里。
在 Claude Code 中,每个会话都会在你工作时自动保存,所以没有什么需要记住的。在任何其他已连接的助手上,说 “save this chat to memory”。要让某个文件夹拥有自己的项目记忆,就在其中说 “make this folder a project”,或者在子文件夹中说以创建子项目。
带上你已有的东西
安装这个的大多数人磁盘上已经放着几个月的对话。一条命令就能把它们变成记忆,这就是一个今天下午就有用的存储和一个从这里开始慢慢填充的存储之间的区别:
node daidocs.js convert
它以同样的方式读取三种历史记录:
- 本机上的 Claude Code 会话,来自
~/.claude/projects - 已捕获但尚未转换的会话,即
_pending标记及其文本在_unconverted/中 - 来自其他任何地方的导出文件夹:
.txt、.md或.jsonl
它列出找到的内容,包括日期、项目和大小,询问要哪些(all,还是
1,3,5-8),询问存储位置,并在任何付费调用之前引用最坏情况下的 token 数量和成本。在 Claude 订阅上,这个成本为零:会话中的助手自己完成提取。每个条目在完成的那一刻就被写入,因此崩溃最多丢失一个文档,重新运行会跳过已转换的内容。会话落在它们来自的文件夹中,因此一个项目的历史最终进入该项目自己的存储,而不是堆在一起。
每个问题都有一个标志,因此可以脚本化:
node daidocs.js convert --source claude --project atlas-api --pick 1-5 --to ~/DaiDocs --yes指南列出了每个标志。
之后就是自动的
你不必记得保存任何东西。一旦安装了钩子,每个会话都会自动保存:
- 每新增 4,000 个 token,到目前为止的会话会在后台转换,写入你正在工作的文件夹中。它由对话中已有的助手写入,因此不需要 API 密钥,也不需要额外调用。
- 在此之前关闭终端也不会丢失任何东西。每次回复后,尚未转换的文本会写入该文件夹存储中的
_unconverted/,因此即使终端被杀死,最多也只丢失最后一次交流。再次在该文件夹中打开会话时,该文本会在开始时逐字读入,recall_memory也会读取它,因此 2k 的会话在转换前就可用。等待中的内容会计入下一次保存,因此昨天的 2k 和今天的 2k 会一起转换,文件夹也会随之清空。 - 第一次在文件夹中打开会话时,会先问你一个问题:将这个文件夹的记忆保存在这里,作为它自己的项目,还是和其他所有内容一起放在通用存储中?无论哪个答案都会被记住,因此不会再为该文件夹询问你。
所以你唯一要做的就是工作。指南有详细信息,下面的图表展示了整个路径。
改变主意了?把它放回去
一条命令即可撤销设置所做的一切:
npx daidocs setup --restore
设置会在更改每个文件之前备份它,因此 --restore 会将每个文件完全恢复原样:钩子从 ~/.claude/settings.json 中移除,记忆服务器从你的助手的 MCP 配置中移除,读取协议(AGENTS.md、GEMINI.md、.cursorrules)被删除。设置创建的、之前不存在的文件会被删除。之后重启一次助手,让它卸载服务器和钩子。
你的记忆永远不会被触碰:.dai 存储以纯文件形式留在磁盘上,因此你不会丢失任何东西,可以稍后重新安装并从中断处继续。
你得到什么
一个文件夹。这就是全部诀窍。
~/DaiDocs/
├── 2026-07-12_deploy-debug.dai one file per conversation, three zones
├── 2026-07-18_q3-planning.dai
├── _index/ what retrieval reads: manifest, facts, events, profile
├── _unconverted/ what is not converted yet, small, read by the next session
└── _raw/ your originals, byte-exact, never deleted
没有数据库,没有记忆服务器,也没有供应商持有你的历史。一个存储服务于 Claude、GPT、Gemini、Cursor 和本地模型,并且当其中任何一个消失时它仍然可读。
这意味着你的记忆可以用普通工具来操作:
$ grep -l "Casa do Rio" ~/DaiDocs/*.dai /home/you/DaiDocs/chat_20260720_e0546121.dai $ head -12 ~/DaiDocs/chat_20260720_e0546121.dai --- daidocs: "4.4" id: "chat_20260720_e0546121" type: "chat" title: "Valletta trip planning chat" lang: "en" source: {"app": "claude", "native_id": "chat_20260720_e0546121"} span: null messages: 3 class: {"category": "general", "priority": "normal", "actionable": false, "sensitivity": "public", "confidence": 0.9} summary: "User booked a summer trip to Valletta staying at the Casa do Rio guesthouse." tags: ["x.travel"]
没有客户端,没有查询语言,没有导出步骤。如果你愿意,可以 git log 你的记忆。
以及一张它的地图,当你想看的时候
npm run dashboard
地图的点击浏览:每个存储及其文件夹类型和磁盘上的成本,一个存储的记忆及其相关记忆之间的连线,一个记忆作为自己的页面,以及文件在三个区域中与未修改的原件并排显示。从你自己的文件构建成一个自包含的页面,可离线工作。录制使用虚构数据。
要打开它:在安装文件夹中运行 npm run dashboard。它会在 package.json 旁边写入 daidocs-dashboard.html 并在默认浏览器中打开。一个文件,离线,无服务器。如果你希望它只告诉你路径,请传入 --no-open。
这是一个快照,所以它展示的是构建时存在的内容。要在你工作时保持其最新:
npm run dashboard-live
每当存储发生变化时,它都会重建页面,而当你停止操作后,页面会自行重新加载,回到你之前查看的存储。它绝不会在阅读中途或你点击时重新加载。
会话短暂也不会丢失任何内容
低于 4,000 个新 token 的会话尚未被转换。其文本会写入该文件夹存储中的 _unconverted/,该文件夹中的下一次会话开始时,会原样呈现在助手面前,因此所说的内容不会丢失或无法读取;recall_memory 也会读取它。关闭终端不会改变任何事:文本及其标记都是磁盘上的文件。你可以随时转换积压内容,一次一个项目,每个都会落入其来源文件夹。一旦某个转换完成,它就会离开 _unconverted/。
指南中有详细说明。
记忆属于它所描述的文件夹
声明一个文件夹,其记忆就存在于其中并随它移动。文件夹是什么,就决定了该记忆会发生什么:locked 文件夹保留其已有内容,不接受任何新内容;frozen 文件夹已完成;confidential 文件夹永远不会被包含在任何更广泛的读取中。在会话中说明,在地图中设置,或传入 --project-type。
不要等着被要求。在该文件夹的 Claude Code 会话中,输入 make this folder a project;这就是全部指令。一个包含多个部分的项目,比如一个网站、一个应用,就是多个项目:在顶层输入 make this folder a project that reads its parts,在每个部分中输入 make this folder a project,这样会话只加载其部分的记忆,并在某个部分需要时 look in the main project's memory too;它只会询问一次。 指南中有分步说明。
你的机密不会进入其中
记忆由你的会话构建,因此显而易见的担忧是,粘贴到聊天中的密钥或 .env 最终会以明文保存。事实并非如此。有三样东西挡在你的会话与存储之间:
- 每次捕获都进行脱敏处理。在任何内容写入磁盘或发送给模型之前,
lib/redact.js会剥离凭据:API 密钥、令牌、.env内容等。测试套件断言,在所有捕获路径上,机密永远不会到达存储。 - 每个项目一个
.daiignore。在项目根目录放置一个.daiignore,任何文件夹与其某一行匹配的会话都完全不会被捕获:原始内容、索引,什么都没有。它的读取方式类似.gitignore(secrets/、logs/*),这是将整个敏感区域排除在记忆之外的干净方式,超出了脱敏所能捕获的范围。 - 用于已存储内容的清理命令。
node daidocs.js scrub会对现有存储重新运行脱敏处理,因此,在规则存在之前创建的存储可以在原处被清理。
没有任何内容被上传到任何地方。存储是你机器上的普通文件,只有当你设置了 API 密钥或使用你选择的订阅运行时,模型才会看到会话。完整细节见 SECURITY.md。
它有效吗
在 LongMemEval-S 上达到 83.00%(415/500):500 个问题,基于平均 103,601 个 token 的聊天历史,由本仓库中的适配器测量(benchmark/run_longmemeval.mjs),存储从数据集全新构建,由基准作者自己的 evaluate_qa.py 评分,评判快照为 gpt-4o-2024-08-06,GPT-4o 作答。任务平均:84.02%。
docs/RESULTS.md 包含完整条件、按类别细分(包括最弱的行),以及所有因针对此基准开发而受到影响的内容的披露。
引擎读取的是存储中一小块与问题相关的切片,而不是整个历史记录:每个问题 10,065 个 token,而历史记录为 103,601 个 token,约少 10.3 倍,两侧使用相同的分词器计数。检索几乎全部是基于索引的代码;它唯一的外部依赖是一个磁盘缓存的 text-embedding-3-small 调用,用于对阅读模型看到的内容进行排序(计数和建议读取会对候选事实进行第二次调用)。
在基准测试中排名第二,且其配置可由非厂商人员复现的记忆系统中。有一个系统公布了更高的数字:Mastra Observational Memory 为 84.80%,在相同的 GPT-4o actor 上领先 1.80 个百分点、9 个问题,这一差距在 n=500 时处于单次运行的噪声范围内(标准误 1.68 个百分点)。与基准测试作者自己的全上下文基线(同一模型读取粘贴的历史记录)相比,它领先 22.40 个百分点。完整表格、决定谁被纳入的规则,以及每个数字所附带的注意事项都在 docs/RESULTS.md 中;这些数字本身连同其来源作为数据记录在 tools/references.json 中。
引擎通过一个基于问题文本的正则分类器,将问题路由到四种阅读策略之一(查找、计数、时间线、建议)。这是否针对基准测试做了定制,是一个公平的问题,且有一个可验证的答案:分类器只读取问题文本,无法访问数据集,且任何调用者都无法覆盖它。从发布的源代码中打印它并自行测量:
node tools/verify_router.mjs /path/to/longmemeval_s.json
一个记忆层,五个回答模型
存储可跨模型移植;分数则不能。因此,同样的 500 个问题在一切保持不变(相同的存储、相同的渲染提示、相同的正则路由、相同的评判器)的情况下再次作答,只更换回答模型:
| actor | accuracy | correct | +/- 1 s.e. | task-averaged |
|---|---|---|---|---|
| Claude Fable 5 | 92.00% | 460/500 | 1.21 | 91.94% |
| Claude Opus 5 | 91.00% | 455/500 | 1.28 | 90.94% |
| Claude Sonnet 5 | 85.60% | 428/500 | 1.57 | 86.75% |
openai:gpt-4o(发布运行) |
83.00% | 415/500 | 1.68 | 84.02% |
| Claude Haiku 4.5 | 78.00% | 390/500 | 1.85 | 77.66% |
openai:gpt-4o,无记忆系统 |
60.60% | 303/500 | 2.19 | 未公布 |
最后一行是完全没有记忆层的同一模型:基准测试作者自己的全上下文基线,即将整个历史记录粘贴到上下文窗口中,模型据此作答。这是他们在自己的测试框架上的测量结果,不是我们的运行。其计数和标准误是在 n = 500 时对该已公布百分比进行的算术运算,所用公式与给出其他每一行标准误的公式相同;task-averaged 列留空,因为它需要六种分类型的准确率,而他们只公布了一个总体数字。与我们的 gpt-4o 行对比,这是可获得的最干净的比较,因为 actor 完全相同,唯一的变量是记忆:83.00% 对 60.60%,差距 22.40 个百分点,而且它是运行成本最高的一行,因为粘贴历史记录意味着每个问题 100,000 个 token 的提示。
Fable 5 和 Opus 5 彼此相差在一个标准误之内,应视为并列。整个差距集中在多会话综合(从 88.72% 到 69.92%);每一行的检索都完全相同,由逐字节相同的逐问题诊断文件证明。Claude 各行是通过 manual 提供商路由而非 API 生成的,这是一个真实的差异,并在 RESULTS-ACTORS.md 中完整披露。
单独测量的检索
一次仅检索的扫描在 k = 1 到 15 时重新读取同样的 500 个问题,完全不调用模型:在 k=1 时内容召回率为 96%,从 k=3 起为 98%,而 k=5 以上没有任何变化。实际交付的工作点(k=5,10,065 个 token)正是曲线已经趋于平坦的位置。多会话在 gpt-4o 下达到 99% 的内容召回率和 72.18% 的准确率,这是最清楚的证据,说明剩余的错误是读取错误,而不是搜索错误。
完整的表格、两种召回率定义以及零网络调用的证明都在 experiments/recall-sweep/ 中。
何时值得使用,何时不值得
历史记录大约低于 20k 个 token 时,没什么可节省的。你只问几个问题,整个对话仍然能放进窗口,所以用的就是原始文本,DaiDocs 帮不上什么忙。超过这个点,历史记录就放不下了,而 .dai 存储正是让答案保持可用的东西。后台转换无论如何都会运行,每 4,000 个 token 一次,所以当你跨过那条线时,存储已经就位。
每个会话有一笔很小的固定开销。当启动钩子加载你的记忆索引时,会话在你提问之前就已经带着大约 2,000 到 3,000 个 token 的上下文开始了。它是固定的,不随你的历史增长,正是它让第一个问题能够从记忆中回答。在非常短的会话中,这是一笔几乎无法抵消的开销,这也是短历史最好留在窗口里的另一半原因。
Agent 轨迹以紧凑形式保存,而非完整保存。工具调用及其结果不再被丢弃:每个都被简化为工具名称、最具说明性的输入和截断后的结果,因此编码会话的编辑、命令和输出都变得可召回。长结果会被摘要而非逐字存储,而更丰富的 agent 轨迹结构仍有待完善。
想让我们替你运行吗?这里的引擎就是完整的引擎,而且永远如此,自托管,在 Apache-2.0 下免费。如果你不想自己运维,我们提供托管:转换、存储和召回作为托管服务,相同的格式,相同的文件,随时可导出。这就是这里的工作获得资金的方式。参见 daidocs.com。
选择你的模型
安装时设置会问你一次,之后该选择便处处适用。转换、钩子、MCP 服务器和 CLI 都会使用它,直到你更改为止。
在 Claude 订阅下,在 Claude Code 中:使用 Opus。这是我们的推荐,而且在订阅下,转换是由对话中已有的助手完成的,所以不需要 API 密钥,也没有额外费用。
使用 API 密钥时:使用 openai:gpt-4.1-mini。成本低,准确率高,而且本仓库中发布的每一个数字都是用它所测量的。gemini:gemini-3.1-pro 是另一个不错的选择。
转换在 token 上很便宜。转换一个会话的成本大致相当于该会话已经占用的量,再加上同样大小的一个或两个问题。它不是对你整个历史再做一遍,而是只读取新增的部分,一次。
如果你愿意,可以调高,但不要调低。观察者的输出会被永久写入文件,因此未来的每一个答案都受限于它第一次捕获到的内容。一个只捕获了 65% 关键信息的模型,而不是 96%,并不会让你之后回忆得稍差一点:它给你的存储库将不再包含答案。上面五模型对比就是这一点的实测版本:同一个存储库、同样的问题,仅因由谁来读取就产生了 14 个百分点的差距。
负责回答的模型是成本较低的选择,并且可以按问题更换。观察者才是值得投入的那个,因为你只能运行它一次。
使用它
通过 MCP 提供六个工具:save_memory、recall_memory、list_memories、read_memory、declare_project 和 brief_parent。你从不直接调用它们;你只需自然地提问:
- “把这段对话保存到记忆里”
- “关于部署流水线我们决定了什么?”
安装 Claude Code 钩子后,每次会话都会在你工作时自动保存,无需记住任何事。
高效读取存储库是与连接存储库分开的一步,而这一步常被跳过。加载整个 .dai 文件而不是三个缩放层级,会多消耗一个数量级的 token,却没有任何准确率提升。setup.js 会为你把协议安装到 ~/.claude/CLAUDE.md 中;同样的规则也在 prompts/READER-PROMPT.txt 里,可粘贴到任何助手中。
node daidocs.js ingest ./my-chats ./my-store # convert a folder npm run check # verify an install, no API key needed
| 变量 | 默认值 | 作用 |
|---|---|---|
DAIDOCS_STORE |
~/DaiDocs |
存储库所在位置 |
DAIDOCS_OBSERVER |
你在安装时选择的模型 | 为单次运行覆盖该选择 |
DAIDOCS_DISABLE |
未设置 | 跳过自动归档钩子 |
DAIDOCS_NO_PING |
未设置 | 在未被要求时拒绝一次性的选择加入安装 ping |
复现我们的数字
你通过运行来复现数字,而不是下载我们的答案文件。三样东西,全部公开:数据集(LongMemEval-S)、引擎(lib/methods/daidocs-v44n,在此仓库中)以及评分器(基准作者自己的 evaluate_qa.py)。协议见 docs/REPLICATION.md。
每个问题的结果在 benchmark/ 中,这样你可以找出哪些问题存在差异,而不是比较两个总数。如果你无法复现某个数字,那是你能提交的最有价值的问题,我们会公开说明,而不是悄悄修改页面。
仓库地图
| 路径 | 内容 |
|---|---|
QUICKSTART.md |
五分钟,无需任何前提 |
spec/DAIDOCS-STANDARD.md |
.dai 格式规范 |
docs/RESULTS.md |
条件、披露信息,以及每个数字一经测量后的记录 |
docs/REPLICATION.md |
如何复现它们 |
docs/READ-DAIDOCS.md |
读取协议,按界面划分 |
docs/INTEGRATION.md |
与 Claude Code 配合使用:钩子、转换历史、无密钥保存 |
prompts/ |
可粘贴到任何地方的提示词形式的协议 |
daidocs.js |
CLI:convert、pending、stores、backup、scrub、ingest、ask |
setup.js |
一条命令安装与配置 |
lib/methods/daidocs-v44n/ |
引擎,采用此仓库发布的配置 |
Kerneta-Cai/ |
.cai 代码层:tree-sitter 代码图、代码/文档交叉链接以及代码/文档/历史路由器(Python,pip install kerneta-cai) |
mcp_server.mjs |
MCP 服务器 |
session_archiver.mjs |
Claude Code SessionEnd 钩子 |
session_context.mjs |
SessionStart 钩子:会话开始时加载记忆 |
session_autosave.mjs |
Stop 钩子:会话自动保存,无需 API 密钥 |
verify_surfaces.mjs |
npm run verify:所有界面,免费且离线 |
keyless_check.mjs |
证明运行无需任何 API 密钥 |
lock.js |
npm run lock:使此文件夹变为只读 |
assets/ |
品牌标识、图表、示意图和演示 |
benchmark/run_longmemeval.mjs |
基准适配器,使运行可核查 |
benchmark/ |
每个问题的结果 |
RESULTS-SUMMARY.md |
发布运行,gpt-4o,一页呈现 |
RESULTS-ACTORS.md |
五个回答模型运行在同一个记忆层上 |
run-artifacts/ |
每个参与者的回答、评判结论、诊断信息和运行清单 |
experiments/recall-sweep/ |
recall@k,k = 1 到 15,仅检索,零 API 调用 |
MANIFEST.sha256 |
每个文件冻结时的 sha256;docs/PROVENANCE.md 说明了如何验证 |
docs/GAPS.md |
尚未完成事项的诚实清单 |
tools/verify_router.mjs |
从源码打印路由器并对其进行测量 |
tools/check_numbers.mjs |
如果任何已发布的数字与产物出现偏差,就让 CI 失败 |
tools/make_charts.py |
根据数字重新生成图表 |
tools/chart_theme.py |
daidocs.com 的图表界面,移植到 matplotlib |
tools/make_diagrams.py |
重新生成讲解图 |
tools/dashboard/ |
npm run dashboard:构建记忆地图。构建出的页面永不发布 |
docs/GUIDE.md |
每条命令、工具、脚本和文件夹类型,都在一页里 |
tools/make_badges.py |
顶部的徽章,作为本地文件而非远程获取 |
CHANGELOG.md |
每个版本改了什么 |
SECURITY.md |
如何报告问题,以及什么在范围内 |
RUNBOOK.md |
发布运行,一步一步来 |
安全地评估它
如果你是在审查 DaiDocs 而不是采用它,请在一个错误无法触及你真实环境的地方运行它:
- 首先备份你的 Claude 数据和配置。Setup 会记录它写入的每个文件,
node setup.js --restore会把它们全部还原,但备份是那对花括号之外的腰带。 - 从独立的操作系统用户配置文件进行测试,这样钩子、MCP 配置和存储都会落在一个不属于你自己的主目录中。
- 从合成对话开始,而不是你的真实历史,直到你信任被捕获和存储的内容。
- 要完全隔离,请使用一次性 VM 或容器快照。迄今为止最彻底的外部审查是在一个隔离、离线、只读的容器中运行整个系统,仅使用合成数据,这是最安全的可复制基线。
贡献
格式才是重点,所以最有用的贡献是那些把它带到更多地方的贡献。
集成。一个只有某个助手能读取的存储不是格式,而是一个多了几步的数据库。MCP 服务器覆盖 Claude Desktop、Claude Code、Cursor 和 Windsurf。其他一切开放:为另一个编辑器做的扩展、为另一个 agent 框架做的插件、为另一个运行时做的加载器、为使用非 MCP 协议的助手做的适配器。如果你在接入时遇到格式上的阻碍,那就是格式的 bug,值得提一个 issue。我们特别点名想要两个:一个 OpenRouter 提供商后端,一个密钥对接数百个模型,把自带模型变成一行配置,并以同样的小契约接入 lib/providers/,与 anthropic、openai 和 gemini 并列;以及一个 Hermes agent 集成,让运行该技术栈的人可以把它指向一个存储并让记忆工作起来。
第二个实现。一个不是这份代码的读取器或写入器。它被刻意做得足够小,一个下午就能写出来:UTF-8、一个 YAML 头、一个 JSON 区和文本。两个独立实现是文件布局与格式之间的区别。
对记忆本身的改进。更好的提取、更好的检索、更好地处理目前还无法处理的形态。Agent 轨迹是显而易见的一个:工具调用和堆栈跟踪目前转换得很差,解决它的人就是在为所有人解决。任何能让召回更准确、或让存储读取成本更低的东西,都欢迎。
Bug 和粗糙的边缘。尤其是在 macOS 和 Linux 上,这些平台虽然经过审计,但在这里的使用量远少于 Windows。如果某个东西令人困惑而非损坏,那也值得报告:一个没人能找到的功能,就等于不存在的功能。
欢迎直接提交小改动,无需事先询问。对于任何会改变格式本身的改动,请先开 issue 再写代码,因为那正是其他人工作所依赖、需要保持稳定的部分。
贡献即表示你同意你的作品以 Apache-2.0 许可,并且你声明(DCO)你有权提交它。
统计安装量,需主动选择加入,默认关闭
DaiDocs 是本地优先的,工具本身不会发送任何内容。只有一个例外,一次安装 ping,而且它的设计是为了信守这一承诺,而非变通:
- 它只询问一次,在首次交互式
setup时,之后不再询问。 - 默认是否:直接按 Enter 即拒绝,并且在非交互式运行时从不提示。
- 选择是则发送一个匿名请求:一个随机 id、版本号和时间戳。没有任何能识别你、你的文件或你的记忆的信息。
DAIDOCS_NO_PING=1会直接拒绝,无需询问。- 选择记录在
~/.daidocs/install.json中;删除该文件即可再次被询问。
它的存在是为了让项目能统计有多少人安装了它。如果你希望它根本不存在,那一个变量就能永久关闭它。
许可证
规范、引擎和 MCP 服务器均为 Apache-2.0,包含专利授权。商业使用、修改和再分发都可以。没有滞后的免费版:这里发布的就是实际运行的。
由 Kerneta 构建。
来源:Hacker News · github.com





