当你的 LLM 账单飙升你告诉自己好吧好吧上下文是昂贵的但这就是构建代理的成本。是的。结果是……不完全是。我在尝试解决一个非常无聊的问题时遇到了 QMD如何让一个代理记住数千个 Markdown 文件而不是把半个文件系统塞进每个提示会议笔记。文档。个人笔记。六个月前突然又重要的随机半成品想法。通常的答案是嵌入 向量搜索 祈祷。或者更糟只是把一切都塞进上下文然后看着令牌蒸发。QMD 做了不同的事情。老实说更聪明。它通过将检索从 LLM 转移到你的机器上减少了95%的令牌使用。没有云。没有巨大的提示。只是快速的本地搜索把模型需要的东西精确地递给它。1、真正的问题上下文不是记忆让我们说清楚。LLM 没有记忆。它们有昂贵的注意力窗口。每次你把文档粘贴到提示词中你都在为重新解释模型本来不应该想到的东西付费。大部分文本是无关的。模型知道这一点。但它仍然必须阅读它。这是核心挫折。你不希望模型知道一切。 你希望它找到正确的东西。这是一个搜索问题。不是提示问题。QMD 这样对待它。2、QMD 到底是什么QMD 是一个设备上的 Markdown 搜索引擎。你指向文件夹。它索引你的文件。它构建一个全文索引通过 SQLite FTS5 的 BM25一个用于语义搜索的向量索引一个本地 LLM 重新排序器来正确排序结果然后它通过 CLI 和代理可以使用的 MCP 服务器暴露所有这些。没有 API 调用。没有 SaaS 依赖。一切都通过node-llama-cpp和 GGUF 模型在本地运行。这就是神奇之处。本地优先。令牌最后。3、快速开始安装它bun install -g https://github.com/tobi/qmd添加你的集合qmd collection add ~/notes --name notes qmd collection add ~/Documents/meetings --name meetings qmd collection add ~/work/docs --name docs添加一些上下文让搜索理解这是什么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 embed现在搜索qmd search project timeline qmd vsearch how to deploy qmd query quarterly planning process就是这样。你现在有一个不燃烧令牌的本地记忆系统。4、为什么混合搜索实际上很重要让我们谈谈检索因为这是大多数系统崩溃的地方。4.1 仅 BM25 不够关键词搜索快速而精确。如果你记得确切的短语它是无可匹敌的。但人类不是用关键词思考的。你会输入“我们如何再次部署这个东西”文档说“生产上线程序”BM25 会错过这个。4.2 仅向量搜索也不够语义搜索很好……直到它不好。它是模糊的。它有时会返回看起来略微相关但却错过你想要的确切答案的结果。更糟糕的是它可以将完美的匹配埋藏在有点相似的下面。QMD 不选边。它两者都做。4.3 混合管道这是架构简化后是这样的。你输入一个查询。QMD 使用一个小型本地 LLM 生成查询扩展。每个查询原始 变体运行通过BM25 全文搜索向量语义搜索所有结果使用倒数排名融合 (RRF)合并。顶级候选由本地 LLM 重新排序。最终分数根据位置混合。这听起来很复杂。但每个步骤都有原因。这是来自项目的实际管道图值得凝视┌─────────────────────────────────────────────────────────────────────────────┐ │ QMD Hybrid Search Pipeline │ └─────────────────────────────────────────────────────────────────────────────┘ ...关键想法不要让任何单一方法主导。精确匹配被保留。语义匹配被包含。重新排序器在最后清理混乱。4.4 为什么 RRF 位置感知混合是聪明的大多数混合系统简单地组合分数并希望最好。QMD 更谨慎。排名第一的文档获得奖励。原始查询结果比扩展的权重更大。重新排序器在顶部的影响力较小在后面的影响力较大。为什么因为重新排序器很强大但它们可能会出错。特别是当一个精确的关键词匹配已经命中时。文档中的这句话说明了一切纯 RRF 可以在扩展查询不匹配时稀释精确匹配。所以 QMD 保护那些匹配。这不是学术的。这是被检索系统烫过的人。4.5 重新排序器在本地运行这仍然是感觉疯狂的部分。QMD 使用qwen3-reranker-0.6B通过node-llama-cpp在本地运行。没有 API。没有延迟轮盘赌。没有把你的笔记发送给第三方。重新排序器输出一个基于编码为 log 概率的 yes/no 相关性判断的 0 到 1 之间的分数。而且因为它只重新排序top 30 候选它很快。这就是你如何在没有令牌泄漏的情况下获得质量的方法。5、为什么令牌使用减少 95%想想旧的流程把文档塞进提示词问问题为每个无关的令牌付费永远重复现在比较这个使用 QMD 检索5-10 个高度相关的块只把那些传给 LLM问同样的问题LLM 读得更少。猜得更少。废话更少。它回答得更快。更便宜。更好。这不是优化。这是架构。6、将 QMD 与代理一起使用QMD 不仅仅是一个 CLI 工具。它暴露了一个MCP 服务器允许代理将其作为工具调用。可用的工具包括qmd_searchqmd_vsearchqmd_queryqmd_getqmd_multi_getqmd_status你这样把它接入 Claude Desktop 或 Claude Code{ mcpServers: { qmd: { command: qmd, args: [mcp] } } }现在你的代理可以本地搜索决定什么是相关的只在需要时拉取完整文档7、数据模型是无聊的一切都在 SQLite 中documentsdocuments_ftscontent_vectorsllm_cache没有神秘的 blobs。没有专有格式。你可以检查索引。备份它。删除它并重建。索引在这里~/.cache/qmd/index.sqlite诚实地讲这才是更多工具应该构建的方式。8、关于模型和大小的简要说明是的QMD 下载模型。本地的。嵌入~300MB重新排序器~640MB查询扩展~1.1GB这听起来很大直到你记得你在替换什么。在托管 LLM 上糟糕的一天你会花费比这更多的 API 成本。磁盘便宜。令牌不是。9、这种方法真正有效的场景如果你是以下情况这个设置会很出色写很多 Markdown构建需要长期记忆的代理关心隐私讨厌提示词膨胀想要可预测的成本如果你只是和 LLM 聊天这可能感觉过度。但如果你在构建系统……事后感觉显而易见。10、结束语QMD 不仅仅是一个搜索工具。它提醒你LLM 不应该是你的数据库。它们是推理者。综合者。解释者。让它们思考。 让其他东西记住。一旦你分离了这些职责一切都变得更容易。更便宜。更平静。诚实地讲使用这个之后把巨大的提示词塞进去感觉像用扳手作为锤子。它能工作。但你为什么要原文链接QMD本地MD混合搜索引擎 - 汇智网