Come chiamare Jev su AiHubMix: un tutorial di classificazione strutturata

AIHubMix5 min di lettura
Come chiamare Jev su AiHubMix: un tutorial di classificazione strutturata

Risposta breve: jev-1.13 non genera testo. Invii un testo insieme a un insieme di domande con nome a https://aihubmix.com/v1/systemone e ricevi risposte tipizzate, indicizzate con i nomi delle tue domande: una categoria, un punteggio o una probabilità. Non c'è nulla da analizzare. Di seguito trovi una richiesta funzionante, il formato completo della risposta e l'errore di progettazione che compromette silenziosamente l'accuratezza.

A cosa serve Jev

Usalo quando ti serve un giudizio, non un paragrafo: instradare un ticket di supporto, valutare la gravità, segnalare l'urgenza, filtrare i contenuti. La pagina del modello lo dichiara chiaramente: "Nessuna generazione di testo, nulla da analizzare".

Usa invece un normale modello di chat quando ti servono spiegazioni, riassunti o qualsiasi output in forma libera. jev non può produrli.

Prima di iniziare

  • [ ] Python 3 installato (la libreria standard è sufficiente)
  • [ ] Un account AiHubMix e una chiave API
  • [ ] Chiave esportata come AIHUBMIX_API_KEY, mai inserita direttamente nel codice sorgente

Non ti serve nessun SDK di OpenAI, LangChain o il pacchetto requests.

Passo 1 — Conosci l'endpoint

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

Questa è una rotta specifica del modello, non /v1/chat/completions. I client compatibili con OpenAI non possono chiamarla. Usa HTTP semplice.

Passo 2 — Scegli i tipi di domanda

Ce ne sono tre, e puoi combinarli liberamente in un'unica richiesta:

TipoUsalo perCosa fornisci
choiceScegliere una categoriacriteria come dizionario: etichetta → definizione
scoreValutazione su una scala ordinatacriteria come lista, dal valore più basso
noulUn giudizio sì/nonient'altro oltre a instructions

Passo 3 — Costruisci la richiesta

state è il testo da giudicare. Le chiavi di questions sono nomi che inventi tu; la risposta usa gli stessi nomi.

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",
        },
    },
}

Passo 4 — Inviala con la libreria standard

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]}")

Mantieni la costruzione della richiesta all'interno di una funzione. Se costruisci e invii a livello di modulo, importare il file rilancia la chiamata e consuma token.

Passo 5 — Leggi le risposte

Ogni risposta memorizza il proprio valore sotto una chiave corrispondente al suo type, quindi un solo accessor copre tutti e tre i casi:

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"))

Output verificato:

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

Passo 6 — Comprendi l'envelope completo

Il ciclo di stampa nasconde campi utili. Il JSON grezzo per una risposta di tipo score:

{
  "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 associa l'indice alla tua formulazione originale: l'intero è autoesplicativo, quindi non ti serve una tabella di consultazione nel codice.
  • probabilities fornisce la distribuzione completa, utile per rilevare un pareggio quasi perfetto.
  • noul non ha un campo confidence. Il segnale è la sua probabilità.

Il livello superiore restituisce anche usage, id, provider (TypeSafe) e la versione del backend risolta typesafe/jev-1.13-20260917.

L'errore che compromette l'accuratezza

Nella richiesta sopra, department ha restituito billing con una confidenza di 0,51. Ripetendo la stessa identica richiesta, è stata restituita la stessa etichetta con 0,38: la risposta era stabile, la certezza dichiarata no.

La causa sta nei criteri, non nel modello. billing è "Problemi di pagamento o abbonamento" e technical è "Bug o problemi di integrazione". Un'integrazione Stripe che continua a fallire corrisponde davvero a entrambi. Il modello stava segnalando un'ambiguità scritta nello schema.

Due regole prima della produzione:

  1. Scrivi criteri choice che si escludano a vicenda. Se un essere umano esiterebbe tra due etichette, lo farà anche il modello.
  2. Imposta una soglia di confidenza e instrada i risultati a bassa confidenza verso una coda gestita da un essere umano, invece di accettarli come decisioni. Un modello che ammette l'incertezza è più prezioso di uno che la nasconde.

Checklist pre-lancio

  • [ ] Chiave caricata dall'ambiente o da un file in modalità 600 che il VCS ignora
  • [ ] Criteri choice verificati per sovrapposizioni
  • [ ] Soglia di confidenza definita, con un percorso di ripiego al di sotto di essa
  • [ ] Risposte noul gestite separatamente: non hanno confidence
  • [ ] Domande inutilizzate rimosse (3 domande costano 424 token di input; 2 costano 355)
  • [ ] Risposte non 2xx registrate con il corpo grezzo

FAQ

Posso usare l'SDK di OpenAI? No. /v1/systemone non è una rotta compatibile con OpenAI.

jev può restituire una frase o un riassunto? No. Risponde solo alle domande tipizzate che definisci.

Quante domande per richiesta? I test verificati ne hanno usate due e tre. Ogni domanda aggiunge token di input e di output, quindi includi solo ciò su cui agirai.

Esiste un alias di versione? La pagina del modello elenca un alias jev-latest accanto a jev-1.13. Fissa la versione esplicita se la riproducibilità è importante.

Quanto costa? La pagina del modello pubblica $0.0462 / M di token di input e $0 / M di token di output. Sono cifre del fornitore: verifica il prezzo attuale prima di fare il budget.

Qual è la finestra di contesto? La pagina del modello è incoerente: 64K nell'intestazione, 32K nella tabella dei fornitori. Verifica con il tuo input più lungo prima di fare affidamento su uno dei due valori.

Ambito di questa guida

Tutto quanto sopra è stato verificato con tre chiamate live su un singolo input. Non copre latenza, batching, throughput o il comportamento su input diversi dall'esempio. La deriva della confidenza è un'osservazione riprodotta, non un tasso di errore misurato: ripetila sui tuoi dati prima di impostare una soglia.

Inizia con AiHubMix

jev-1.13 è disponibile tramite AiHubMix, e la pagina del modello contiene tutto ciò a cui questo tutorial fa riferimento: l'endpoint /v1/systemone, i tre tipi di domanda con i relativi formati di criteria, i campi completi della risposta e il prezzo pubblicato di $0.0462 / M di token di input con $0 / M di token di output. L'alias jev-latest risolve alla release più recente, quindi resta aggiornato al variare delle versioni.

Inizia qui: https://aihubmix.com/model/jev-latest

Prossimi passi:

  1. Crea un account AiHubMix e genera una chiave API
  2. Copia la richiesta del Passo 3 e la funzione ask() del Passo 4
  3. Sostituisci state con un record reale della tua coda
  4. Confronta il risultato con il metodo che usi oggi per classificare quel record

Se questa guida ti è stata utile, iscriviti per i prossimi articoli su modelli con output strutturato e pipeline di classificazione.

Un unico gateway per più provider di IA. Pensato per la produzione.

Visita AIHubMix