面向终端 AI 的自更新知识库

我大部分时间都在终端里使用 AI 编程助手。

我经常在一次会话中解决难题。我发现了一个棘手的修复方法或特定的配置设置。然后我关闭了标签页,知识也就消失了。一个月后,我又遇到了完全相同的问题。

我构建了一个系统,利用 Claude Code hooks 让我的助手维护自己的笔记。

该系统由三个部分组成:

  • 在每次提示时搜索一个小型 Markdown 知识库以提供上下文。
  • 在会话结束时捕获有用的笔记。
  • 在会话开始时加载索引。

以下是如何在不减慢工作流的情况下构建该系统的方法。

1. 使用 UserPromptSubmit 进行检索

每当你发送提示时,此 hook 都会运行。它接收你的文本,并可以在模型响应之前注入上下文。

不要让模型决定何时查看你的笔记。使用像 grep 这样快速的搜索工具来查找相关文件。仅注入前五个匹配项。这能将处理时间控制在 100ms 以内。

搜索 hook 的两条规则:

  • 保持低成本。初始搜索使用 grep 而不是 LLM。
  • 保持精简。仅注入标题和文件路径。如果模型需要更多细节,它可以打开文件。

2. 避免在 Stop hook 中执行繁重任务

每当助手完成回复时,Stop hook 都会运行。如果你在这里运行一个耗时任务,你的助手会变得很慢。一个包含 30 轮对话的会话会触发 30 个繁重任务。

相反,请使用 SessionEnd 来一次性捕获完整的会话。

3. 解决 SessionEnd 的局限性

SessionEnd 是非阻塞的。如果你在这里启动一个长期的后台任务,系统可能会在会话关闭时将其终止。

解决方法是使用两个 hook:

  • SessionEnd:快速将对话记录路径添加到队列文件中。
  • SessionStart:清空该队列并在后台运行繁重的捕获任务。

因为下一个会话处于活动状态,后台进程将会继续运行。

4. 防止无限循环

当你启动一个 headless AI 来编写笔记时,它会继承你的环境。这意味着新的 AI 会触发它自己的 hook。这会造成无休止的 AI 调用循环。

务必在脚本顶部添加递归保护:

[ -n "$KB_CAPTURE" ] && exit 0

在启动后台捕获任务时,设置 KB_CAPTURE=1

配置总结:

  • 使用 UserPromptSubmit 进行即时上下文注入。
  • 使用 SessionEnd 将任务入队。
  • 使用 SessionStart 执行实际工作。
  • 使用廉价模型来总结笔记以节省成本。

避免一次重复解决问题所节省的精力,足以抵消多次捕获任务的成本。

Source: https://dev.to/just_an_electron/a-self-updating-knowledge-base-for-my-terminal-ai-assistant-claude-code-hooks-28jb

Optional learning community: https://t.me/GyaanSetuAi