qmd 跑本地搜索任务:Claude Code 的 Key 用 TaoToken
2026/9/16 21:00:22 网站建设 项目流程

1. 从「云端知识库越用越怕」到 qmd 本地索引:这篇文章在解决什么

前阵子和做研发的朋友聊起文档检索,大家几乎同一个状态:个人笔记、团队成员的项目文档、会议记录散落在 Obsidian 和本地目录里,真到要找资料的时候,要么在云盘里翻半天,要么怕客户信息上传到在线知识库出问题。后来社区里开始有人推 qmd 这种纯本地运行的 AI 搜索引擎,它能索引本地 Markdown 文档、会议记录,通过关键词搜索加语义搜索再加 LLM 重排序,把结果找出来。整个过程都在本机完成,断网也能跑,敏感数据不出设备。这篇文章就是用 TaoToken 给 Claude Code 接入大模型通道,顺着 qmd 已经建好的本地索引,把「本地检索 + AI 问答」跑成一条完整的 Agent 工作流。TaoToken 的统一 API 通道负责让 Claude Code 有模型可用,qmd 继续做它最擅长的本地索引和混合搜索;需要的 Key 在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,后面每个步骤都会具体说到。

先说清楚分工,免得后面绕晕:qmd 管的是「文档在我这台机器上,索引也在本机,谁能帮我搜出相关内容」;Claude Code 是「用户用自然语言提问,我要根据问题决定调什么工具、看哪些文档、最后汇总回答」;TaoToken 是 Claude Code 背后的大模型统一接入通道,不参与索引,也不碰你的文件内容。刚才提到的工作流里,敏感文档还是留在本地,qmd 的索引文件也在本地,只有 Claude Code 向 TaoToken 发起模型推理请求时才会出网。这样既拿到了 AI 的总结和组织能力,又不必把整套知识库搬上云。

2. 先把 qmd 本体装好:一条命令收编笔记和会议记录

qmd 支持用 bun 全局安装,也可以走 npm 或者 pnpm,我个人习惯用 bun,一条命令就能装完:

bun install -g https://github.com/tobi/qmd

装完之后顺手确认一下版本号,避免后面 MCP 插件调用时出现找不到命令的情况:

qmd --version

如果你用的包管理器不是 bun,比如 npm 全局目录存在权限问题,可以考虑用 pnpm 再装一次。工具本身不大,真正占地方的是后面qmd embed要下载的 embedding 模型文件,那个通常几百 MB 到几个 GB,需要留出磁盘空间。

安装完成后,把散落的文档「收编」进集合。集合(Collection)是 qmd 里最核心的组织单元,它不是一个数据库文件,而是一组对本地目录的描述。我给个人笔记、会议记录、工作文档分别建了三个集合:

qmd collection add ~/notes --name notes qmd collection add ~/Documents/meetings --name meetings qmd collection add ~/work/docs --name docs

路径根据自己的实际情况改。这里有一点要注意:qmd 索引的是目录里现有的 Markdown 文件,如果以后在这个目录下新增了文档,需要再跑一次增量同步,它本身不会实时监听文件系统变化。

为了让搜索结果的来源更可读,可以给每个集合补一句上下文描述:

qmd context add qmd://notes "Personal notes and ideas" qmd context add qmd://meetings "Meeting transcripts and notes" qmd context add qmd://docs "Work documentation"

这一步不是必须的,但当你搜到一个结果时,qmd 能告诉你这个文档属于哪个集合,方便 Claude Code 在回答里带上「这段内容来自 meetings 集合的 2024-01-15.md」,定位起来很快。

然后生成向量索引,语义搜索靠的就是这一步:

qmd embed

第一次运行会下载 embedding 模型文件,根据网络情况可能要等一阵子。之后再跑就快多了,它只处理新增或变更的文件。

3. 三种搜索方式里,最该记住的是混合搜索

索引建完之后,qmd 提供三种搜索方式,分别对应不同场景。我是按这个思路用的:

关键词搜索

qmd search "project timeline"

基于 BM25 全文检索,速度快,适合你记得确切关键词的情况。想拿给 AI Agent 用,可以加 JSON 输出:

qmd search "authentication" --json -n 10

-n 10控制返回条数,--json让输出变成结构化数据,Claude Code 解析起来比纯文本流畅很多。

语义搜索

qmd vsearch "how to deploy"

基于向量相似度,文档里没有「deploy」这个词,只要语义相近也能找出来。适合只有模糊印象、记不准术语的情况。

混合搜索

