Jak wywołać Jev na AiHubMix: samouczek klasyfikacji strukturalnej

AIHubMix5 min czytania
Jak wywołać Jev na AiHubMix: samouczek klasyfikacji strukturalnej

Krótka odpowiedź: jev-1.13 nie generuje tekstu. Wysyłasz POST z fragmentem tekstu oraz zestawem nazwanych pytań na adres https://aihubmix.com/v1/systemone, a w odpowiedzi otrzymujesz typowane odpowiedzi kluczowane nazwami Twoich pytań — kategorię, ocenę lub prawdopodobieństwo. Nic nie trzeba parsować. Poniżej znajduje się działające żądanie, pełny format odpowiedzi oraz jeden błąd projektowy, który po cichu obniży dokładność.

Do czego służy Jev

Używaj go, gdy potrzebujesz oceny, a nie akapitu: kierowania zgłoszeń do wsparcia, oceny wagi problemu, oznaczania pilności, moderowania treści. Strona modelu mówi to wprost: „Brak generowania tekstu, nic do parsowania”.

Zamiast tego użyj zwykłego modelu czatu, gdy potrzebujesz wyjaśnień, podsumowań lub jakiegokolwiek wyniku w dowolnej formie. Jev takich wyników nie wygeneruje.

Zanim zaczniesz

  • [ ] Zainstalowany Python 3 (wystarczy biblioteka standardowa)
  • [ ] Konto AiHubMix i klucz API
  • [ ] Klucz wyeksportowany jako AIHUBMIX_API_KEY, nigdy wpisany na sztywno w kodzie źródłowym

Nie potrzebujesz żadnego SDK OpenAI, LangChain ani pakietu requests.

Krok 1 — Poznaj endpoint

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

To trasa dedykowana konkretnemu modelowi, nie /v1/chat/completions. Klienty zgodne z OpenAI nie mogą jej wywołać. Użyj zwykłego HTTP.

Krok 2 — Wybierz typy pytań

Są trzy typy, które możesz swobodnie łączyć w jednym żądaniu:

TypZastosowanieCo podajesz
choiceWybór jednej kategoriicriteria jako słownik: etykieta → definicja
scoreOcena na uporządkowanej skalicriteria jako lista, od najniższej
noulOcena typu tak/nienic poza instructions

Krok 3 — Zbuduj żądanie

state to tekst, który ma zostać oceniony. questions to klucze, które sam nazywasz; odpowiedź używa tych samych nazw.

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

Krok 4 — Wyślij żądanie za pomocą biblioteki standardowej

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

Zamknij budowanie żądania w funkcji. Jeśli budujesz i wysyłasz je na poziomie modułu, samo zaimportowanie pliku ponownie uruchomi wywołanie i zużyje tokeny.

Krok 5 — Odczytaj odpowiedzi

Każda odpowiedź zapisuje wartość pod kluczem odpowiadającym jej type, więc jeden accessor obsługuje wszystkie trzy typy:

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

Zweryfikowany wynik:

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

Krok 6 — Zrozum pełną strukturę odpowiedzi

Pętla wypisująca wyniki ukrywa przydatne pola. Surowy JSON dla odpowiedzi typu 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 mapuje indeks z powrotem na Twoje własne sformułowania — liczba całkowita jest samoopisowa, więc w kodzie nie potrzebujesz żadnej tabeli odnośników.
  • probabilities podaje pełny rozkład, co pomaga wykryć bliski remis.
  • noul nie ma pola confidence. Sygnałem jest jego prawdopodobieństwo.

Na najwyższym poziomie odpowiedź zawiera także usage, id, provider (TypeSafe) oraz rozwiązaną wersję backendu typesafe/jev-1.13-20260917.

Błąd, który obniża dokładność

W powyższym żądaniu department zwrócił billing z pewnością 0,51. Powtórzenie identycznego żądania zwróciło tę samą etykietę z wynikiem 0,38 — odpowiedź była stabilna, ale deklarowana pewność już nie.

Przyczyna leży w kryteriach, a nie w modelu. billing to „Problemy z płatnościami lub subskrypcjami”, a technical to „Błędy lub problemy z integracją”. Integracja Stripe, która ciągle nie działa i jest związana z płatnościami, rzeczywiście pasuje do obu. Model zgłaszał niejednoznaczność, która była zapisana w schemacie.

