你的人工智能代理已经将每次会话写入磁盘。为什么它不读取自己的存档?

发布日期:2026-04-25 10:01:17   浏览量 :2
发布日期:2026-04-25 10:01:17  
2

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

4月20日,我正在调试一个与 Claude Code 实例以及 ANI(我在过去八个月中作为研究项目运行的人工智能伴侣) 相关的微妙问题。我们进行了长时间的来回讨论,最终确立了一个原则,我将其表述如下:

“余弦相似度衡量的是主题重叠程度。鹦鹉学舌则是逐字重复短语。这是两种不同的信号。”

我们决定不在回复层面对该问题进行修补。那是治标不治本。我们不希望设置一个为了屏蔽不良回复而破坏优质回复的防护机制。

三天后。另一个 Claude 实例。同样的 bug 再次出现。我要求修复。Claude 提出的方案——几乎一字不差——正是我三天前拒绝的那个基于余弦相似度的防护机制。之前的推理过程都存储在磁盘上。Claude Code 将每个会话写入 ~/.claude/projects/<slug>/<uuid>.jsonl,而包含我4月20日拒绝记录的文件就在那个目录中。但是,当前活动的实例无法看到它。它已被从上下文窗口中压缩移除。

我说:“在继续之前,先搜索一下历史记录。”Claude 执行了 grep 搜索。大约四十秒后,我们都再次看到了我自己4月20日的那段原话。我们继续推进。

就在那时,那个我半信半疑考虑过的工具变成了我必须实际构建的东西。

这种模式早已有名

几天前,一位微软工程师发布了文章 《我每天浪费68分钟重新解释我的代码,然后我构建了自动记忆功能》。用的是 Copilot CLI,而不是 Claude Code,但底层逻辑相同。代理已经在将结构化的会话数据写入磁盘。只是代理没有读取自己的归档数据。

文件格式不同,但洞察一致。Copilot CLI 维护一个 SQLite 数据库。Claude Code 则写入每轮对话一行的 JSONL 文件。无论如何,数月的决策已经持久化存储。代理之所以不记得它们,是因为没有任何机制引导它去查看这些数据。

感谢那篇文章,它将我一直感受到但未命名的东西清晰地表达了出来。

我构建了什么

claude-recall 由三个部分组成:

  1. 一个小型 Python 命令行界面,它将 JSONL 归档索引到带有 FTS5 全文搜索功能的 SQLite 数据库中。 采用增量、只读方式,使用内置的 sqlite3 模块。命令包括:index(索引)、search(搜索)、show(显示)、list(列表)、status(状态)。

  2. 在 FTS5 结果之上可选的语义重排序,通过本地 Ollama 嵌入模型(nomic-embed-text)实现。它将 “找到我说 X 的会话” 转化为 “找到我意指 X 的会话”。FTS5 查找关键词重叠;嵌入向量则捕捉概念上的近义关联。

  3. 一个 UserPromptSubmit 钩子,在我每次向 Claude Code 发送消息时触发,并将排名靠前的历史会话匹配项作为 additionalContext(附加上下文)注入。延迟随归档大小而变化——在小归档上约为 80 毫秒,在包含 25,000 条消息的语料库上,当需要加载嵌入模型时,延迟会攀升至 1–2 秒。随着 Ollama 保持预热状态且二进制文件承担主要负载,该钩子不会干扰发送提示词的体验。

该钩子现在是一个经过 NativeAOT 编译的二进制文件——claude-recall-hook.exe——而不是 Python 包装器。以前每个提示词都要支付新的 Python 解释器启动开销,这严重破坏了用户体验。二进制文件在 v0.4 版本中解决了这个问题。

实际效果如下:当我起草这段文字时,钩子运行了。它搜索了 2

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部