一个裸调 API 的 AI 应用,在 Demo 阶段看起来什么都能答。问题不在于它会答错,而在于答错时和答对时一模一样——语气自信、格式正常,下游没有任何信号可以区分。AI 五阶框架的价值,是把这种“不可见的错误”逐层转化为可门控、可校验、可度量的工程状态。一阶到二阶靠检索与引用,二阶到三阶靠门控与拒答,三阶到四阶靠 Schema 与兜底,四阶到五阶靠持续回归。每一步都不需要换更大的模型,需要的是换一种设计立场:不确定性不是要被掩盖的缺陷,而是要被显式建模的一等数据。
一阶的典型代码是 client.chat.completions.create(...),没有任何外部证据注入。二阶引入 RAG,把模型从“凭记忆生成”切换为“基于材料改写”,幻觉空间被压缩。但二阶有一个隐蔽陷阱:有引用不等于引用正确。模型可能摘了原文,却得出材料并未支持的结论。因此二阶的完成标准不是“接了检索”,而是接了一个轻量的引用核验——要求输出“结论 + 原文片段”,并用规则或第二个模型检查片段是否真正支持结论。
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)的结论一致性。
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 把输出收敛为契约,并在校验失败时走兜底路径,而不是相信模型“这次会按格式来”。
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="输出格式异常,已拦截。")到四阶,格式合规率、字段完整率、来源命中率都变成了可通过断言自动统计的指标,质量从主观感受变成了可执行检查的对象。
五阶最反直觉的一点:它不追求消灭错误。它的目标是把错误从“不可见”变成“可发现、可归因、可收敛”。固定评估集、每次改动跑回归、按类别看指标而非只看总准确率,是五阶的最小骨架。一个五阶系统的准确率可能并不比四阶高多少,但它知道错误集中在哪个类别、从哪次改动开始变差、回滚是否真的有效。
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 删除。