<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>文档检索 on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/%E6%96%87%E6%A1%A3%E6%A3%80%E7%B4%A2/</link>
        <description>Recent content in 文档检索 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 01 May 2026 03:12:57 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/%E6%96%87%E6%A1%A3%E6%A3%80%E7%B4%A2/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>qmd：给 AI Agent 使用的本地 Markdown 文档搜索工具</title>
        <link>https://www.knightli.com/2026/05/01/qmd-markdown-search-for-ai-agents/</link>
        <pubDate>Fri, 01 May 2026 03:12:57 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/05/01/qmd-markdown-search-for-ai-agents/</guid>
        <description>&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 是一个面向本地 Markdown 文档的搜索工具，重点服务对象是 AI Agent。&lt;/p&gt;
&lt;p&gt;它解决的问题很具体：当你的项目里有大量 &lt;code&gt;.md&lt;/code&gt; 文档时，AI 编程助手经常不知道该读哪一份、该引用哪一段、哪些说明才是最新的。靠全文 grep 可以找到关键词，但很难理解语义；直接把整套文档塞进上下文，又浪费窗口，还容易混入无关内容。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 的思路是先为 Markdown 文档建立索引，再通过搜索接口把最相关的片段交给 AI 使用。它既可以作为命令行工具使用，也可以通过 SDK 集成，还可以作为 MCP Server 接入支持 MCP 的客户端。&lt;/p&gt;
&lt;h2 id=&#34;它解决什么问题&#34;&gt;它解决什么问题
&lt;/h2&gt;&lt;p&gt;真实项目里的文档通常不是一两篇 README。&lt;/p&gt;
&lt;p&gt;你可能会有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;架构说明&lt;/li&gt;
&lt;li&gt;API 文档&lt;/li&gt;
&lt;li&gt;开发规范&lt;/li&gt;
&lt;li&gt;部署流程&lt;/li&gt;
&lt;li&gt;设计决策记录&lt;/li&gt;
&lt;li&gt;故障排查笔记&lt;/li&gt;
&lt;li&gt;需求文档&lt;/li&gt;
&lt;li&gt;AI 使用说明&lt;/li&gt;
&lt;li&gt;各种工具链备忘录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;人类查文档时可以顺着目录慢慢看，但 AI Agent 更需要一个明确的检索入口。否则它可能会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读错文档&lt;/li&gt;
&lt;li&gt;漏掉关键约束&lt;/li&gt;
&lt;li&gt;使用过时说明&lt;/li&gt;
&lt;li&gt;把不相关内容塞进上下文&lt;/li&gt;
&lt;li&gt;在回答里凭经验补全不存在的规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 的价值就在这里：它把本地 Markdown 文档变成可检索的知识源，让 AI 在需要上下文时先搜索，再基于匹配片段回答或执行任务。&lt;/p&gt;
&lt;h2 id=&#34;搜索方式有什么特点&#34;&gt;搜索方式有什么特点
&lt;/h2&gt;&lt;p&gt;README 中提到，&lt;code&gt;qmd&lt;/code&gt; 使用了多种检索方式组合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BM25 关键词搜索&lt;/li&gt;
&lt;li&gt;向量搜索&lt;/li&gt;
&lt;li&gt;LLM reranking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BM25 适合处理明确关键词。比如你搜索某个函数名、配置项、错误码、文件名，它通常很直接。&lt;/p&gt;
&lt;p&gt;向量搜索更适合语义问题。比如你问“这个项目怎么处理权限校验”，文档里未必正好写了“权限校验”四个字，但可能有相关的认证、访问控制、角色判断说明。&lt;/p&gt;
&lt;p&gt;LLM reranking 则用于重新排序候选结果。前两步先把可能相关的内容找出来，再让模型判断哪些片段更符合当前问题。&lt;/p&gt;
&lt;p&gt;这种组合比单纯关键词搜索更适合 AI Agent。因为 Agent 的问题往往不是固定关键词，而是任务意图。&lt;/p&gt;
&lt;h2 id=&#34;为什么是-markdown&#34;&gt;为什么是 Markdown
&lt;/h2&gt;&lt;p&gt;Markdown 是开发项目里最常见的文档格式。&lt;/p&gt;
&lt;p&gt;它足够简单，可以放进 Git；也足够结构化，有标题、列表、代码块、链接和表格。对 AI 来说，Markdown 也比 PDF、网页快照或截图更容易解析。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 专注 Markdown，意味着它可以围绕开发文档做更直接的处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按标题和段落切分内容&lt;/li&gt;
&lt;li&gt;保留代码块&lt;/li&gt;
&lt;li&gt;保留文档路径&lt;/li&gt;
&lt;li&gt;返回适合引用的片段&lt;/li&gt;
&lt;li&gt;让 Agent 知道答案来自哪份文档&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这比让 AI 随机扫描仓库更稳，也比把所有文档一次性塞进 prompt 更省上下文。&lt;/p&gt;
&lt;h2 id=&#34;三种使用入口&#34;&gt;三种使用入口
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 提供 CLI、SDK 和 MCP Server 三种入口。&lt;/p&gt;
&lt;h3 id=&#34;1-cli&#34;&gt;1. CLI
&lt;/h3&gt;&lt;p&gt;CLI 适合直接在终端里使用，也适合放进脚本。&lt;/p&gt;
&lt;p&gt;你可以把文档目录索引起来，然后用命令搜索相关内容。对开发者来说，CLI 是最容易验证效果的入口：先看它能不能搜到正确文档，再考虑接入更复杂的工作流。&lt;/p&gt;
&lt;p&gt;这类工具放在本地项目里很有用。比如你可以在改代码前先搜索设计文档，在排错前先查故障笔记，在写接口时先查 API 约定。&lt;/p&gt;
&lt;h3 id=&#34;2-sdk&#34;&gt;2. SDK
&lt;/h3&gt;&lt;p&gt;SDK 适合把 &lt;code&gt;qmd&lt;/code&gt; 接入自己的工具。&lt;/p&gt;
&lt;p&gt;如果你正在做内部开发助手、文档问答系统、代码审查机器人或项目知识库，可以通过 SDK 调用搜索能力，而不是让用户直接敲命令。&lt;/p&gt;
&lt;p&gt;SDK 的好处是可以更自由地控制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索目录&lt;/li&gt;
&lt;li&gt;查询内容&lt;/li&gt;
&lt;li&gt;返回数量&lt;/li&gt;
&lt;li&gt;结果格式&lt;/li&gt;
&lt;li&gt;后续是否交给模型总结&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这适合需要深度集成的场景。&lt;/p&gt;
&lt;h3 id=&#34;3-mcp-server&#34;&gt;3. MCP Server
&lt;/h3&gt;&lt;p&gt;MCP 是 &lt;code&gt;qmd&lt;/code&gt; 对 AI Agent 最有价值的入口。&lt;/p&gt;
&lt;p&gt;通过 MCP Server，支持 MCP 的客户端可以把 &lt;code&gt;qmd&lt;/code&gt; 当作一个文档搜索工具来调用。这样 Agent 在执行任务时，不必猜项目规则，而是可以先检索本地 Markdown 文档。&lt;/p&gt;
&lt;p&gt;典型流程可以是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户要求 AI 修改某个功能&lt;/li&gt;
&lt;li&gt;AI 先调用 &lt;code&gt;qmd&lt;/code&gt; 搜索相关设计文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qmd&lt;/code&gt; 返回最相关的 Markdown 片段&lt;/li&gt;
&lt;li&gt;AI 基于文档约束再修改代码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这比“开新会话时手动把所有规则贴进去”更自然，也更适合长期项目。&lt;/p&gt;
&lt;h2 id=&#34;适合什么场景&#34;&gt;适合什么场景
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 适合这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目里有大量 Markdown 文档&lt;/li&gt;
&lt;li&gt;AI Agent 经常需要查项目规则&lt;/li&gt;
&lt;li&gt;团队希望 AI 回答时引用本地文档&lt;/li&gt;
&lt;li&gt;文档分散在多个目录里&lt;/li&gt;
&lt;li&gt;需要在 CLI、SDK、MCP 之间复用同一套检索能力&lt;/li&gt;
&lt;li&gt;想减少 AI 编程助手凭空猜测项目约定&lt;/li&gt;
&lt;li&gt;想把本地知识库接入 Claude Desktop、Claude Code 或其他 MCP 客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的项目只有一份很短的 README，直接让 AI 读取文件就够了。&lt;/p&gt;
&lt;p&gt;但如果文档已经增长到几十篇、几百篇，或者你希望 Agent 每次先查文档再行动，这类索引工具就有意义。&lt;/p&gt;
&lt;h2 id=&#34;和-grep-有什么区别&#34;&gt;和 grep 有什么区别
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;rg&lt;/code&gt; 这类工具非常适合精确搜索。&lt;/p&gt;
&lt;p&gt;比如你知道要找 &lt;code&gt;DATABASE_URL&lt;/code&gt;、&lt;code&gt;authMiddleware&lt;/code&gt;、&lt;code&gt;404&lt;/code&gt;、&lt;code&gt;docker compose&lt;/code&gt;，直接搜关键词通常最快。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 更适合你不知道精确词的情况。&lt;/p&gt;
&lt;p&gt;例如你想问：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个项目的发布流程是什么&lt;/li&gt;
&lt;li&gt;新增 API 时要遵守哪些规范&lt;/li&gt;
&lt;li&gt;之前有没有记录过缓存策略&lt;/li&gt;
&lt;li&gt;AI 修改代码前应该读哪些文档&lt;/li&gt;
&lt;li&gt;某个模块的设计背景在哪里&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题往往需要语义检索，而不是只匹配一个词。&lt;code&gt;qmd&lt;/code&gt; 的 BM25 + 向量 + reranking 组合，就是为了让这类问题更容易找到正确上下文。&lt;/p&gt;
&lt;h2 id=&#34;和-rag-有什么关系&#34;&gt;和 RAG 有什么关系
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 可以看作一个面向 Markdown 文档的轻量 RAG 组件。&lt;/p&gt;
&lt;p&gt;它不试图替你完成整套问答系统，而是专注在“把相关文档片段找出来”这一步。至于后续怎么使用这些片段，可以交给 CLI、SDK、MCP 客户端或你自己的 Agent 流程。&lt;/p&gt;
&lt;p&gt;这种定位比较实用。很多项目并不需要一个庞大的知识库系统，只需要让 AI 在本地文档里查得准一点、快一点，并且能把结果带回当前任务。&lt;/p&gt;
&lt;h2 id=&#34;使用时要注意&#34;&gt;使用时要注意
&lt;/h2&gt;&lt;p&gt;第一，文档质量仍然重要。&lt;/p&gt;
&lt;p&gt;检索工具只能帮你找到已有内容。如果文档本身过时、重复、互相矛盾，AI 仍然可能拿到错误上下文。把 &lt;code&gt;qmd&lt;/code&gt; 接入 Agent 之前，最好先清理关键文档。&lt;/p&gt;
&lt;p&gt;第二，索引范围不要过宽。&lt;/p&gt;
&lt;p&gt;把整个仓库所有 Markdown 都塞进去不一定更好。比如依赖包文档、临时记录、旧方案草稿可能会污染结果。更好的做法是明确哪些目录是可信文档源。&lt;/p&gt;
&lt;p&gt;第三，搜索结果需要保留来源。&lt;/p&gt;
&lt;p&gt;AI 使用文档片段时，最好知道它来自哪份文件、哪个章节。这样人类复核时才能追溯，也能减少“看起来像文档结论，其实只是模型总结”的问题。&lt;/p&gt;
&lt;p&gt;第四，不要完全替代人工判断。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 能提高上下文召回质量，但它不是项目真理源的替代品。重要变更仍然要看当前代码、测试结果和最新需求。&lt;/p&gt;
&lt;h2 id=&#34;适合怎样的团队&#34;&gt;适合怎样的团队
&lt;/h2&gt;&lt;p&gt;如果你的团队已经开始把 AI Agent 放进日常开发流程，&lt;code&gt;qmd&lt;/code&gt; 这类工具会很有价值。&lt;/p&gt;
&lt;p&gt;尤其是下面几种团队：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档写得比较多&lt;/li&gt;
&lt;li&gt;项目历史比较长&lt;/li&gt;
&lt;li&gt;新人和 AI 都需要快速理解背景&lt;/li&gt;
&lt;li&gt;经常维护架构决策记录&lt;/li&gt;
&lt;li&gt;有大量 Markdown 规范文档&lt;/li&gt;
&lt;li&gt;希望 AI 修改代码前先查规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的目标不是让 AI “全知全能”，而是让 AI 少猜一点，多查一点。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/tobi/qmd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;tobi/qmd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;最后一句&#34;&gt;最后一句
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;qmd&lt;/code&gt; 的价值，是把本地 Markdown 文档变成 AI Agent 能稳定调用的搜索入口。&lt;/p&gt;
&lt;p&gt;当项目文档从“给人看的说明”变成“给人和 AI 都能检索的上下文源”，AI 编程助手才更容易按项目规则做事。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
