2026年4月30日 星期四

SQL Server 2025中關於AI的快取篇



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


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


Google Gemini API是按Token計費的。如果您的SELECT語法一次呼叫了10萬次API,月底的帳單可能會讓您大吃一驚。

所以需要使用快取(Caching)機制。如果相同的問題已經問過,直接從local table取回結果,不要重複呼叫,本期就來探討這樣的內容。


為什麼快取對於AI呼叫這麼重要


其實這個問題跟在雲端一樣,程式設計師有個懶病,很喜歡寫 SELECT * FROM TABLE,但是這麼一來,傳回的資料量會愈來愈多,雲端的計算是算回傳的 token流量,下期收到帳單時,大家的臉色都會不太好看。

而在企業級應用中,將 SQL Server 2025 Google Gemini 整合時,開發者面臨的最大挑戰通常不是「如何連結」,而是要「如何控制成本」「如何提升效能」這兩個問題。

頻繁地呼叫外部 LLM API(如 Gemini 1.5 Pro/Flash)會帶來兩個問題:

    1.       金錢成本:按 Token 計費,重複的查詢會導致不必要的支出。

    2.       時間延遲:每次API呼叫通常需要15秒,這對於需要快速回應的資料庫查詢來說太慢了。

為了達成本期深度的探討,我們將從架構設計、T-SQL 實作、向量語義快取三個層次,完整解析如何在 SQL Server 2025 中建立一套聰明的「AI 快取機制」。


第一部分:AI快取的核心架構


在資料庫中實作 AI 快取的邏輯非常直覺,但要做到「企業級」的穩健,需要考慮數據的生命週期與雜湊(Hashing)機制。

1.1 快取邏輯流程

當應用程式發出一個 AI 請求時,資料庫不應該直接衝向外部 API,而是遵循以下的路徑:

