他把事務所十年來的案例卷宗、判決書全部轉成向量,餵進自己架設的 RAG(檢索增強生成)系統,讓律師可以用白話問問題就找到相關案例
先講最基本的概念:向量搜尋把文字、圖片這些內容轉換成一串數字(向量),意思相近的內容數字會很接近,透過比對數字之間的距離就能找到相關內容,這是很多智慧檢索系統的底層技術。而 RAG(檢索增強生成)讓 AI 回答問題之前,先去資料庫裡撈出相關資料,再根據這些資料生成答案,而不是憑空亂猜 就是靠向量搜尋去撈資料,阿凱幫事務所做的系統就是這一類。
問題出在:向量一多,記憶體就爆炸。素材裡提到,一千萬筆文件轉成向量,用最原始的方式存(float32)要吃掉 31GB 記憶體,這對一般公司甚至個人接案者都是很沉重的雲端主機費用。turbovec 這個開源工具,靠的是 量化把每個向量裡精細的小數字,用比較粗略、佔用空間更小的數字去近似表示,犧牲一點點精準度換取大量省下的空間 技術,把同樣的資料壓到 4GB,還宣稱搜尋比知名的 FAISS 更快。
turbovec 用的壓縮演算法叫 TurboQuant,是 Google 研究團隊做出來的。它的特別之處在於是 資料無關(data-oblivious)不需要先看過你的資料、學習資料的分布規律再決定怎麼壓縮,任何一批向量丟進來都能直接套用同一套規則去壓,不用重新訓練 的量化器,這代表你隨時加新資料進去,都不用停下來重新訓練或重建整個索引。
速度那端,turbovec 靠的是 SIMD讓 CPU 一個指令同時處理好幾筆數字運算,而不是一筆一筆算,同樣的工作量可以用更少時間做完 這種底層硬體加速技巧,針對 ARM 跟 Intel/AMD 分別手寫了加速核心,這也是它能同時做到「更省空間」又「搜更快」的原因。
| 比較項目 | turbovec | FAISS(IndexPQFastScan) |
|---|---|---|
| 記憶體(1000 萬筆向量) | 4 GB | 31 GB(未壓縮 float32 為基準) |
| 4-bit 量化搜尋速度 | 平均快 3.4 倍 | 基準 |
| 2-bit 量化搜尋速度 | 平均快 23% | 基準 |
| 是否需要訓練階段 | 不需要 | 通常需要 |
這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。
# demo_turbovec.py
# 這支程式示範:建立向量索引、加入資料、搜尋、以及刪除與存讀檔
import numpy as np
from turbovec import IdMapIndex
DIM = 128 # 示範用維度,真實 RAG 常見用 1536,這裡縮小方便電腦馬上跑完
def make_fake_vectors(n, dim, seed):
rng = np.random.default_rng(seed)
return rng.standard_normal((n, dim)).astype(np.float32)
def main():
index = IdMapIndex(dim=DIM, bit_width=4)
vectors = make_fake_vectors(1000, DIM, seed=1)
ids = np.arange(1001, 2001, dtype=np.uint64)
index.add_with_ids(vectors, ids)
print(f"已加入 {len(ids)} 筆向量,索引維度 {DIM}")
query = vectors[0:1] # 拿第一筆當查詢,理論上應該搜得到自己排第一名
scores, found_ids = index.search(query, k=5)
print("查詢結果(最相近的 5 筆 id):", found_ids)
print("對應相似度分數:", scores)
index.remove(1002)
print("已刪除 id=1002,之後搜尋不會再找到這筆")
index.write("demo_index.tvim")
print("索引已完整存檔為 demo_index.tvim")
loaded = IdMapIndex.load("demo_index.tvim")
scores2, found_ids2 = loaded.search(query, k=5)
print("重新載入後再搜一次,結果應該一致:", found_ids2)
if __name__ == "__main__":
main()