Skip to content

[Feature] Embeddingストレージ(SQLite ベクトル格納) #62

@Kewton

Description

@Kewton

概要

生成されたEmbeddingベクトルをSQLite(symbols.db)に格納し、ベクトル検索(コサイン類似度)を実行できるようにする。

背景・動機

Semantic Searchを実現するために、生成されたembeddingを永続化し、高速なベクトル類似度検索ができるストレージ層が必要。

提案する解決策

スキーマ

CREATE TABLE embeddings (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    file_path TEXT NOT NULL,
    section_heading TEXT,          -- 見出し(NULL = ファイル全体)
    embedding BLOB NOT NULL,       -- f32配列をバイナリ格納
    dimension INTEGER NOT NULL,    -- ベクトル次元数
    model_name TEXT NOT NULL,      -- 生成に使用したモデル名
    file_hash TEXT NOT NULL,       -- キャッシュ用ハッシュ
    created_at TEXT NOT NULL
);
CREATE INDEX idx_embeddings_path ON embeddings(file_path);
CREATE INDEX idx_embeddings_hash ON embeddings(file_hash);

ベクトル格納方式

  • Vec<f32>byteorder crateで BLOB に変換して格納
  • 読み出し時に BLOBVec<f32> に復元
  • 次元数は dimension カラムで管理(モデル変更時の検出用)

コサイン類似度検索

pub fn search_similar(
    &self,
    query_embedding: &[f32],
    top_k: usize,
) -> Result<Vec<(String, String, f32)>>  // (file_path, section, similarity)
  • 全ベクトルをメモリにロードし、コサイン類似度を計算
  • 想定規模(1500ファイル × 数セクション = 数千ベクトル)ではブルートフォースで十分
  • 将来的にANN(近似最近傍)が必要になれば別途対応

スキーマバージョン

  • CURRENT_SYMBOL_SCHEMA_VERSION をインクリメント
  • 既存DBはバージョン不一致時に clean & rebuild で対応

delete/update連携

  • SymbolStore::delete_by_file()embeddings の DELETE を追加
  • ファイル更新時は delete-before-insert パターン

受け入れ基準

  • embeddingsテーブルにベクトルを格納できる
  • 格納したベクトルを正しく読み出せる(BLOB ↔ Vec変換)
  • コサイン類似度検索でtop-k件を取得できる
  • delete_by_fileでembeddingレコードも削除される
  • スキーマバージョンがインクリメントされている
  • cargo test / clippy / fmt 全パス

依存 Issue

  • なし(Phase 4完了が前提)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions