向量搜尋中的相關性
在向量查詢執行期間,搜尋引擎會尋找類似的向量,以尋找要在搜尋結果中傳回的最佳候選項目。 根據您編製向量內容索引的方式,搜尋相關的相符項目可以是詳盡的,或僅限於鄰近項目以加快處理速度。 一旦找到候選項目,就會使用相似度計量,根據比對強度來評分每個結果。
本文說明用來尋找相關相符項目的演算法,以及用於評分的相似度計量。 如果搜尋結果不符合預期,其也會提供改善相關性的秘訣。
用於向量搜尋的演算法
向量搜尋演算法包括詳盡的 K 最接近像素 (KNN) 和階層式導覽小型世界 (HNSW)。
詳盡的 KNN 會執行暴力搜尋,掃描整個向量空間。
HNSW 會執行近似最接近像素 (ANN) 搜尋。
只有在索引中標示為 searchable
或在查詢中標示為 searchFields
的向量欄位才會用於搜尋和評分。
何時使用詳盡的 KNN
詳盡的 KNN 會計算所有資料點配對之間的距離,並為查詢點尋找確切的 k
最接近像素。 其適用於下列案例:高重新叫用極其重要,且使用者願意接受在查詢延遲的取捨。 由於計算密集,因此請針對中小型資料集,或在精確度需求的重要性超過查詢效能考量時,使用詳盡的 KNN。
第二個使用案例是建置資料集,以評估近似最接近像素演算法重新叫用。 詳盡的 KNN 可以用來建置最接近像素的有根據事實集。
使用 HNSW 的時機
在編製索引期間,HNSW 會建立額外的資料結構,將資料點組織成階層式圖形結構,以加快搜尋速度。 HNSW 具有數個可調整的設定參數,以實現搜尋應用程式的輸送量、延遲和重新叫用目標。 例如,在查詢時,您可以指定詳盡搜尋的選項,即使向量欄位是針對 HNSW 編製索引也一樣。
在查詢執行期間,HNSW 會瀏覽圖形來啟用快速鄰近項查詢。 這種方法會在搜尋精確度與計算效率之間取得平衡。 建議在大部分情況下使用 HNSW,因為其在搜尋較大的資料集時效率更好。
最接近像素搜尋的運作方式
向量查詢會針對內嵌空間執行,此空間包含從相同內嵌模型產生的向量。 一般而言,查詢要求內的輸入值會饋送至在向量索引中產生之內嵌的相同機器學習模型。 輸出是相同內嵌空間中的向量。 由於類似的向量會形成叢集,因此尋找相符項目相當於尋找最接近查詢向量的向量,並傳回相關聯的文件做為搜尋結果。
例如,如果查詢要求是關於旅館,則模型會將查詢對應至存在於向量叢集 (代表旅館相關文件) 某處的向量。 根據相似度計量識別哪些向量與查詢最相似,可決定哪些文件最相關。
當向量欄位針對詳盡的 KNN 編製索引時,查詢會針對「所有鄰近項」執行。 若是針對 HNSW 編製索引的欄位,搜尋引擎會使用 HNSW 圖表,搜尋向量索引內的節點子集。
建立 HNSW 圖表
在編製索引期間,搜尋服務會建構 HNSW 圖表。 將新向量編製索引至 HNSW 圖表的目標是,要以允許進行有效率最接近像素搜尋的方式,將其新增至圖表結構。 下列步驟會摘要說明流程:
初始化:從空白的 HNSW 圖表開始,或如果其不是新的索引,則從現有的 HNSW 圖表開始。
進入點:這是階層式圖表的最上層,其可作為索引編製的起點。
新增至圖表:不同的階層代表圖表的不同粒度,層級越高越全面,而層級越低越細緻。 圖表中的每個節點都代表一個向量點。
每個節點最多可連線至附近的
m
個鄰近項。 這是m
參數。視為候選連線的資料點數目是由
efConstruction
參數所控管。 此動態清單會形成現有圖表中最接近的資料點集,以供演算法考慮。 較高的efConstruction
值會導致考慮更多的節點,這通常會造成每個向量的區域鄰近項更密集。這些連線會使用已設定的相似度
metric
來判斷距離。 某些連線是跨不同階層連線的「長距離」連線,這會在圖表中建立可提升搜尋效率的捷徑。
圖表剪除和最佳化:這可以在編製所有向量索引之後進行,並可改善 HNSW 圖表的導覽性和效率。
在查詢時瀏覽 HNSW 圖表
向量查詢會瀏覽階層式圖表結構,以掃描相符項目。 下列步驟會摘要說明流程中的步驟:
初始化:演算法會在階層式圖表的最上層起始搜尋。 這個進入點包含一組做為搜尋起點的向量。
周遊:接下來,其會逐層級周遊圖表、從最上層瀏覽至較低層級、根據設定的距離計量選取更接近查詢向量的候選節點,例如餘弦相似度。
剪除:為了提高效率,演算法只會考慮可能包含最接近像素的節點來剪除搜尋空間。 這是藉由維護潛在候選項目的優先順序佇列,並在搜尋進行時將其更新來實現。 這個佇列的長度是由參數
efSearch
所設定。精簡:當演算法移至更低、更細微的層級時,HNSW 會考慮查詢附近的其他鄰近項,這可讓候選的向量集進行精簡,進而改善精確度。
完成:在識別了所需的最接近像素數目時,或在符合了其他停止準則時,搜尋便會完成。 這個所需的最接近像素數目是由 query-time 參數
k
控管。
用來測量接近程度的相似度計量
演算法會尋找候選向量來評估相似度。 若要執行這項工作,相似度計量計算會將候選向量與查詢向量進行比較,並測量相似度。 演算法會追蹤其找到的最類似向量的已排序集合,這會在演算法達到完成時形成排名結果集。
計量 | 描述 |
---|---|
cosine |
此計量會測量兩個向量之間的角度,而且不會受到不同向量長度影響。 從數學上來說,其會計算兩個向量之間的角度。 餘弦是 Azure OpenAI 內嵌模型所使用的相似度計量,因此如果您使用 Azure OpenAI,請在向量設定中指定 cosine 。 |
dotProduct |
此計量會同時測量每對 (兩個向量一對) 的長度,以及這兩個向量之間的角度。 從數學上來說,其會計算向量大小和向量之間角度的乘積。 對於標準化向量,這與 cosine 相似度相同,但效能稍高。 |
euclidean |
(也稱為 l2 norm ) 此計量會測量兩個向量之間的向量差長度。 從數學上來說,其會計算兩個向量之間的歐幾里得距離,這是兩個向量差的 l2 範數。 |
向量搜尋結果中的分數
分數會計算並指派給每個相符項目,而最高的相符項目會以 k
結果傳回。 @search.score
屬性包含分數。 下表顯示分數落在哪個範圍內。
搜尋方法 | 參數 | 評分計量 | 範圍 |
---|---|---|---|
向量搜尋 | @search.score |
餘弦 | 0.333 - 1.00 |
對於 cosine
計量,請務必注意,算出的 @search.score
不是查詢向量與文件向量之間的餘弦值。 相反地,Azure AI 搜尋服務會套用轉換,使得分數函式單調遞減,這表示分數值將會一律隨著相似度變差而降低。 此轉換可確保搜尋分數可用於排名目的。
相似度分數有一些細微差別:
- 餘弦相似度定義為兩個向量之間角度的餘弦。
- 餘弦距離定義為
1 - cosine_similarity
。
若要建立單調遞減函式,@search.score
會定義為 1 / (1 + cosine_distance)
。
需要餘弦值而非綜合值的開發人員可以使用公式,將搜尋分數轉換回餘弦距離:
double ScoreToSimilarity(double score)
{
double cosineDistance = (1 - score) / score;
return -cosineDistance + 1;
}
在設定閾值以修剪低品質結果的自訂解決方案中,具有原始餘弦值很有用。
相關性微調的秘訣
如果您未取得相關結果,請試驗查詢設定的變更。 向量查詢沒有特定的微調功能,例如評分設定檔或欄位或字詞提升:
試驗區塊大小和重疊。 請嘗試增加區塊大小,並確保有足夠的重疊來保留區塊之間的內容或持續性。
針對 HNSW,請嘗試不同層級的
efConstruction
來變更鄰近圖表的內部組合。 預設值為 400。 範圍是 100 到 1,000。增加
k
結果,以將更多搜尋結果饋送至聊天模型 (如果您使用一個)。嘗試搭配語意排名的混合式查詢。 在基準測試中,這種組合會一致地產生最相關的結果。