So rufen Sie Jev auf AiHubMix auf: Ein strukturiertes Klassifikationstutorial

AIHubMix5 Min. Lesezeit
So rufen Sie Jev auf AiHubMix auf: Ein strukturiertes Klassifikationstutorial

Kurze Antwort: jev-1.13 generiert keinen Text. Sie POSTen ein Stück Text plus eine Reihe benannter Fragen an https://aihubmix.com/v1/systemone, und Sie erhalten typisierte Antworten, die nach Ihren Fragenamen zugeordnet sind — eine Kategorie, eine Punktzahl oder eine Wahrscheinlichkeit. Nichts zu parsen. Im Folgenden finden Sie eine funktionierende Anfrage, das vollständige Antwortformat und den einen Designfehler, der Ihnen stillschweigend Genauigkeit kosten wird.

Wofür Jev gedacht ist

Verwenden Sie es, wenn Sie ein Urteil benötigen, nicht einen Absatz: Routing eines Support-Tickets, Bewertung der Schwere, Kennzeichnung der Dringlichkeit, Zugang zu Inhalten. Die Modellseite sagt es klar — "Keine Textgenerierung, nichts zu parsen."

Verwenden Sie stattdessen ein normales Chat-Modell, wenn Sie Erklärungen, Zusammenfassungen oder beliebige freie Ausgaben benötigen. Jev kann diese nicht erzeugen.

Bevor Sie beginnen

  • [ ] Python 3 installiert (die Standardbibliothek reicht aus)
  • [ ] Ein AiHubMix-Konto und API-Schlüssel
  • [ ] Schlüssel als AIHUBMIX_API_KEY exportiert, niemals im Quellcode fest codiert

Sie benötigen kein OpenAI SDK, LangChain oder das requests Paket.

Schritt 1 — Endpoint kennen

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

Dies ist eine modell-spezifische Route, nicht /v1/chat/completions. OpenAI-kompatible Clients können sie nicht aufrufen. Verwenden Sie einfaches HTTP.

Schritt 2 — Wählen Sie Ihre Fragetypen

Es gibt drei, und Sie können sie in einer Anfrage frei mischen:

TypVerwenden Sie es fürSie liefern
choiceAuswahl einer Kategoriecriteria als dict: label → definition
scoreBewertung auf einer geordneten Skalacriteria als Liste, niedrigste zuerst
noulEin Ja/Nein-Urteilnichts darüber hinaus instructions

Schritt 3 — Anfrage erstellen

state ist der zu bewertende Text. questions Schlüssel sind Namen, die Sie erfinden; die Antwort verwendet dieselben Namen.

payload = {
    "model": "jev-1.13",
    "state": "Hallo, ich habe versucht, mein Stripe-Konto seit 3 Tagen zu verbinden "
             "und es schlägt ständig fehl. Ich verliere Verkäufe. Bitte helfen Sie ASAP.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Welches Team sollte sich darum kümmern",
            "criteria": {
                "billing":   "Zahlungs- oder Abonnementprobleme",
                "technical": "Fehler oder Integrationsprobleme",
                "sales":     "Preise oder Kontofragen",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "Wie frustriert der Kunde erscheint",
            "criteria": [
                "Ruhig, nur Fakten darstellend",
                "Frustriert, aber zivilisiert",
                "Sehr wütend, starke Sprache",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "Die Nachricht vermittelt Dringlichkeit oder Zeitempfindlichkeit",
        },
    },
}

Schritt 4 — Senden Sie es mit der Standardbibliothek

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

Halten Sie die Anfrageerstellung innerhalb einer Funktion. Wenn Sie auf Modulebene erstellen und senden, wird der Aufruf beim Importieren der Datei erneut ausgelöst und verbraucht Tokens.

Schritt 5 — Antworten lesen

Jede Antwort speichert ihren Wert unter einem Schlüssel, der ihrem type entspricht, sodass ein Zugriff auf alle drei abgedeckt ist:

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

Überprüfte Ausgabe:

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

Schritt 6 — Verstehen Sie das vollständige Envelope

Die Druckschleife verbirgt nützliche Felder. Das rohe JSON für eine score Antwort:

{
  "type": "score",
  "score": 1,
  "legend": {"0": "Ruhig, nur Fakten darstellend", "1": "Frustriert, aber zivilisiert", "2": "Sehr wütend, starke Sprache"},
  "probabilities": {"0": 0, "1": 1, "2": 0},
  "confidence": 1
}
  • legend ordnet den Index zurück zu Ihrer eigenen Formulierung — die Ganzzahl ist selbsterklärend, sodass Sie keine Nachschlagetabelle in Ihrem Code benötigen.
  • probabilities gibt die vollständige Verteilung an, nützlich zur Erkennung eines nahezu Gleichstands.
  • noul hat kein confidence Feld. Seine Wahrscheinlichkeit ist das Signal.