qmd query "quarterly planning process"

这是集大成者:先用本地 LLM 把原始查询扩展成多个变体,再同时跑关键词和语义搜索,最后用重排序模型把结果按相关度重新排一遍。直接拿它当默认命令用就行,搜索质量在这个工具里是最高的。

如果只想拿路径,不想要整篇内容:

qmd query "error handling" --all --files --min-score 0.4

--all表示在所有集合里搜,--files只返回文件路径,--min-score 0.4过滤掉低分结果。这样配合 Claude Code 使用时,可以先拿到一批文件路径,再让模型决定读哪几个。

需要读取完整内容时:

qmd get "meetings/2024-01-15.md"

也可以用索引里的文档 ID 获取,搜索结果里会带类似#abc123的短 ID:

qmd get "#abc123"

这些命令单独用已经很顺手了,但真正让它发挥价值的是下一步:接到 Claude Code 里,让模型在一个长会话里同时调度 qmd 搜索和语言推理。这也是为什么需要把模型通道切到 TaoToken——Claude Code 本身不自带大模型,它需要一个能访问模型的 API 地址。

4. Claude Code 装 qmd 插件后,把模型通道指到 TaoToken

Claude Code 接 qmd 分两步:第一步装 qmd 的插件,第二步把模型 Base URL 指到 TaoToken。

装插件用官方命令行:

claude marketplace add tobi/qmd claude plugin add qmd@qmd

装完插件之后,Claude Code 会拿到一组 qmd 工具,比如qmd_searchqmd_vsearchqmd_queryqmd_get。这些工具的底层全都落在 qmd 命令上,索引和文档内容仍然在本机完成。Claude Code 负责的是判断「当前这个问题该调用哪个工具、返回结果如何组织成答案」。

这时候就轮到 TaoToken 登场了。Claude Code 官方默认的模型通道对国内开发者来说有配额和网络方面的门槛,绕过这些限制不是本文要讲的,也不该那么做;更稳的做法是让 Claude Code 走一个兼容通道,把模型请求发到你自己的 API 地址上。TaoToken 正好提供这种统一接入方式。打开 TaoToken 注册并创建 API Key,然后配置 Claude Code 的环境变量。

Claude Code 的全局配置在~/.claude/settings.json,像下面这样填:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场为准" } }

三个环境变量缺一不可。ANTHROPIC_BASE_URL填的是接口地址,注意末尾不要加/v1,TaoToken 的接入文档里对这一点有明确说明。ANTHROPIC_AUTH_TOKEN填你从控制台创建的 Key,也就是上面说的YOUR_API_KEY,别和官网落地页地址搞混,那个是注册和创建 Key 用的,填进工具的是https://taotoken.net/apiANTHROPIC_MODEL不要拍脑袋填一个模型名,去模型广场看当时提供哪些可用的 Claude 模型 ID,照着列表选。

这是 Claude Code 的标准环境变量配置方式,不是通用 JSON,是整个生态里和 Anthropic 官方客户端兼容的写法。改完之后重启 Claude Code,让配置生效。

顺带提一下,如果你更习惯在项目级配置里区分不同项目的模型,可以把这个 env 块放在项目根目录的.claude/settings.json里,只对当前项目生效。平时开发我用全局配置,不同客户项目需要隔离时再改成项目级。

5. 验证链路:让 Claude Code 去搜「数据库迁移那次会议的结论」

配置保存后,怎么确认两端真的打通了,而不是各自跑各自的?我的验证方法是给 Claude Code 提一个模糊的、没法靠模型知识回答的问题,强制它去调 qmd。比如问它:「去年讨论数据库迁移的会议记录,结论是什么?帮我列出当时提到的风险点。」

如果链路正常,Claude Code 会调用qmd_query做一次混合搜索,返回一批会议记录文件路径,再调用qmd_get读内容,最后结合两份文档给出回答。回答里应该能看到类似「根据 meetings 集合的 2024-06-18.md 和 2024-06-25.md,当时讨论的风险点主要有三个」这样的引用,而不是模型凭自己的记忆硬编一段。这一点很重要:qmd 没有搜索到内容,Claude Code 就不该有对应结论。

接着可以再测一个侧重点不太一样的查询:「我笔记里有没有提过模糊搜索的调优思路?」这个问题适合验证语义搜索,因为你的笔记里可能根本没写「模糊搜索」四个字,写的可能是「fuzzy match」或者「拼写纠错」。如果 qmd 能通过向量相似度把相关笔记捞回来,说明 embedding 索引是真的在工作,Claude Code 只是一个把结果翻译成自然语言的角色。

