Jev 不再生成文本:用类型化概率构建可控的 AI 决策链路

2026-10-01 26 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

大语言模型通常返回一段文本,而业务系统真正需要的往往只是一个决定:是否放行、风险等级是多少、工单应该分到哪个队列。TypeSafe AI 推出的 Jev 将模型定位在“只做决策”上,不生成自然语言答案,而是返回带类型的结果、概率分数与置信度。对需要稳定接口的后端系统来说,这比解析一段看似合理但格式不确定的文本更接近传统软件组件。

TypeSafe AI 由前 OpenAI 研究员 Diogo Almeida 创立。根据已披露的信息,Jev 可以并行评估输入,并已被集成到 Vercel、Netlify 等平台。不过,公开摘要没有给出完整 API、字段定义或基准数据,因此下面的接口结构属于实践示例,不代表官方协议。

从“生成答案”转向“输出决定”

传统生成式模型常被要求返回 JSON:

{
  "risk": "high",
  "reason": "The request appears suspicious."
}

问题在于,JSON 依然可能只是模型生成的文本。字段会丢失,枚举值可能越界,数值也可能被写成字符串。应用层通常还要增加结构化输出约束、重试和修复逻辑。

Jev 所代表的思路是把输出空间限制为预先声明的决策类型,例如:

  • 布尔值:是否批准退款;
  • 枚举:low | medium | high;
  • 数值区间:风险分数或优先级;
  • 多个并行判断:欺诈风险、合规状态、人工复核需求。

这种模式的价值不只是少了一段解释文字。它改变了系统边界:模型不再扮演聊天机器人,而更像一个带不确定性的分类器或策略节点。调用方可以直接校验类型、设置阈值,并在置信度不足时拒绝自动执行。

概率和置信度必须进入业务逻辑

如果一个模型返回 approve,应用不能只读取这个标签。更稳妥的接口还需要保留候选结果的概率,以及模型对当前判断可靠性的估计。

概率与置信度不应被默认视为同一个概念。可以把概率理解为各候选类别之间的相对分布,而置信度表示当前输出是否值得依赖;但 Jev 对这些字段的精确定义仍应以其正式文档为准。接入前至少要确认:

  1. 概率是否经过校准;
  2. 置信度如何计算,能否跨任务比较;
  3. 多个并行判断是否共享上下文,错误是否相关;
  4. 输入分布变化后,阈值是否仍然有效。

例如,退款系统不应该简单采用“概率最高的类别”。更合理的策略是同时设置业务概率阈值和最低置信度:高置信度且拒绝概率足够高时自动拒绝;其余情况交给人工复核。这样,模型的不确定性就成为工作流的一部分,而不是被藏在一个确定性的标签后面。

一个可运行的类型化决策路由器

下面示例假设 Jev 或类似服务返回一个类型化 JSON。该结构是演示用适配层,并非官方 API。代码不依赖第三方库,可直接保存为 decision_router.py 后运行:

from typing import Literal, TypedDict

Decision = Literal['approve', 'review', 'reject']


class DecisionResult(TypedDict):
    decision: Decision
    probabilities: dict[str, float]
    confidence: float


def route(result: DecisionResult) -> str:
    allowed = {'approve', 'review', 'reject'}
    probabilities = result['probabilities']

    if result['decision'] not in allowed:
        raise ValueError('unknown decision')

    if set(probabilities) != allowed:
        raise ValueError('probability labels do not match the schema')

    if any(value < 0 or value > 1 for value in probabilities.values()):
        raise ValueError('probabilities must be between 0 and 1')

    if abs(sum(probabilities.values()) - 1.0) > 0.02:
        raise ValueError('probabilities must sum to approximately 1')

    confidence = result['confidence']
    if not 0 <= confidence <= 1:
        raise ValueError('confidence must be between 0 and 1')

    winner = max(probabilities, key=probabilities.get)
    if winner != result['decision']:
        raise ValueError('decision does not match the highest probability')

    # 不确定结果永远不直接驱动不可逆操作。
    if confidence < 0.75 or probabilities[winner] < 0.70:
        return 'manual_review'

    return winner


sample: DecisionResult = {
    'decision': 'reject',
    'probabilities': {
        'approve': 0.06,
        'review': 0.12,
        'reject': 0.82,
    },
    'confidence': 0.88,
}

print(route(sample))

运行命令:

python decision_router.py

预期输出为:

reject

接入真实服务时,只需把 sample 替换成 API 响应,并按照官方字段调整适配层。不要跳过本地校验:即使上游承诺类型安全,网络代理、版本变化和错误响应仍可能破坏契约。

如果要并行判断多个条件,还可以让应用层定义一个固定的决策集合,例如 refund_eligible、fraud_risk 和 requires_human_review。并行计算可以减少串行调用带来的延迟,但必须分别记录每个决策的概率、置信度、模型版本和阈值,避免只保存最终动作。

集成快不等于可以直接自动执行

Jev 被集成到 Vercel、Netlify 等平台,说明决策型模型适合嵌入边缘函数、API 路由和部署工作流。与生成长文本相比,固定类型的短输出也天然更容易做缓存、审计和指标统计。不过,“效率更高”仍需要放到具体负载中验证,包括延迟、吞吐量、价格、失败率和模型质量,而不能只比较输出长度。

上线前可以使用以下检查表:

  • 为每个决策声明类型、合法值和默认失败行为;
  • 用历史数据校准概率阈值,不凭直觉设置 0.7 或 0.9;
  • 低置信度结果进入人工队列,而不是自动重试到得到满意答案;
  • 保存输入摘要、完整概率、置信度、模型版本和最终业务动作;
  • 对支付、封禁、医疗、招聘等高风险操作保留人工审批;
  • 监控各类别占比和置信度分布,及时发现数据漂移;
  • 为服务超时、字段缺失和版本不兼容准备降级路径。

决策型模型并不会消除模型错误,它只是让错误更容易被程序识别和约束。Jev 最值得关注的地方,正是把 AI 接口从“请相信这段文字”推进到“这是一个可验证、可设阈值、可以拒绝采用的决定”。


相关推荐