让它替你回答「这单是哪里坏了」——而且告诉你它有多确定
Jev 不是 ChatGPT 那种「写字的 AI」。它是一个判卷老师:你把工单(一份材料)递给它,再把一张你预先印好的答题卡(几个分类选项)也递给它,它不写一个字的作文,只在答题卡上涂概率:
因为不写字、只涂卡,「编造一个不存在的选项」「输出一段没法解析的话」这类错误在构造上就不存在——答题卡是你印的,它只能在你的选项里涂。
术语:Jev 是 TypeSafe AI 的 System One 模型,RLCD 训练,70–500ms 出结果,输入 $0.042/M token、输出免费
| LLM(写作文) | Jev(涂答题卡) | |
|---|---|---|
| 工作方式 | 逐字生成文本 | 在固定选项上算概率 |
| 结构化错误 | 0.58%–45.5% | 0%(构造上不可能) |
| 置信度 | 过度自信、忽高忽低 | 校准的:说 90% 把握的那批,实际命中率≈90% |
| 速度 | 3s–329s | 70–500ms |
| 单价 | $0.2–10 / M tok | $0.042 / M tok,输出免费 |
「校准」是关键卖点:普通 LLM 你问「有几分把握」,它八成回答 99%。Jev 的训练目标(RLCD)就是让置信度和真实命中率对齐——这意味着置信度第一次变成了可用的生产参数,而不只是心理安慰。
① state(材料):工单的证据文本——故障现象描述、错误代码、已换过的备件、机型。直接贴原文,不需要清洗措辞,错别字、行话、中英夹杂都行(下文实测)。
② questions(答题卡):你定义的分类体系,三种题型——
| 题型 | 问什么 | 返回什么 |
|---|---|---|
choice | 多选一(最多 255 项) | 选中项 + 全选项概率分布 + 置信度 |
noul | 是非题 | 0–1 的「是」概率 |
score | 按等级打分(2–10 档) | 概率加权分数 + 各档概率 + 置信度 |
{
"state": "客户报修天吊DR,开机自检报错…(工单证据)",
"model": "jev-latest",
"questions": {
"failure_mode": {
"type": "choice",
"instructions": "判断最可能的故障子系统",
"criteria": {
"detector": "平板探测器坏点/伪影/校准失败/图像异常",
"hv_generator": "高压发生器/高压油箱打火/曝光错误",
"tube": "球管漏油/真空下降/阳极噪声",
"software": "软件报错/升级引起/回滚后恢复",
"mechanical": "机械/运动轴/限位/刹车",
"other": "以上都不符合或证据不足"
}
},
"needs_escalation": { "type": "noul", "instructions": "需升级研发" },
"severity": { "type": "score", "criteria": ["可继续用","受限","无法出图","停机"] }
}
}
{
"answers": {
"failure_mode": {
"choice": "detector", "confidence": 0.69,
"probabilities": { "detector": 0.77, "software": 0.23, … }
},
"needs_escalation": { "noul": 0.29 },
"severity": { "score": 1.6, "confidence": 0.78, … }
},
"usage": { "input_tokens": 402, "output_tokens": 70 }
}
三个问题一次调用全部返回——问题是并行评估的,多加问题几乎不加时间。这不是「问三遍 API」,是「一张答题卡涂三道题」。
用 X 光机售后工单风格的输入实测(结果均为 API 真实返回):
| 输入(黑话/混合) | 判定 | 置信度 |
|---|---|---|
| 「设备无法出图,现场看是平板坏了,换了块新的就好」 | detector | 1.0 |
| 「客户反映球馆漏油」(球管的同音错字) | tube | 0.99 |
| 「工程师说检测器有坏点,图像有黑斑」 | detector | 1.0 |
| 「怀疑高压油箱有问题,绝缘阻值偏低」 | hv_generator | 1.0 |
| 中文主体 + 英文错误码 + 德文工程师备注 的长工单 | detector | 0.99 |
「球馆漏油」这关最说明问题:字面是错的,它靠「漏油」+语境推出了球管。50 个工程师 50 种写法的实体归一化问题,语义模型直接吃掉。
工程实践
一个关键细节:这 4 条全对,部分功劳在 criteria 描述里预埋了这些别名(平板/检测器/高压油箱都写进了对应选项的描述)。别号表的正确用法不是写匹配规则,而是写进选项描述。| # | 策略 | 为什么省 |
|---|---|---|
| 1 | 只放证据字段:现象描述、错误码、换件记录。扔掉工单号/客户名/地址/日期 | 无分类价值的字段是纯浪费,还泄露隐私 |
| 2 | 问题批量化:分类+升级+严重度一次调用问完 | 官方 cookbook:13 问合 1 比逐问便宜 12.2×、快 10× |
| 3 | 准则写短写准:每类一句判定证据,不写作文 | questions 也在输入 token 里,白话冗长 = 白烧钱 |
| 4 | 分层分类:先 6–10 大类一轮,长尾再二轮细分 | 255 选项一次塞满 = 每条工单都为所有选项付 token |
| 5 | 别预提取:工单原文直进,不先过一道 LLM 压缩 | 省一道模型钱 + 少一个出错环节(A/B 实测后定) |
成本量级感受:10000 条 × 2000 token = 2000 万 token ≈ $0.84。全量重跑一遍不到 6 块钱——迭代分类体系不用心疼。
import json, urllib.request, os
key = os.environ["TYPESAFE_API_KEY"] # 或从 ~/.hermes/.env 读
def classify(order_text: str) -> dict:
body = {
"state": order_text, # 脱敏后的工单证据
"model": "jev-latest",
"questions": {
"failure_mode": {
"type": "choice",
"instructions": "判断最可能的故障子系统",
"criteria": CRITERIA, # 你定义的分类体系
},
"needs_escalation": {
"type": "noul",
"instructions": "安全问题或重复维修未解决,需升级研发",
},
},
}
req = urllib.request.Request(
"https://api.typesafe.ai/v1/systemone",
data=json.dumps(body).encode(),
headers={"Authorization": f"Bearer {key}",
"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=60) as r:
return json.load(r)
result = classify("客户报修天吊DR,探测器校准失败……")
print(result["answers"]["failure_mode"]["choice"]) # detector
print(result["answers"]["failure_mode"]["confidence"]) # 0.69
429/529 时指数退避重试;端点只有一个,没有别的 API 面
CREATE TABLE jev_classifications (
order_id TEXT, -- 工单号
failure_mode TEXT, -- choice 结果(选项 id)
probabilities JSONB, -- 全选项概率分布(整存!)
confidence REAL, -- 置信度
needs_escalation REAL, -- noul 概率
severity_score REAL, -- score 分
input_tokens INT,
created_at TIMESTAMPTZ DEFAULT now()
);
铁律
概率数字 100% 来自模型/SQL 聚合,LLM 只做语义层。Jev 输出的是选择和概率,恰好不越界——分类进 Jev,故障树概率统计进 SQL,各管各的。SELECT 故障现象, COUNT(*) GROUP BY 1 ORDER BY 2 DESC → Top 20详细 playbook 见知识库《Jev工单分类-实施流程与成功关键》
LLM 是会写字的实习生,写的字要人检查;
Jev 是只涂卡的质检员,涂的卡自带诚实的把握。
决策交给涂卡的,语言留给写字的。