链路通了以后,再去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看一眼这次交互有没有产生 API 调用记录。TaoToken 控制台的用量列表里,能看到刚才 Claude Code 发出的请求、对应模型和 token 消耗。这一步能帮你确认问题到底出在模型通道还是出在 qmd 插件,是排查问题最直接的分界点。

在 TaoToken 模型对话 里也可以用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。如果这里能通而 Claude Code 里不通,问题基本就在环境变量的加载路径上,去检查 settings.json 的位置和 JSON 格式即可。如果这里也不通,那就是 Key 或模型 ID 的问题,先去 控制台 API Keys 确认 Key 的状态和额度,再回到模型广场核对模型 ID。

6. 只有本篇会遇到的报错,逐个说清排查方向

跑这套「Claude Code + qmd + TaoToken」的组合,和纯 CLI 搜索不一样,报错来源分成三层,每一层的现象和修法都不同。这里只挑三个最常见的写。

第一层:qmd 命令本身找不到

错误现象是qmd: command not found,或者 Claude Code 插件报「Failed to execute qmd」之类的错。常见原因是 bun 的全局 bin 目录不在 PATH 里,解决办法是把 bun 的 bin 目录加到 shell 配置里,而不是重装工具。

第二层:模型通道报 404

如果 Claude Code 启动后模型请求直接 404,先检查ANTHROPIC_BASE_URL是不是被写成了https://taotoken.net/api/v1。TaoToken 的兼容地址末尾不带/v1,这一点和很多 OpenAI 风格网关不一样;多写一个/v1会直接导致路由对不上。另外确认ANTHROPIC_MODEL是不是填了模型广场里不存在的名字,拿不准就用广场列表里显示的原始 ID。

第三层:插件装上了但工具调不出来

claude marketplace add tobi/qmd执行成功,但对话中 Claude Code 一直不调用 qmd 工具,可能的原因有两个。一个是当前会话是插件安装前启动的,重启会话让工具列表重新加载;另一个是模型在长对话里判断「这个问题不需要外部搜索」,这种情况可以主动换一种说法提示它,比如「先用 qmd 搜索一下再回答」,把工具调用的意图表达得更明确。

另外给一个 CLI 直接验证的办法,如果你机器上装了@taotoken/taotoken,也可以不经过 Claude Code,直接确认模型通道可用:

npm install -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID

-u后面同样不要加/v1。这条命令的作用是把模型通道这一层单独摘出来测试,通过之后再去查 Claude Code 的插件,问题定位会快很多。完整的 Claude Code 环境变量说明在 接入文档 里写得很细,遇到不确定的字段可以直接对照文档查。

7. 跑通之后,这套组合实际能做什么

链路验证通过后,我实际用得最多的是三个场景,都和本地知识库的隐私保护强相关。

第一个是会议记录回顾。以前团队开完会,想把某次关于备份策略的讨论找出来,得按日期翻文件。现在直接问 Claude Code:「6 月那几次例会里,有没有讨论过备份策略?把结论整理一下。」它会先让 qmd 做语义搜索,定位到 meetings 集合里的几次会议记录,再返回给模型汇总。整个过程不需要把会议记录传到任何云服务上。

第二个是技术文档检索。查某个内部 API 的用法时,Claude Code 可以先用qmd search搜出相关实现文件,读完后直接基于项目里的真实代码回答,而不是凭训练数据猜一段可能过时的写法。对于代码量大的仓库,这个价值很快就体现出来了。

第三个是写文档或周报前的资料收集。我让 Claude Code 针对某个主题先跑一轮qmd query --all --files --min-score 0.4,把相关的本地文档路径全捞出来,再逐个读取重点内容,最后在回答里列出每份文档说了什么。这样生成的初稿每条信息都有出处,不用像以前那样担心 AI 编造细节。

整套方案跑顺之后,你对自己的知识库会建立一种信任感:文档在本地,索引在本地,搜索也在本地,Claude Code 留在外面的只有最后那一层和模型 API 交互的内容。如果你刚装好 TaoToken 还没想好跑什么场景,建议先从自己的笔记目录开始建集合。索引好之后,挑一条之前死活想不起关键词的旧笔记,用qmd query搜一遍,再用 Claude Code 问一遍,感受一下「本地检索 + AI 问答」和单纯浏览器搜索的差别。之后需要长期大量调用的话,可以去看看 Coding Plan 是否更贴合你的用量。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询