Die oberste Ebene gibt auch usage, id, provider (TypeSafe) und die aufgelöste Backend-Version typesafe/jev-1.13-20260917 zurück.

Der Fehler, der Ihnen Genauigkeit kostet

In der obigen Anfrage gab department mit einer Zuversicht von 0.51 zurück. Eine identische Anfrage ergab dasselbe Label mit 0.38 — die Antwort war stabil, die angegebene Sicherheit jedoch nicht.

Die Ursache liegt in den Kriterien, nicht im Modell. billing ist "Zahlungs- oder Abonnementprobleme" und technical ist "Fehler oder Integrationsprobleme." Eine Stripe Integration die ständig fehlschlägt passt wirklich zu beiden. Das Modell berichtete von einer Mehrdeutigkeit, die in das Schema geschrieben wurde.

Zwei Regeln vor der Produktion:

  1. Schreiben Sie choice Kriterien, die sich gegenseitig ausschließen. Wenn ein Mensch zwischen zwei Labels zögern würde, wird das Modell dies auch tun.
  2. Setzen Sie einen Zuversichtsschwellenwert und leiten Sie Ergebnisse mit niedriger Zuversicht in eine menschliche Warteschlange weiter, anstatt sie als Entscheidungen zu akzeptieren. Ein Modell, das Unsicherheit zulässt, ist wertvoller als eines, das sie verbirgt.

Checkliste vor dem Start

  • [ ] Schlüssel aus der Umgebung oder einer 600-Modus-Datei geladen, die Ihr VCS ignoriert
  • [ ] choice Kriterien auf Überlappung überprüft
  • [ ] Zuversichtsschwellenwert definiert, mit einem Fallback-Pfad darunter
  • [ ] noul Antworten separat behandelt — sie tragen keine confidence
  • [ ] Unbenutzte Fragen entfernt (3 Fragen kosten 424 Eingabetokens; 2 kosten 355)
  • [ ] Nicht-2xx-Antworten mit dem rohen Body protokolliert

FAQ

Kann ich das OpenAI SDK verwenden? Nein. /v1/systemone ist keine OpenAI-kompatible Route.

Kann jev einen Satz oder eine Zusammenfassung zurückgeben? Nein. Es beantwortet nur die von Ihnen definierten typisierten Fragen.

Wie viele Fragen pro Anfrage? Die verifizierten Tests verwendeten zwei und drei. Jede Frage fügt Eingabe- und Ausgabetokens hinzu, also schließen Sie nur das ein, was Sie bearbeiten werden.

Gibt es ein Versionsalias? Die Modellseite listet ein jev-latest Alias neben jev-1.13. Fixieren Sie die explizite Version, wenn Reproduzierbarkeit wichtig ist.

Was kostet es? Die Modellseite veröffentlicht $0.0462 / M Eingabetokens und $0 / M Ausgabetokens. Dies sind Anbieterzahlen — bestätigen Sie die aktuellen Preise, bevor Sie budgetieren.

Was ist das Kontextfenster? Die Modellseite ist inkonsistent: 64K in ihrer Kopfzeile, 32K in der Anbietertabelle. Überprüfen Sie gegen Ihre eigene längste Eingabe, bevor Sie sich auf eine der beiden verlassen.

Umfang dieses Leitfadens

Alles oben wurde mit drei Live-Anrufen gegen eine einzige Eingabe verifiziert. Es behandelt nicht Latenz, Batchverarbeitung, Durchsatz oder Verhalten bei Eingaben, die von dem Beispiel abweichen. Der Zuversichtsdrift ist eine reproduzierte Beobachtung, kein gemessener Fehlerquote — wiederholen Sie es mit Ihren eigenen Daten, bevor Sie einen Schwellenwert festlegen.

Beginnen Sie mit AiHubMix

jev-1.13 ist über AiHubMix verfügbar, und die Modellseite enthält alles, auf das dieses Tutorial verwiesen hat: den /v1/systemone Endpoint, die drei Fragetypen mit ihren criteria Formaten, die vollständigen Antwortfelder und die veröffentlichten Preise von $0.0462 / M Eingabetokens mit $0 / M Ausgabetokens. Das jev-latest Alias verweist auf die neueste Version, sodass es aktuell bleibt, während sich die Versionen ändern.

Starten Sie hier: https://aihubmix.com/model/jev-latest

Nächste Schritte:

  1. Erstellen Sie ein AiHubMix-Konto und generieren Sie einen API-Schlüssel
  2. Kopieren Sie die Anfrage aus Schritt 3 und die ask() Funktion aus Schritt 4
  3. Ersetzen Sie state durch einen echten Datensatz aus Ihrer eigenen Warteschlange
  4. Vergleichen Sie das Ergebnis mit dem, wie Sie diesen Datensatz heute klassifizieren

Wenn dieser Leitfaden nützlich war, abonnieren Sie zukünftige Beiträge zu strukturierten Ausgabemodellen und Klassifikationspipelines.