資料分析與智慧問數
智慧問數(用自然語言查資料,也叫 Text-to-SQL)的做法是:把相關表的結構和欄位說明寫進提示詞,讓模型生成 SQL,程式確認這是一條只讀查詢後,用只讀資料庫帳號執行,再由模型把查詢結果寫成幾句業務結論。按每月 2 萬次提問、另加 300 份報表和表格彙總估算,用各模型最低價分組的即時價格計算,模型費用每月約 ¥395。
價格更新於 2026年11月13日 下午6:08
月成本估算
假設:每月 2 萬次提問(約 100 名業務人員,每人每個工作日 10 次);生成 SQL 每次輸入約 4,000 tokens(指令和示例約 1,000、相關表結構約 2,500、問題約 500),輸出約 300 tokens,約 10% 校驗不通過要重寫一次;解讀結果每次輸入約 1,500 tokens(最多 50 行結果);另有 300 份報表和表格彙總,每份輸入約 8,000 tokens 的統計摘要。
業務問題
運營、銷售和管理層經常要臨時查一個數:上週各渠道的退貨率、華東區有多少復購使用者、哪家門店的客單價降得最多。每次都要找資料團隊寫 SQL,簡單的問題也要排隊等。
大模型可以把這類問題翻譯成 SQL,但它不知道你們的表名、欄位含義和統計口徑,容易編出不存在的欄位,或者漏掉「已退款訂單不計入銷售額」這樣的條件。生成的語句如果不加檢查就執行,還可能修改資料,或者一次掃描整張大表、拖慢資料庫。
穩妥的做法是:只把相關表的結構交給模型,生成的 SQL 先過程式校驗,再用只讀帳號在只讀副本上執行,限制返回行數和執行時間;結果和 SQL 一起展示給使用者,口徑對不對一眼就能核對。
推薦模型組合
推薦模型按即時目錄自動選取,價格取各模型最低價分組,更新於 2026年11月13日 下午6:08。點模型名可檢視全部分組價格。
找出相關的表(Embeddings)
text-embedding-3-smallOpenAI
輸入 ¥0.04 / 輸出 ¥0.04 每百萬 tokens標準分組
表很多時,沒法把全部表結構都放進提示詞。給每張表寫一段說明(用途、欄位含義、常見問法)並向量化,使用者提問時只取最相關的幾張表交給模型。表只有二三十張時可以省掉這一步,直接把全部表結構寫進提示詞。
生成 SQL(對話模型)
deepseek-v4.1-flashDeepSeek
輸入 ¥2.8 / 輸出 ¥11.2 每百萬 tokens國產模型分組
根據表結構、欄位說明和幾條示例問答寫出 SQL。這是整個流程裡最需要準確的一步,上線前用你們自己的歷史問題和核對過的 SQL 評測幾個備選模型再定。表結構和示例每次請求都一樣,放在提示詞開頭;模型支援上下文快取時,這部分按更低的快取讀取價計費。
解讀結果與總結報表(對話模型)
qwen3.5-plus通義千問
輸入 ¥1.12 / 輸出 ¥6.72 每百萬 tokens國產模型分組
把查詢結果、報表資料或表格的統計摘要寫成幾句業務結論,比如環比變化、排名和異常值。輸入以數字為主、輸出短,單價低的模型就夠用;需要看圖表截圖時,換成備選裡能識圖的模型。
參考架構
- 1
整理表結構說明
為開放查詢的表寫說明:表的用途、每個欄位的含義和單位、列舉值、表之間怎麼關聯,以及「銷售額是否含退款」這類統計口徑。說明寫得越清楚,生成的 SQL 越準。
- 2
找出相關的表
表多的時候,把每張表的說明向量化入庫;使用者提問時取最相關的 3 到 5 張表,把它們的建表語句和說明放進提示詞。
- 3
生成 SQL
提示詞裡寫明資料庫類型(MySQL、PostgreSQL 等)、可用的表結構和幾條「問題 → 核對過的 SQL」示例,要求只輸出一條查詢語句,不加解釋。
- 4
程式校驗
執行前檢查:只能有一條語句,必須以 SELECT 或 WITH 開頭,不能含 INSERT、UPDATE、DELETE、DROP 等寫操作,只引用允許查詢的表,並且帶 LIMIT。不合格的把原因交回模型重寫一次,仍不合格就請使用者換個問法。
- 5
只讀執行
用只有查詢權限的資料庫帳號連線只讀副本或資料倉儲,設定查詢超時和返回行數上限。即使校驗漏掉了什麼,這個帳號也改不了資料。
- 6
解讀與展示
把查詢結果交給模型寫成兩三句結論,和 SQL、原始資料一起展示給使用者。月度報表和上傳的表格,先用程式算好合計、同比環比和排名,再讓模型寫文字說明,數字以程式算出的為準。
成本估算
假設:每月 2 萬次提問(約 100 名業務人員,每人每個工作日 10 次);生成 SQL 每次輸入約 4,000 tokens(指令和示例約 1,000、相關表結構約 2,500、問題約 500),輸出約 300 tokens,約 10% 校驗不通過要重寫一次;解讀結果每次輸入約 1,500 tokens(最多 50 行結果);另有 300 份報表和表格彙總,每份輸入約 8,000 tokens 的統計摘要。
| 專案 | 模型 | 用量假設 | 費用 |
|---|---|---|---|
| 問題向量化 | text-embedding-3-small | 20,000 次 × 輸入 50 tokens | ¥0.04 |
| 生成 SQL | deepseek-v4.1-flash | 20,000 次 × 輸入 4,000 + 輸出 300 tokens | ¥291.2 |
| 校驗不通過重寫(約 10%) | deepseek-v4.1-flash | 2,000 次 × 輸入 4,500 + 輸出 300 tokens | ¥31.92 |
| 解讀查詢結果 | qwen3.5-plus | 20,000 次 × 輸入 1,500 + 輸出 250 tokens | ¥67.2 |
| 報表與表格彙總 | qwen3.5-plus | 300 次 × 輸入 8,000 + 輸出 800 tokens | ¥4.3 |
| 合計(每月) | ¥394.66 | ||
按各模型最低價分組的即時價格計算,價格更新於 2026年11月13日 下午6:08。
只含模型呼叫費用,不含資料庫、向量庫和伺服器成本。表結構說明首次向量化是一次性費用,按 300 張表、每張說明約 400 tokens 算,約 12 萬 tokens。生成 SQL 的輸入裡表結構和示例佔大頭,模型支援上下文快取時命中部分按快取讀取價計費,實際費用會更低;推理模型的思考過程按輸出計費,輸出可能多於表中假設。提問量翻倍,費用大致翻倍。
示例程式碼
模型生成 SQL,程式檢查這條語句:只有一條查詢、只查允許的表、帶 LIMIT,通過後用只讀連線執行,再讓模型解讀結果。示例用 SQLite,換成你們的資料庫和只讀帳號即可。
import os
import re
import sqlite3
from openai import OpenAI
client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"])
# Only the tables relevant to the question (with many tables, find them by embedding search with text-embedding-3-small).
SCHEMA = """
CREATE TABLE stores (id INTEGER PRIMARY KEY, name TEXT, region TEXT); -- region: east, north, south, west
CREATE TABLE orders (id INTEGER PRIMARY KEY, store_id INTEGER, paid_at TEXT, amount REAL, status TEXT);
-- status: paid or refunded. Sales = sum(amount) of paid orders. paid_at looks like 2026-10-31 18:05:00.
"""
ALLOWED = {"stores", "orders"}
WRITES = re.compile(r"\b(insert|update|delete|drop|alter|create|truncate|attach|pragma|grant)\b", re.I)
def write_sql(question, problem=None):
prompt = "Question: " + question
if problem:
prompt += "\nYour previous query was rejected (" + problem + "). Write it again."
resp = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{"role": "system", "content": "Write one SQLite SELECT query for the question, using only these tables:\n"
+ SCHEMA + "\nAlways add a LIMIT. Reply with the SQL only."},
{"role": "user", "content": prompt},
],
)
sql = resp.choices[0].message.content.strip()
return re.sub(r"^\x60{3}(?:sql)?\s*|\s*\x60{3}$", "", sql).strip().rstrip(";") # drop a code fence
def check(sql):
"""Why the query is unsafe, or None. A SQL parser is sturdier than regexes; keep the read-only user anyway."""
if ";" in sql:
return "more than one statement"
if not re.match(r"(select|with)\b", sql, re.I):
return "not a SELECT query"
if WRITES.search(sql):
return "contains a write keyword"
ctes = set(re.findall(r"\b(\w+)\s+as\s*\(", sql, re.I))
tables = set(re.findall(r"\b(?:from|join)\s+(\w+)", sql, re.I)) - ctes
if not tables <= ALLOWED:
return "unknown table " + ", ".join(sorted(tables - ALLOWED))
if not re.search(r"\blimit\s+\d+", sql, re.I):
return "no LIMIT"
return None
def ask(question):
sql = write_sql(question)
problem = check(sql)
if problem: # one rewrite, then give up
sql = write_sql(question, problem)
problem = check(sql)
if problem:
raise ValueError("no safe query: " + problem)
# read-only connection; in production, a SELECT-only database user on a replica, with a query timeout
db = sqlite3.connect("file:shop.db?mode=ro", uri=True)
rows = db.execute(sql).fetchmany(50)
db.close()
resp = client.chat.completions.create(
model="qwen3.5-plus",
messages=[
{"role": "system", "content": "Explain the result in two or three sentences for a business reader. Use only the numbers given."},
{"role": "user", "content": f"Question: {question}\nSQL: {sql}\nRows: {rows}"},
],
)
return sql, rows, resp.choices[0].message.content
sql, rows, summary = ask("Which 5 stores in the east region had the highest sales last month?")
print(sql, rows, summary, sep="\n\n")常見問題
智慧問數每月要花多少錢?
按每月 2 萬次提問、每次給模型約 4,000 tokens 的表結構和示例,再加 300 份報表彙總估算,用最低價分組計算約 ¥395。費用主要取決於提問量和每次放進提示詞的表結構有多長。
模型生成的 SQL 能直接執行嗎?
不建議。執行前用程式檢查:只能是一條查詢、只查允許的表、必須帶 LIMIT;執行時用只有查詢權限的資料庫帳號,連只讀副本或資料倉儲,並設定查詢超時。這樣即使模型寫錯,也改不了資料,也不會拖垮主庫。
查出來的數一定對嗎?
不一定。SQL 能執行不代表口徑正確,比如漏掉了退款訂單、時區或去重條件。建議把 SQL 和結果一起展示給使用者;銷售額、毛利這類關鍵指標,用你們定義好的標準 SQL 或指標表,模型只負責把問題對應到這些指標上。
表很多、欄位名都是縮寫怎麼辦?
給每張表和每個欄位寫中文說明,包括單位、列舉值和統計口徑;表多時先用向量檢索找出相關的幾張表,只把它們放進提示詞。再把使用者問過的典型問題和核對過的 SQL 整理成示例,一起放進提示詞。
能分析 Excel 表格嗎?
可以,但不要把整張表交給模型去加總和比較。先用程式(例如 pandas)讀取表格,算好合計、同比環比和排名,再把這些結果交給模型寫成文字說明。大模型做算術容易出錯,數字以程式算出的為準。
業務資料會發給模型嗎?
生成 SQL 時,請求裡只需要表結構和欄位說明,不需要真實資料;解讀結果時,查詢結果會隨請求經本站轉發給模型服務處理。涉及個人資訊或敏感經營資料的,先脫敏或只發送聚合後的數字,並按你們自己的資料合規要求評估。
