OSS · Python CLI + MCP
rag-db-advisor
あなたのRAGワークロードに合うベクトルDBを、実測エビデンスつきで見つける。
「どのベクトルDB?」の答えは、たいてい意見でできています。これは実測でできています。どのバックエンドが合うか、レイテンシの数字が実際何を意味するか、どの罠を踏みかけているかを聞くと、ベンチ済み9構成から蒸留した54チャンクのエビデンスで答えます。アドバイザーが返すのはエビデンス、回答を書くのはあなたのLLMです。
人気ランキングではなく、あなたのワークロードで選ぶ。
無料 · オープンソース · 数秒でエビデンスつき回答
- 4.3秒 実測の回答時間
- 約2分 セットアップ→初回答
- 54 エビデンスチャンク
- 無料 Open Source · MIT
- 出典まで遡れる回答 54チャンク全部がベンチ記録か再現済みの罠に遡れる
- 比較表をその場で 9構成×1万/10万件、人手アノテーション860クエリ
- 罠を踏む前に知れる 無音劣化3件を再現してから記録
- Claude Codeの中で動く MCPツール3本、サーバー側に生成キー不要
3ステップで回る
- 聞く
rag-db-advisor ask "…"自由文の質問1つ。CLIでもMCPでも、質問票はありません - エビデンスが返る
=== note:qdrant#1 (knowledge/ja/qdrant.md) ===実測数字入りのチャンクが、チャンクIDと出典レコードを名乗って届きます - 決める
--llm / MCP経由のあなたのLLM合成は外側で。判定文はあなたのLLM(か、あなた)が出典つきで書きます
実際の回答例
rag-db-advisor ask "10万件の日本語ドキュメントでRAG検索を作る。recallは落としたくないが、運用はなるべく軽くしたい。どのベクトルDBがいい?" --llm
✓ Recommended Qdrant (HNSW)
- recall@10 0.947 (10万件) · ANN構成トップ、厳密検索の上限0.952まで0.5pt差
- 検索p50 3.3ms · 他候補と同一コーパス・同一埋め込みの実測
- LanceDBは除外 · 既定の量子化がrecallを0.811まで下げるため
比較検討: LanceDB (10万件でrecall@10 0.811、量子化内蔵)
実行例 2026-07-12: rag-db-advisor ask --llm --model gpt-4o の実出力を要約整形
エビデンスが載せられる判断軸
以下の軸はすべて、ストアに入ることを許された2種類のもの(実測と再現済みの罠)でカバーされています。
- データ規模 1万件と10万件、両方で実測
- 検索品質 recall@10・nDCG・MRR・hit@k。人手正解と突合
- レイテンシ クエリごとのp50 / p95 / p99
- 書き込み バルクロード+インデックス構築秒数
- 運用の罠 再現済み3件+機械検証
- 配置形態 embedded型とサーバー型を別テーブルで
メタデータフィルタリング・hybrid検索・コスト試算はv0.1のエビデンス範囲外です。範囲外の質問には、それらしく答えずfail-closedでエラーを返します。測った範囲に正直なのがこのツールの態度です。
誰のためのツールか
- AIエンジニア 設計文書の「なぜこのDB」に引用できる数字が要る
- RAG開発者 「検索が遅い気がする」のデバッグで、既知の罠から先に潰したい
- Claude Codeユーザー RAGスタックの質問にモデルの事前知識でなくエビデンスで答えてほしい
- テックリード ベクトルDB提案のレビューで数字の意味を確かめたい
どんな時に使うか
- 新しいRAG機能のDB選定前に。ベンダー資料でもLLMの一般論でもなく、同一条件の実測から始める
- 「ClickHouseのベクトル検索が遅い」と感じたとき。その印象のために再現済みの罠カタログがあります
- レビューで「なぜQdrant?」と聞かれたとき。出典レコードID付きのエビデンスで答えられる
- Claude Codeで実装中に。セッションを離れずMCP経由でLLMがエビデンスを引く
インストール
pip install git+https://github.com/kenimo49/rag-db-advisor
export OPENAI_API_KEY=sk-...
rag-db-advisor ingest APIキーは埋め込み(text-embedding-3-small)のみに使用。MCP経由ならサーバー側に生成用キーは不要です: サーバーはエビデンスを返し、回答はあなたのLLMが書きます。
何を知っているか
- 実測レコード: 9バックエンド構成×2コーパス規模(MIRACL-ja 1万/10万件、人手アノテーション860クエリ)。レコードごとに品質・レイテンシ・取り込み・インデックス使用検証つき
- 運用ノート: 手書き8ファイル(バックエンド別7本+横断原則1本)。ベンチ作業中に再現した挙動だけを書く方針
- 罠カタログ: エラーゼロのまま劣化する経路3件。すべて再現→修正→記録済み
- 方法論の注意が回答に織り込み済み: 埋め込み型とサーバー型のレイテンシは直接比較不可、数値はMIRACL-ja+text-embedding-3-smallのシングルノード実測
- MCPツール3本: advise(エビデンス検索) / compare_backends(1万・10万件の比較表) / list_traps(バックエンド別の罠)。失敗時は例外でなく{"error", "hint"}を返す
罠カタログから3件
7バックエンド中3つに「エラーゼロのまま劣化する」経路がありました。3つともベンチ作業中に実際に踏み、再現してから知識ベースに書かれています。
| バックエンド | 起きること | どう見えるか | 機械検証 |
|---|---|---|---|
| ClickHouse | クエリ実行時にallow_experimental_vector_similarity_indexフラグを付け忘れるとHNSWが黙ってbrute force化 | 「HNSW」が27ms、brute forceが31msで「ほぼ同じ」に見える | EXPLAIN indexes=1でスキップインデックスの使用を確認 |
| Qdrant | 20MB未満のセグメントはデフォルトでHNSW索引化されない(indexing_threshold) | ステータスgreenのままindexed_vectors_count = 0、全クエリがフルスキャン | indexed_vectors_count == points_countを確認 |
| Milvus | quick-setupパスがindex_paramsを黙って捨ててAUTOINDEXを構築 | HNSWを指定したつもりがdescribe_indexではAUTOINDEX | 作成後にdescribe_indexでindex_typeを確認 |
出典: knowledge/ja/clickhouse.md · qdrant.md · milvus.md(すべて再現してから記録)
エビデンスで答えが変わった実例
データシートでなく実測を見ると答えが反転する例を2つ:
既定の量子化
recall@10 0.983 → 0.901
同じ1万件・同じ埋め込みで、素のHNSW最良構成とLanceDB IVF_HNSW_SQの差です。内蔵の量子化がrecallを8ポイント払います(10万件では19ポイント)。見るべきは「HNSWと書いてあるか」ではなく「量子化が入るか」。
出典: knowledge/ja/lancedb.md, cross-cutting.md
インデックスでなくプランナー
2,048行=seq scan · 4,096行=index scan
pgvectorはHNSWインデックスを作っても、数千行未満ではPostgresのプランナーがそれを使いません(ef_search=100で実測)。小規模での「HNSWが遅い」という診断は、しばしばこれが正体です。
出典: knowledge/ja/pgvector.md
使い方
# エビデンスのみ
rag-db-advisor ask "pgvector or Qdrant for 100k Japanese docs?"
# + OpenAIによる回答合成 (デフォルトはgpt-4o-mini)
rag-db-advisor ask "ClickHouse vector search feels slow. What should I check?" --llm
# Claude CodeにMCPサーバーとして登録
claude mcp add rag-db-advisor -- rag-db-advisor mcp
「答えない」という機能
このツールが想定する事故はこうです: 検索レイヤーが壊れ、呼び出し側のLLMが黙って事前知識で答え、誰も気づかない。だからアドバイザーはfail-closedに作られています。
- 検索の失敗はMCPツール3本すべてで明示的な{"error", "hint"}になる。例外が文章に飲み込まれることはない
- 結果0件も「null回答」ではなくエラー。呼び出し側モデルには「問題なし」ではなく「エビデンスなし」が見える
- 判定文は中で生成しない。アドバイザーは検索し、合成はあなたのLLM(か人間)が行い、出典は付いたまま
すべてのチャンクは同梱のベンチ記録(knowledge/results/*.jsonl)か、再現済み挙動の手書きノート(knowledge/ja/*.md)まで遡れます。推測ベースの助言は方針としてスコープ外です。
ドッグフーディング: 検索レイヤーはrag-retriever-bench自身のBaseRetriever抽象を輸入し、ナレッジの保存先にはChromaを選択。ベンチのデータが「この規模では素のHNSW勢の品質は横並び」と示しているためで、アドバイザーは自分の助言に従っています。
なぜ作ったか
rag-retriever-benchを作って分かったのは、数字は残るということです。JSONLとレポートに落ちて消えません。消えていくのはその周りの運用知識でした。インデックスを黙って無効化するフラグ、greenステータスのまま索引ゼロにするしきい値。データベースについての意見は再現しませんが、実測と再現済みの罠は再現します。だからこのアドバイザーでループを閉じました。測り、測ったものと踏んだものを知識ベースに蒸留し、次の質問に供給する。そしてエビデンスが無いときは、推測せずに無いと言います。
LLM直答・ann-benchmarksとの位置関係
「どのベクトルDB?」への答え方は道具ごとに違います。正直な違いは、答えがどこから来るかです。
| rag-db-advisor | LLMに直接聞く | ann-benchmarks | |
|---|---|---|---|
| 答えの根拠 | 同梱の実測レコード+再現済みの罠 | モデルの事前知識。出典には遡れない | 公開ANNベンチマークの実測 |
| スコープ | 日本語コーパス(MIRACL-ja)上のRAG検索バックエンド | なんでも | 標準データセット(glove, sift等)上のANNアルゴリズム・エンジン |
| 運用の罠 | ✓ 再現済み3件+機械検証つき | — | — |
| エビデンスが無いとき | 明示エラー(fail-closed) | それらしく答える | — |
| 使い方 | MCPツール + CLI | チャット | Webのグラフ |
「—」はそのツールが劣るという意味ではなく、その軸を扱わないという意味です。LLM直答は広く速く、ann-benchmarksは素のANN性能のリファレンスです。このアドバイザーは意図的に狭く、1つのコーパス系統と1つの埋め込みモデルの範囲に絞る代わりに、全主張がレコードに遡れます。
よくある質問
OpenAIのAPIキーは必須ですか?
埋め込みにだけ使います(text-embedding-3-small)。クエリとチャンクの埋め込みがOpenAI API経由です。MCP経由ならサーバー側に生成キーは不要で、回答はあなたのLLMが書きます。--llmを付けた場合のみOpenAIで合成します(デフォルトはgpt-4o-mini)。
質問は外部に送信されますか?
質問文は埋め込み生成のためにOpenAI embeddings APIへ送られます。知識ベース自体はローカル(ディスク上のChroma)です。--llm使用時は合成のため質問とエビデンスがOpenAI chat APIにも送られます。MCP経由なら合成は普段使っているLLMの側で行われます。
英語で質問できますか?
検索は埋め込み類似度なので言語をまたいで動きますが、知識ベース本文はノートもレコードの描画も日本語です。MCP経由ならあなたのLLMが合成時に翻訳します。英語ネイティブの知識はv0.1には同梱されていません。
エビデンスは正確には何件入っていますか?
v0.1で54チャンクです。実測レコード18件(rag-retriever-benchの9構成×2規模)と、手書き運用ノート8ファイル由来の36チャンク。測っていないこと・踏んでいないことは入っていません。
自分のワークロードにそのまま従っていいですか?
実測済みの出発点として扱ってください。判決文ではありません。数値はMIRACL-ja+text-embedding-3-smallのシングルノード実測で、回答自身がその注意を毎回添えます。自分のコーパスとインフラで測るならrag-retriever-benchを回してください。そのための道具です。
質問に対するエビデンスが無いときは?
推測ではなく明示エラーが返ります。MCPツール3本とも失敗時は{"error", "hint"}を返し、結果0件もエラー扱いです。呼び出し側LLMが黙って事前知識にフォールバックする経路を塞いでいます。
ナレッジを自分で足せますか?
足せます。docs/adding-knowledge.mdにノートと実測レコードの形式があります。ただし家訓は同じで、測ったか再現した挙動だけを書いてください。
なぜ回答をツール内で生成しないのですか?
再現性のためです。アドバイザーが自前のLLMを回すと、同じ質問でも実行ごとに判定が揺れます。決定的なエビデンスを返して合成を呼び出し側に委ねれば、数字が動くのはベンチを回し直した時だけで、どの主張にも出典が付いたままになります。
作者について
作者はKen Imoto。Zenn・Qiita・Dev.to・当サイトで技術記事300本以上、4言語で書籍40冊以上、Zenn・Qiitaで累計40万PV超、Zenodoで研究論文4本を公開し、LLMO Frameworkを設計しています。
関連
エビデンスはすべてrag-retriever-benchから。同一コーパス・同一クエリで9バックエンド構成を測るベンチマークハーネスです。
関連する開発ツール
- opencut-mcp OpenCut classic を任意の MCP クライアントから操作する MCP サーバー。Playwright がエディタセッションを保持し、12 個のツールでタイムライン・メディアアセット・エクスポートパイプラインを公開。OpenCut classic の fork 向け。
- mcp-scorecard MCPサーバー用のプリフライトチェックCLI。ツールを1つも呼ばずに消費される受動トークン量、ユースケースの絞り込み、セキュリティ、命名衝突の4層でスコアカードを返します。
- 404 Games 404ページに置けるcanvasミニゲーム10本。有名エラーページへのオマージュ集。Vanilla JS・依存ゼロ・テーマ追従。当サイトの404で稼働中。
- historymap YAMLを書くと企業サイト風のプロダクトヒストリー年表を生成。10種類のレイアウトをページ上で切り替え可能。静的・自己完結・iframe埋め込み対応。