Newer
Older
TelosDB / docs / sqlite-vector-build.md

SQLite Vector 拡張機能のビルドと導入 (Windows)

本システムでは、ベクトル検索エンジンとして sqliteai/sqlite-vector を利用しています。Windows 環境において標準的なプリビルドバイナリを使用すると依存関係の問題が発生するため、独自のビルド手順を採用しています。

1. プリビルドバイナリの課題

npm パッケージ等で配布されている vector.dll は、MinGW 等の外部ランタイム (libgcc_s_seh-1.dll) に依存している場合が多く、これらがシステムパスに含まれていないと SQLite からのロードに失敗します。

2. 解決策:カスタムビルドの採用

本プロジェクトでは以下の方法で問題を解決しています。

  1. SQLite 本体の DLL 化: 拡張機能が SQLite のシンボルを解決できるよう、sqlite3.c から sqlite3.dll を自前でビルド。
  2. 動的リンク: vector.dll をビルドする際、作成した sqlite3.dll をリンク対象に指定。
  3. PATH 環境変数の調整: アプリケーション起動時に bin/ フォルダをプロセスの PATH に一時的に追加し、依存 DLL を自動検出可能にする。

3. ビルド手順

ビルドには Zig ( zig cc ) を使用します。

手順 A: sqlite3.dll のビルド

zig cc -target x86_64-windows-gnu -shared -O3 "tmp/sqlite-vector/libs/sqlite3.c" -o bin/sqlite3.dll

手順 B: vector.dll のビルド

ソースコードの修正(AVX2命令の定数初期化回避など)を施した後、以下を実行します。

$srcFiles = Get-ChildItem -Path "tmp/sqlite-vector/src/*.c" | ForEach-Object { '"' + $_.FullName + '"' }
$cmd = "zig cc -target x86_64-windows-gnu -shared -O3 " +
       "-I`"tmp/sqlite-vector/src`" -I`"tmp/sqlite-vector/libs`" -I`"tmp/sqlite-vector/libs/fp16`" " +
       ($srcFiles -join ' ') + " `"tmp/sqlite-vector/vector.def`" -Lbin -lsqlite3 -o bin/vector.dll"
Invoke-Expression $cmd

4. 実行時の構造

bin/
├── vector.dll    (ベクトル検索拡張)
└── sqlite3.dll   (vector.dll が依存するシンボル提供元)

5. プログラムからのロード

Rust (src-backend/src/lib.rs) 内で、以下の処理を行っています。

// bin ディレクトリを PATH に追加
if let Some(bin_dir) = find_bin_dir() {
    let old_path = env::var("PATH").unwrap_or_default();
    env::set_var("PATH", format!("{};{}", bin_dir.display(), old_path));
}

// 拡張のロード
conn.load_extension("vector.dll", Some("sqlite3_vector_init"));

これにより、開発者や利用者は特に追加のランタイムをインストールすることなくシステムを利用可能です。