-
Notifications
You must be signed in to change notification settings - Fork 0
[BUG] suggest が日本語入力でフォールバック出力になる #126
Description
再現手順
commandindexdev index --path .
# 日本語
commandindexdev suggest --for "iPad横置きでターミナルを全画面表示したい"
# 英語(比較用)
commandindexdev suggest --for "add fullscreen feature to terminal display"期待される動作
日本語のタスク記述に対しても、関連ファイルに基づく具体的な検索戦略が提案される。
実際の動作
日本語:
Suggested search strategy:
1. commandindexdev status --detail (Check index status and coverage)
2. commandindexdev search "<your keywords>" --format json (Try a broader keyword search)
英語: 具体的なファイルを含む戦略が返される(精度は別として)。
原因
suggestコマンドは search_entry_files() で reader.search() を直接呼び出しており、BM25全文検索のみを使用している。一方、searchコマンドには try_hybrid_search() によるハイブリッド検索(BM25+セマンティック RRF統合)が実装済み。
英語コードベースに対して日本語クエリを投げると、linderaトークナイザーは正しく日本語を形態素分解するが、日本語形態素と英語トークンの語彙が異なるためBM25でマッチしない。結果0件 → フォールバック出力となる。
suggestがハイブリッド検索を使用していないため、embeddings DBが存在してもセマンティック検索が活用されない。
データソースに関する注意
現行の try_hybrid_search() は symbols.db の SymbolStore::search_similar() を使用するが、embed コマンドおよび index --with-embedding は embeddings.db の EmbeddingStore に書き込む。このデータソース不整合のため、try_hybrid_search() をそのまま呼ぶだけでは動作しない。 suggestでは embeddings.db の EmbeddingStore を直接使用してセマンティック検索を行う方針とする。
改善方針
このIssueのスコープ: suggestコマンドでセマンティック検索フォールバックを実装する
実装ポイント
- BM25検索が0件の場合にセマンティック検索フォールバック:
search_entry_files()で BM25が0件なら、EmbeddingStore(embeddings.db)を使ってセマンティック類似検索を試みる - SearchContext の活用: suggest側で
SearchContextをsearch_entry_files()まで渡し、既存のctx.configを再利用してembedding providerを生成 - エラーハンドリング: embedding 関連エラーは graceful degradation(eprintln + BM25フォールバック)で処理。SuggestError に新バリアント追加不要
- BM25ヒット時はそのまま: BM25で結果がある場合は従来通り。セマンティック検索はBM25 0件時のフォールバックのみ
- has_embeddings 判定の統一:
SuggestResult.has_embeddingsの判定元をembeddings.dbのEmbeddingStoreに統一し、既存JSON出力契約との整合性を維持
スコープ外(将来Issue)
try_hybrid_search()のデータソース整合性修正(symbols.db vs embeddings.db)- 日本語キーワードからの英語キーワード推定(LLM依存の大きな機能追加)
- フォールバックメッセージの多言語対応
--no-semanticオプションの追加(パフォーマンス考慮)- クエリembeddingキャッシュやタイムアウト制御
受け入れ基準
- 日本語クエリでBM25が0件の場合、embeddings DB(
embeddings.db)が存在すればセマンティック検索にフォールバックし、関連ファイルに基づく具体的な戦略が生成されること - セマンティック検索でも0件の場合、従来のフォールバック戦略が返ること
- 既存の英語クエリの動作に退行がないこと
- embeddings DB未構築の環境で既存動作に退行がないこと
- embedding provider / ネットワーク / 類似検索で失敗しても suggest がエラー終了せず、BM25または従来フォールバックを返すこと(graceful degradation)
-
suggest --format jsonのhas_embeddingsフィールドがembeddings.dbベースの判定に統一され、既存JSON契約を維持すること
テスト計画
単体テスト(suggest.rs)
- BM25 hit → 従来通りの戦略生成(退行なし)
- BM25 miss + embeddings hit → セマンティック検索経由で具体的戦略が返る
- BM25 miss + embeddings missing → 従来のフォールバック戦略
- BM25 miss + semantic error → graceful degradation でフォールバック戦略
E2Eテスト
- クロスリンガルE2E: 英語コンテンツのみのテストリポジトリをindex/embedし、日本語クエリではBM25が0件だがセマンティック経由で具体的戦略が返ること
- 英語クエリの既存動作に退行がないこと(同一データで比較)
テストデータ準備
- CIでは
EmbeddingStoreへテストデータを直接投入する統合テスト方式(実provider不要で安定・高速) - 実provider E2Eは最小限に分離
影響範囲
既存機能への影響
- 出力変化: BM25 0件時のsuggest出力が汎用フォールバックから具体戦略へ変わりうる(CLI互換性の観点では非破壊だが挙動変更)
- JSON契約:
has_embeddingsの判定元がSymbolStoreからEmbeddingStoreに変更。値の意味は「セマンティック検索が利用可能か」で統一
コード変更
- 主な変更:
src/cli/suggest.rs(セマンティック検索フォールバック追加、has_embeddings判定変更) - 影響なし:
src/cli/search.rs、src/search/hybrid.rs、他コマンド
依存関係
- 新規ライブラリ依存なし
- ただし
suggestが既存の embedding provider 設定・API接続性に条件付き依存する(BM25 0件時のみ)
パフォーマンス
- BM25ヒット時: 変化なし
- BM25 0件時: 既存の高速失敗ケースがネットワーク待ち付きに変わる(embedding provider へのHTTPリクエスト、数百ms〜数秒)
注意事項
- 現時点では
suggestのセマンティックフォールバックとsearch --semantic/ hybrid の内部実装は別経路(データソースが異なる)
環境
- commandindex 0.1.0
- 対象リポジトリ: 英語コードベース(TypeScript/Next.js)
深刻度
中(日本語ユーザーがsuggestコマンドを使用する場合に100%再現。ワークアラウンドとして search --semantic が利用可能な環境では代替手段あり)