
搜索引擎全文檢索后端前端CLI【免費下載鏈接】histerYour own search engine項目地址https://gitcode.com/GitHub_Trending/hi/hister點擊查看免費下載導讀hister 是一個自托管的個人搜索引擎Your own search engine它的語義搜索需要向量數(shù)據(jù)庫能力。為了讓 sqlite-vec 這一 SQLite 向量擴展能夠跨平臺、零系統(tǒng)依賴地構建進 Go 二進制項目在server/vectorstore/sqlitevec/目錄下維護了一個自包含的本地捆綁包。本文以 server/vectorstore/sqlitevec/README.md 為骨架結合vec.go、update.sh、sqlite.go等源碼講解這一捆綁方案的設計動機、CGO 細節(jié)、版本更新流程以及它如何支撐 hister 的 vec0 虛擬表向量檢索。為什么需要本地捆綁跨平臺構建的痛點sqlite-vec 是 SQLite 的一個 C 語言擴展通過注冊vec0虛擬表來提供 KNNK 近鄰向量搜索能力。如果像普通擴展那樣依賴系統(tǒng)安裝的共享庫.so/.dylib/.dllhister 的發(fā)布和部署就會面臨一系列問題用戶在 Alpine Linuxmusl libc、macOS、Windows 等環(huán)境上需要自行編譯或下載對應平臺的擴展文件擴展與宿主 SQLite 的版本/編譯選項不匹配時可能加載失敗Docker 多架構鏡像docker-bake.hcl支持多平臺構建需要為每個平臺準備擴展維護成本極高。README 開門見山地給出了結論WARNING: This is required to be able to build sqlite-vec cross platform without dependencies也就是說這個包的存在不是可選項而是實現(xiàn)跨平臺構建的前提。方案本身很簡單把 sqlite-vec 的 C 源碼sqlite-vec.c和頭文件sqlite-vec.h直接拷貝進倉庫再補一個sqlite3.h頭文件然后通過 CGO 的CGO_CFLAGS指向 mattn/go-sqlite3 的包目錄。這樣整個構建過程完全自包含不依賴任何系統(tǒng)庫。目錄結構捆綁包的構成整個捆綁包位于 server/vectorstore/sqlitevec/包含以下文件文件來源作用sqlite-vec.csqlite-vec v0.1.6上游 C 源碼vec0 虛擬表、vec_each表值函數(shù)及距離函數(shù)L2、cosine 等的完整實現(xiàn)sqlite-vec.hsqlite-vec v0.1.6上游頭文件聲明sqlite3_vec_init入口與版本宏SQLITE_VEC_VERSION v0.1.6sqlite3.hmattn/go-sqlite3 v1.14.42對應 SQLite 3.51.3編譯期所需的 SQLite API 聲明vec.go本倉庫Go 包入口包含 CGO 預處理指令與Auto()注冊函數(shù)update.sh本倉庫從上游自動拉取并更新上述 C 文件的維護腳本其中sqlite3.h是關鍵的膠水。README 稱之為 one-liner sqlite3.h shim實際實現(xiàn)上見 update.sh是把 mattn/go-sqlite3 模塊緩存里的sqlite3-binding.h直接拷貝為sqlite3.h——因為 SQLite 的頭文件必須與編譯進二進制的那份 SQLite 實現(xiàn)來自 mattn/go-sqlite3嚴格一致否則擴展調(diào)用 SQLite API 時可能因 ABI 不匹配而出錯。捆綁這份頭文件使得構建時無需在系統(tǒng)里額外安裝 SQLite 開發(fā)包。vec.goCGO 前奏與進程級注冊Go 側的入口是 vec.go它的 CGO 預處理指令是整個捆綁方案的樞紐// #cgo CFLAGS: -DSQLITE_CORE // #cgo CFLAGS: -Du_int8_tuint8_t -Du_int16_tuint16_t -Du_int64_tuint64_t // #cgo linux LDFLAGS: -lm // #include sqlite-vec.h import C逐行拆解-DSQLITE_CORE告訴 sqlite-vec 以內(nèi)嵌核心模式編譯。sqlite-vec.h中據(jù)此選擇包含sqlite3.h而非加載器模式的sqlite3ext.h即擴展直接靜態(tài)編譯進宿主進程而不是作為運行時動態(tài)加載的共享庫。-Du_int8_tuint8_t ...musl 兼容這是打包時專門為 Alpine Linux 等 musl libc 環(huán)境打的補丁。musl 不提供 POSIX 的u_int*_t別名而 sqlite-vec.c 的源碼用它來 typedef C99 的uint*_t類型這些宏讓 typedef 在 musl 上變成空操作在 glibc 上也無害類型本就兼容。沒有這三行hister 的 Docker 鏡像Alpine 基礎鏡像根本無法編譯通過。-lmLinux 下鏈接數(shù)學庫vec0 的距離計算需要sqrt等數(shù)學函數(shù)。包提供的唯一公開 API 是Auto()func Auto() { C.sqlite3_auto_extension((*[0]byte)(C.sqlite3_vec_init)) }它調(diào)用 SQLite 的sqlite3_auto_extension把sqlite3_vec_init注冊為自動擴展。這意味著進程內(nèi)此后打開的每一個 SQLite 連接都會自動加載 sqlite-vec調(diào)用方無需在每個連接上手動執(zhí)行SELECT load_extension(...)。這一設計配合了 hister 的數(shù)據(jù)庫訪問方式數(shù)據(jù)庫連接可能在不同模塊中創(chuàng)建Auto()在初始化時調(diào)用一次即可全局生效。真實調(diào)用鏈sqlite.go在 server/vectorstore/sqlite.go 中newSQLite()首先調(diào)用sqlitevec.Auto()然后打開主數(shù)據(jù)庫同目錄下的vectors.sqlite3向量庫并限制為單連接以避免 SQLite 鎖競爭func newSQLite(cfg *config.Config) (VectorStore, error) { sqlitevec.Auto() dbPath : cfg.FullPath(cfg.Server.Database) dir : filepath.Dir(dbPath) vecDBPath : filepath.Join(dir, vectors.sqlite3) db, err : sql.Open(sqlite3, vecDBPath) ... db.SetMaxOpenConns(1) ... }隨后Init()用SELECT vec_version()校驗擴展確實可用并創(chuàng)建基于 vec0 的embeddings虛擬表sqlite.go#L100-L110CREATE VIRTUAL TABLE embeddings USING vec0( user_id INTEGER PARTITION KEY, chunk_key TEXT PRIMARY KEY, embedding FLOAT[dimensions] distance_metriccosine )這里展示了 vec0 的三個特性PARTITION KEY按用戶分區(qū)KNN 查詢可限定分區(qū)、TEXT PRIMARY KEYvec0 內(nèi)部用 int64 rowid 存儲、以id text unique模擬文本主鍵見sqlite-vec.c中VEC0_SHADOW_ROWIDS_CREATE_PK_TEXT的注釋、以及distance_metriccosine余弦距離從默認的 L2 遷移而來——sqlite.go的initEmbeddingsTable專門實現(xiàn)了舊 L2 表到 cosine 表的事務性數(shù)據(jù)遷移。FLOAT[n]的維度n來自配置項semantic_search.dimensions。查詢側sqlite.go#L254-L294使用 vec0 的 KNN 語法SELECT e.chunk_key, e.distance, ... FROM embeddings e LEFT JOIN chunk_meta m ON e.chunk_key m.chunk_key WHERE e.embedding MATCH ? AND e.k ? AND e.user_id ? ORDER BY e.distance其中MATCH傳入的是float32ToBlob序列化的小端序vec_f32二進制向量sqlite.go#L310-L318k為返回候選數(shù)e.user_id分區(qū)條件讓 vec0 的vec0BestIndex在 chunk 層面提前過濾分區(qū)避免全庫掃描。結果中的distance換算為相似度1.0 - distance后再與semantic_search.similarity_threshold比較過濾隨后經(jīng) vectorstore.go 的候選放大topK * 4與文檔級去重每篇文檔最多保留 2 個 chunk處理最終進入索引器的語義重排。整套鏈路完全建立在Auto()注冊的捆綁擴展之上。版本維護update.sh 與手工同步的代價捆綁方案的代價在 README 末尾被明確點出The downside is were copying upstream C files and need to update them manually when sqlite-vec releases.即上游發(fā)布新版本后必須手動重新拉取 C 文件并同步版本號。為此項目提供了 update.sh支持兩種調(diào)用方式# 方式一通過 go generate 觸發(fā)版本號從 vec.go 注釋中自動讀取 go generate ./server/vectorstore/sqlitevec/ # 方式二顯式指定版本 sh update.sh v0.1.6腳本執(zhí)行流程確定版本優(yōu)先用命令行參數(shù)未傳參時從vec.go中以// sqlite-vec source:開頭的注釋中解析版本號下載 C 源碼從 sqlite-vec-go-bindings 倉庫對應版本的cgo目錄依次下載sqlite-vec.c和sqlite-vec.h依賴curl同步 sqlite3.h通過go list -m -json github.com/mattn/go-sqlite3定位模塊緩存目錄把其中的sqlite3-binding.h拷貝為sqlite3.h——保證頭文件始終與 go.mod 中鎖定的 mattn/go-sqlite3 版本當前為 v1.14.42SQLite 3.51.3一致提示收尾提醒更新vec.go中的版本注釋。整個更新流程刻意手工化腳本只負責拉文件不自動改代碼目的是讓版本變更成為一次可審查的顯式提交。當前捆綁的版本在vec.go注釋與sqlite-vec.h的SQLITE_VEC_VERSION宏中均有記錄sqlite-vec v0.1.6。權衡總結何時該采用本地捆綁策略從 this 包的實現(xiàn)可以提煉出一套可復用的取舍邏輯維度本地捆綁本方案系統(tǒng)級依賴共享庫構建復雜度高需處理 CGO、musl 兼容低安裝即用跨平臺可移植性強單二進制自包含弱每平臺需準備擴展部署運維無額外步驟需管理擴展生命周期版本更新手動同步上游 C 文件跟隨系統(tǒng)包管理器適用場景分發(fā)多平臺 Docker 鏡像、追求零依賴已有系統(tǒng)包管理、單一可控環(huán)境hister 選擇前者換來的是docker-bake.hcl多平臺鏡像、Dockerfile 構建、甚至靜態(tài)部署場景下的統(tǒng)一體驗——用戶拿到一個二進制就自帶完整的向量檢索能力這正是Your own search engine自托管理念在工程層面的體現(xiàn)。參考文件索引捆綁包說明server/vectorstore/sqlitevec/README.mdGo 入口與 CGO 指令server/vectorstore/sqlitevec/vec.go上游同步腳本server/vectorstore/sqlitevec/update.sh向量擴展實現(xiàn)server/vectorstore/sqlitevec/sqlite-vec.cSQLite 頭文件 shimserver/vectorstore/sqlitevec/sqlite3.h向量庫初始化與查詢server/vectorstore/sqlite.go向量后端抽象與后端選擇server/vectorstore/vectorstore.go贊分享搜索引擎全文檢索后端前端CLI【免費下載鏈接】histerYour own search engine項目地址https://gitcode.com/GitHub_Trending/hi/hister點擊查看免費下載相關推薦如何用sqlite-vec構建本地AI知識庫向量搜索終極指南如何用sqlite vec構建本地AI知識庫向量搜索終極指南 在人工智能快速發(fā)展的今天 向量搜索 技術已成為構建智能應用的核心。sqlite vec作為一款向量數(shù)據(jù)庫數(shù)據(jù)庫C語言集成sqlite-vec構建高效向量搜索應用的完整指南C語言集成sqlite vec構建高效向量搜索應用的完整指南 sqlite vec是一個輕量級的向量搜索SQLite擴展專為C語言開發(fā)者設計提供高效的向量向量數(shù)據(jù)庫數(shù)據(jù)庫SQLite向量搜索Python實戰(zhàn)5步實現(xiàn)本地語義搜索SQLite向量搜索Python實戰(zhàn)5步實現(xiàn)本地語義搜索 SQLite向量搜索sqlite vec是一個強大的本地向量搜索擴展讓你能夠在任何SQLite向量數(shù)據(jù)庫數(shù)據(jù)庫創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考