Як викликати Jev на AiHubMix: посібник зі структурованої класифікації

AIHubMix5 хв читання
Як викликати Jev на AiHubMix: посібник зі структурованої класифікації

Коротка відповідь: 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]}")

Розміщуйте побудову запиту всередині функції. Якщо формувати й надсилати запит на рівні модуля, імпорт файлу знову запустить виклик і витратить токени.

Крок 5 — Прочитайте відповіді

Кожна відповідь зберігає значення під ключем, що відповідає її type, тож один accessor працює для всіх трьох типів:

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 — Розберіть повну структуру відповіді

Цикл виводу приховує корисні поля. Ось сирий JSON для відповіді типу 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 зіставляє індекс із вашими власними формулюваннями — ціле число самодостатнє, тож у коді не потрібна таблиця пошуку.
  • probabilities дає повний розподіл, що корисно для виявлення майже нічиєї.
  • noul не має поля confidence. Його сигналом є ймовірність.

На верхньому рівні також повертаються usage, id, provider (TypeSafe) та версія бекенду typesafe/jev-1.13-20260917.

Помилка, яка знижує точність

У запиті вище department повернув billing з упевненістю 0.51. Повторний ідентичний запит повернув ту саму мітку з 0.38 — відповідь була стабільною, а заявлена впевненість — ні.

Причина в критеріях, а не в моделі. billing означає «Проблеми з оплатою або підпискою», а technical — «Помилки або проблеми з інтеграцією». Інтеграція Stripe, яка постійно відмовляє (integration), справді відповідає обом. Модель відобразила неоднозначність, закладену в схему.

Два правила перед продакшеном:

  1. Формулюйте критерії типу choice так, щоб вони взаємно виключали одне одного. Якщо людина вагалася б між двома мітками, вагатиметься і модель.
  2. Встановіть поріг упевненості та направляйте результати з низькою впевненістю в чергу для людини, а не приймайте їх як остаточні рішення. Модель, яка визнає невпевненість, цінніша за ту, що її приховує.

Чеклист перед запуском

  • [ ] Ключ завантажено зі змінних середовища або з файлу з правами 600, який ігнорує ваша VCS
  • [ ] Критерії choice перевірено на перетини
  • [ ] Визначено поріг упевненості з резервним шляхом нижче нього
  • [ ] Відповіді noul обробляються окремо — у них немає confidence
  • [ ] Невикористані запитання видалено (3 запитання коштують 424 вхідні токени; 2 — 355)
  • [ ] Відповіді з кодом, відмінним від 2xx, записуються в журнал разом із сирим тілом

Часті запитання

Чи можна використовувати OpenAI SDK? Ні. /v1/systemone не є маршрутом, сумісним з OpenAI.

Чи може jev повернути речення або резюме? Ні. Він відповідає лише на типізовані запитання, які ви визначили.

Скільки запитань можна надіслати в одному запиті? Перевірені тести використовували два та три запитання. Кожне запитання додає вхідні та вихідні токени, тож включайте лише ті, за якими будете діяти.

Чи є псевдонім версії? На сторінці моделі поряд із jev-1.13 вказано псевдонім jev-latest. Закріпіть явну версію, якщо важлива відтворюваність.

Скільки це коштує? На сторінці моделі опубліковано $0.0462 / M за вхідні токени та $0 / M за вихідні токени. Це дані постачальника — перед плануванням бюджету уточніть поточні ціни.

Яке у неї контекстне вікно? Сторінка моделі суперечлива: 64K у заголовку та 32K у таблиці постачальників. Перевірте на власному найдовшому вхідному тексті, перш ніж покладатися на будь-яке з цих значень.

Межі цього посібника

Усе вище перевірено трьома живими викликами на одному вхідному тексті. Посібник не охоплює затримку, пакетну обробку, пропускну здатність або поведінку на вхідних даних, відмінних від прикладу. Дрейф упевненості — відтворене спостереження, а не виміряна частота помилок; відтворіть його на власних даних, перш ніж встановлювати поріг.

Почніть роботу з AiHubMix

jev-1.13 доступна через AiHubMix, а сторінка моделі містить усе, на що посилався цей посібник: ендпоінт /v1/systemone, три типи запитань із форматами criteria, повні поля відповіді та опубліковану ціну $0.0462 / M за вхідні токени та $0 / M за вихідні токени. Псевдонім jev-latest вказує на найновіший випуск, тож залишається актуальним у міру виходу нових версій.

Почніть тут: https://aihubmix.com/model/jev-latest

Наступні кроки:

  1. Створіть обліковий запис AiHubMix і згенеруйте API-ключ
  2. Скопіюйте запит із Кроку 3 та функцію ask() з Кроку 4
  3. Замініть state реальним записом зі своєї черги
  4. Порівняйте результат із тим, як ви класифікуєте цей запис сьогодні

Якщо цей посібник був корисним, підпишіться, щоб отримувати майбутні публікації про моделі зі структурованим виводом і конвеєри класифікації.

Один шлюз до багатьох провайдерів ШІ. Створено для продакшену.

Перейти на AIHubMix