doc-search
Officialdoc-search — гибридный поиск + RAG-чат для репозитория документов
Гибридный поисковый движок для внутреннего репозитория документов (глоссарий, чек-листы ревью, проектная документация), сочетающий поиск по ключевым словам (BM25) × векторный поиск (семантический поиск), и RAG-чат (Claude API, выбор модели, потоковый вывод) поверх него.
Дизайн UI повторяет SodaShikenn/LLM-RAG_KBQA (левая боковая панель: выбор модели / настройки базы знаний / история диалога, справа: чат + Send / Cancel).
Четыре способа использования:
RAG-чат (
/) — выберите модель и задайте вопрос. Поиск → потоковый ответ с цитатамиПоисковый обозреватель (
/search.html) — инкрементальный поиск, отображение оценок KW/VEC/RRFCLI —
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 (офлайн)».
Выбор модели эмбеддингов (--embedder)
Название | Расположение | Вес | Особенности |
| Облако | Ноль локальных зависимостей | voyage-3.5. Рекомендуемый Anthropic партнёр по эмбеддингам. Высочайшее качество. Требуется |
| Локально | ~470MB + torch | multilingual-e5-small. Полностью локальная, надёжный вариант по умолчанию с поддержкой японского и английского |
| Локально | ~2.2GB + torch | Высокоточная версия e5 |
| Локально | ~2.3GB + torch | Многоязычная модель локального топ-уровня. Однако это полная противоположность «лёгкости», и инференс на CPU медленный |
| Локально | Ноль зависимостей | Хэш по символьному виду (без семантического поиска, вырожденный режим) |
Как выбрать: если хотите сочетать качество и лёгкую установку — voyage (при разрешении облака).
Если обязательно полностью локально — e5; если нужна выше точность — bge-m3 (если допустим вес).
Поскольку BM25 (лексическое совпадение) всегда работает локально, роль эмбеддингов — только учёт перефразировок; разница между моделями проявляется только здесь, а multi-vector/sparse возможности bge-m3 в этой конфигурации не нужны.
Как работает чат (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) | Один гибридный поиск, топ-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 генерации — официальный SDK Anthropic. Ключ —
ANTHROPIC_API_KEYв.env
Интеграция с 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 сам выполняет планирование запроса → повторный поиск → чтение файлов → ответ с цитатами, в редакторе реализуется 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, указатели на внутренний репозиторий не пушатсяПлейсхолдер: если ничего не настроено, индексируется
sample_docs/
Логика разрешения сосредоточена в одной функции get_datasource() в docsearch/datasource.py.
GitHub-ссылки в цитатах
Результаты поиска, чипы цитат и [path:line] в ответах становятся глубокими ссылками на соответствующие строки в GitHub-репозитории документов (формат blob/<インデックス時のSHA>/path#L<line>, поэтому якоря строк не сбиваются даже при развитии репозитория).
Автоопределение из
git remoteрепозитория docs во время индексации (поддерживается и GHE)Если автоопределение невозможно (например, при монтировании docs в Docker), задайте
DOCSEARCH_GITHUB_BASE=https://github.com/o/r/blob/main/docsв.env(в CLI —--github-base)
Ключевые особенности поискового движка
Поиск по японским ключевым словам: CJK-строки разворачиваются в биграммы и индексируются в 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.plistВнимание, macOS TCC: если репозиторий находится в защищённой папке, например
~/Desktop, python, запущенный через launchd, может получить отказ в доступе к файлам и зациклиться при запуске. В этом случае предоставьте 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Если на Mac нет Docker (при отказе от 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 с достаточной памятью): запишите в
.envWITH_LOCAL_ML=1иDOCSEARCH_EMBEDDER=e5, затемdocker compose up --build -d(образ ~2-3GB, при первом запуске происходит загрузка модели. Изменение модели эмбеддингов обнаруживается при запуске, и индексация выполняется автоматически заново)Стандартный облегчённый образ (~300MB): векторный поиск — через облако при наличии
VOYAGE_API_KEY, иначе вырождается в hash (поиск по ключевым словам всегда работает полностью)Для реальных документов замените
./sample_docs:/docs:roвdocker-compose.yml; повторная индексация после обновления содержимого —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 браузера (без серверной персистентности)
Оценка: полезно сравнить hybrid против отдельных режимов и между моделями эмбеддингов по recall@k на парах «вопрос → правильный файл»
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