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 deployed
Maintenance
Related MCP Connectors
MCP server for querying Forkast documentation
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
1201MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP 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.11 npmMIT
- AlicenseNot gradedqualityAmaintenanceMCP server for local RAG over personal notes, PDFs, and documents, enabling plain-English querying and hybrid search with multi-hop context expansion.MIT