Jak zadzwonić do Jev na AiHubMix: Przewodnik po klasyfikacji strukturalnej

AIHubMix5 min czytania
Jak zadzwonić do Jev na AiHubMix: Przewodnik po klasyfikacji strukturalnej

Krótka odpowiedź: jev-1.13 nie generuje tekstu. Wysyłasz fragment tekstu oraz zestaw nazwanych pytań do https://aihubmix.com/v1/systemone, a otrzymujesz odpowiedzi przypisane do nazw twoich pytań — kategorię, wynik lub prawdopodobieństwo. Nic do przetwarzania. Poniżej znajduje się działające zapytanie, pełny format odpowiedzi oraz jeden błąd projektowy, który cicho wpłynie na twoją dokładność.

Do czego służy Jev

Użyj go, gdy potrzebujesz osądu, a nie akapitu: kierowanie zgłoszeniem wsparcia, ocenianie powagi, flagowanie pilności, kontrolowanie treści. Strona modelu jasno to stwierdza — "Brak generacji tekstu, nic do przetwarzania."

Użyj normalnego modelu czatu, gdy potrzebujesz wyjaśnień, podsumowań lub jakiegokolwiek wyjścia w formie wolnej. Jev nie może ich produkować.

Zanim zaczniesz

  • [ ] Zainstalowany Python 3 (standardowa biblioteka wystarczy)
  • [ ] Konto AiHubMix i klucz API
  • [ ] Klucz wyeksportowany jako AIHUBMIX_API_KEY, nigdy zakodowany na stałe w źródle

Nie potrzebujesz SDK OpenAI, LangChain ani pakietu requests.

Krok 1 — Poznaj punkt końcowy

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

To jest trasa specyficzna dla modelu, nie /v1/chat/completions. Klienci zgodni z OpenAI nie mogą jej wywołać. Użyj zwykłego HTTP.

Krok 2 — Wybierz typy pytań

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

TypUżyj go doTy dostarczasz
choiceWybór jednej kategoriicriteria jako słownik: etykieta → definicja
scoreOcena na uporządkowanej skalicriteria jako lista, najniższa na początku
noulOsąd tak/nienic poza instructions

Krok 3 — Zbuduj zapytanie

state to tekst do oceny. questions to klucze, które wymyślasz; odpowiedź używa tych samych nazw.

payload = {
    "model": "jev-1.13",
    "state": "Cześć, próbuję połączyć moje konto Stripe od 3 dni "
             "i ciągle się nie udaje. Tracę sprzedaż. Proszę o pomoc ASAP.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Który zespół powinien się tym zająć",
            "criteria": {
                "billing":   "Problemy z płatnościami lub subskrypcjami",
                "technical": "Błędy lub problemy z integracją",
                "sales":     "Pytania dotyczące cen lub konta",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "Jak bardzo klient wydaje się sfrustrowany",
            "criteria": [
                "Spokojny, po prostu przedstawia fakty",
                "Sfrustrowany, ale grzeczny",
                "Bardzo zły, mocny język",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "Wiadomość przekazuje pilność lub wrażliwość czasową",
        },
    },
}

Krok 4 — Wyślij to za pomocą standardowej biblioteki

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

Trzymaj konstrukcję zapytania wewnątrz funkcji. Jeśli zbudujesz i wyślesz na poziomie modułu, importowanie pliku ponownie wywoła zapytanie i wyda tokeny.

Krok 5 — Przeczytaj odpowiedzi

Każda odpowiedź przechowuje swoją wartość pod kluczem odpowiadającym jej type, więc jeden dostępnik obejmuje wszystkie trzy:

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

Zweryfikowane wyjście:

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

Krok 6 — Zrozum pełną odpowiedź

Pętla drukująca ukrywa przydatne pola. Surowy JSON dla odpowiedzi score:

{
  "type": "score",
  "score": 1,
  "legend": {"0": "Spokojny, po prostu przedstawia fakty", "1": "Sfrustrowany, ale grzeczny", "2": "Bardzo zły, mocny język"},
  "probabilities": {"0": 0, "1": 1, "2": 0},
  "confidence": 1
}
  • legend mapuje indeks z powrotem do twojego własnego sformułowania — liczba całkowita jest samoprzypisująca, więc nie potrzebujesz tabeli wyszukiwania w swoim kodzie.
  • probabilities daje pełną dystrybucję, przydatną do wykrywania bliskiego remisu.
  • noul nie ma pola confidence. Jego prawdopodobieństwo to sygnał.

