如何在 AiHubMix 呼叫 Jev:結構化分類教學

推理時代閱讀約 5 分鐘
如何在 AiHubMix 呼叫 Jev:結構化分類教學

簡短回答: jev-1.13 不會生成文字。你只要將一段文字和一組具名問題 POST 至 https://aihubmix.com/v1/systemone,就會收到以問題名稱為鍵的型別化答案——類別、分數或機率。完全不需要解析文字。以下會介紹可直接使用的請求、完整的回應格式,以及一個會在不知不覺中降低準確度的設計錯誤。

Jev 的用途

當你需要的是一項 判斷,而非一段文字時,就適合使用它:例如為支援單分流、評定嚴重程度、標記急迫性或控管內容。模型頁面說得很明白:「不生成文字,也沒有需要解析的內容。」

如果你需要解釋、摘要或任何自由格式的輸出,請改用一般聊天模型。jev 無法產生這些內容。

開始之前

  • [ ] 已安裝 Python 3(只需標準函式庫即可)
  • [ ] 擁有 AiHubMix 帳戶和 API 金鑰
  • [ ] 將金鑰匯出為 AIHUBMIX_API_KEY,絕不要硬編碼在原始碼中

你 不 需要 OpenAI SDK、LangChain 或 requests 套件。

步驟 1 — 認識端點

POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json

這是模型專用的路由,不是 /v1/chat/completions。OpenAI 相容用戶端無法呼叫此端點,請使用一般 HTTP。

步驟 2 — 選擇問題類型

共有三種類型,你可以在同一個請求中自由混用:

類型用途你要提供的內容
choice選擇一個類別criteria 以字典格式提供:標籤 → 定義
score在有序量表上評分criteria 以清單格式提供,順序由最低到最高
noul是/否判斷除了 instructions,不需提供其他內容

步驟 3 — 建立請求

state 是要判斷的文字。questions 的鍵名由你自行命名;回應會使用相同名稱。

payload = {
    "model": "jev-1.13",
    "state": "Hi, I have been trying to connect my Stripe account for 3 days "
             "and it keeps failing. I am losing sales. Please help ASAP.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Which team should handle this",
            "criteria": {
                "billing":   "Payment or subscription issues",
                "technical": "Bugs or integration problems",
                "sales":     "Pricing or account questions",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "How frustrated the customer appears",
            "criteria": [
                "Calm, just stating facts",
                "Frustrated but civil",
                "Very angry, strong language",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "The message conveys urgency or time-sensitivity",
        },
    },
}

步驟 4 — 使用標準函式庫傳送請求

import json, os, urllib.error, urllib.request

