LSA検索において類似度スコアが 0.0000 固定になっていた問題を解決し、数学的に正しい検索結果を表示させるため。また、旧実装時のダミーデータを効率的に一掃する仕組みを導入するため。
0.0 のままだった。mcp.rs の sync_all_vectors を拡張し、LEFT JOIN を用いて既存ベクトルの有無と内容(全て0かどうか)を判定するロジックを実装した。search_text ツール内の類似度計算式を 1.0 - (distance / 2.0) に修正した。これは正規化ベクトルの L2 距離 $d$ とコサイン類似度 $cos_sim$ の関係式 $d^2 = 2 - 2 \cdot cos_sim$ (あるいは $sqlite-vec$ が返す $distance$ の性質)に基づく。lsa.rs の特異値分解におけるデフレーション条件の閾値を 1e-12 から 1e-15 に微調整し、より安定した主成分抽出を可能にした。graph TD
A[アプリ起動] --> B{全アイテム走査}
B --> C{ベクトル不在 又は 全て0?}
C -- Yes --> D[最新LSAモデルで再算出]
C -- No --> E[同期済みとしてスキップ]
D --> F[vec_items & items_lsa 更新]
E --> G[検索待機]
F --> G
G --> H[search_text 実行]
H --> I[距離をコサイン類似度に変換]
I --> J[UIに表示]
スマート同期の導入により、ユーザーの利便性(不正確なデータの一掃)とパフォーマンス(無駄な再計算の回避)の両立に成功した。また、検索式の修正により、意味的に近いドキュメントに対して直感的に分かりやすいスコア(1.0に近い値)が表示されるようになったことを確認した。