如何在 AiHubMix 上调用 Jev:结构化分类教程

推理时代阅读约 5 分钟
如何在 AiHubMix 上调用 Jev:结构化分类教程

简短回答: jev-1.13 不生成文本。你需要向 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 步:理解完整的响应结构

打印循环隐藏了一些有用的字段。下面是一个 score 答案的原始 JSON:

{
  "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 ——答案是稳定的,而所声明的确定性并不稳定。

问题出在 criteria 上,而不是模型。billing 的定义是“付款或订阅问题”,technical 的定义是“漏洞或集成问题”。一个集成 且持续失败的 Stripe 问题确实同时符合两者。模型只是在反映写入模式中的歧义。

投入生产前的两条规则:

  1. 编写 choice 类型的 criteria 时应保证互斥。如果人在两个标签之间会犹豫,模型也会犹豫。
  2. 设定一个置信度阈值,并将低置信度的结果转交人工队列处理,而不是直接接受为最终决定。一个坦承不确定性的模型,比一个隐藏不确定性的模型更有价值。

上线前检查清单

  • [ ] 密钥从环境变量或版本控制系统忽略的 600 权限文件中加载
  • [ ] 已检查 choice 类型 criteria 是否存在重叠
  • [ ] 已定义置信度阈值,并为低于阈值的情况设置备用流程
  • [ ] 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 步中的请求以及第 4 步中的 ask() 函数
  3. 用你自己队列中的真实记录替换 state
  4. 将结果与你目前对该记录的分类方式进行比较

如果本指南对你有帮助,欢迎订阅,获取更多关于结构化输出模型和分类流水线的文章。

一个网关接入多家 AI 服务商, 为生产环境而生。

访问推理时代官网