doc-search
Officialdoc-search — hybride Suche + RAG-Chat für Dokumentrepository
Für das interne Dokumentrepository (Glossar, Review-Kriterien, Designdokumente) gibt es eine hybride Suchmaschine aus Stichwortsuche (BM25) × Vektorsuche (semantische Suche) und darauf aufbauend einen RAG-Chat (Claude API, Modellauswahl, Streaming-Ausgabe).
Die UI orientiert sich an SodaShikenn/LLM-RAG_KBQA
(linke Seitenleiste: Modellauswahl / Wissen-Einstellungen / Chat-Verlauf; rechts: Chat + Senden / Abbrechen).
4 Verwendungsmöglichkeiten:
RAG-Chat (
/) — Modell wählen und Frage stellen. Suche → Antwort mit Quellenangaben als StreamSuch-Explorer (
/search.html) — Inkrementelle Suche, Anzeige der KW/VEC/RRF-ScoresCLI —
docsearch search "..."MCP-Server — als Tool in Claude Code registriert (Agentic RAG)
Einrichtung (leichtgewichtig: keine ML-Abhängigkeiten, ~30 MB)
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 を記入(チャット用)Nur wenn ein lokales Einbettungsmodell (e5 / bge-m3) verwendet wird, kommt ein schwerer ML-Stack hinzu:
uv pip install -p .venv/bin/python -r requirements-local.txtRelated MCP server: LLMDoc
Verwendung
# 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 vectorAuch ohne API-Schlüssel lässt sich die Chat-UI mit dem Modell „Demo (offline)“ ausprobieren.
Auswahl des Einbettungsmodells (--embedder)
Name | Ort | Gewicht | Eigenschaften |
| Cloud | keine lokalen Abhängigkeiten | voyage-3.5. Von Anthropic empfohlener Einbettungs-Partner. Höchste Qualitätsklasse. Benötigt |
| Lokal | ~470MB + torch | multilingual-e5-small. Vollständig lokal, solider Standardvektorberückt für Japanisch/Englisch |
| Lokal | ~2.2GB + torch | Präzisere Version von e5 |
| Lokal | ~2.3GB + torch | Stärkstes lokales mehrsprachiges Modell. Trotzdem das Gegenteil von „leicht“, CPU-Inferenz ist ebenfalls langsam |
| Lokal | keine Abhängigkeiten | Hash auf Zeichenebene (keine semantische Suche, Fallback-Modus) |
Auswahlhinweis: Wenn du Qualität und einfaches Setup gleichermaßen willst, nimm voyage (wenn Cloud erlaubt). Muss es vollständig lokal sein, e5; für höhere Präzision bge-m3 (wenn das Gewicht akzeptabel ist). Da BM25 (lexikalische Suche) immer lokal läuft, besteht die Rolle der Einbettung nur darin, Umformulierungen aufzunehmen — und genau hier wirkt sich das Modell aus. Die Multi-Vector-/Sparse-Funktionen von bge-m3 sind in dieser Konfiguration nicht nötig.
Chat (RAG) – Funktionsweise
質問 → 検索の深さ(effort)を解決(auto は確信度シグナルで自動判断)
→ 検索実行(hard は選択モデルがクエリを言い換え → 全変種を検索して RRF 融合)
→ system プロンプトに参照資料として注入([n] path:line 付き)
→ Claude API へストリーミング要求(output_config.effort も連動)
→ data: {status|sources|delta|done|error} を SSE 配信
→ UI が逐次描画 + 「なぜこの検索をしたか」の説明 + 引用チップ。会話は localStorageSuchtiefe (effort) – hybrid/keyword/vector verbergen
Die Nutzer müssen sich nicht für IR-Begriffe entscheiden. Gewählt wird nur, „wie gründlich gesucht werden soll“ – was tatsächlich gemacht wurde, erscheint unter der Antwort auf Japanisch (z. B. „Automatik → gründlich – keine Keyword-Übereinstimmung … Umschreibungen wurden erzeugt und tiefer gesucht“).
Effort | Verhalten | Anwendungsfall |
Automatisch (auto) | Zuerst einmal sondieren, dann automatisch easy/medium/hard je nach Sicherheit | Standard. Bei Unsicherheit diese Option |
Einfach (easy) | Ein hybrider Suchlauf, Top-4-Treffer. Modell-Effort ebenfalls low | Begriffe werden direkt gesucht. Am schnellsten und günstigsten |
Normal (medium) | Standard-Hybridsuche, 6 Treffer | Der bisherige Standard |
Gründlich (hard) | Das gewählte Modell erzeugt 3 Umformulierungen → Suche über alle Queries und RRF-Fusion, 10 Treffer. Modell-Effort ist high | Fragen, bei denen die Formulierung in den Unterlagen von deiner Abweichung abweicht (z. B. „Gehalt für die Überstunden“ → Zuschlag für Überstunden) |
Signale für „auto“: Ob Keyword-Treffer vorhanden sind, wie stark die Vektorähnlichkeit ist und welche hohen Treffer beide Sucharten sind. Falls kein Umformulieren möglich ist (Demo-Modell, kein Schlüssel gesetzt), wird „hard“ automatisch auf „erhöhte Trefferzahl“ zurückgesetzt. Die reinen Suchmodi (keyword/vector/hybrid) bleiben Entwicklern in /search.html und der CLI erhalten.
Modelle: Claude Opus 5 (Standard) / Sonnet 5 / Haiku 4.5 / Demo (offline)
Opus 5 aktiviert Server-seitigen refusal fallback: Bei verweigerten Antworten aus Sicherheitsgründen wird innerhalb desselben Requests automatisch auf ein alternatives Modell zurückgegriffen
Generierungs-API ist das offizielle Anthropic SDK. Der Schlüssel steht in
.envinANTHROPIC_API_KEY
Einbindung in Claude Code (MCP / Agentic RAG)
.mcp.json (im Ziel-Repository oder im Home-Verzeichnis):
{
"mcpServers": {
"docsearch": {
"command": "/ABSOLUTE/PATH/doc-search/.venv/bin/python",
"args": ["-m", "docsearch.mcp_server"],
"env": { "DOCSEARCH_INDEX": "/ABSOLUTE/PATH/doc-search/index" }
}
}
}Claude Code übernimmt die Query-Pharmung → erneute Suche → Dateilesen und -verstehen → Antwort mit Quellenangabe. Daher lässt sich im Editor, unabhängig von Chat-UI, Agentic RAG umsetzen.
Ersetzen durch echte Daten (auf einem Rechner mit Zugriffsrechten)
In diesem Repository liegen nur Platzhalter (sample_docs). Realistische Daten und Links zum internen Repository werden auf einem Rechner mit Zugriff ohne Codeänderung ersetzt. Prioritätsreihenfolge:
Umgebungsvariablen (Dockers Weg): in
.envDOCSEARCH_DOCS_HOST=/path/to/real-docs(Quelle für den Container-Mount) undDOCSEARCH_GITHUB_BASE=https://github.example.com/org/repo/blob/mainKonfigurationsdatei (lokal ausführen):
cp datasource.example.json datasource.json
und danndocs_dir/github_base/embeddereditieren →docsearch index(ohne Argumente).datasource.jsonist gitignored, ein Verweis auf das interne Repository wird nicht gepushtPlatzhalter: Ohne Konfiguration wird
sample_docs/erstellt
Die Auflösungslogik ist in der Funktion get_datasource() in der Datei docsearch/datasource.py gebündelt.
GitHub-Links bei Quellenangabe
Suchtreffer, Zitier-Chips und [path:line] in Antworten verweisen direkt auf die betreffende Zeile des Dokumenten-Repositories auf GitHub. Die Form blob/<SHA zum Indexzeitpunkt>/path#L<line> wird verwendet, damit die Zeilenanker auch nach der Weiterentwicklung des Repos nicht verspringen.
Wird beim Indizieren automatisch aus
git remotedes docs-Repository erkannt (auch GHE möglich)Wenn Auto-Erkennung nicht möglich ist (z. B. bei Docker/Mount-Repo):
DOCSEARCH_GITHUB_BASE=https://github.com/o/r/blob/main/docsin.envbei der CLI--github-base
Designpunkte der Suchmaschine
Japanische Stichwortsuche: CJK-Zeichen werden in Bigramme zerlegt und in SQLite FTS5 indiziert. Auf der Anfrageseite wird das Stemming durch eine Phrasensuche über die Bigramme realisiert, sodass benachbarte Treffer erkannt werden (ohne Morphologie-Analyzer)
RRF-Fusion: Da BM25-Scores und Kosinus-Ähnlichkeit nicht skalär vergleichbar sind, wird in der Rangfolge fusioniert
Brotkrümel in Chunks: Die Kopfstruktur wird am Chunk- Anfang ergänzt (im Glossar ist der Kopf das Wort selbst)
Interessante Queries zum Austesten
Query | Erwartung |
| Mit Keyword direkt den Glossar-Eintrag finden |
| Vektorsuche entdeckt „Churn Rate“ (Umformulierung) |
| Antwortzitat / Hinweis auf |
| Sicherheitsblickwinkel auf der Mietetrennung |
Deployment
Local residency (macOS / LaunchAgent)
bash deploy/install-launchd.sh # ログイン時自動起動・クラッシュ時自動再起動Logs:
logs/docsearch.log/logs/docsearch.err.logS che Reis entpacken / löschen:
launchctl bootout gui/$(id -u)/com.sodashikenn.docsearch && rm ~/Library/LaunchAgents/com.sodashikenn.docsearch.plistmacOS-TCC-Hinweis: Wenn das Repository in geschütztem Ordnern wie
~/Desktopliegt, kann der per launchd gestartete Python-Prozess den Dateizugriff verweigern und so einen Endlos Start verursachen. Falls das passiert, gib Python in „Systemeinstellungen > Datenschutz & Sicherheit“ Zugriff oder verschiebe das Repository aus dem geschützten (z. B.~/dev/).
Docker (für Austausch mit anderen Maschinen am schnellsten)
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:8765Auf einem Mac ohne Docker (falls Docker Desktop nicht verwendet werden soll):
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-composeFalls die Einbettung vollständig lokalisiert werden soll (empfohlen für M-Reihe-Mac mit ausreichend Memory): In der
.envWITH_LOCAL_ML=1undDOCSEARCH_EMBEDDER=e5schreiben, danachdocker compose up --build -d(Image ~2–3 GB, beim ersten Mal Modell-Download). Änderungen am Embedding-Modell werden beim Befehl erkannt und automatisch neu indizet.Das Standard-Slim-Image (~300 MB): Vektor-Suche nutzt
VOYAGE_API_KEY, falls vorhanden, sonst Hash-Fallback (Schlüsselwortsuche insgesamt voll funktionsfähig)Echte Dokumente ersetzen: In
docker-compose.yml./sample_docs:/docs:ro, bei Inhalt aktualisieren und neu indizierenDOCSEARCH_REINDEX=1 docker compose up -dSchlüssel werden aus der host
.envinjiziert (nicht ins Image gebrannt)Keine Authentifizierung vorhanden. Bei externer Veröffentlichung am Standardbindings lokal belassen und einen Reverse-Proxy (mit Authentifizierung) oder VPN verwenden.
Third-party
webui/vendor/ enthält selbst gehosted Drittanbieter-Bibliotheken, unter den jeweils eigenen Lizenzen:
marked v13.0.2 (MIT) ·
DOMPurify 3.1.6 (Apache-2.0 OR MPL-2.0).
Der übrige Teil steht unter MIT (siehe LICENSE).
Einschränkungen und Erweiterungen
Der Index kann nur vollständig neu aufgebaut werden (eine inkrementelle ist nicht möglich).
Antwortenivee Verlauf liegt im Browser-localer localStorage (keine Server-Persistenz)
Bewertungen: Vergleich zwischen hybrid und einzelnen Modellen bzw. Einbettungsmodellen über
recall@kbei Frage → korrekte Datei bieten sich an.
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