1.       標準化(Normalization:將輸入的 Prompt 去除多餘空格、統一大小寫。

2.       雜湊計算(Hashing:利用 HASHBYTES 產生 Prompt 的唯一指紋。

3.       快取查找(Lookup:檢查本地表是否有該指紋且未過期的紀錄。

4.       決策分流

o    Hit(命中):直接回傳本地結果,延遲 < 1ms

o    Miss(未命中):呼叫 Gemini API,取得結果後存入快取,再回傳給用戶。


第二部分:T-SQL實作範例


以下我們將建立一個具備「自動過期機制」與「指紋辨識」的 AI 快取系統。

1. 建立快取資料表

我們需要一張表來儲存問答紀錄,並對 PromptHash 建立索引以確保極速查詢。

CREATE TABLE dbo.AICache (

    PromptHash VARBINARY(32) PRIMARY KEY, -- SHA2_256 產生的指紋

    OriginalPrompt NVARCHAR(MAX),         -- 原始問題(供後續稽核)

    AIResponse NVARCHAR(MAX),             -- Gemini 的回傳值

    ModelName NVARCHAR(100),              -- 使用的模型版本

    TotalTokens INT,                      -- 消耗的 Token 數(成本監控)

    ExpiryDate DATETIME2,                 -- 快取失效時間

    CreatedDate DATETIME2 DEFAULT SYSUTCDATETIME()

);

 

CREATE INDEX IX_AICache_Expiry ON dbo.AICache(ExpiryDate);

GO



2.
封裝「帶快取功能」的 AI 呼叫預存程序

這個預存程序會先「問自己」,再「問 Google」。

CREATE OR ALTER PROCEDURE dbo.usp_CallGeminiWithCache

    @Prompt NVARCHAR(MAX),

    @CacheDays INT = 7,             -- 快取預設保留 7

    @ForceRefresh BIT = 0           -- 是否強制刷新快取

AS

BEGIN

    SET NOCOUNT ON;

 

    DECLARE @PromptHash VARBINARY(32);

    DECLARE @CachedResponse NVARCHAR(MAX);

    DECLARE @ModelName NVARCHAR(100) = 'gemini-1.5-flash';

 

    -- 1. 標準化 Prompt 並計算雜湊值

    SET @Prompt = LTRIM(RTRIM(@Prompt));

    SET @PromptHash = HASHBYTES('SHA2_256', @Prompt);

 

    -- 2. 檢查快取

    IF @ForceRefresh = 0

    BEGIN

        SELECT TOP 1 @CachedResponse = AIResponse

        FROM dbo.AICache

        WHERE PromptHash = @PromptHash

          AND ExpiryDate > SYSUTCDATETIME();

 

        IF @CachedResponse IS NOT NULL

        BEGIN

            PRINT '--- Cache Hit! ---';

            SELECT @CachedResponse AS Response, 'Cache' AS Source;

            RETURN;

        END

    END

 

    -- 3. 若快取未命中,執行 API 呼叫 (延用前次的 sp_invoke_external_rest_endpoint 邏輯)

    PRINT '--- Cache Miss. Calling Gemini API... ---';

   

    DECLARE @ResponseJSON NVARCHAR(MAX);

 

   -- 這裡調用我們先前寫好的 API 呼叫邏輯 (簡略標註)

    -- EXEC dbo.usp_InternalCallGemini @Prompt, @ModelName, @ResponseJSON OUTPUT;

 

    -- 假設取得回應後...

    SET @CachedResponse = JSON_VALUE(@ResponseJSON,'$.result.candidates[0].content.parts[0].text');

 

    -- 4. 更新快取

    IF @CachedResponse IS NOT NULL

    BEGIN

        MERGE dbo.AICache AS Target

        USING (SELECT @PromptHash AS PromptHash) AS Source

        ON Target.PromptHash = Source.PromptHash

        WHEN MATCHED THEN

            UPDATE SET

                AIResponse = @CachedResponse,

                ExpiryDate = DATEADD(DAY, @CacheDays, SYSUTCDATETIME()),

                CreatedDate = SYSUTCDATETIME()

        WHEN NOT MATCHED THEN

            INSERT (PromptHash, OriginalPrompt, AIResponse, ModelName, ExpiryDate)

            VALUES (@PromptHash, @Prompt, @CachedResponse, @ModelName, DATEADD(DAY, @CacheDays, SYSUTCDATETIME()));

    END

 

    SELECT @CachedResponse AS Response, 'API' AS Source;

END

GO


第三部分:進階應用—語義快取(Semantic Caching)


這是 SQL Server 2025 最具革命性的地方。傳統快取(如上面的例子)必須「字元完全一致」才能命中。但如果用戶問「這筆訂單為什麼延遲?」和「請解釋這張單子晚到的原因」,語義是一樣的,應該共享同一個快取。

這就是 SQL Server 2025 原生向量支援(Vector Support 的用武之地。

語義快取的步驟:

1.       向量化(Embedding:當新問題進來時,先將 Prompt 轉化為向量。

2.       近似搜尋(Vector Search:在 AICache 表中尋找「距離最近」的既有問題。

3.       門檻判斷:如果相似度 > 0.95,直接給舊答案;如果相似度介於 0.8 0.95,可以提示用戶「是否指以下內容?」;如果低於 0.8,則視為新問題。


第四部分:實戰情境深度解析


情境 A:大規模產品描述生成

假設您有一張 Products 表,內含 10 萬件商品。您需要為每件商品生成繁體中文的行銷文案。

●  不使用快取:如果您更新了資料表結構需要重新跑一次,您得再付 10 萬次的 Token 費用。

●  使用快取SQL 發現 ProductID 沒變、ProductName 沒變,指紋一致,瞬間從本地載入。這在進行 A/B 測試或資料庫遷移時,能節省數萬元的預算。


情境 B:客服機器人的常見問題(FAQ)分析

當多個用戶詢問相似的「退貨政策」時,利用語義快取,SQL Server 可以在內網直接攔截請求,減少對 Google API 的依賴,大幅提升回應速度,讓前端用戶感覺不到「AI 在思考」的卡頓感。


第五部分:維運建議與成本監控


作為一名專業的資料庫講師與工程師,在實作這套系統時,建議各位需要關注以下「細節」:

1. 成本審計視圖

建立一個 View 來計算您省了多少錢。

CREATE VIEW dbo.vw_AICostSavings

AS

SELECT

    COUNT(*) AS SavedCalls,

    SUM(TotalTokens) * 0.000001 * 0.5 AS EstimatedSavingsUSD -- 以平均費率計算

FROM dbo.AICache

WHERE CreatedDate < ExpiryDate;


2.
垃圾回收(Garbage Collection

快取表如果不清理,會佔用磁碟空間。

    ●  建議:建立一個 SQL Agent Job,每天凌晨刪除 ExpiryDate < SYSUTCDATETIME() 的紀錄。


3. 資料隱私
在將 Prompt 發送給 Gemini 或存入 OriginalPrompt 欄位前,務必進行資料遮罩(Data Masking),避免將客戶的身分證字號、信用卡號或聯絡電話傳送到公有雲端。


結語:SQL Server 2025的「AI定位」


透過這 2000 字的深度解析,我們可以看到 SQL Server 2025 已經不再是一個純粹的儲存容器。透過 T-SQL 的擴展性、原生向量搜尋、以及嚴謹的快取設計,它成為了企業 AI 架構中的「智慧調度中心」。

對於一些擁有深厚 SQL Server 背景的專家來說,掌握這些 AI 整合技巧,能讓我們在開發 AI 應用時,擁有比純 Python 開發者更高的資料控制力效能最佳化空間

0 意見:

張貼留言