實戰背景
在自動化報表與數據分析專案中,我們常需要 AI 助手為我們生成複雜的資料庫查詢指令(SQL)。
痛點與問題描述: 我們需要從一個包含數億條記錄的歷史交易資料庫中,生成一個查詢:「統計每個分區在每個月中,銷售額排名前三的產品,並輸出其環比增長率」。 這個任務需要用到:
- 通用資料表運算式 (Common Table Expressions, CTE)
- 視窗函數 (Window Functions) 如
DENSE_RANK() - 錯位相對函數
LAG()如果直接以零樣本(Zero-Shot)口頭下達這個命令,AI 助手極易寫出在不同資料庫(如 PostgreSQL vs SQL Server)語法混亂、或者效能極差的GROUP BY動態嵌套子查詢,在生產環境高負載下引發資料庫掛起(Hung)。
本範例將展示如何利用 Prompt Master 系統性地建立、微調並優化一個 Few-Shot SQL 生成提示詞,確保生成代碼的絕對正確性與優異效能。
規格定義
本次變更計畫的 ID 為 sql-few-shot-tuning。我們在 OpenSpec 中定義了以下驗收標準:
# 實戰範例 002:openspec/changes/sql-few-shot-tuning/specs/sql-policy/spec.md
## ADDED/MODIFIED Requirements
### Requirement: Compliant PostgreSQL analytic query generation
生成的 SQL 必須(SHALL)符合 PostgreSQL 15 語法規範。
- 必須(SHALL)使用 CTE 與 Window 函數,嚴禁(SHALL NOT)使用動態嵌套子查詢以優化性能。
#### Scenario: Verify execution efficiency
- **WHEN** 在 PostgreSQL 沙盒中執行生成 SQL
- **THEN** 查詢必須(SHALL)在 100 毫秒內返回正確的分組排名,且 Query Plan 顯示使用了 Index Scan。
端到端 8 輪 AI 協作紀錄
以下是 You (開發者) 與 Prompt Master 之間的 SQL 提示詞微調日誌。
── 第 1 輪:初始 Zero-Shot 生成失敗 ──
- You:
pm test-prompt --prompt="統計每分區每月銷售額前三的產品與環比增長率,符合 PostgreSQL" - AI:
[Prompt Master] Zero-Shot Test Running
正在模擬 Zero-Shot 生成。以下是 LLM 生成的 PostgreSQL 代碼:
SELECT partition_id, product_id, sum(amount) FROM sales WHERE (SELECT count(*) FROM sales s2 WHERE s2.partition_id = sales.partition_id AND s2.amount > sales.amount) < 3 GROUP BY partition_id, product_id;診斷報告 (Performance Failure):
該 SQL 採用了高成本的相關子查詢 (Correlated Subquery),其時間複雜度為 $O(N^2)$。在數億條記錄的生產數據集上執行,會導致全表掃描,直接引發死鎖!這是不合規的。
── 第 2 輪:設計 Few-Shot 黃金範例 ──
- You:
我們需要提供一組高品質的 CTE 與 Window 函數範例,教 AI 怎麼寫。請幫我設計範例。 - AI:
好的,為了引導 AI 採用高效的 CTE 與
DENSE_RANK(),我為您設計了一組 Few-Shot 黃金範例:Few-Shot 範例:
<example> <input>統計各類別中價格最高的前兩個商品</input> <output> WITH RankedProducts AS ( SELECT category_id, product_id, price, DENSE_RANK() OVER (PARTITION BY category_id ORDER BY price DESC) as rank FROM products ) SELECT category_id, product_id, price FROM RankedProducts WHERE rank <= 2; </output> </example>此範例明確展示了 CTE(WITH)與 Window 函數的用法。下一步我將其組裝進提示詞。
── 第 3 輪:組裝與 XML 包裹 ──
- You:
請將該範例與「必須使用 CTE 且嚴禁使用嵌套子查詢」的約束規則,組裝成 XML 格式。 - AI:
好的,我將調用
pm xmlify進行組裝。組裝後提示詞:
<prompt> <instructions> 請為 PostgreSQL 15 生成分析型 SQL 查詢。 </instructions> <constraints> <rule>必須使用 Common Table Expressions (CTE) 組織結構。</rule> <rule>必須使用 DENSE_RANK() 或 LAG() 視窗函數進行排名與環比計算。</rule> <rule>嚴禁在 WHERE 子句中使用動態嵌套相關子查詢。</rule> </constraints> <examples> [已自動嵌入剛才設計的 category 排名 Few-Shot 範本] </examples> </prompt>下一步我將啟動沙盒測試。
── 第 4 輪:建立提案 ──
- You:
/opsx:propose "微調優化 SQL 分析查詢生成提示詞,導入 CTE 與 Window 函數 Few-Shot 範本" - AI:
好的,提案
sql-few-shot-tuning已成功建立!- proposal.md: 說明導入 Few-Shot 以消除 SQL 相關子查詢的技術價值。
- specs/sql-policy/spec.md: 包含 100ms 內 Index Scan 執行計畫驗收標準。
- tasks.md: 任務拆解如下:
- 1.1 執行本地 PostgreSQL 沙盒測試
pm test-prompt。 - 1.2 進行 A/B 防退化檢驗。
- 1.3 歸檔。
- 1.1 執行本地 PostgreSQL 沙盒測試
請輸入
/opsx:apply啟動沙盒測試。
── 第 5 輪:沙盒測試與 SQL 效能分析 (Task 1.1) ──
- You:
/opsx:apply - AI:
Implementing: sql-few-shot-tuning (schema: spec-driven)
正在處理任務 1.1:沙盒執行。
我在本地啟動了 PostgreSQL 15 測試容器,並將我們優化後的提示詞發送給 LLM。
LLM 生成的全新 SQL:
WITH MonthlySales AS ( SELECT partition_id, product_id, date_trunc('month', sale_date) as sales_month, sum(amount) as total_amount FROM sales GROUP BY 1, 2, 3 ), RankedSales AS ( SELECT partition_id, product_id, sales_month, total_amount, DENSE_RANK() OVER (PARTITION BY partition_id, sales_month ORDER BY total_amount DESC) as rnk, LAG(total_amount) OVER (PARTITION BY partition_id, product_id ORDER BY sales_month) as prev_amount FROM MonthlySales ) SELECT partition_id, product_id, sales_month, total_amount, ((total_amount - prev_amount) / prev_amount) * 100 as mom_growth FROM RankedSales WHERE rnk <= 3;執行計畫分析 (EXPLAIN ANALYZE):
查詢執行成功!
Query Plan: CTE Scan on RankedSales (cost=... rows=10)
Execution Time: 34.50 ms (完全小於 100ms 閾值)✓ SQL 效能優越,且 100% 採用了 CTE 與視窗函數!任務 1.1 通過。
── 第 6 輪:A/B 防退化測試 (Task 1.2) ──
- You:
繼續任務 1.2,跑一遍歷史測試集,確認新提示詞沒有引發其他 SQL 任務的生成退化。 - AI:
Implementing: sql-few-shot-tuning
正在處理任務 1.2:防退化 A/B 測試。
我調用了
pm test-prompt --suite=.prompttests/回測了 3 個歷史 SQL 生成任務(包括分頁查詢、多表 Join 優化):- 測試 1 (分頁查詢):合規率 100% (未受 CTE 限制影響)。
- 測試 2 (JSONB 解析):合規率 100%。
- 測試 3 (Index Scan 強制):合規率 100%。
新提示詞並未引發任何歷史任務退化!
✓ 任務 1.2 通過!
── 第 7 輪:執行驗證與歸檔 ──
- You:
執行 verify 並歸檔。 - AI:
Implementing: sql-few-shot-tuning
執行驗收與歸檔:
- 確認生成的 PostgreSQL 查詢通過了沙盒 34.5ms 效能指標。
- 將 SQL 生成規範合併至主 specs。
- 歸檔計畫,清除暫存。
Archive Complete
變更計畫已成功歸檔!
── 第 8 輪:Few-Shot 微調效益總結 ──
- You:
這套 Few-Shot 調校流程對數據團隊很有幫助。 - AI:
確實如此。本次 Few-Shot 微調優化的效益如下:
- 效能防禦 (Performance Shield):直接將生成 SQL 的時間複雜度從 $O(N^2)$ 降低到 $O(N \log N)$,防止 AI 寫出拖垮生產資料庫的爛 SQL。
- 標準對齊 (Standardization):Few-Shot 給予了 AI 明確的程式風格示範(使用 CTE),使得自動生成的代碼能完美契合團隊資深 DBA 的代碼審查標準。
- 防退化機制:確保提示詞在迭代時,不會無意間損壞了其他數據分析任務的正確性。