Skip to content
Guides2 min read

把決策模型用作低成本的第一層標註

決策模型用一次前向計算為每個選項打分,不生成任何文本。在選項不多的題目上,它可以在 LLM 之前充當第一層標註。

Potato Team

決策模型用一次前向計算回答一道固定選項的題目,為每個選項返回一個機率,不需要生成任何文本。在只有少數幾個選項的單選題上,可以把它用作標註級聯的第一層,把它沒把握的條目交給 LLM,並在一份盲態人工樣本上認證它的閾值,因為它在答錯的輸入上也可能保持很高的置信度。

決策模型是一種分類器,它接收一段文本和一組帶類型的問題,為每個答案返回一個機率。它不生成文本,所以寫不了提示詞、理由或規則。Laya 就是這類開放模型之一。它的模型卡列出了一個基於 ModernBERT-large 編碼器、有 4.21 億參數、採用 Apache 2.0 許可證的英文檢查點,以及一個有 3.22 億參數的多語言檢查點。/v1/systemone API 通過 HTTP 提供同類答案,來源可以是託管的 Jev、OpenJev 或 Laya 自己的伺服器。

第一層在哪裡省錢

標註級聯按順序嘗試模型,通常從最便宜的到能力最強的,只有當前模型不夠有把握時才把條目往下傳。當語料中簡單條目佔比很大時,一個能有把握地標好這些條目的便宜模型,會給 LLM 留下更少、更難的剩餘部分。節省多少取決於這個佔比,所以在據此做計劃之前,請先在你自己的資料上測量它。

決策模型適合做第一層,因為它一次計算就能回答所有選項,所以一道有五個標籤的題目只需一次前向計算,不生成任何文本。它輸出的機率就是置信度分數,所以不需要追問,也不需要重複取樣。它還能在 CPU 上執行。模型卡報告,在預先載入檢查點的情況下,CPU 上每個請求耗時 193 到 464 毫秒,英文檢查點在 T4 GPU 上耗時 39.5 毫秒。

Laya 已報告的侷限

以下侷限中有四條來自 Laya 的模型卡,第五條關於評分量表,來自 Potato 的文件:

  • 選項很多時。 在 Banking77 意圖基準上,模型卡報告 Laya 在 77 個標籤上的準確率為 0.425,而 Jev 在 72 個標籤上為 0.870。各選項共享一個固定的 token 預算,所以很長的標籤列表會互相擠佔。Potato 的文件還指出,在有 11 個或更多選項的題目上,Laya 會警告其溫度超出範圍,並對溫度進行截斷。
  • 英文檢查點遇到其他文字。 模型卡報告,英文檢查點在高棉文文本上的準確率為 0.000,置信度卻是 0.952。置信度閾值無法發現模型很有把握的錯誤。
  • 零樣本準確率。 模型卡報告,基礎檢查點在其帶類型決策基準上的零樣本表現接近隨機水平,為 0.362,而隨機基線為 0.318,多數類基線為 0.461;模型卡稱 Laya 是“一個用來專門化的快速基座,而不是零樣本決策引擎”。
  • 原始校準。 模型卡報告,laya 出廠時置信度偏高,平均期望校準誤差為 0.466,在你自己的資料上重新擬合溫度後降到 0.081。校準程度因領域而異,所以在別人資料上選定的閾值不能照搬。
  • 評分量表。 Potato 的文件發現,在 likert 和 slider 方案上,無論題目怎麼措辭,Laya 的分數幾乎都跟不上量表。

綜合這些侷限,宜把決策模型限定在只有少數幾個選項的單選題上,並使用其檢查點訓練時所用的語言。它的閾值要根據你自己語料上的人工標籤來選定。

Potato 中的決策模型

Potato 2.11 為決策模型新增了兩種端點類型。laya 在 Potato 程序內執行 Laya,需要 decision 附加依賴,即 pip install 'potato-annotation[decision]',它會引入 torch 和 transformers。systemone 連線任何提供 /v1/systemone API 的伺服器,只需要一個 base_url。兩者都適用於 radio、select、likert 和 slider 方案;如果把其中一個設為標註 multiselect、片段或自由文本方案,Solo Mode 不會啟動。

在標註引擎中,決策模型是一個放在級聯第一位的 decision 來源。下面這段摘自 Potato 隨附的文本示例,它把 Laya 放在一個小型 Ollama LLM 之前,並以 Potato 預設的 90% 置信度、對照 10% 的錯誤目標來認證這一組合:

yaml
labeling_engine:
  enabled: true
  sources:
    - id: laya
      kind: decision
      endpoint_type: laya
      model: convaiinnovations/laya
      options:
        device: cpu
    - id: llm
      kind: llm
      endpoint_type: ollama
      model: llama3.2:3b
      base_url: http://localhost:11434
      max_tokens: 200
  cascade: [laya, llm]
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9

引擎在一份盲態人工樣本的一半上選定 Laya 的置信度閾值,在另一半上檢驗它,所以閾值來自你的語料,而不是來自模型卡。在樣本的 dev 那一半為 Laya 定下閾值之前,LLM 會標註每一個條目。此後,LLM 只會看到 Laya 沒把握的條目,外加校準樣本。

在該示例 README 記錄的那次執行中,LLM 用的是 Gemma 12B,Laya 的閾值始終沒有定下來,所有被接受的標籤都由 LLM 給出,所以在指望第一層之前,請先在你自己的語料上測量它的貢獻。由於引擎會分別檢驗每一層被接受的標籤,像高棉文那樣很有把握的失敗,只要認證樣本覆蓋了這類輸入,就會作為錯誤出現在樣本中。distributional 契約還可以使用 Laya 的完整機率向量,這適合標註者意見分歧的主觀問題。

在 Solo Mode 中,決策模型放在 labeling_models 裡,並作為 confidence_routing 的第一層。Solo Mode 還需要在 revision_models 下設定一個生成式模型,因為決策模型寫不了它的修訂迴圈所產出的提示詞和規則。

在完整執行之前測試決策模型

在讓整個語料經過決策模型之前,先在幾十個你已經標註過的條目上執行它。Solo Mode 的 Try on 10 items 按鈕針對提示詞做的就是這件事;在引擎中,先執行 potato label run 再執行 potato label status,就能看到每一層的閾值還需要多少標籤,以及哪個來源產生了錯誤。認證失敗的一層什麼也不接受,它會把高於自身閾值的條目交給人,而不是交給 LLM,這就把人工標籤預算花在了 LLM 本來可能標好的條目上。如果決策模型這一層一直認證失敗,就把它從級聯中去掉。

延伸閱讀