Как вызвать 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, который игнорирует ваша система контроля версий
  • [ ] choice критерии проверены на перекрытие
  • [ ] Определен порог уверенности с резервным путем ниже него
  • [ ] noul ответы обрабатываются отдельно — они не имеют confidence
  • [ ] Неиспользуемые вопросы удалены (3 вопроса стоят 424 входящих токена; 2 стоят 355)
  • [ ] Не 2xx ответы записываются с сырым телом

Часто задаваемые вопросы

Могу ли я использовать 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. Сравните результат с тем, как вы классифицируете эту запись сегодня

Если это руководство было полезным, подписывайтесь на будущие посты о моделях структурированного вывода и классификационных пайплайнах.