共用方式為


SQL Database Engine 中的向量搜尋和向量索引概觀

適用於:SQL Server 2025 (17.x) 在Microsoft Fabric 中預覽 Azure SQL DatabaseAzure SQL 受控實例 SQL 資料庫

向量是數字的排序陣列 (通常是浮點數),可以代表某些資料的相關資訊。 例如,影像可以表示為像素值的向量,或文字字串可以表示為 ASCII 值的向量。 將資料轉換成向量的程序稱為向量化。

備註

嵌入

內嵌是代表資料重要特徵的向量。 嵌入通常是透過使用深度學習模型來學習的,機器學習和 AI 模型將它們用作特徵。 內嵌也可以擷取相似概念之間的語意相似性。 例如,在產生單字 personhuman 的內嵌時,我們預期它們的內嵌 (向量表示) 在值中類似,因為這些單字在語意上也類似。

Azure OpenAI 具有從文字資料建立內嵌的模型。 服務會將文字分成詞元,並使用 OpenAI 預先訓練的模型生成嵌入向量。 若要深入了解,請參閱使用 Azure OpenAI 建立內嵌

產生內嵌之後,即可將其儲存至 SQL Server 資料庫。 這可讓您將內嵌與它們所代表的數據一起儲存,並執行向量搜尋查詢來尋找類似的數據點。

向量搜尋是指尋找數據集中類似特定查詢向量之所有向量的程式。 因此,單字 human 的查詢向量會搜尋整個數據集是否有類似的向量,因此類似的單字:在此範例中,它應該會以接近的比對方式尋找該單字 person 。 這個接近度或距離是使用距離度量來測量,例如餘弦距離。 當向量越接近時,它們就越相似。

SQL Server 透過向量數據類型提供向量內建支援。 向量會以優化的二進位格式儲存,但為了方便起見,公開為 JSON 陣列。 向量的每個元素都會使用單精度 (4 個字節) 浮點值來儲存。 除了數據類型之外,還有專用函式可在向量上運作。 例如,您可以使用 VECTOR_DISTANCE 函式來尋找兩個向量之間的距離。 函式會根據您指定的距離計量,傳回兩個向量之間的距離純量值。

由於向量通常會以浮點數位的形式進行管理,因此只要將 JSON 陣列 轉換成向量數據類型即可建立向量 。 例如,下列程式代碼會從 JSON 陣列建立向量:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

或者,使用隱含轉型

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

將向量轉換成 JSON 陣列也是如此:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

精確搜尋和向量距離 (精確近鄰)

精確搜尋也稱為 k-Nearest Neighbor (k-NN) 搜尋,牽涉到計算指定向量與數據集中所有其他向量之間的距離、排序結果,以及根據指定的距離計量選取最接近的鄰居。 這個方法可確保精確擷取最接近的鄰近,但可能會需要大量運算,特別是針對大型數據集。

向量 Distance 函數可用來測量向量之間的接近度。 常見的距離計量包括 Euclidean 距離、餘弦相似度和點乘積。 這些函式對於執行 k-NN 搜尋以及確保正確結果至關重要。

精確近鄰 (ENN) 向量搜尋會跨所有索引向量執行詳盡的距離計算,以確保根據指定的距離計量擷取最接近的芳鄰。 此方法精確但需要大量資源,因此適合較小的數據集或精確度至關重要的案例。

在 SQL Database Engine 中,可以使用 VECTOR_DISTANCE 函式來執行 k-NN 搜尋,這可讓您有效率地計算向量之間的距離,並協助擷取最接近的鄰居。

下列範例示範如何執行 k-NN,將資料表中 content_vector 儲存的前 10 個最類似向量傳回給指定的查詢向量 @qv

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

當您沒有太多向量可搜尋時,建議使用確切的搜尋(作為一般建議的向量少於 50,000 個向量)。 只要您的搜尋述詞將用於芳鄰搜尋的向量數目減少為 50,000 或更少,數據表就可以包含更多向量。

近似向量索引和向量搜尋(近似近鄰)

識別接近指定查詢向量的所有向量,需要大量資源來計算查詢向量與儲存在數據表中的向量之間的距離。 搜尋接近指定查詢向量的所有向量,牽涉到數據表的完整掃描和大量的 CPU 使用量。 這稱為“K-Nearest Neighbors” 或 “KNN” 查詢,並傳回最接近的 “k” 向量。

向量可用來尋找 AI 模型的類似數據,以回應用戶查詢。 這牽涉到使用點(inner) 乘積、餘弦相似度或 Euclidean 距離等距離計量,查詢查詢向量最接近查詢向量的 “k” 向量資料庫。

KNN 查詢通常會與延展性作鬥爭,因此在許多情況下可以接受,以取捨某些精確度,特別是召回率,以取得顯著的速度提升。 這個方法稱為「近似近鄰」(ANN)。

召回是一個重要的概念,應該讓每個人熟悉使用或規劃使用向量和內嵌。 事實上,召回會測量演算法所識別之近似近鄰的比例,與詳盡搜尋所傳回的確切近鄰相較之下。 因此,這是演算法所執行之近似值品質的良好測量。 完美的召回率相當於沒有近似值,是1。

對於 AI 應用程式,取捨相當合理。 由於向量內嵌已經大致概念,因此使用 ANN 並不會影響結果,但前提是召回率接近 1。 這可確保傳回的結果與 KNN 的結果非常類似,同時提供大幅改善的效能,並大幅降低資源使用量,這對作資料庫非常有用。

請務必瞭解,在參考 向量索引 時,「索引」一詞的意義與您在關係資料庫中使用的索引不同。 事實上,向量索引會傳回近似結果。

在 MSSQL 引擎中,向量索引是以 DiskANN 演演算法為基礎。 DiskANN 依賴建立圖表,快速流覽所有索引向量,以尋找與指定向量最接近的相符專案。 DiskANN 是以圖表為基礎的系統,可使用有限的計算資源編製和搜尋大型向量數據集。 它有效率地使用 SSD 和最小記憶體來處理比記憶體內部索引更多的數據,同時維持每秒的高查詢 (QPS) 和低延遲,確保記憶體、CPU 和 I/O 使用量和搜尋效能之間的平衡。

您可以先使用 CREATE VECTOR INDEX T-SQL 命令建立向量索引,然後使用 VECTOR_SEARCH T-SQL 函式來執行近似搜尋,以執行近似的芳鄰演算法搜尋。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance