-
Notifications
You must be signed in to change notification settings - Fork 0
[BUG] search --semantic がembed済みでも「No embeddings found」エラー #124
Copy link
Copy link
Closed
Description
再現手順
commandindexdev index --path .
commandindexdev embed --path .
# → Total sections: 77829 / Generated: 58692 / Duration: 774.25s
commandindexdev status --detail
# → Embedding files: 2542 / Embedding model: nomic-embed-text / Embeddings DB: 202.4 MB
commandindexdev search --semantic "fullscreen" --format json --limit 3期待される動作
embeddingベースのセマンティック検索結果が返される。
実際の動作
Error: No embeddings found. Run `commandindex embed` first.
exitコード1で即座にエラー終了。
追加情報
通常の search "fullscreen" でも以下の警告が出力される:
[hybrid] No embeddings found, using BM25 only.
status コマンドでは Embedding files: 2542 と表示されているため、embedding自体は生成・保存されているが、検索時に認識されていない。
確定した根本原因
コード調査により、以下の原因が確定した:
| コンポーネント | 参照先DB | コード箇所 |
|---|---|---|
embed コマンド |
embeddings.db (EmbeddingStore) |
src/cli/embed.rs:136 |
search --semantic |
symbols.db (SymbolStore) |
src/cli/search.rs:512-531 |
search (hybrid) |
symbols.db (SymbolStore) |
src/cli/search.rs:643-666 |
status コマンド |
embeddings.db (EmbeddingStore) |
src/cli/status/mod.rs:238 |
embedコマンドはEmbeddingStore経由でembeddings.dbにembeddingを書き込むsearch --semanticとhybridはSymbolStore経由でsymbols.dbのembeddingsテーブルを参照するsymbols.dbのembeddingsテーブルにはデータが投入されないため、常に0件となりエラーが発生するstatusコマンドは正しくembeddings.dbを参照しているため、embedding数は正常に表示される
これは設計書(issue-63)で「SymbolStoreのembeddingsテーブルに書き込む」と記載されていたが、実装では別途 EmbeddingStore(embeddings.db)が導入された経緯による設計と実装の乖離が原因。
影響箇所
コード変更が必要な箇所
run_semantic_search()— src/cli/search.rs(DB参照先変更)try_hybrid_search()— src/cli/search.rs(DB参照先変更)EmbeddingStore— src/embedding/store.rs(search_similar(),EmbeddingSimilarityResult型の追加。既存count()を活用)- エラー型変換 — src/cli/search.rs(
EmbeddingStoreError→SearchErrorの変換追加) - 異常系契約:
run_semantic_search()はNoEmbeddingsエラー、try_hybrid_search()は従来通りgraceful fallback(BM25 only)を維持
テスト変更が必要な箇所
tests/e2e_semantic_hybrid.rs— SymbolStore経由のembeddings挿入をEmbeddingStore使用に変更test_embedding_insert_and_counttest_semantic_search_basictest_semantic_search_top_ktest_context_with_embeddingstest_hybrid_auto_switch(ignored)test_hybrid_bm25_fallback(ignored)
src/embedding/store.rs—search_similar()のユニットテスト追加(BLOBサイズ検証、dimension mismatchスキップ、ソート順、top_k制限)
新規依存関係
cli/search→embedding/storeの新規モジュール依存が発生EmbeddingStoreError変換、EmbeddingSimilarityResultの公開面積拡大- 外部crate/サービスの追加なし。Ollama/embedding provider依存の実行時契約は不変
スキーマ差異(注意)
| 項目 | SymbolStore (symbols.db) | EmbeddingStore (embeddings.db) |
|---|---|---|
| ファイルパスカラム | file_path |
section_path |
| モデルカラム | model_name |
model |
影響
- セマンティック検索(CommandIndex最大の差別化機能)が完全に利用不能
- ハイブリッド検索(BM25+embedding RRF)がBM25のみにフォールバックし、検索品質が低下
修正方針
推奨案(A): search コマンドの読み取り先を symbols.db から embeddings.db(EmbeddingStore)に変更する
- 最小変更で済む
- 既存の
EmbeddingStoreのAPI(count(),count_distinct_files())を活用 - EmbeddingStoreに
search_similar()メソッドを追加(SymbolStore側と同等のBLOBサイズ検証・dimension mismatchスキップ・コサイン類似度ソートを維持) cosine_similarity関数をEmbeddingStoreに追加embeddings.db未存在・テーブル未作成時の扱い:EmbeddingStoreError→SearchError::NoEmbeddingsまたはhybrid fallbackへのマッピングを実装し、AC-4を保証- 検索は引き続きbrute-force全件走査(SymbolStore実装と同等)。大規模DB(5万件超)での性能は退行測定対象
代替案(B): embed コマンドの書き込み先を symbols.db の embeddings テーブルに統合する
- 将来的にはクリーンだが影響範囲が大きい
- 別Issueでリファクタリングとして対応
受け入れ基準
- AC-1:
embedコマンド実行後、search --semanticがエラーなく検索結果を返す - AC-2:
searchコマンド(hybridモード)で「No embeddings found」警告が出ず、BM25+embeddingのRRF統合結果が返る - AC-3: 既存の
embeddings.dbを持つ環境で再indexなしに検索が動作する(後方互換性) - AC-4:
embeddings.dbが存在しない環境では従来通りのエラーメッセージ/フォールバックが表示される - AC-5:
cargo test --allが全パス、cargo clippy --all-targetsが警告0件 - AC-6: 検索結果の見出し・本文・タグ補完(
enrich_with_metadata())が従来通り維持される
環境
- commandindex 0.1.0
- Ollama nomic-embed-text
- Embeddings DB: 202.4 MB(生成済み)
深刻度
高
備考
- 修正時に設計書
dev-reports/design/issue-63-semantic-search-design-policy.mdの該当箇所も更新(semantic/hybridの参照先はembeddings.db、symbols.dbはメタデータ補完用という責務分担を明記) statusコマンドは機能変更なし(既にembeddings.dbを参照)- SymbolStoreのembeddingsテーブル・関連メソッド・ユニットテストは後方互換・段階的削除のため残置。別Issueでリファクタリングとして対応
- embeddings格納先の一本化リファクタリングは別Issueで対応
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels