Как да извикате 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, така че един достъп покрива и трите типа:

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, която продължава да се проваля, наистина отговаря и на двата. Моделът отразяваше неяснота, която беше вградена в схемата.

Две правила преди продукционна среда:

  1. Пишете критерии от типа choice, които се изключват взаимно. Ако човек би се колебал между два етикета, моделът също ще се колебае.
  2. Задайте праг на увереност и насочвайте резултатите с ниска увереност към опашка за преглед от човек, вместо да ги приемате като решения. Модел, който признава несигурност, е по-ценен от този, който я скрива.

Контролен списък преди пускане

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

Често задавани въпроси

Мога ли да използвам OpenAI SDK? Не. /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. Сравнете резултата с това, как класифицирате този запис в момента

Ако това ръководство ви беше полезно, абонирайте се за бъдещи публикации за модели със структуриран изход и класификационни конвейери.

Един шлюз към множество AI доставчици. Създаден за продукционна среда.

Посетете AIHubMix