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

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

简短回答: 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": "嗨,我已经尝试连接我的 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("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": "冷静,只是在陈述事实", "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. 设置置信度阈值,并将低置信度结果路由到人工队列,而不是接受它们作为决策。一个承认不确定性的模型比一个隐藏不确定性的模型更有价值。

发布前检查清单

  • [ ] 从环境或您的 VCS 忽略的 600 模式文件加载密钥
  • [ ] 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 中的请求和步骤 4 中的 ask() 函数
  3. 用您自己队列中的真实记录替换 state
  4. 将结果与您今天对该记录的分类进行比较

如果本指南对您有帮助,请订阅以获取未来关于结构化输出模型和分类管道的帖子。