Dwie zasady przed wdrożeniem produkcyjnym:

  1. Pisz kryteria choice tak, aby się wzajemnie wykluczały. Jeśli człowiek wahałby się między dwiema etykietami, model też będzie się wahał.
  2. Ustal próg pewności i kieruj wyniki o niskiej pewności do kolejki ręcznej, zamiast przyjmować je jako ostateczne decyzje. Model, który przyznaje się do niepewności, jest cenniejszy niż ten, który ją ukrywa.

Lista kontrolna przed uruchomieniem

  • [ ] Klucz wczytany ze zmiennych środowiskowych lub z pliku 600, który system kontroli wersji ignoruje
  • [ ] Kryteria choice sprawdzone pod kątem nakładania się
  • [ ] Próg pewności zdefiniowany, wraz ze ścieżką awaryjną poniżej niego
  • [ ] Odpowiedzi noul obsługiwane osobno — nie zawierają confidence
  • [ ] Nieużywane pytania usunięte (3 pytania kosztowały 424 tokeny wejściowe; 2 kosztowały 355)
  • [ ] Odpowiedzi inne niż 2xx zapisywane w logach wraz z surowym ciałem

Najczęstsze pytania

Czy mogę użyć SDK OpenAI? Nie. /v1/systemone nie jest trasą zgodną z OpenAI.

Czy Jev może zwrócić zdanie lub podsumowanie? Nie. Odpowiada wyłącznie na zdefiniowane przez Ciebie pytania o określonych typach.

Ile pytań można zadać w jednym żądaniu? Zweryfikowane testy używały dwóch i trzech pytań. Każde pytanie zwiększa liczbę tokenów wejściowych i wyjściowych, więc uwzględniaj tylko te, na podstawie których będziesz działać.

Czy istnieje alias wersji? Strona modelu wymienia alias jev-latest obok jev-1.13. Jeśli zależy Ci na powtarzalności, przypnij konkretną wersję.

Ile to kosztuje? Strona modelu podaje $0.0462 / M tokenów wejściowych oraz $0 / M tokenów wyjściowych. Są to dane dostawcy — przed planowaniem budżetu sprawdź aktualny cennik.

Jakie jest okno kontekstu? Strona modelu jest niespójna: w nagłówku podaje 64K, a w tabeli dostawcy 32K. Zweryfikuj na własnym, najdłuższym wejściu, zanim oprzesz się na którejkolwiek z tych wartości.

Zakres tego przewodnika

Wszystko powyżej zweryfikowano za pomocą trzech wywołań na żywo dla jednego wejścia. Nie obejmuje to opóźnień, grupowania żądań, przepustowości ani zachowania na danych innych niż przykład. Dryf pewności to udokumentowana obserwacja, a nie zmierzony wskaźnik błędów — przed ustawieniem progu powtórz ją na własnych danych.

Zacznij korzystać z AiHubMix

jev-1.13 jest dostępny przez AiHubMix, a strona modelu zawiera wszystko, do czego odnosi się ten przewodnik: endpoint /v1/systemone, trzy typy pytań z formatami criteria, pełne pola odpowiedzi oraz opublikowany cennik: $0.0462 / M tokenów wejściowych i $0 / M tokenów wyjściowych. Alias jev-latest wskazuje na najnowsze wydanie, więc pozostaje aktualny wraz ze zmianami wersji.

Zacznij tutaj: https://aihubmix.com/model/jev-latest

Kolejne kroki:

  1. Utwórz konto AiHubMix i wygeneruj klucz API
  2. Skopiuj żądanie z Kroku 3 oraz funkcję ask() z Kroku 4
  3. Zastąp state prawdziwym rekordem z własnej kolejki
  4. Porównaj wynik z tym, jak klasyfikujesz ten rekord obecnie

Jeśli ten przewodnik był przydatny, zasubskrybuj, aby otrzymywać kolejne wpisy o modelach ze strukturalnym wyjściem i potokach klasyfikacji.

Jedna brama do wielu dostawców AI. Stworzona z myślą o produkcji.

Odwiedź AIHubMix