適用於: SQL Server 2025 (17.x)
Azure SQL Database Azure
SQL Managed Instance
SQL database in Microsoft Fabric
SQL Database 引擎可讓您儲存任何類型的數據並執行任何類型的查詢:結構化和非結構化,以及在該數據上執行向量搜尋。 對於需要一起搜尋所有數據的案例而言,這是一個不錯的選擇,而且您不想使用個別的服務來搜尋會讓架構複雜化。
備註
- 向量功能可在使用 SQL Server 2025 或 一律up-to日期更新原則設定的 Azure SQL 受控執行個體中使用。
Vectors
向量是數字的排序陣列 (通常是浮點數),可以代表某些資料的相關資訊。 例如,影像可以表示為像素值的向量,或文字字串可以表示為 ASCII 值的向量。 將資料轉換成向量的程序稱為向量化。 SQL Server 中的 向量 數據類型是設計來有效率地儲存這些數位數位陣列。
嵌入技術
內嵌是代表資料重要特徵的向量。 嵌入通常是透過使用深度學習模型來學習的,機器學習和 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-near neighbor (k-NN) 搜尋,牽涉到計算指定向量與數據集中所有其他向量之間的距離、排序結果,以及根據指定的距離計量選取最接近的鄰近值。 這個方法可確保精確擷取最接近的鄰近,但可能會需要大量運算,特別是針對大型數據集。
向量距離函數可用來測量向量之間的接近度。 常見的距離計量包括 Euclidean 距離、餘弦相似度和點乘積。 這些函式對於執行 k-NN 搜尋以及確保正確結果至關重要。
精確近鄰 (ENN) 向量搜尋會跨所有索引向量執行詳盡的距離計算,以確保根據指定的距離計量來擷取最接近的鄰居。 此方法精確但需要大量資源,因此適合較小的數據集或精確度至關重要的案例。
在 SQL Database Engine 中,可以使用 VECTOR_DISTANCE 函式來執行 k-NN 搜尋,這可讓您有效率地計算向量之間的距離,並協助擷取最接近的鄰居。
下列範例示範如何執行 k-NN,將資料表中 content_vector 儲存的前 10 個最類似向量傳回給指定的查詢向量 @qv。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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 或更少,數據表就可以包含更多向量。
近似向量索引和向量搜尋(近似近鄰)
備註
近似向量索引與向量搜尋目前僅在 SQL Server 2025(17.x)、Azure SQL 資料庫及 Microsoft Fabric 中的 SQL 資料庫中提供。
識別接近指定查詢向量的所有向量,需要大量資源來計算查詢向量與儲存在數據表中的向量之間的距離。 搜尋接近指定查詢向量的所有向量,牽涉到數據表的完整掃描和大量的 CPU 使用量。 這稱為“K-nearest neighbors” 或 “k-NN” 查詢,並傳回最接近的 “k” 向量。
向量可用來尋找 AI 模型的類似數據,以回應用戶查詢。 這牽涉到使用點(inner) 乘積、餘弦相似度或 Euclidean 距離等距離計量,查詢查詢向量最接近查詢向量的 “k” 向量資料庫。
K-NN 查詢通常在擴展性方面面臨挑戰,因此在許多情況下,為了大幅提升速度,犧牲一些準確性,特別是召回率,是可以接受的。 這個方法稱為「近似最近鄰」(ANN)。
召回是一個重要的概念,應該讓每個人熟悉使用或規劃使用向量和內嵌。 事實上,召回會測量演算法所識別之近似近鄰的比例,與詳盡搜尋所傳回的確切近鄰相較之下。 因此,這是演算法所執行之近似值品質的良好測量。 完美的召回率相當於沒有近似值,是1。
對於 AI 應用程式,取捨相當合理。 由於向量內嵌已經大致概念,因此使用 ANN 並不會影響結果,但前提是召回率接近 1。 這可確保傳回的結果與 k-NN 的結果非常類似,同時提供大幅改善的效能,並大幅降低資源使用量,這對作資料庫非常有用。
請務必瞭解,在參考 向量索引 時,「索引」一詞的意義與您在關係資料庫中使用的索引不同。 事實上,向量索引會傳回近似結果。
在 SQL Database 引擎中,向量索引是以 DiskANN 演算法為基礎。 DiskANN 依賴建立圖表,快速流覽所有索引向量,以尋找與指定向量最接近的相符專案。 DiskANN 是以圖表為基礎的系統,可使用有限的計算資源編製和搜尋大型向量數據集。 它有效率地使用 SSD 和最小記憶體來處理比記憶體內部索引更多的數據,同時維持每秒的高查詢 (QPS) 和低延遲,確保記憶體、CPU 和 I/O 使用量和搜尋效能之間的平衡。
您可以先使用 CREATE VECTOR INDEX T-SQL 命令來建立向量索引,然後使用 VECTOR_SEARCH T-SQL 函數進行近似搜尋。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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