首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AI 五阶:把“不确定性”做成系统的第一等公民

AI 五阶:把“不确定性”做成系统的第一等公民

原创
作者头像
IT大佬 jzit-top
发布于 2026-10-30 17:10:19
发布于 2026-10-30 17:10:19
1290
举报

一个裸调 API 的 AI 应用,在 Demo 阶段看起来什么都能答。问题不在于它会答错,而在于答错时和答对时一模一样——语气自信、格式正常,下游没有任何信号可以区分。AI 五阶框架的价值,是把这种“不可见的错误”逐层转化为可门控、可校验、可度量的工程状态。一阶到二阶靠检索与引用,二阶到三阶靠门控与拒答,三阶到四阶靠 Schema 与兜底,四阶到五阶靠持续回归。每一步都不需要换更大的模型,需要的是换一种设计立场:不确定性不是要被掩盖的缺陷,而是要被显式建模的一等数据。

一阶 → 二阶:从“断言”到“有据”

一阶的典型代码是 client.chat.completions.create(...),没有任何外部证据注入。二阶引入 RAG,把模型从“凭记忆生成”切换为“基于材料改写”,幻觉空间被压缩。但二阶有一个隐蔽陷阱:有引用不等于引用正确。模型可能摘了原文,却得出材料并未支持的结论。因此二阶的完成标准不是“接了检索”,而是接了一个轻量的引用核验——要求输出“结论 + 原文片段”,并用规则或第二个模型检查片段是否真正支持结论。

代码语言:javascript
复制
def grounded_answer(q, retrieve, model):
    docs = retrieve(q, top_k=5)
    raw = model(q, context=docs, instruction="结论 + 原文片段")
    for claim in raw.claims:
        if not any(supports(claim, d.text) for d in docs):
            return {"status": "citation_failed", "reply": "依据核验未通过"}
    return {"status": "ok", "reply": raw, "sources": [d.id for d in docs]}

supports 可以是 NLI 模型、字符级偏移匹配,或带严格提示词的第二个 LLM。二阶的产出物从“一段话”变成了“一段话 + 可检查的证据链”。

二阶 → 三阶:把“不知道”变成显式状态

三阶是质变点。系统不再“尽力回答一切”,而是在证据不足或结论不稳定时主动进入 need_clarify 或 low_consistency 状态。门控信号通常取两类:检索相似度的 top-score,以及两次独立采样(不同 temperature)的结论一致性。

代码语言:javascript
复制
def answer_with_gate(question, retrieve, model, threshold=0.72):
    docs = retrieve(question, top_k=5)
    top = max((d.score for d in docs), default=0.0)
    if top < threshold:
        return {"status": "need_clarify", "reply": "资料里没有明确依据,能补充场景吗?"}
    a, b = model(question, docs, t=0.2), model(question, docs, t=0.7)
    if not same_conclusion(a, b):
        return {"status": "low_consistency", "reply": "存在多种说法,建议人工确认。"}
    return {"status": "ok", "reply": a, "sources": [d.id for d in docs]}

关键在 status 字段:“不确定”不再是一句模糊措辞,而是一个下游程序可以分支处理的状态码。客服系统据此转人工,表单填写据此弹提示,而不是把一句“可能吧”直接交给用户。

三阶 → 四阶:让输出可被程序断言

三阶解决了“该不该答”,四阶解决“答出来的东西下游能不能直接用”。自然语言输出即使带了 status,字段缺失、类型漂移、枚举越界仍然会让集成代码崩溃。四阶用 Pydantic 把输出收敛为契约,并在校验失败时走兜底路径,而不是相信模型“这次会按格式来”。

代码语言:javascript
复制
from pydantic import BaseModel, ValidationError
from typing import Literal

class Answer(BaseModel):
    status: Literal["ok", "need_clarify", "low_consistency"]
    reply: str
    sources: list[str] = []

def safe_answer(q):
    try:
        return Answer(**answer_with_gate(q, retrieve, model))
    except ValidationError:
        return Answer(status="need_clarify", reply="输出格式异常,已拦截。")

到四阶,格式合规率、字段完整率、来源命中率都变成了可通过断言自动统计的指标,质量从主观感受变成了可执行检查的对象。

四阶 → 五阶:承认错误永远存在,但让它可归因

五阶最反直觉的一点:它不追求消灭错误。它的目标是把错误从“不可见”变成“可发现、可归因、可收敛”。固定评估集、每次改动跑回归、按类别看指标而非只看总准确率,是五阶的最小骨架。一个五阶系统的准确率可能并不比四阶高多少,但它知道错误集中在哪个类别、从哪次改动开始变差、回滚是否真的有效。

代码语言:javascript
复制
def regression(eval_set, system):
    by_cat = {}
    for case in eval_set:
        ok = judge(system(case.input), case.expected)
        by_cat.setdefault(case.category, []).append(ok)
    return {c: sum(v)/len(v) for c, v in by_cat.items()}

线上失败样本回流到评估集,下一次回归覆盖它。门控阈值漂移、知识库过期、模型升级带来的行为变化,都能在用户投诉之前被指标捕获。

五阶的本质,是把“自信”从语言风格中一层层剥离:一阶用断言掩盖不确定性,二阶用引用约束它,三阶把它暴露为状态,四阶把它编码为可校验的契约,五阶把它纳入持续运转的度量闭环。一个真正“懂”的系统,恰恰是那个知道自己几斤几两、并且能量出来的系统。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一阶 → 二阶:从“断言”到“有据”
  • 二阶 → 三阶:把“不知道”变成显式状态
  • 三阶 → 四阶:让输出可被程序断言
  • 四阶 → 五阶:承认错误永远存在,但让它可归因
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档