用 Jev 做工单路由:显著减少错派单
TL;DR: 工单路由本质是一道选择题(choice)——“这单该进哪个队列”。Jev 是 TypeSafe AI(typesafe.ai)2026 年 9 月发布的 System One 判断模型(judgment model),专做判断题(judgment)、选择题(choice)、打分题(scoring),不做聊天。一次调用直接返回结构化的
{answer, confidence, rationale}:置信度 0.85 以上自动派单,以下进人工队列。本文给出输入输出定义、架构图和 50 行以内的端到端实现。
路由决策长什么样
写代码之前,先把任务定义收窄:
- 输入:工单主题 + 截断后的正文。够分类即可,不必喂整个会话线程。
- 任务类型:
choice——从固定队列列表里选一个,例如billing(账单)、technical(技术)、account(账号)、other(其他)。 - 输出:结构化结果,不是一段散文。示例数据(example fixture):
{"answer":"billing","confidence":0.94,"rationale":"客户反映被重复扣款并要求退款。"}
三个字段各司其职:answer 决定分支走向,confidence 决定能不能自动化,rationale 是客服接手时直接能读的判据。
为什么判断模型更合适
聊天模型为开放式生成优化,拿它做路由就得解析自由文本、祈祷格式不跑偏。Jev 的任务形态和路由天然对齐。
| 对比维度 | 聊天模型 | Jev(choice 调用) |
|---|---|---|
| 输出形态 | 自由文本,需要自己解析 | 结构化 answer / confidence / rationale |
| 任务框定 | 靠提示词压制闲聊 | 原生选择题 |
| 自动化信号 | 默认没有 | confidence 可直接设阈值 |
| 可解释性 | 不稳定 | 每次决策都附带 rationale |
| 失败方式 | 格式跑偏、答非所问 | 低置信度结果,可转人工 |
架构图
工单到达(主题 + 正文)
|
v
预处理(截断、脱敏、拼接主题与正文)
|
v
Jev choice 调用(经 OpenRouter,typesafe/jev-1.13)
|
v
解析结构化结果 {answer, confidence, rationale}
|
+--> confidence >= 0.85 --> 自动派单到对应队列
|
+--> confidence < 0.85 --> 人工队列,rationale 展示给客服
整条流水线就是四步逻辑加一个阈值分支,没有任何魔法。
最小端到端实现
import os, json, requests
URL = "https://openrouter.ai/api/v1/chat/completions"
# Confirm the exact model slug on the OpenRouter model page.
MODEL = "typesafe/jev-1.13"
QUEUES = ["billing", "technical", "account", "other"]
SYSTEM = ("You are a ticket router. Choose exactly one queue from: "
+ ", ".join(QUEUES) + ".")
def route(subject: str, body: str) -> dict:
resp = requests.post(
URL,
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
json={
"model": MODEL,
"messages": [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": f"Subject: {subject}\n\n{body[:4000]}"},
],
"temperature": 0,
},
timeout=30,
)
resp.raise_for_status()
# 示例数据(example fixture):
# {"answer":"billing","confidence":0.94,"rationale":"..."}
return json.loads(resp.json()["choices"][0]["message"]["content"])
result = route("Refund not received", "I was charged twice this month...")
if result["confidence"] < 0.85 or result["answer"] not in QUEUES:
print("ACTION=human-review", result)
else:
print("ACTION=route queue=", result["answer"], "conf=", result["confidence"])
核心就三步:调用、解析、分支。任何支持 OpenAI 兼容端点的 SDK(JavaScript、Go 等)写法一致,只是 HTTP 客户端不同。官方 API 的端点与字段请以 typesafe.ai 官方文档为准。
参数与阈值建议
| 配置项 | 建议 | 理由 |
|---|---|---|
| 任务类型 | choice | 路由是单选决策,不是 yes/no 也不是打分 |
| 自动派单阈值 | confidence >= 0.85 | 保守起点,用自有误派样本回调 |
| 低置信度路径 | 人工队列 + rationale | 客服能看到模型犹豫的原因 |
| 未知标签 | 按低置信度处理 | answer 不在队列列表里就进人工队列 |
| 正文截断 | 约 4000 字符 | 信号足够,延迟可控 |
三种任务类型的详细区别见 Jev 三原语(three primitives)指南,阈值设计见置信度与兜底(confidence and fallback)指南;邮件路由三团队的实际案例展示了同款配置的生产运行方式。
本文适用版本:Jev 1.13。
FAQ
- 工单路由为什么用 Jev 而不是聊天模型? 路由是选择题,不是对话。Jev 是 System One 判断模型,专做判断、选择、打分,直接返回带置信度的结构化结果,不用从自由文本里抠答案。
- 自动派单的置信度阈值设多少? 建议 0.85 起步:达到就自动派单,低于就连同 rationale 一起进人工队列,再按实际误派样本微调。
- 在 OpenRouter 上调用哪个模型 id? 示例用
typesafe/jev-1.13,端点为https://openrouter.ai/api/v1/chat/completions;上线前在 OpenRouter 模型页确认确切 slug。