def ask(payload):
    req = urllib.request.Request(
        "https://aihubmix.com/v1/systemone",
        data=json.dumps(payload).encode(),
        headers={"Authorization": "Bearer " + os.environ["AIHUBMIX_API_KEY"],
                 "Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            return json.loads(r.read())
    except urllib.error.HTTPError as e:
        raise SystemExit(f"HTTP {e.code}: {e.read().decode(errors='replace')[:500]}")

請將請求建立的程式碼放在函式內。如果在模組層級建立並傳送請求,匯入檔案時就會再次觸發呼叫,消耗 token。

步驟 5 — 讀取答案

每個答案都會將值存放在與其 type 相符的鍵下,因此一個存取方式就能涵蓋三種類型:

data = ask(payload)
for name, ans in data["answers"].items():
    kind = ans["type"]
    print(name, kind, ans[kind], ans.get("confidence"))
print("usage:", data.get("usage"))

已驗證的輸出:

department   choice  billing   0.51
frustration  score   1         1
is_urgent    noul    1         None
usage: {'input_tokens': 424, 'output_tokens': 73}

步驟 6 — 了解完整回應結構

列印迴圈會隱藏一些實用欄位。以下是 score 答案的原始 JSON:

{
  "type": "score",
  "score": 1,
  "legend": {"0": "Calm, just stating facts", "1": "Frustrated but civil", "2": "Very angry, strong language"},
  "probabilities": {"0": 0, "1": 1, "2": 0},
  "confidence": 1
}
  • legend 會將索引對應回你自己的文字標示——整數本身就能清楚說明其意義,因此程式碼不需要查找表。
  • probabilities 會提供完整的機率分布,方便偵測結果是否勢均力敵。
  • noul 沒有 confidence 欄位。 其機率就是判斷依據。

最上層也會回傳 usage、id、provider(TypeSafe),以及解析後的後端版本 typesafe/jev-1.13-20260917。

降低準確度的錯誤

在上述請求中,department 回傳了 billing,信心度為 0.51。重複傳送完全相同的請求時,同一個標籤再次出現,但信心度只有 0.38——答案穩定,表達的確定程度卻不穩定。

原因出在 criteria,而非模型。billing 的定義是「付款或訂閱問題」,而 technical 則是「錯誤或整合問題」。Stripe 整合 持續失敗確實符合兩者。模型反映的是寫入 schema 的模糊之處。

上線前請遵守兩項原則:

  1. 撰寫彼此互斥的 choice criteria。如果人類在兩個標籤之間都會猶豫,模型也會如此。
  2. 設定信心度門檻,並將低信心度結果送至人工處理佇列,而非直接視為判斷結果。能坦承不確定性的模型,比隱瞞不確定性的模型更有價值。

上線前檢查清單

  • [ ] 從環境變數或版本控制系統(VCS)會忽略的 600 權限檔案載入金鑰
  • [ ] 檢查 choice criteria 是否有重疊
  • [ ] 設定信心度門檻,並定義低於門檻時的後續處理方式
  • [ ] 分別處理 noul 答案——它們不帶有 confidence
  • [ ] 移除未使用的問題(3 個問題會耗用 424 個輸入 token;2 個問題則耗用 355 個)
  • [ ] 記錄非 2xx 回應及其原始內容

常見問題

可以使用 OpenAI SDK 嗎? 不行。/v1/systemone 不是 OpenAI 相容路由。

jev 可以回傳句子或摘要嗎? 不行。它只會回答你定義的型別化問題。

每個請求可以包含幾個問題? 經驗證的測試使用了兩個和三個問題。每個問題都會增加輸入與輸出 token,因此只加入你會採取行動的問題。

有版本別名嗎? 模型頁面除了 jev-1.13,也列出了 jev-latest 別名。若重現性很重要,請固定使用明確版本。

費用是多少? 模型頁面公布的價格為每 M 個輸入 token $0.0462 / M,每 M 個輸出 token $0 / M。這些是供應商公布的價格,編列預算前請確認最新價格。

上下文視窗有多大? 模型頁面的資訊不一致:頁首標示 64K,供應商表格則標示 32K。依賴任一數值前,請先用你自己的最長輸入進行驗證。

本指南的範圍

以上內容都已透過對單一輸入進行三次即時呼叫加以驗證。本指南不涵蓋延遲、批次處理、吞吐量,或模型對不同於範例的輸入會有何行為。信心度波動是重現觀察到的結果,並非測得的錯誤率——設定門檻前,請先用自己的資料重複測試。

開始使用 AiHubMix

jev-1.13 可透過 AiHubMix 使用,模型頁面也列出本教學參考的所有資訊:/v1/systemone 端點、三種問題類型及其 criteria 格式、完整的回應欄位,以及公布的定價——每 M 個輸入 token $0.0462 / M,每 M 個輸出 token $0 / M。jev-latest 別名會指向最新版本,確保你使用的版本隨著更新保持最新。

從這裡開始: https://aihubmix.com/model/jev-latest

接下來:

  1. 建立 AiHubMix 帳戶並產生 API 金鑰
  2. 複製步驟 3 的請求,以及步驟 4 的 ask() 函式
  3. 將 state 替換成你自己佇列中的真實記錄
  4. 將結果與你目前對該筆記錄的分類方式進行比較

如果本指南對你有所幫助,歡迎訂閱,掌握結構化輸出模型與分類流程的後續文章。

一個閘道接入多家 AI 服務商, 為正式環境而生。

前往推理時代官網