面向终端 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执行实际工作。 - 使用廉价模型来总结笔记以节省成本。
避免一次重复解决问题所节省的精力,足以抵消多次捕获任务的成本。
Optional learning community: https://t.me/GyaanSetuAi
