適用於:SQL Server 2025 (17.x) 在
Microsoft Fabric 中預覽
Azure SQL Database
Azure SQL 受控實例 SQL 資料庫
向量是數字的排序陣列 (通常是浮點數),可以代表某些資料的相關資訊。 例如,影像可以表示為像素值的向量,或文字字串可以表示為 ASCII 值的向量。 將資料轉換成向量的程序稱為向量化。
備註
- 預覽中的向量支援,而且可能會變更。 請務必閱讀 在線服務的服務等級協定 (SLA) 中的預覽使用規定。
- 向量功能可在以 Always-up-to-date 原則 設定的 Azure SQL 受控實例中使用。
嵌入
內嵌是代表資料重要特徵的向量。 嵌入通常是透過使用深度學習模型來學習的,機器學習和 AI 模型將它們用作特徵。 內嵌也可以擷取相似概念之間的語意相似性。 例如,在產生單字 person
和 human
的內嵌時,我們預期它們的內嵌 (向量表示) 在值中類似,因為這些單字在語意上也類似。
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