Najwyższy poziom zwraca również usage, id, provider (TypeSafe), oraz rozwiązaną wersję backendu typesafe/jev-1.13-20260917.

Błąd, który kosztuje cię dokładność

W powyższym zapytaniu department zwrócił billing z pewnością 0.51. Powtórzenie identycznego zapytania zwróciło tę samą etykietę przy 0.38 — odpowiedź była stabilna, ale podana pewność nie.

Przyczyną jest kryterium, a nie model. billing to "Problemy z płatnościami lub subskrypcjami", a technical to "Błędy lub problemy z integracją." Integracja Stripe, która ciągle się nie udaje, rzeczywiście pasuje do obu. Model zgłaszał niejednoznaczność, która była zapisana w schemacie.

Dwie zasady przed produkcją:

  1. Napisz choice kryteria, które są wzajemnie wykluczające. Jeśli człowiek wahałby się między dwiema etykietami, model również się waha.
  2. Ustal próg pewności i kieruj wyniki o niskiej pewności do kolejki ludzkiej zamiast akceptować je jako decyzje. Model, który przyznaje się do niepewności, jest bardziej wartościowy niż ten, który ją ukrywa.

Lista kontrolna przed uruchomieniem

  • [ ] Klucz załadowany z środowiska lub z pliku w trybie 600, który ignoruje twój VCS
  • [ ] choice kryteria sprawdzone pod kątem nakładania się
  • [ ] Ustalony próg pewności, z alternatywną ścieżką poniżej niego
  • [ ] noul odpowiedzi obsługiwane osobno — nie mają confidence
  • [ ] Nie używane pytania usunięte (3 pytania kosztują 424 tokeny wejściowe; 2 kosztują 355)
  • [ ] Odpowiedzi nie będące 2xx rejestrowane z surowym ciałem

FAQ

Czy mogę użyć SDK OpenAI? Nie. /v1/systemone to nie jest trasa zgodna z OpenAI.

Czy jev może zwrócić zdanie lub podsumowanie? Nie. Odpowiada tylko na zadane pytania, które definiujesz.

Ile pytań na zapytanie? Zweryfikowane testy używały dwóch i trzech. Każde pytanie dodaje tokeny wejściowe i wyjściowe, więc uwzględnij tylko to, na co będziesz działać.

Czy istnieje alias wersji? Strona modelu wymienia alias jev-latest obok jev-1.13. Zablokuj konkretną wersję, jeśli reprodukowalność ma znaczenie.

Ile to kosztuje? Strona modelu publikuje $0.0462 / M tokenów wejściowych i $0 / M tokenów wyjściowych. To są dane dostawcy — potwierdź aktualne ceny przed budżetowaniem.

Jaki jest kontekst okna? Strona modelu jest niespójna: 64K w nagłówku, 32K w tabeli dostawcy. Zweryfikuj na podstawie swojego najdłuższego wejścia, zanim polegasz na którymkolwiek z nich.

Zakres tego przewodnika

Wszystko powyżej zostało zweryfikowane przy trzech rzeczywistych wywołaniach na jednym wejściu. Nie obejmuje opóźnienia, grupowania, przepustowości ani zachowania na wejściach różniących się od przykładu. Dryf pewności to powtórzone obserwacje, a nie zmierzona stopa błędów — powtórz to na własnych danych przed ustaleniem progu.

Rozpocznij pracę z AiHubMix

jev-1.13 jest dostępny przez AiHubMix, a strona modelu zawiera wszystko, do czego odnosił się ten przewodnik: punkt końcowy /v1/systemone, trzy typy pytań z ich formatami criteria, pełne pola odpowiedzi oraz opublikowane ceny $0.0462 / M tokenów wejściowych z $0 / M tokenów wyjściowych. Alias jev-latest odnosi się do najnowszej wersji, więc pozostaje aktualny w miarę zmiany wersji.

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

Następne kroki:

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

Jeśli ten przewodnik był przydatny, subskrybuj, aby otrzymywać przyszłe posty na temat modeli wyjścia strukturalnego i pipeline'ów klasyfikacyjnych.