2026年9月23日 星期三

完全以T-SQL打造企業級RAG應用


作者:楊先民  
精誠資訊/恆逸教育訓練中心資深講師


※網路引用請註明完整出處

前言

完全以 T-SQL 打造企業級 RAG 應用:Azure SQL Database原生向量與 Azure OpenAI 整合實戰。

資料庫架構的生成式 AI 革命

隨著生成式人工智慧(Generative AI)技術在企業端迅速普及,如何讓大語言模型(LLM)精確回答企業內部的專有資料,成為資料團隊面臨的首要課題。傳統上,解決模型「幻覺(Hallucination)」或缺少最新上下文的主要手段包含兩種:模型微調(Fine-Tuning檢索增強生成(Retrieval-Augmented Generation, RAG

然而,微調模型成本昂貴、訓練週期長,且模型一經訓練完成其知識便固定,無法即時反映資料庫中的動態變動(如即時庫存、最新客戶評論)。因此,RAG 架構憑藉「動態檢索最新上下文並強化提示」的優勢,成為企業導入 AI 應用的首選方案。

過往建置 RAG 系統時,系統架構通常相當繁複:開發人員必須架設獨立的向量資料庫(Vector Database),並撰寫 Python Node.js 等中介軟體(Middleware),處理資料同步、向量轉化、語意檢索以及 REST API 呼叫。這不僅大幅增加了運維成本,更衍生出敏感資料跨系統搬移的安全與合規疑慮。


隨著 Azure SQL 資料庫 推出原生向量支援(Vector Data Type)與外部 REST 端點整合能力,現代資料庫工程師已經可以完全在熟悉的 T-SQL 環境下,從零建置完整的 RAG 工作流程。本文將全方位解析如何在 Azure SQL 中實現資料分塊、向量內嵌生成、智慧搜尋以及端對端 RAG 管線。


一、 第一階段:設計與實作模型與向量內嵌 (Embeddings)

SQL 資料庫中整合 AI 功能,基礎在於如何將非結構化文字(如客戶評論、產品說明)轉換為高維度的語意向量。

1. 模型評估與核心觀念

選擇外部 AI 模型時,必須針對下列關鍵屬性進行全面評估:

·         模態與語言(Modalities & Languages): 模型是否支援多語言或跨模態處理。

·         權杖(Tokens): 文字會被分割為子詞單元(Tokens)。上下文視窗大小、推理能力與權杖計費成本呈現正相關,因此必須選擇合適的模型規模。

·         向量內嵌(Embeddings): 語意意義的數學向量表示法。例如 Azure OpenAI text-embedding-3-small 模型會產生 1536 維度 的高維向量。


2. 基於受控識別的安全認證配置

在企業環境中,安全永遠是第一要務。Azure SQL 建議使用 系統指派受控識別(System-Assigned Managed Identity 取代傳統 API Key,徹底消除將秘密金鑰寫死在資料庫的資安風險。

-- Step 1: 建立資料庫範圍憑證 (使用受控識別)

CREATE DATABASE SCOPED CREDENTIAL [https://<your-openai-endpoint>.openai.azure.com]

WITH IDENTITY = 'Managed Identity',

SECRET = '{"resourceid":"https://cognitiveservices.azure.com"}';

GO

 

-- Step 2: 註冊 Azure OpenAI 外部內嵌模型

CREATE EXTERNAL MODEL my_embedding_model

WITH (

    LOCATION = 'https://<your-openai-endpoint>.openai.azure.com/openai/deployments/text-embedding-3-small/embeddings?api-version=2024-10-21',

    API_FORMAT = 'Azure OpenAI',

    MODEL_TYPE = EMBEDDINGS,

    MODEL = 'text-embedding-3-small',

    CREDENTIAL = [https://<your-openai-endpoint>.openai.azure.com]

);

GO

 

資安注意事項: SECRET 中的 resourceid Azure Cognitive Services 的固定 OAuth 受眾識別碼([https://cognitiveservices.azure.com](https://cognitiveservices.azure.com)),切勿隨意改動。

 

3. 文字分塊(Chunking)與向量生成

若直接對萬字長文進行向量化,會導致重點語意被「稀釋」,或者超出模型的 Token 上下文限制。合理的做法是透過 AI_GENERATE_CHUNKS 將文本切割為固定長度(例如 500 字元)的區塊,再使用 AI_GENERATE_EMBEDDINGS 寫入原生的 VECTOR(1536) 欄位中:

-- 為產品評論資料表擴充向量欄位

ALTER TABLE dbo.ProductReview

ADD ReviewVector VECTOR(1536);

GO

-- 批次將文本轉為 1536 維度向量

UPDATE dbo.ProductReview

SET ReviewVector = AI_GENERATE_EMBEDDINGS(ReviewText USE MODEL my_embedding_model);

GO


4.
向量資料維護策略

隨著 OLTP 資料庫持續寫入,向量資料的同步與維護可依據業務延遲接受度採用多種架構:



二、 第二階段:設計與實作 SQL 智慧搜尋

擁有了向量欄位後,如何有效率地尋找最相關的上下文?Azure SQL 支援三種不同的搜尋機制,滿足不同的業務情境。

搜尋技術與適用場景對比



1. 全文檢索 (Full-Text Search)

基於 BM25 演算法,支援 CONTAINS FREETEXT 謂詞。例如使用 FORMSOF(INFLECTIONAL) 可以讓搜尋 "ride" 的同時比對出 "riding" "ridden"

2. 向量搜尋 (Vector Search)ENN vs. ANN

·         精確最近鄰 (Exact Nearest Neighbor, ENN) 使用 VECTOR_DISTANCE('cosine', @q, Vec) 計算全表夾角餘弦距離。保證 100% 準確度,適合 資料量 < 50,000 的場景。

·         近似最近鄰 (Approximate Nearest Neighbor, ANN) 當資料量達到十萬或百萬級別時,採用 DiskANN 圖結構索引。透過 VECTOR_SEARCH 進行快速圖尋路,能在極低延遲下保持高召回率(High Recall)。

3. 互惠排序融合 (Reciprocal Rank Fusion, RRF) 混合搜尋

為了兼顧關鍵字精確度與語意意圖,混合搜尋會透過 FULL OUTER JOIN 併執行全文檢索與向量搜尋,並以經典的 RRF 公式計算綜合得分:



RRF 能夠平衡兩個列表的排名,使同時出現在雙邊榜單高位的資料獲得最高權重,大幅提升 Top-N 檢索的精準度。

 

三、 第三階段:完全以 T-SQL 實作 RAG 解決方案

在完成「向量化」與「語意檢索」後,最後一塊拼圖是將檢索到的資料封裝為 Context,並呼叫大型語言模型(如 gpt-5.4-mini)產生回答。

1. 嵌入 (Embed)將使用者發問字串即時轉為 1536 維度向量。

呼叫 AI_GENERATE_EMBEDDINGS(@Question USE MODEL my_embedding_model) 將使用者傳入的自然語言提問轉換為向量格式。

2. 搜尋 (Search)檢索 Top-N 相關資料並轉換為 JSON

透過 VECTOR_DISTANCE 比對資料庫內資料,並搭配 FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 將結果自動轉化為 Token 效率極高的 JSON 字串上下文。

3. 提示 (Prompt) T-SQL 中使用 JSON_OBJECT 動態組裝系統層與用戶層 Prompt

利用 JSON_OBJECT JSON_ARRAY 函數建構符合 OpenAI API 規範的 Request Body,強制加入系統邊界指令(如:「僅能依據提供的評論回答」)。

4. 呼叫 (Call)使用 sp_invoke_external_rest_endpoint 透過 REST API 呼叫 LLM

透過系統預存程序發送 HTTP POST 請求給 Azure OpenAI 部署端點,實現無中介軟體的直接溝通。

5. 解析 (Parse)使用 JSON_VALUE 解析 LLM 回傳內容並返回給前端應用。

提取回傳 JSON Payload 中的 $.result.choices[0].message.content,完成完整的 RAG 管線。

端到端 RAG 預存程序完整實現

以下為可直接於 Azure SQL Database 中執行的完整預存程序腳本:

CREATE PROCEDURE dbo.AskProductQuestion

    @Question NVARCHAR(1000),

    @Answer NVARCHAR(MAX) OUTPUT

AS

BEGIN

    SET NOCOUNT ON;

 

    DECLARE @questionVector VECTOR(1536);

    DECLARE @context NVARCHAR(MAX);

    DECLARE @payload NVARCHAR(MAX);

    DECLARE @response NVARCHAR(MAX);

    DECLARE @returnValue INT;

 

    -- 步驟 1: 嵌入 - 將使用者問題轉換為向量

    SELECT @questionVector = AI_GENERATE_EMBEDDINGS(@Question USE MODEL my_embedding_model);

 

    -- 步驟 2: 搜尋 - 透過向量距離檢索最相關的 3 筆產品評論並轉為 JSON

    SET @context = (

        SELECT TOP 3

            p.Name AS ProductName,

            r.ReviewText,

            r.Rating

        FROM dbo.ProductReview r

        JOIN dbo.Product p ON r.ProductID = p.ProductID

        ORDER BY VECTOR_DISTANCE('cosine', r.ReviewVector, @questionVector)

        FOR JSON PATH

    );

 

    -- 步驟 3: 提示 - 建立動態增強型 JSON 提示 Payload

    SET @payload = JSON_OBJECT(

        'messages': JSON_ARRAY(

            JSON_OBJECT(

                'role': 'system',

                'content': 'You are an Adventure Works product assistant. Answer questions using ONLY the provided product review data. If info is missing, say so.'

            ),

            JSON_OBJECT(

                'role': 'user',

                'content': 'Product Data: ' + @context + ' Question: ' + @Question

            )

        ),

        'max_tokens': 500,

        'temperature': 0.3

    );

 

    -- 步驟 4: 呼叫 - T-SQL 發送 REST 請求至 Azure OpenAI

    EXECUTE @returnValue = sp_invoke_external_rest_endpoint

        @url = N'https://<your-openai-endpoint>.openai.azure.com/openai/deployments/gpt-5.4-mini/chat/completions?api-version=2024-10-21',

        @method = 'POST',

        @payload = @payload,

        @credential = [https://<your-openai-endpoint>.openai.azure.com],

        @response = @response OUTPUT;

 

    -- 步驟 5: 解析 - 檢驗 HTTP 回應狀態並解析最終文字答案

    IF @returnValue = 0

    BEGIN

        SET @Answer = JSON_VALUE(@response, '$.result.choices[0].message.content');

    END

    ELSE

    BEGIN

        SET @Answer = 'Unable to process your question at this time. (API Error Code: ' + CAST(@returnValue AS NVARCHAR(10)) + ')';

    END

END;

GO

結語:架構演進與未來展望

透過 Azure SQL Database 的原生 AI 整合功能,企業無須重新調整現有的應用程式架構,就能在原本的資料庫層級中解鎖生成式 AI 的龐大價值。

架構轉型的核心優勢

1.       極致簡化的系統架構: 省去獨立向量資料庫(Vector DB)與 Python/LangChain 中介服務,降低了維運複雜度與故障點。

2.       零時差的資料即時性: 當資料庫內發生 INSERT UPDATE 時,透過內建機制即可完成向量更新,模型回答永遠反映最新業務狀態。

3.       企業級資安與合規性: 所有敏感資料與向量存儲均保留在 Azure SQL 的安全防護邊界內,結合受控識別(Managed Identity)認證,徹底杜絕 API Key 洩漏的隱患。

4.       熟悉的開發體驗: 資料庫管理員(DBA)與 SQL 開發人員無須重新學習昂貴的新語言,只需使用熟悉的 T-SQL 即可封裝完整的 AI 邏輯。

總結來說,Azure SQL 將向量與 RAG 能力納為原生功能,標誌著資料庫正在從傳統的「靜態儲存引擎」演進為「智慧運算中心」。這種「讓 AI 靠近資料,而非將資料搬去 AI」的新典範,無疑為企業資料團隊提供了一條最高效、最安全的 AI 落地轉型之路。


0 意見:

張貼留言