本システムでは、SQLite を単なるメタデータストレージとしてだけでなく、「ベクトル検索エンジン」としても活用しています。これにより、ACID 特性(データの整合性保証)を維持しながら、高速なセマンティック検索を実現しています。
sqlite-vec エクステンションを採用することで、標準的な SQL クエリの中でベクトル間の「距離計算」が可能になります。
erDiagram
items ||--|| vec_items : "Reference by ID (1:1)"
items {
integer id PK "文書ID (自動採番)"
text content "原文テキスト"
text path "出典・メタデータ"
datetime created_at "作成日"
}
vec_items {
integer id PK "items.id と紐付け"
blob embedding "640次元ベクトルデータ(f32)"
}
search_text のロジック検索クエリが入力されると、システムは以下の手順を踏みます。
llama-server に送り、ベクトル化する。vec_items テーブルをスキャンし、クエリベクトルに近い順(L2距離順)に items.id を取得。items テーブルから実際のテキストを取得して結合。モデルの変更や、インポート時の中断などにより、items にテキストはあるが vec_items に対応するベクトルが存在しない「不整合状態」が稀に発生し得ます。 本システムは db::sync_vectors ロジックを備えており:
items を全走査。items (メタデータ管理)文書の本体と、それに付随する情報を保持します。path カラムは、将来的なローカルパス連携や URL 参照を想定した自由形式の文字列です。
vec_items (ベクトル演算用仮想テーブル)sqlite-vec によって定義された仮想テーブルです。dimensions=640 として設定されており、Gemma-3 の出力層と完全一致させています。