doc-search
Officialdoc-search — 面向文档仓库的混合搜索 + RAG 聊天
面向公司内部文档仓库(术语表・评审要点・设计文档)的 关键词搜索(BM25)× 向量搜索(语义搜索) 混合搜索引擎, 以及构建在其之上的 RAG 聊天(Claude API・模型选择・流式输出)。
UI 设计沿袭 SodaShikenn/LLM-RAG_KBQA (左侧边栏:模型选择 / 知识库设置 / 对话历史,右侧:聊天 + Send / Cancel)。
4 种使用方式:
RAG 聊天 (
/) — 选择模型后提问。搜索 → 带引用的回答以流式输出搜索浏览器 (
/search.html) — 增量搜索,显示 KW/VEC/RRF 分数CLI —
docsearch search "..."MCP 服务器 — 注册为 Claude Code 的工具(Agentic RAG)
安装(轻量:无 ML 依赖・约 30MB)
cd doc-search
brew install uv # 未導入の場合
uv venv --python 3.12 .venv
uv pip install -p .venv/bin/python -r requirements.txt
cp .env.example .env # ANTHROPIC_API_KEY を記入(チャット用)仅在使用本地嵌入模型(e5 / bge-m3)时,才需要添加重量级 ML 依赖:
uv pip install -p .venv/bin/python -r requirements-local.txtRelated MCP server: LLMDoc
使用方法
# 1) インデックス構築
.venv/bin/python -m docsearch index sample_docs # 自動選択
.venv/bin/python -m docsearch index /path/to/docs --embedder voyage # クラウド埋め込み
# 2) サーバー起動 → http://127.0.0.1:8765
.venv/bin/python -m docsearch serve --port 8765
# 3) CLI検索
.venv/bin/python -m docsearch search "解約率" --mode vector即使没有 API 密钥,也可以通过模型「Demo(离线)」确认聊天 UI 的运行。
嵌入模型的选择 (--embedder)
name | 位置 | 体积 | 特点 |
| 云端 | 零本地依赖 | voyage-3.5。Anthropic 推荐的嵌入合作伙伴。品质最高级别。需要 |
| 本地 | 约 470MB + torch | multilingual-e5-small。完全本地,日英双语支持,稳妥的默认选择 |
| 本地 | 约 2.2GB + torch | e5 的高精度版本 |
| 本地 | 约 2.3GB + torch | 本地最强级别的多语言模型。但与「轻量」完全相反,CPU 推理也很慢 |
| 本地 | 零依赖 | 字面哈希(无语义搜索・降级模式) |
选择方法:想兼顾品质和安装轻量的话选 voyage(允许云端时)。
必须完全本地的话选 e5,想提高精度则选 bge-m3(能接受体积的情况下)。
BM25(字面匹配)始终在本地运行,因此嵌入的作用仅是吸收「换种说法」——
模型差异只在那里体现,bge-m3 的 multi-vector/sparse 功能在此架构中不需要。
聊天 (RAG) 的工作原理
質問 → 検索の深さ(effort)を解決(auto は確信度シグナルで自動判断)
→ 検索実行(hard は選択モデルがクエリを言い換え → 全変種を検索して RRF 融合)
→ system プロンプトに参照資料として注入([n] path:line 付き)
→ Claude API へストリーミング要求(output_config.effort も連動)
→ data: {status|sources|delta|done|error} を SSE 配信
→ UI が逐次描画 + 「なぜこの検索をしたか」の説明 + 引用チップ。会話は localStorage搜索深度(effort)— 隐藏 hybrid/keyword/vector
不让用户选择 IR 术语。用户只需选择「要搜索得多仔细」, 实际做了什么会在回答下方以日语显示(例:「自动 → 深入 — 无关键词匹配…生成换种说法后深入搜索」)。
effort | 动作 | 适用场景 |
自动 (auto) | 先搜索一次,再根据置信度自动选择 easy/medium/hard | 默认。拿不定主意时选这个 |
简单 (easy) | 混合搜索 1 次・取前 4 条。模型 effort 也为 low | 直接搜索术语。最快・最便宜 |
普通 (medium) | 标准混合搜索・6 条 | 以往的默认行为 |
深入 (hard) | 所选模型生成 3 条换种说法 → 用全部查询搜索并 RRF 融合・10 条。模型 effort 为 high | 资料与措辞不同的提问(例:「加班费怎么算」→ 加班津贴) |
auto 的判断信号:关键词匹配的有无・向量相似度的强弱・两种搜索的顶部匹配。
无法使用换种说法生成时(Demo 模型・未设置密钥),hard 会自动降级为「扩大条数」。
原始搜索模式(keyword/vector/hybrid)为工程师保留在 /search.html 和 CLI 中。
模型:Claude Opus 5(默认)/ Sonnet 5 / Haiku 4.5 / Demo(离线)
Opus 5 启用了服务端 refusal fallback(在因安全原因拒绝回答时, 会在同一请求内自动回退到替代模型)
生成 API 使用 Anthropic 官方 SDK。密钥在
.env的ANTHROPIC_API_KEY
集成到 Claude Code(MCP / Agentic RAG)
.mcp.json(目标仓库或主目录):
{
"mcpServers": {
"docsearch": {
"command": "/ABSOLUTE/PATH/doc-search/.venv/bin/python",
"args": ["-m", "docsearch.mcp_server"],
"env": { "DOCSEARCH_INDEX": "/ABSOLUTE/PATH/doc-search/index" }
}
}
}工具:search_docs(query, mode, k) / docs_repo_info()。
Claude Code 自身会完成查询规划→重新搜索→文件解读→引用回答,
因此与聊天 UI 不同,在编辑器内即可实现 Agentic RAG。
替换为真实数据(在具有访问权限的机器上)
本仓库中只有占位符(sample_docs)。 真实数据与内部仓库的链接,在具有访问权限的机器一侧 无需修改代码即可替换。优先级:
环境变量(Docker 使用这个):在
.env中设置DOCSEARCH_DOCS_HOST=/path/to/real-docs(容器的挂载源)和DOCSEARCH_GITHUB_BASE=https://github.example.com/org/repo/blob/main配置文件(本地运行):
cp datasource.example.json datasource.json后编辑docs_dir/github_base/embedder→ 执行docsearch index(无参数)。datasource.json已被 gitignore,指向内部仓库的指针不会被 push占位符:不设置任何内容则索引
sample_docs/
解析逻辑集中在 docsearch/datasource.py 的
get_datasource() 这一个函数中。
引用的 GitHub 链接
搜索结果・引用标签・回答中的 [path:line] 会指向文档仓库
GitHub 上对应行的深层链接(格式为 blob/<索引时的SHA>/path#L<line>,
因此即使仓库更新,行锚点也不会偏移)。
索引时从 docs 仓库的
git remote自动检测(GHE 也可)无法自动检测时(例如 Docker 中挂载 docs 时) 在
.env中设置DOCSEARCH_GITHUB_BASE=https://github.com/o/r/blob/main/docs(CLI 中使用--github-base)
搜索引擎的设计要点
日语关键词搜索:将 CJK 字符串展开为二元组(bigram)后索引到 SQLite FTS5。 查询侧通过二元组的短语搜索实现相邻匹配(无需形态分析器即可运行)
RRF 融合:BM25 分数与余弦相似度量纲不兼容,因此基于排名进行融合
给块添加面包屑:在块开头附加标题层级(术语表中标题=术语,因此尤其有用)
值得一试的有趣查询
查询 | 预期 |
| 关键词直接命中术语表 |
| 向量发现「churn rate」(换种说法) |
| 引用幂等性 / Idempotency-Key 来回答 |
| 安全评审中的租户隔离 |
部署
本地常驻(macOS / LaunchAgent)
bash deploy/install-launchd.sh # ログイン時自動起動・クラッシュ時自動再起動日志:
logs/docsearch.log/logs/docsearch.err.log停止・删除:
launchctl bootout gui/$(id -u)/com.sodashikenn.docsearch && rm ~/Library/LaunchAgents/com.sodashikenn.docsearch.plistmacOS TCC 注意:如果仓库位于
~/Desktop等受保护文件夹下, launchd 启动的 python 可能会因文件访问被拒绝而陷入启动循环。 此时请在「系统设置 > 隐私与安全性」中授予 python 访问权限, 或将仓库移到受保护区域之外(例如~/dev/)
Docker(与其他机器共享时这是最快路径)
git clone https://github.com/SodaShikenn/doc-search.git && cd doc-search
cp .env.example .env # ANTHROPIC_API_KEY を記入
docker compose up --build -d # → http://127.0.0.1:8765没有 Docker 的 Mac(不使用 Docker Desktop 时):
brew install colima docker docker-compose && colima start mkdir -p ~/.docker/cli-plugins && ln -sfn $(brew --prefix)/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose要使用完全本地的向量搜索时(推荐内存充裕的 M 系列 Mac): 在
.env中写入WITH_LOCAL_ML=1和DOCSEARCH_EMBEDDER=e5后 执行docker compose up --build -d(镜像约 2-3GB,首次会下载模型。 嵌入模型的变更会在启动时被检测并自动重新索引)默认的精简版镜像(约 300MB):向量搜索在有
VOYAGE_API_KEY时使用云端, 没有则降级为 hash(关键词搜索始终完整可用)真实文档替换
docker-compose.yml中的./sample_docs:/docs:ro, 内容更新后的重新索引使用DOCSEARCH_REINDEX=1 docker compose up -d密钥从宿主机的
.env注入(不会烧录进镜像)没有认证。对外公开时请保持本地绑定,通过反向代理(带认证)或 VPN 访问
Third-party
webui/vendor/ 是自托管的第三方库,遵循各自许可证:
marked v13.0.2 (MIT)・
DOMPurify 3.1.6 (Apache-2.0 OR MPL-2.0)。
其余均为 MIT(参见 LICENSE)。
限制与展望
索引仅支持全量重建(增量更新未实现)
对话历史保存在浏览器 localStorage(无服务器持久化)
评估:建议用「问题→正确答案文件」的 recall@k 来比较 hybrid 与单独模式・不同嵌入模型
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for semantic and hybrid search over RHEL documentation using docs2db RAG, with cross-encoder reranking and support for multiple MCP clients.4Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for semantic search across llms.txt documentation sources, with hybrid two-stage retrieval and automatic background refresh.5MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for documentation search that automatically indexes web documentation sites and provides semantic, full-text, or hybrid search capabilities.11MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for local RAG over personal notes, PDFs, and documents, enabling plain-English querying and hybrid search with multi-hop context expansion.MIT
Related MCP Connectors
MCP server for AgentDocs (agentdocs.eu): read, search, write, comment on & share Markdown docs.
Hosted MCP memory: save sessions/decisions once, search from Claude, Cursor, ChatGPT. EU-hosted FTS.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SodaShikenn/doc-search'
If you have feedback or need assistance with the MCP directory API, please join our Discord server