跳到正文
土土金API

資料分析與智慧問數

智慧問數(用自然語言查資料,也叫 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 的統計摘要。

¥394.66/ 月

  • 問題向量化¥0.04
  • 生成 SQL¥291.2
  • 校驗不通過重寫(約 10%)¥31.92
  • 解讀查詢結果¥67.2
  • 報表與表格彙總¥4.3
看用量假設

業務問題

運營、銷售和管理層經常要臨時查一個數:上週各渠道的退貨率、華東區有多少復購使用者、哪家門店的客單價降得最多。每次都要找資料團隊寫 SQL,簡單的問題也要排隊等。

大模型可以把這類問題翻譯成 SQL,但它不知道你們的表名、欄位含義和統計口徑,容易編出不存在的欄位,或者漏掉「已退款訂單不計入銷售額」這樣的條件。生成的語句如果不加檢查就執行,還可能修改資料,或者一次掃描整張大表、拖慢資料庫。

穩妥的做法是:只把相關表的結構交給模型,生成的 SQL 先過程式校驗,再用只讀帳號在只讀副本上執行,限制返回行數和執行時間;結果和 SQL 一起展示給使用者,口徑對不對一眼就能核對。

推薦模型組合

推薦模型按即時目錄自動選取,價格取各模型最低價分組,更新於 2026年11月13日 下午6:08。點模型名可檢視全部分組價格。

參考架構

  1. 1

    整理表結構說明

    為開放查詢的表寫說明:表的用途、每個欄位的含義和單位、列舉值、表之間怎麼關聯,以及「銷售額是否含退款」這類統計口徑。說明寫得越清楚,生成的 SQL 越準。

  2. 2

    找出相關的表

    表多的時候,把每張表的說明向量化入庫;使用者提問時取最相關的 3 到 5 張表,把它們的建表語句和說明放進提示詞。

  3. 3

    生成 SQL

    提示詞裡寫明資料庫類型(MySQL、PostgreSQL 等)、可用的表結構和幾條「問題 → 核對過的 SQL」示例,要求只輸出一條查詢語句,不加解釋。

  4. 4

    程式校驗

    執行前檢查:只能有一條語句,必須以 SELECT 或 WITH 開頭,不能含 INSERT、UPDATE、DELETE、DROP 等寫操作,只引用允許查詢的表,並且帶 LIMIT。不合格的把原因交回模型重寫一次,仍不合格就請使用者換個問法。

  5. 5

    只讀執行

    用只有查詢權限的資料庫帳號連線只讀副本或資料倉儲,設定查詢超時和返回行數上限。即使校驗漏掉了什麼,這個帳號也改不了資料。

  6. 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-small20,000 次 × 輸入 50 tokens¥0.04
生成 SQLdeepseek-v4.1-flash20,000 次 × 輸入 4,000 + 輸出 300 tokens¥291.2
校驗不通過重寫(約 10%)deepseek-v4.1-flash2,000 次 × 輸入 4,500 + 輸出 300 tokens¥31.92
解讀查詢結果qwen3.5-plus20,000 次 × 輸入 1,500 + 輸出 250 tokens¥67.2
報表與表格彙總qwen3.5-plus300 次 × 輸入 8,000 + 輸出 800 tokens¥4.3
合計(每月)¥394.66

按各模型最低價分組的即時價格計算,價格更新於 2026年11月13日 下午6:08。

只含模型呼叫費用,不含資料庫、向量庫和伺服器成本。表結構說明首次向量化是一次性費用,按 300 張表、每張說明約 400 tokens 算,約 12 萬 tokens。生成 SQL 的輸入裡表結構和示例佔大頭,模型支援上下文快取時命中部分按快取讀取價計費,實際費用會更低;推理模型的思考過程按輸出計費,輸出可能多於表中假設。提問量翻倍,費用大致翻倍。

示例程式碼

模型生成 SQL,程式檢查這條語句:只有一條查詢、只查允許的表、帶 LIMIT,通過後用只讀連線執行,再讓模型解讀結果。示例用 SQLite,換成你們的資料庫和只讀帳號即可。

示例程式碼(Python,智慧問數)
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")

用一把 Key 試試這個方案

註冊後在控制台建立 API Key,把上面程式碼裡的 base_url 和 Key 換成你的就能執行。企業採購、開發票可以加客服微信 JsnonoChat。

土土金客服微信二維碼
微信JsnonoChat

掃碼或搜尋微信號新增客服

常見問題

智慧問數每月要花多少錢?

按每月 2 萬次提問、每次給模型約 4,000 tokens 的表結構和示例,再加 300 份報表彙總估算,用最低價分組計算約 ¥395。費用主要取決於提問量和每次放進提示詞的表結構有多長。

模型生成的 SQL 能直接執行嗎?

不建議。執行前用程式檢查:只能是一條查詢、只查允許的表、必須帶 LIMIT;執行時用只有查詢權限的資料庫帳號,連只讀副本或資料倉儲,並設定查詢超時。這樣即使模型寫錯,也改不了資料,也不會拖垮主庫。

查出來的數一定對嗎?

不一定。SQL 能執行不代表口徑正確,比如漏掉了退款訂單、時區或去重條件。建議把 SQL 和結果一起展示給使用者;銷售額、毛利這類關鍵指標,用你們定義好的標準 SQL 或指標表,模型只負責把問題對應到這些指標上。

表很多、欄位名都是縮寫怎麼辦?

給每張表和每個欄位寫中文說明,包括單位、列舉值和統計口徑;表多時先用向量檢索找出相關的幾張表,只把它們放進提示詞。再把使用者問過的典型問題和核對過的 SQL 整理成示例,一起放進提示詞。

能分析 Excel 表格嗎?

可以,但不要把整張表交給模型去加總和比較。先用程式(例如 pandas)讀取表格,算好合計、同比環比和排名,再把這些結果交給模型寫成文字說明。大模型做算術容易出錯,數字以程式算出的為準。

業務資料會發給模型嗎?

生成 SQL 時,請求裡只需要表結構和欄位說明,不需要真實資料;解讀結果時,查詢結果會隨請求經本站轉發給模型服務處理。涉及個人資訊或敏感經營資料的,先脫敏或只發送聚合後的數字,並按你們自己的資料合規要求評估。