Skip to content

[BUG] suggest が日本語入力でフォールバック出力になる #126

@Kewton

Description

@Kewton

再現手順

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.dbSymbolStore::search_similar() を使用するが、embed コマンドおよび index --with-embeddingembeddings.dbEmbeddingStore に書き込む。このデータソース不整合のため、try_hybrid_search() をそのまま呼ぶだけでは動作しない。 suggestでは embeddings.dbEmbeddingStore を直接使用してセマンティック検索を行う方針とする。

改善方針

このIssueのスコープ: suggestコマンドでセマンティック検索フォールバックを実装する

実装ポイント

  1. BM25検索が0件の場合にセマンティック検索フォールバック: search_entry_files() で BM25が0件なら、EmbeddingStoreembeddings.db)を使ってセマンティック類似検索を試みる
  2. SearchContext の活用: suggest側で SearchContextsearch_entry_files() まで渡し、既存の ctx.config を再利用してembedding providerを生成
  3. エラーハンドリング: embedding 関連エラーは graceful degradation(eprintln + BM25フォールバック)で処理。SuggestError に新バリアント追加不要
  4. BM25ヒット時はそのまま: BM25で結果がある場合は従来通り。セマンティック検索はBM25 0件時のフォールバックのみ
  5. has_embeddings 判定の統一: SuggestResult.has_embeddings の判定元を embeddings.dbEmbeddingStore に統一し、既存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 jsonhas_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.rssrc/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 が利用可能な環境では代替手段あり)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions