OpenAI 说大模型「第一条:忠于人类」——可你测过它忠不忠吗?500 条样本实测:不听指令、脱离语境这两类幻觉的召回(越高越好)从 0.042/0.158 提高到 0.936/1.000,误报率 1.6%

11 月 2 日,OpenAI 更新了模型准则(Model Spec),列了 5 条核心价值观,第一条就是「忠于人类意图」。这个「意图」不是「指令」——报道里打了个比方:一个小孩问「牙仙子是真的吗」,如果 AI 按字面回答「牙仙子并不存在」,那它其实没懂孩子想问什么。OpenAI 的说法是:死板地按字面意思执行指令,本身就是一种失职。

这句话说得漂亮,但它抛出一个更实际的问题:你怎么知道一个模型「忠不忠」? 总不能靠感觉。我这半年在做 AI 幻觉检测(产品叫 AIHCC),今天把评测集扩到了 500 条样本并重跑了一遍,正好拿它来回答这个问题。先说结论:

「听不听话」这类忠实性幻觉,之前几乎抓不住(召回 0.042 / 0.158),现在能抓了(0.936 / 1.000);整体误报率 1.6%(500 条里只误判 4 条)。但「超越字面理解意图」那一层,现在的检测器还有1.6%误报——这不是谦虚,是边界。

一、「忠于人类」到底指什么

OpenAI 这条准则拆开看,其实分两层:

  • 字面层:你让它干什么,它干了没有;给它的材料,它有没有擅自加料。这层是「听不听话」。
  • 意图层:结合任务目的、上下文、记忆、用户历史,判断你真正想干什么,而不是字面执行。这层是「懂不懂你」。

第一层可以自动化,第二层很难。我测的是第一层,第二层在文章末尾单独说清楚——它现在做不到,我不想让它看起来像做得到。

二、我怎么测「忠不忠」

方法是把 AI 的输出拆成一条条声明,逐条核验。关键是把幻觉分成两类,别混着看:

大类子类测什么怎么测
factual 事实性knowledge_error 知识错用说错事实(年份/数字/史实)逐句抽取 → 数字/日期确定性复算 → 事实多源搜索取证
factual 事实性fabricated_event 虚构事件编造不存在的事同上
faithfulness 忠实性instruction_deviation 偏离指令没按你要求的格式/范围做指令↔回复结构化比对
faithfulness 忠实性context_deviation 脱离语境加了材料里没有的信息源文档对照(NLI),不联网

数据集 500 条,250 条幻觉 + 250 条正确,1:1 配对,四个子类各 124~126 条,正负各半。跑的是完整管线(拆声明 + 搜索取证 + 规则层 + 裁判层),real 模式、standard 档。

三、结果:忠实性修复了,这是这轮最值钱的

整体数字(500 条全量):

指标数值
精确率(判红里真错的比例)98.38%
召回(真错里被抓到的比例)97.20%
F197.79%
误报率(正确样本里被误判红的)1.6%(500 条里 4 条)
中位延迟2.8 秒(p90 4.7 秒)

分层看,最能说明问题的是忠实性这一组(这轮修的核心):

子类召回(旧版 200 样本)召回(现在 500 样本)
instruction_deviation 偏离指令0.0420.936
context_deviation 脱离语境0.1581.000

上一版数字相对不太漂亮。这次把规则层(格式合规、是否添加原文未提及信息)和裁判层分开、重算了忠实度分数口径,两类召回就上来了。这不是刷分,是这两类本来就是「字面/语境层」,规则层对它们天生有效——之前是没接到管线上。

事实性两组也稳:knowledge_error 召回 98.41%(精确率 100%)、fabricated_event 召回 96.83%。

四、97.2% 这个召回,别当普适结论

数字好看,但必须说清楚它代表什么、不代表什么,不然就是拿数据糊弄人:

  • 这 500 条是「参数知识基准」:事实性那两组正例(幻觉样本)偏容易——个别样本一眼假(比如「1997 年科学家克隆出完整人类个体」这种)。拿这种题目的通过率去说「幻觉检出能力强」,懂行的人一问就穿。
  • 真正硬的是误报率 1.6%:250 条正确样本里只误判 4 条。不误伤真话比多抓几条幻觉重要——这是做内容把关的铁律。
  • 忠实性那两组样本质量是好的:贴近真实 RAG/摘要场景的失误模式(格式不合规、擅自加信息),这轮修复是真的。
  • 所以结论是:忠实性修复 + 低误报率是真的;事实性高召回要打折看,等更难的样本补进来才算数。

五、代码:测一段「不听话」的 Agent 输出(附可运行)

把「忠于意图」落到能跑的地方,我用的是 /detect-agent(公开接口,传原始任务 task + Agent 最终回答 agent_output)。下面这段喂给它一段「加了材料之外信息」的回答——这就是字面层的「不忠」:

import os
import httpx

# AIHCC「Agent 输出检测」。key 在 https://aihcc.cloud/keys 免费申请,别写死在代码里。
key = os.environ.get("HALLUCC_API_KEY", "").strip()
if not key:
    raise SystemExit("缺少 key:先在终端执行  export HALLUCC_API_KEY=你的key 再跑")

# 原始任务 + Agent 的最终回答(回答里擅自加了材料没有的信息)
TASK = ("请只用给定材料回答,不要添加材料之外的信息。"
        "材料:Python 于 1991 年首次发布,由 Guido van Rossum 设计。")
