本システムでは、ベクトル検索エンジンとして sqliteai/sqlite-vector を利用しています。Windows 環境において標準的なプリビルドバイナリを使用すると依存関係の問題が発生するため、独自のビルド手順を採用しています。
npm パッケージ等で配布されている vector.dll は、MinGW 等の外部ランタイム (libgcc_s_seh-1.dll) に依存している場合が多く、これらがシステムパスに含まれていないと SQLite からのロードに失敗します。
本プロジェクトでは以下の方法で問題を解決しています。
sqlite3.c から sqlite3.dll を自前でビルド。vector.dll をビルドする際、作成した sqlite3.dll をリンク対象に指定。bin/ フォルダをプロセスの PATH に一時的に追加し、依存 DLL を自動検出可能にする。ビルドには Zig ( zig cc ) を使用します。
zig cc -target x86_64-windows-gnu -shared -O3 "tmp/sqlite-vector/libs/sqlite3.c" -o bin/sqlite3.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
bin/ ├── vector.dll (ベクトル検索拡張) └── sqlite3.dll (vector.dll が依存するシンボル提供元)
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"));
これにより、開発者や利用者は特に追加のランタイムをインストールすることなくシステムを利用可能です。