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

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

Коротка відповідь: jev-1.13 не генерує текст. Ви надсилаєте частину тексту разом із набором названих запитань на https://aihubmix.com/v1/systemone, і отримуєте надруковані відповіді, прив'язані до назв ваших запитань — категорія, оцінка або ймовірність. Нічого парсити. Нижче наведено робочий запит, повний формат відповіді та одна дизайнерська помилка, яка тихо позначиться на вашій точності.

Для чого потрібен Jev

Використовуйте його, коли вам потрібен судження, а не абзац: маршрутизація запиту на підтримку, оцінка серйозності, позначення терміновості, обмеження контенту. Сторінка моделі чітко зазначає — "Без генерації тексту, нічого парсити."

Використовуйте звичайну модель чату, коли вам потрібні пояснення, резюме або будь-який вільний вихід. Jev не може їх виробляти.

Перед початком

  • [ ] Встановлений Python 3 (стандартної бібліотеки достатньо)
  • [ ] Обліковий запис AiHubMix та API-ключ
  • [ ] Ключ експортовано як AIHUBMIX_API_KEY, ніколи не закодований у джерелі

Вам не потрібен SDK OpenAI, 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": "Привіт, я намагався підключити свій обліковий запис Stripe протягом 3 днів "
             "і це постійно не вдається. Я втрачаю продажі. Будь ласка, допоможіть терміново.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Яка команда повинна займатися цим",
            "criteria": {
                "billing":   "Проблеми з оплатою або підпискою",
                "technical": "Помилки або проблеми з інтеграцією",
                "sales":     "Питання щодо ціни або облікового запису",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "Наскільки розчарованим виглядає клієнт",
            "criteria": [
                "Спокійний, просто викладає факти",
                "Розчарований, але ввічливий",
                "Дуже сердитий, сильна лексика",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "Повідомлення передає терміновість або чутливість до часу",
        },
    },
}

Крок 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, тому один доступник охоплює всі три:

data = ask(payload)
for name, ans in data["answers"].items():
    kind = ans["type"]
    print(name, kind, ans[kind], ans.get("confidence"))
print("використання:", data.get("usage"))

Перевірений вихід:

department   choice  billing   0.51
frustration  score   1         1
is_urgent    noul    1         None
використання: {'input_tokens': 424, 'output_tokens': 73}

Крок 6 — Зрозумійте повний обсяг

Цикл друку приховує корисні поля. Сирий JSON для відповіді score:

{
  "type": "score",
  "score": 1,
  "legend": {"0": "Спокійний, просто викладає факти", "1": "Розчарований, але ввічливий", "2": "Дуже сердитий, сильна лексика"},
  "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, яка постійно не вдається, дійсно відповідає обом. Модель повідомляла про неоднозначність, яка була закладена в схему.

Два правила перед виробництвом:

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

Перевірочний список перед запуском

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

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

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

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

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

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

Скільки це коштує? Сторінка моделі публікує $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. Порівняйте результат з тим, як ви класифікуєте цей запис сьогодні

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