目錄
一、embedding_function(向量模型)
可選方式
選型建議
二、HNSW 參數選擇(核心影響搜索速度與準確率)
2.1 參數解釋和推薦值
2.2? 配置模板參考
1、推薦默認配置(適合大多數項目):
?2、如果你數據量不大,追求速度:
3、如果你是海量數據 + 精確語義搜索(例如 10w+ 向量):
三、?如何驗證設置是否合理?
一、embedding_function
(向量模型)
可選方式
模型 | 來源 | 優點 | 適用場景 |
---|---|---|---|
DefaultEmbeddingFunction | 本地 | 免費、快速、不聯網 | 本地原型、快速測試 |
OpenAIEmbeddingFunction | 云端(OpenAI) | 高質量語義表達、支持多語言 | 生產環境、中文或多語言場景 |
自定義 HuggingFace 模型 | 本地/云端 | 靈活,適配行業語料 | 醫療、法律、金融定制需求 |
選型建議
-
原型階段 / 離線工具 → 用
DefaultEmbeddingFunction()
(MiniLM) -
中小型項目上線 → 用 OpenAI
text-embedding-3-small
(速度快,質量高) -
大模型私有部署 / 內網不聯網 → 自建向量模型
二、HNSW 參數選擇(核心影響搜索速度與準確率)
2.1 參數解釋和推薦值
參數名 | 含義 | 推薦值(中小數據量) | 推薦值(大數據量) | 建議說明 |
---|---|---|---|---|
space | 向量相似度度量方式 | "cosine" | "cosine" | 一般都選余弦相似度,除非特殊場景 |
ef_construction | 構建索引時的探索范圍(越大索引越準) | 100 | 200~300 | 構建階段,時間換準確 |
ef_search | 查詢時探索節點數(越大越準) | 50~100 | 100~300 | 越大查得越準但越慢 |
max_neighbors | 每個節點連接的鄰居數量(影響索引質量) | 16 | 32 | 一般設為 16 或 32 |
num_threads | 構建索引使用的線程數 | 根據 CPU 核心數 | 根據 CPU 核心數 | 多線程加速構建 |
?2.1.1 關鍵參數:ef_construction
1、概述
構建索引時的“探索范圍”指的是參數 ef_construction
,這是構建 HNSW 索引時的核心參數之一,它決定了每個新節點在添加到圖中時,會“看”多少個已有節點來尋找最相似的鄰居。
一句話解釋:
ef_construction
控制新節點在加入圖時會探索多少個已有節點。值越大,索引越準確,但構建時間和內存開銷也越高。
?
2、原理簡述
-
構建 HNSW 索引時,每插入一個向量,就要為它選擇一批“鄰居”。
-
選擇鄰居的方法是:從已有的圖中搜索
ef_construction
個候選節點,然后從中選出最相似的max_neighbors
個建立連接。
3、參數選擇建議(常用范圍:64 ~ 512)
數據規模 | 推薦 ef_construction |
---|---|
< 1 萬條 | 64 ~ 100 |
1 萬 ~ 10 萬條 | 100 ~ 200 |
10 萬 ~ 100 萬條 | 200 ~ 300 |
> 100 萬條 | 300 ~ 512(視內存而定) |
4、?設置越大/越小的影響
ef_construction 值 | 優點 | 缺點 |
---|---|---|
小(如 64) | 構建快、內存省 | 索引質量差、影響查準率 |
中(如 100~200) | 平衡 | 推薦值 |
大(如 300~512) | 檢索更準 | 構建慢、內存占用高 |
?
5、舉個例子
假設你用 10 萬條文本向量構建搜索系統:
"hnsw": {"ef_construction": 200,"max_neighbors": 32,"num_threads": 4
}
?含義是:每個新向量會先從已有圖中探索 200 個節點,然后從中選出 32 個相似度高的作為鄰居。
6、小結
參數 | 說明 | 推薦值范圍 |
---|---|---|
ef_construction | 構建索引時,每個新向量探索的候選節點數 | 100 ~ 300(中大型項目) |
2.1.2?關鍵參數:ef_search
1、概述
-
f_search
就是你設置的 搜索過程中最多會探索的節點數。 -
默認值可能是
10
或100
,你可以設更高以提升查準率。
ef_search 值 | 探索節點數 | 檢索速度 | 檢索精度 |
---|---|---|---|
10 | 少 | 非常快 | 精度可能不高 |
100 | 多 | 較慢 | 精度更高 |
300 | 非常多 | 更慢 | 幾乎等于精確搜索 |
可以理解為搜索時你愿意“走幾步路”去找最近的東西,走得越多,找到的可能越準。
?
?2、怎么選 ef_search
?
應用場景 | 推薦值 |
---|---|
實時性要求高、數據不多 | ef_search = 20~50 |
通用語義檢索、常規精度 | ef_search = 100 |
準確率優先、如推薦系統 | ef_search = 200~300 |
想象你在地圖上找“最近的加油站”:
-
ef_search = 10
→ 你只看周圍 10 個路口(很快,但可能錯過) -
ef_search = 300
→ 你查看方圓 5 公里所有站點(更準,但耗時)
名詞 | 含義 | 建議 |
---|---|---|
搜索節點 | 檢索時要比較距離的向量節點數 | ef_search 控制,越多越準但慢 |
構建節點 | 建索引時訪問過的節點數 | 由 ef_construction 控制 |
??2.1.3?關鍵參數:max_neighbors
1、概述
“每個節點連接的鄰居數量”是指在 HNSW(Hierarchical Navigable Small World)索引構建階段,每個向量節點最多會連接多少個“相似的節點”作為它的鄰居。這由參數 max_neighbors
(有時叫 M
)控制。
一句話解釋:
每個向量點會主動維護max_neighbors
個最相似的其他向量,作為圖結構中的“朋友節點”,用來輔助導航搜索。
2、舉個例子(假設 max_neighbors = 4):
假設你有一個向量 A,它與周圍其他向量計算了相似度,系統會選擇其中最相似的 4 個節點作為 A 的“鄰居”。
在圖中,A 將連向這 4 個節點,形成雙向或單向的邊。這些邊形成了一個小世界圖(Small World Graph),為后續搜索提供跳躍路徑。
?
3、這些鄰居有什么用?
-
它們就是**“搜索路線圖”**的一部分。
-
查詢時從某個節點開始,沿著它的鄰居跳轉(而不是全量比較),從而快速接近最相似的向量。
4、參數建議
數據規模 | 推薦 max_neighbors (M) |
---|---|
< 10 萬條 | 8 ~ 16 |
10 萬 ~ 100 萬 | 16 ~ 32 |
> 100 萬條 | 32 ~ 64(根據內存可調高) |
?
5、數量設置影響
數量 | 優點 | 缺點 |
---|---|---|
少(如 8) | 節省空間,速度快 | 精度差、圖稀疏 |
多(如 32) | 更高檢索精度 | 占內存,構建慢 |
極多(如 64+) | 接近精確搜索效果 | 內存大增,不適合輕量部署 |
?
6、類別理解
把節點想成一個人,鄰居就是他最熟的朋友。一個人朋友越多,消息傳播(搜索)效率越高,但也更復雜、更占資源。
7、總結
概念 | 含義 |
---|---|
max_neighbors | 構建索引時,每個節點最多連接多少“相似節點” |
更大值 | 圖更密集,搜索路徑更多,準確率提高但資源開銷增大 |
通常值 | 16 或 32 足夠大多數任務 |
??2.1.4?關鍵參數:num_threads
1、 選擇依據
你應該根據 本機的 CPU 核心數 來合理設置 num_threads
:
機器配置 | 建議設置(num_threads ) |
---|---|
單核 CPU / 低性能機器 | 1 |
4 核 CPU | 2~4 |
8 核 CPU | 4~6 |
16 核服務器 | 8~12(最多不超過 75% 使用率) |
?
2、查看你機器的 CPU 核心數(命令行)
▲Linux/macOS:
lscpu | grep "^CPU(s):"
# 或者
nproc
?▲Windows(PowerShell):
Get-WmiObject -Class Win32_ComputerSystem | Select-Object NumberOfLogicalProcessors
3、設置建議
設置 | 優點 | 缺點 |
---|---|---|
線程數小(如 1) | 占用低 | 構建時間長 |
線程數中等(如 2~4) | 平衡 | 適合開發測試環境 |
線程數多(如 8+) | 構建快 | 占 CPU 多,其他進程變慢 |
4、?示例設置(實際代碼)
"hnsw": {"ef_construction": 200,"max_neighbors": 16,"num_threads": 4 # 如果你的機器是 8 核,可以設為 4~6
}
5、小結
參數名 | 含義 | 如何選擇 |
---|---|---|
num_threads | 構建 HNSW 索引時的線程數 | 設為不超過 CPU 核心數的 70% 較穩妥 |
構建快慢取決于線程數;查詢階段不影響 |
2.2? 配置模板參考
1、推薦默認配置(適合大多數項目):
"hnsw": { "space": "cosine","ef_search": 100, "ef_construction": 200,"max_neighbors": 16, "num_threads": 4 # 或根據你機器核心數
}
?2、如果你數據量不大,追求速度:
"hnsw": { "space": "cosine", "ef_search": 50, "ef_construction": 100, "max_neighbors": 8, "num_threads": 2
}
3、如果你是海量數據 + 精確語義搜索(例如 10w+ 向量):
"hnsw": { "space": "cosine", "ef_search": 300, "ef_construction": 300, "max_neighbors": 32, "num_threads": 8
}
▲"space": "cosine":向量之間使用余弦相似度來衡量相似度。
▲ef_search: 搜索時的探索范圍,越大越準,越小越快。
▲ef_construction: 構建索引時的精度控制參數,越大越好。
▲max_neighbors: 每個節點最多連接的鄰居數量。
▲num_threads: 使用線程數(用于并發構建索引)。
三、?如何驗證設置是否合理?
你可以從以下角度做 A/B 測試:
指標 | 評估方式 |
---|---|
檢索精度 | 查詢后返回的 top-3 是否與你預期語義相關 |
響應速度 | 用 time 或日志記錄搜索耗時 |
資源占用 | 構建和搜索時 CPU 占用是否合理 |
內存開銷 | 是否容易 OOM(內存溢出) |
總之需要根據數據量級(比如有多少條文本、是不是中文內容)、部署環境(是否聯網)以及用途(問答、推薦、對話等),構建定制化的參數