資料標註與分類
批次打標籤先用便宜的小模型跑第一遍,要求按 JSON 返回標籤和置信度;置信度低的樣本交給另一家的模型複核,再隨機抽一部分人工檢查。按每月 50 萬條短文本、5% 進入複核估算,用最低價分組計算,模型費用每月約 ¥68.24。
價格更新於 2026年11月13日 下午6:08
月成本估算
假設:每月標註 50 萬條短文本(評論、工單),每條輸入約 400 tokens(標籤定義與示例約 300、文本約 100),輸出約 30 tokens;其中 5%(2.5 萬條)低置信度樣本交給第二個模型複核。
業務問題
使用者評論、客服工單、問卷回答、商品標題每天都在增加,運營和演算法團隊要把它們分進類目,統計問題分佈,或者拿來訓練自己的模型。人工標註慢,幾個人的標準也很難統一。
大模型照著寫清楚的標籤定義打標,速度快、成本低,但在邊界樣本上會搖擺,偶爾還會給出標籤清單之外的答案。
更現實的定位是把模型當第一遍標註員:輸出限定在固定標籤裡並附置信度,拿不準的交給第二個模型或人工,再用抽檢結果不斷修正標籤定義。
推薦模型組合
推薦模型按即時目錄自動選取,價格取各模型最低價分組,更新於 2026年11月13日 下午6:08。點模型名可檢視全部分組價格。
首輪標註(小模型)
gemini-2.5-flash-liteGoogle
輸入 ¥0.2 / 輸出 ¥0.8 每百萬 tokens標準分組
處理全部樣本。任務只是從固定標籤裡選一個,用不上大模型的推理能力,選輸入單價低、響應快的小模型就夠了。
複核低置信度樣本(第二個模型)
qwen3.5-plus通義千問
輸入 ¥1.12 / 輸出 ¥6.72 每百萬 tokens國產模型分組
只處理首輪置信度低的樣本。換一家廠商的模型給第二意見,能減少同一個模型帶來的系統性偏差;兩次結果不一致的交給人工。
參考架構
- 1
寫標籤定義
每個標籤寫一句定義和兩三個正反例,邊界情況單獨說明,比如「物流慢但對商品滿意」該歸哪一類。
- 2
小模型首輪標註
系統提示詞固定,要求返回 JSON:標籤加 0 到 1 的置信度;temperature 設為 0,限制輸出長度。
- 3
程式校驗
標籤不在清單裡、或者 JSON 解析失敗的,直接記為待複核。
- 4
第二模型複核
置信度低於閾值(比如 0.7)的樣本交給另一個模型重新標註,結果一致就採用,不一致進入人工佇列。
- 5
抽樣人工檢查
每批隨機抽 1% 到 2% 人工檢查,算出一致率;一致率下降時修改標籤定義和示例,重跑有問題的類目。
成本估算
假設:每月標註 50 萬條短文本(評論、工單),每條輸入約 400 tokens(標籤定義與示例約 300、文本約 100),輸出約 30 tokens;其中 5%(2.5 萬條)低置信度樣本交給第二個模型複核。
| 專案 | 模型 | 用量假設 | 費用 |
|---|---|---|---|
| 首輪標註 | gemini-2.5-flash-lite | 500,000 次 × 輸入 400 + 輸出 30 tokens | ¥52 |
| 低置信度複核 | qwen3.5-plus | 25,000 次 × 輸入 400 + 輸出 30 tokens | ¥16.24 |
| 合計(每月) | ¥68.24 | ||
按各模型最低價分組的即時價格計算,價格更新於 2026年11月13日 下午6:08。
只含模型呼叫費用,不含人工抽檢成本。標籤定義越長,每條的輸入 tokens 越多;待標文本越長,費用越高。條數翻倍,費用大致翻倍。
示例程式碼
首輪用小模型按 JSON 返回標籤和置信度,置信度低的交給第二個模型,兩次不一致的標記為人工處理,結果寫入 JSONL。
import json
import os
import random
from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI
client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"], max_retries=3)
LABELS = ["shipping", "quality", "price", "service", "other"]
SYSTEM = (
"You label customer reviews. Choose exactly one label from: " + ", ".join(LABELS) + ". "
'Reply with JSON only, for example {"label": "quality", "confidence": 0.9}.'
)
def label(item, model):
resp = client.chat.completions.create(
model=model,
messages=[{"role": "system", "content": SYSTEM}, {"role": "user", "content": item["text"]}],
response_format={"type": "json_object"},
temperature=0,
max_tokens=50,
)
raw = resp.choices[0].message.content
try:
result = json.loads(raw[raw.find("{"): raw.rfind("}") + 1])
except ValueError:
result = {}
if result.get("label") not in LABELS:
return {"id": item["id"], "label": None, "confidence": 0.0}
return {"id": item["id"], "label": result["label"], "confidence": float(result.get("confidence", 0))}
items = [{"id": 1, "text": "Arrived two days late, but the mug itself is lovely."}]
with ThreadPoolExecutor(max_workers=8) as pool:
first = list(pool.map(lambda it: label(it, "gemini-2.5-flash-lite"), items))
# second opinion for low-confidence rows from another vendor's model
by_id = {it["id"]: it for it in items}
for row in first:
if row["confidence"] < 0.7:
second = label(by_id[row["id"]], "qwen3.5-plus")
row["needs_human"] = second["label"] != row["label"]
row["label"] = second["label"] if row["label"] is None else row["label"]
# a random 2% always goes to people for quality checks
for row in random.sample(first, max(1, len(first) // 50)):
row["needs_human"] = True
with open("labels.jsonl", "w", encoding="utf-8") as f:
for row in first:
f.write(json.dumps(row, ensure_ascii=False) + "\n")常見問題
每月 50 萬條資料標註要多少錢?
按每條輸入約 400 tokens、輸出約 30 tokens,再讓 5% 進入第二個模型複核估算,用最低價分組計算約 ¥68.24。標籤定義寫得越長,單條成本越高。
模型標註的準確率有多高?
取決於任務難度和標籤定義是否清楚,沒有通用的數字。上線前拿幾百條人工標好的樣本測一遍一致率,再定置信度閾值和人工抽檢比例。
怎麼避免模型輸出清單外的標籤?
提示詞裡列出全部標籤並要求只能選其中一個,按 JSON 格式返回;程式裡再校驗一遍,不在清單裡的直接歸入待複核。
標註結果能拿去訓練自己的模型嗎?
技術上可以,但各家模型提供方對輸出內容的用途有自己的使用條款,用於訓練模型之前請先確認條款允許。
併發開多少合適?
從 8 個併發開始,看 429 出現的比例逐步調整;收到 429 時等一會兒再重試。量大的任務也可以分批放到業務低峰時段跑。
