VIP 專屬 RAG 檢索增強 實戰

表格與數值資料的檢索:為什麼 RAG 算不對數字

問「去年第三季營收多少」,RAG 常常答錯。這是結構化資料該走的路。

RAG 檢索增強教程封面

RAG 在數值查詢上表現不佳,原因是根本性的:把表格轉成文字後,數字失去了行列關係;而且模型不擅長從一堆數字中做精確的篩選與運算。

正確的做法不是把 RAG 調得更好,而是讓數值查詢走不同的路徑

路由:先判斷這是哪一類問題

ROUTE = '''判斷問題的類型,只輸出 JSON。

text   — 詢問概念、流程、規定的敘述性問題
table  — 需要從結構化資料查詢或計算數值
mixed  — 兩者都需要

輸出:{"route": "text|table|mixed", "reason": "..."}'''

table 路徑:文字轉查詢

把表格資料放進真正的資料庫,讓模型產生查詢語句而不是直接回答數字。這樣運算由資料庫執行,結果是精確的。

SQL_PROMPT = '''依據下列資料表結構,把使用者問題轉成一句 SQLite 查詢。

資料表:revenue(year INT, quarter INT, region TEXT, amount REAL)

規則:
- 只輸出 SQL,不要說明。
- 只允許 SELECT,不得有寫入操作。
- 一律加上 LIMIT 100。

問題:{q}'''

安全與驗證

import sqlite3, re

BANNED = re.compile(r'\b(insert|update|delete|drop|alter|attach|pragma)\b', re.I)

def safe_query(sql, db_path):
    if BANNED.search(sql) or ';' in sql.rstrip(';'):
        raise ValueError('僅允許單一 SELECT 查詢')
    conn = sqlite3.connect(f'file:{db_path}?mode=ro', uri=True)   # 唯讀連線
    try:
        return conn.execute(sql).fetchall()
    finally:
        conn.close()

唯讀連線是最重要的防線。即使提示被繞過、正則被閃過,資料庫層面仍然無法寫入。

把結果交回模型組句

查詢結果不要直接呈現給使用者,而是連同原始問題交給模型組成自然語言回答,並附上使用的 SQL。附上 SQL 讓使用者能驗證邏輯,這在財務與營運報表場景幾乎是必要的。

混合問題的處理

「第三季營收為什麼下滑」同時需要數字與敘述。做法是兩條路徑各跑一次,把數值結果與文字片段一起放進最終的生成提示。

文字轉 SQL 的正確率不會是 100%。必須顯示產生的查詢語句、限制可存取的資料表、並對高風險場景保留人工確認。
🔒

訂閱後繼續閱讀全文

本篇為訂閱者專屬內容。訂閱後可取得下列權限:

  • 解鎖全部內容權限
  • 閱讀不限篇數
  • 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6

一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。

立即訂閱

金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策