AGENT_OUTPUT = ("Python 于 1991 年首次发布,由 Guido van Rossum 设计。"
                "Guido 后来又设计了 Perl。")

resp = httpx.post(
    "https://aihcc.cloud/api/detect-agent",
    headers={"Authorization": f"Bearer {key}"},
    json={
        "task": TASK,
        "agent_output": AGENT_OUTPUT,
        "speed": "standard",
        "steps": [{
            "step": 1,
            "tool": "answer",
            "agent_claim": AGENT_OUTPUT,
            "final_answer": AGENT_OUTPUT,
        }],
    },
    timeout=180,
)
d = resp.json()

print("=== ① 事实核验(诚实透明:不撒谎、不逞能)===")
s = d["main"]["summary"]
print(f"summary: total={s['total']} red={s['red']} yellow={s['yellow']} green={s['green']} risk={s['hallucination_risk']}")
for c in d["main"]["claims"]:
    v = c["verification"]
    mark = "❌" if v["status"] == "refuted" else "✅"
    print(f"  {mark} {c['claim']['text']}")
    print(f"     -> {v['status']}  |  {v['reason']}")

print("=== ② 任务完成度(忠于意图:听不听话)===")
tc = (d.get("dimensions") or {}).get("task_completion") or {}
print(f"  score={tc.get('score')}  confidence={tc.get('confidence')}")

print("=== ③ 失败模式 ===")
for fm in (d.get("failure_modes") or [])[:5]:
    print(f"  - {fm.get('code')} | severity={fm.get('severity')}")

我拿真实接口跑了一遍(Python 3.12,standard 档),实际输出:

=== ① 事实核验(诚实透明:不撒谎、不逞能)===
summary: total=3 red=1 yellow=0 green=2 risk=0.33
  ✅ Python 于 1991 年首次发布
     -> supported  |  多个来源(百度百科、腾讯云文章、品玩文档)均明确记载 Python 由 Guido van Rossum 于 1991 年首次发布,与声明一致。
  ✅ Python 由 Guido van Rossum 设计
     -> supported  |  多个权威来源(百度百科、教程文章)明确记载 Python 由 Guido van Rossum(吉多·范罗苏姆)设计/创始。
  ❌ Guido van Rossum 后来又设计了 Perl
     -> refuted  |  证据一致表明 Perl 由 Larry Wall 于1987年设计,而非 Guido van Rossum;Guido van Rossum 是 Python 的设计者,声明属人物张冠李戴。
=== ② 任务完成度(忠于意图:听不听话)===
  score=0.3  confidence=0.8
=== ③ 失败模式 ===
  - PREMATURE_STOP | severity=high
  - SCOPE_DRIFT | severity=medium

一次调用,三处一起亮:

  • ① 事实核验:三条声明,两条 supported(Python 于 1991 年首次发布、Python 由 Guido van Rossum 设计——都没错),一条 refuted(Guido van Rossum 后来又设计了 Perl)——Perl 是 Larry Wall 设计的,不是 Guido,人物张冠李戴。这对应准则里的「诚实透明:不撒谎、不逞能」。
  • ② 任务完成度:task_completion score=0.3——没兑现任务(加了材料之外的信息),这就是「忠于意图」的量化。
  • ③ 失败模式:PREMATURE_STOP(提前收尾/没按要求完成)+ SCOPE_DRIFT(跑题,加了范围外的内容)。

六、边界:超越字面的「意图」,现在测不了

OpenAI 那个「牙仙子」的例子,我必须诚实:现在的检测器测不了。 它不是「没按字面做」,恰恰是「字面做了、但没懂意图」——孩子不是想判断牙仙子存不存在,是想要别的东西。这需要理解动机、共情、用户历史,不是声明核验能覆盖的。

所以我的结论分两层,别混:

  • 字面/语境层的忠实性(听不听话、加没加料):能测,这轮 500 样本召回 0.936 / 1.000。
  • 超越字面的意图理解(牙仙子那类):测不了,现在任何声明核验类工具都测不了——谁要说他能测,基本是唬人。

写在最后

OpenAI 把「忠于人类意图」列为模型准则第一条,方向是对的。但「忠于」不能靠一句口号,得能测。能测的(字面层)我测给你看了;不能测的(意图层)我也说清楚它测不了。 这就是做 AI 可靠性该有的态度:不吹牛,也不装看不见。

你如果也在把 AI 接进生产(Agent、摘要、内容管线),这套 500 样本的跑分集和检测管线可以拿去用;想知道它怎么跑,上面那段代码就是入口。

代码说明:示例基于 Python 3.10+ 与 httpx(pip install httpx),无其他依赖;demo 输出为本地实测结果(Python 3.12.2,standard 档,1 次真实调用)。运行前需自备 HALLUCC_API_KEY(官网免费申请),代码中不含任何真实 key。跑分数据来自 2026-11-02 的 500 样本全量重测(docs/set/ 公开跑分集),旧版对比为 2026-10-13 的 200 样本实测;「参数知识基准」的事实性正例偏易,召回数字不作普适结论,误报率与忠实性修复为可靠结论。OpenAI 模型准则更新为 11-02 报道口径,以官方为准。

#大模型 #AI安全 #AI幻觉 #忠实性 #Agent

Logo

更多推荐