版权与内容来源声明
本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式,也不对任何收益结果作承诺。转载请注明出处。
一、先看现场:检索一条没命中,它照样编了一段合格答案
周一上午十点,客服在群里贴了一张截图。用户问「R9 路由器的并发上限是多少」,回答是:型号对得上,数字带单位,后面跟了一句「如果并发接近这个值,建议在网关侧开启限流」,还分了三点。整段读下来没有任何可疑的地方,读起来像从产品手册里摘的。
实际情况是:索引里关于 R9 只有一份安装说明,通篇没有出现过「并发」两个字。检索确实返回了这一条,top1 相似度 0.31。当时系统里没有阈值这个概念,0.31 就被当成「找到了」。
模型没有说「文档里没有」。它按文档的语气写了一段,数字填的是 512,单位是「个连接」,和它见过的同类设备参数长得一样。这段答案后来被复制进了客户工单,两天后才有人发现原始文档里根本没这个数。
1.1 格式合格才是最坏的伪装
乱码会被当场发现,格式合格的答案不会。一段有型号、有数字、有单位、有建议的回答,读者的第一反应是「查到了」,而不是「它是不是编的」。幻觉真正造成损失的那一步,不是生成,是被当成事实使用。
这也是拒答这件事难做的原因:它要对抗的不是模型的错误,而是人对「通顺」的默认信任。
1.2 四道闸门不是并列的四件事
很多团队做拒答,是把几件事并列着做:加一句「不确定就说不确定」的提示词,设一个相似度阈值,再加一个「答案要点引用」的要求。三件事都做了,效果仍然不稳定,因为它们是流水线,不是清单。
顺序是这样的:第一道先确认「库里到底有没有」,把「根本没有」的那批挡在外面;第二道再看「答案有没有用上检索到的内容」,把「块对了但答案自己编」的挡在外面;第三道比对「同一问题两次答案的实体是否一致」,把「单条看不出、换个问法就变」的挡在外面;第四道才轮到话术,决定被拦下来的请求以什么形式交还给用户。
后一道的前提,是前一道已经清掉了某一类错误。第一道不拦,后面三道全部失效——因为支撑和一致性检查的都是「答案与检索块的关系」,当块本身无关时,它们会反过来给出「一致」「有支撑」的假阳性。下面按这个顺序拆。
二、第一道:检索分数闸门——拦的是「库里根本没有」
这道闸门是唯一能拦「库里没有」的闸门,而「库里没有」恰恰是幻觉最主要的来源。它的判据只有一个:检索分数低于阈值,就不许生成。
阈值该定在哪,不能凭感觉。下面这段脚本用 numpy 造两类分数分布——一类是库里真有答案的,一类是库里没有的——让它们刻意重叠,然后扫一遍阈值看两类错误怎么换。
🧪 实测环境:Python 3.13.12 / macOS / numpy 2.5.4,固定随机种子 20261028,无计时函数
"""实验 A:检索分数阈值扫描 —— 误拒、误答与转人工量,固定种子可复现。"""importnumpyasnp rng=np.random.default_rng(20261028)N=2000# 可答:库里真有答案,分数偏高;不可答:库里没有,分数偏低。两簇刻意重叠。has=np.clip(rng.normal(0.62,0.14,N),0.0,1.0)none=np.clip(rng.normal(0.38,0.13,N),0.0,1.0)print(f"可答样本{N}条,分数{has.min():.3f}~{has.max():.3f},均值{has.mean():.3f}")print(f"不可答样本{N}条,分数{none.min():.3f}~{none.max():.3f},均值{none.mean():.3f}")print(f"两簇重叠区:可答里低于 0.45 的有{(has<0.45).sum()}条;"f"不可答里高于 0.45 的有{(none>=0.45).sum()}条")print()print("阈值 误拒(条) 误答(条) 转人工(条)")print("---- -------- -------- ----------")ths=np.round(np.arange(0.10,0.901,0.05),2)rows=[]fortinths:miss=int((has<t).sum())# 该答被拒wrong=int((none>=t).sum())# 该拒被答human=int((has<t).sum()+(none<t).sum())rows.append((t,miss,wrong,human))print(f"{t:.2f}{miss:>8}{wrong:>8}{human:>10}")print()print("按代价比选阈值(总代价 = 误答代价×误答条数 + 误拒代价×误拒条数)")print("代价比 最优阈值 误拒(条) 误答(条) 总代价(以误拒为 1 计)")print("------ -------- -------- -------- ----------------------")forratioin(1,5,20):best=min(rows,key=lambdar:ratio*r[2]+r[1])t,miss,wrong,_=bestprint(f"{ratio:>4}:1{t:>8.2f}{miss:>8}{wrong:>8}{ratio*wrong+miss:>22}")真实输出(原样贴出):
可答样本 2000 条,分数 0.051~1.000,均值 0.620 不可答样本 2000 条,分数 0.000~0.764,均值 0.382 两簇重叠区:可答里低于 0.45 的有 226 条;不可答里高于 0.45 的有 588 条 阈值 误拒(条) 误答(条) 转人工(条) ---- -------- -------- ---------- 0.10 1 1977 24 0.15 1 1942 59 0.20 4 1855 149 0.25 8 1684 324 0.30 18 1467 551 0.35 40 1187 853 0.40 114 894 1220 0.45 226 588 1638 0.50 384 349 2035 0.55 607 187 2420 0.60 873 89 2784 0.65 1159 42 3117 0.70 1446 14 3432 0.75 1664 3 3661 0.80 1816 0 3816 0.85 1901 0 3901 0.90 1956 0 3956 按代价比选阈值(总代价 = 误答代价×误答条数 + 误拒代价×误拒条数) 代价比 最优阈值 误拒(条) 误答(条) 总代价(以误拒为 1 计) ------ -------- -------- -------- ---------------------- 1:1 0.50 384 349 733 5:1 0.60 873 89 1318 20:1 0.75 1664 3 17242.1 读这张表:阈值一动,两边同时疼
0.10 那一行是最该被看见的:2000 条「库里没有」的请求里,1977 条被直接答了。没有这道闸门时,系统的默认行为就是「几乎全答」,因为检索永远会返回一个 top1,哪怕它只有 0.05 分。0.90 那一行是另一个极端:1956 条该答的被拒,转人工 3956 条——等于把整个问答退化成人工客服。
中间没有一个「两全」的点。0.45 时误拒 226 条、误答 588 条,这两个数在 2000 的样本里分别是 11% 和 29% 左右,谁也吃不掉谁。原因是结构性的:两类分数分布重叠,0.45 附近可答的 226 条和不可答的 588 条挤在同一个区间里,靠分数分不开。
所以阈值不是按「分数看起来低不低」定的,是按两类错误各自的代价定的。
2.2 代价比换一次,阈值要挪 0.25
同一个脚本只改一行系数,最优阈值就从 0.50 挪到 0.60 再到 0.75:
| 误答代价 : 误拒代价 | 最优阈值 | 误拒条数 | 误答条数 | 总代价(以误拒为 1 计) |
|---|---|---|---|---|
| 1 : 1 | 0.50 | 384 | 349 | 733 |
| 5 : 1 | 0.60 | 873 | 89 | 1318 |
| 20 : 1 | 0.75 | 1664 | 3 | 1724 |
这张表真正想说的是代价换到了哪里:从 1:1 走到 20:1,误答从 349 条压到 3 条,代价是误拒从 384 条涨到 1664 条——多拒了 1280 条本该能答的问题。如果排队接这些转人工请求的只有一个客服,这个阈值定得再"正确"也没法落地。
落地动作只有一句:把「一条误答赔多少、一条误拒多花多少人工」写成一行算式,让业务方签字,然后这个数字才能变成配置里的阈值。没有人签字的阈值,一定会在第一次投诉时被随手改掉。
2.3 转人工是这道闸门的另一半
表里还有一列容易被忽略:转人工条数。阈值 0.50 时是 2035 条,超过样本总量的一半。这个数必须提前想清楚——阈值以下不是「丢弃」,是「换个通道」。如果下游没有人接,这道闸门的实际效果就是把 2035 个问题变成 2035 条「抱歉」,那和直接答错相比,只是把错误从内容层挪到了体验层。
还有一条不能抄:不同 embedding 模型、不同归一化方式、不同切块长度下,同一个 0.5 不是同一个东西。别人项目里验过的 0.72,搬到你的索引上可能刚好落在两簇重叠最厉害的位置。阈值必须在你自己的索引上重新标定,标定样本至少覆盖「有答案」和「没答案」两类各 100 条以上。
三、第二道:支撑闸门——拦的是「检索到了但答案没用到」
第一道放行之后,进来的请求有一个共同点:检索块确实和问题相关。但相关不等于被用上。模型完全可能读了一条相关文档,然后用自己的记忆补出一段——块是对的,答案是编的,这类错误第一道闸门一条也拦不住。
第二道闸门要回答的问题很朴素:答案里的这句话,能不能在检索块里找到出处。
🧪 实测环境:Python 3.13.12 / macOS / 仅标准库 random,固定随机种子 20261028
"""实验 B:支撑闸门 —— 用字符二元组重叠度判断「答案句能否在检索块里找到出处」。"""importrandom random.seed(20261028)MODELS=["Q7","Q9","K3","K5","R9","R2"]LABEL=["官方续航","量程","并发上限"]UNIT=["公里","帕","个连接"]TAIL=["快充 30 分钟补到八成","精度正负百分之一","默认空口速率 1200 兆"]defgrams(s):s="".join(cforcinsifc.strip())return{s[i:i+2]foriinrange(len(s)-1)}defsupport(ans,block):a=grams(ans)returnlen(a&grams(block))/len(a)ifaelse0.0PARA=[("官方续航","标称续航"),("快充","快速充电"),("补到八成","充至八成"),("量程","测量范围"),("精度正负百分之一","误差约百分之一"),("并发上限","最大并发数"),("默认空口速率","空口速率默认")]defpara(s):fora,binPARA:s=s.replace(a,b)returns grd,un_num,un_topic,un_free=[],[],[],[]foriinrange(300):j,m=i%3,MODELS[i%6]a=random.randint(100*(j+1),300*(j+3))block=f"{m}{LABEL[j]}{a}{UNIT[j]},{TAIL[j]}"grd.append((block,para(block)))un_num.append((block,block.replace(str(a),str(a+140))))un_topic.append((block,para(block.replace(str(a),str(a+140)))+",建议按此选型"))un_free.append((block,"建议采购前与厂商确认接口兼容性,必要时安排一次联调"))defsc(pairs):return[support(ans,blk)forblk,ansinpairs]s_grd,s_num,s_topic,s_free=sc(grd),sc(un_num),sc(un_topic),sc(un_free)print("各类答案与检索块的支撑分(字符二元组重叠占比,300 条/类)")forname,sin(("有支撑·转述真答案",s_grd),("无支撑·照抄只换数字",s_num),("无支撑·转述但事实错",s_topic),("无支撑·完全不引用块",s_free)):print(f"{name}均值{sum(s)/len(s):.3f}最低{min(s):.3f}最高{max(s):.3f}")print()print("支撑阈值 拦掉无支撑 (换数字/转述错/不引用) 误伤有支撑 净拦")print("-------- ---------- ----------------------- ---------- ----")best_t,best_net,best_hit,best_hurt=0.0,-1,0,0forkinrange(13):t=round(0.05*k,2)cn=sum(1forsins_numifs<t)ct=sum(1forsins_topicifs<t)cf=sum(1forsins_freeifs<t)hit=cn+ct+cf hurt=sum(1forsins_grdifs<t)ifhit-hurt>best_net:best_t,best_net,best_hit,best_hurt=t,hit-hurt,hit,hurtprint(f"{t:>8.2f}{hit:>10}({cn:>3}/{ct:>3}/{cf:>3}){hurt:>10}{hit-hurt:>4}")print()print(f"净拦峰值在阈值{best_t:.2f}:拦掉{best_hit}条、误伤{best_hurt}条、净得{best_net}条")print(f"再抬到 0.60:拦掉多{300+300-best_hit}条,误伤多 "f"{sum(1forsins_grdifs<0.60)-best_hurt}条,净得反而降到 "f"{600-sum(1forsins_grdifs<0.60)}条")print(f"「照抄只换数字」支撑分最低{min(s_num):.3f},高于全部真答案的最高分{max(s_grd):.3f},"f"全表从未被拦下")真实输出(原样贴出):
各类答案与检索块的支撑分(字符二元组重叠占比,300 条/类) 有支撑·转述真答案 均值 0.571 最低 0.438 最高 0.680 无支撑·照抄只换数字 均值 0.849 最低 0.765 最高 0.955 无支撑·转述但事实错 均值 0.343 最低 0.240 最高 0.469 无支撑·完全不引用块 均值 0.000 最低 0.000 最高 0.000 支撑阈值 拦掉无支撑 (换数字/转述错/不引用) 误伤有支撑 净拦 -------- ---------- ----------------------- ---------- ---- 0.00 0 ( 0/ 0/ 0) 0 0 0.05 300 ( 0/ 0/300) 0 300 0.10 300 ( 0/ 0/300) 0 300 0.15 300 ( 0/ 0/300) 0 300 0.20 300 ( 0/ 0/300) 0 300 0.25 336 ( 0/ 36/300) 0 336 0.30 400 ( 0/100/300) 0 400 0.35 496 ( 0/196/300) 0 496 0.40 500 ( 0/200/300) 0 500 0.45 534 ( 0/234/300) 1 533 0.50 600 ( 0/300/300) 78 522 0.55 600 ( 0/300/300) 101 499 0.60 600 ( 0/300/300) 200 400 净拦峰值在阈值 0.45:拦掉 534 条、误伤 1 条、净得 533 条 再抬到 0.60:拦掉多 66 条,误伤多 199 条,净得反而降到 400 条 「照抄只换数字」支撑分最低 0.765,高于全部真答案的最高分 0.680,全表从未被拦下3.1 这道闸门的上限,藏在最后一行
最后一行是整篇最关键的数字:「照抄只换数字」这一类的支撑分最低 0.765,高于全部真答案的最高分 0.680。也就是说,最该被拦的那一类,拿到的是全表最高的分——闸门不但拦不住它,还会给它盖章放行。
原因不难理解。真答案是转述的:把「官方续航」说成「标称续航」,把「补到八成」说成「充至八成」,措辞一变,二元组就对不上,重叠分掉到 0.438~0.680。而「照抄句子换掉一个数字」的答案,除了那个数字,其余措辞与检索块逐字相同,重叠分反而冲到 0.849。越像幻觉的答案,字面上越像原文。
| 答案类型 | 支撑分均值 | 区间 | 这道闸门能否拦下 |
|---|---|---|---|
| 有支撑·转述真答案 | 0.571 | 0.438 ~ 0.680 | ——(不该拦) |
| 无支撑·照抄只换数字 | 0.849 | 0.765 ~ 0.955 | 拦不下,分数全场最高 |
| 无支撑·转述但事实错 | 0.343 | 0.240 ~ 0.469 | 与真答案下沿重叠,提阈值会连真答案一起拦 |
| 无支撑·完全不引用块 | 0.000 | 0.000 | 低阈值即可拦干净 |
3.2 净拦峰值之后,每一个百分点都是拿真答案换的
阈值从 0.45 抬到 0.60,拦掉的多 66 条,误伤多 199 条,净得从 533 掉到 400。这道闸门单独用,最优工作点在 0.45 附近,也就到此为止了。
它能提供的价值,其实只有「完全不引用块」这一类——阈值 0.05 就已经拦干净了 300 条。剩下的部分是在用真答案换假答案,而且换得越来越亏。
所以这道闸门的落地动作要收窄:它只做兜底,负责「整段没引用」这种情况;不要指望它抓数字错误。数字对不对,得靠字段级校验——把答案里的数字、型号、日期抽出来,逐条回检索块里做精确匹配,匹配不上就直接打回。这两件事不能互相替代:重叠度看的是措辞,字段校验看的是值。
3.3 没有它,第一道闸门会白干
反过来看:如果没有这道闸门,第一道闸门放行的每一条相关块,都可能是「块对、答案编」的入口。检索做得越好,块越相关,模型越容易借题发挥——因为相关的块给了它足够的话题词,让它编得像。第二章那个 0.31 分的例子是第一道该拦的,而 0.62 分、内容相关、答案却换了数字的情况,只有这一道能碰一下。
两者串联的顺序不能反:先按分数定「有没有料」,再按支撑定「有没有用」。顺序反了,支撑闸门就要同时面对「块无关」和「答案没引用」两种情形,误伤会成倍上去——因为无关块上本来就该拒答的请求,会被判成「无支撑」,和真正的幻觉混在同一堆里,分不出来。
四、第三、四道:一致性闸门与出口话术
前两道都过了,还有一类错误会漏过去:单条答案有支撑、分数也够,但换个问法就换一个答案。这类错误在单次请求里看不出来,只有在同一问题被问两次时才暴露。
第三道闸门做的就是这个比对:同一问题用两种问法(或打乱检索块顺序)各生成一次,抽出答案里的关键实体——数字、型号、日期、专有名词——逐项比对。不一致就降级为拒答。
4.1 一致性闸门为什么必须排在支撑之后
有个容易踩的坑:一致性闸门会奖励「稳定地编同一个错」。如果两次生成都在编,而且编得一样,这道闸门给出的结论是「一致,放行」。
所以它必须排第三:先由第二道确认答案是从块里来的,再由这一道确认从块里来的答案是否稳定。顺序颠倒,一致性的假阳性会高得没法用。同理,比对的对象只能是关键实体,不能是语义相似度——两段语义很像但数字不同的答案,恰恰是最危险的那一类,用语义相似度去比会把它们判成一致。
这道闸门还有个前提条件:两次生成要能走出不同的路径。要么带一点采样随机性,要么换一种问法让检索命中不同的块。如果温度贴着 0、问法一字不改、检索结果也完全一样,两次答案通常高度重合,这道闸门等于没开——它测不出东西,不是因为答案对,而是因为输入没变。
4.2 出口话术:拒答要给「缺什么」,不是给「不知道」
前三道闸门拦下来的请求,最后都要经过第四道:以什么形式交还给用户。
Anthropic 在《Reduce hallucinations》里给的第一条做法就是给模型「承认不知道」的许可,原文是:
Allow Claude to say “I don’t know”: Explicitly give Claude permission to admit uncertainty. This technique can drastically reduce false information.
同一篇文档还给了可以直接抄进提示词的句式:
If you’re unsure about any aspect or if the report lacks necessary information, say “I don’t have enough information to confidently assess this.”
这句话解决的是「模型不敢说不知道」的问题,但它只解决表达,不解决判定——模型觉得自己不确定,才用得上这句许可。而前面那个 0.31 分的例子说明,模型经常并不觉得自己不确定。这就是为什么话术必须排在最后一道,它不能替代前面三道判定。
落地的话术结构建议三段:第一句说清缺什么(「现有文档里没有 R9 的并发参数,只有安装步骤」),第二句给出确实查到的相近信息(「同一份文档里提到了默认空口速率」),第三句给出下一步(「需要我帮你把这个问题转给技术支持吗」)。「抱歉,我无法回答」是最差的一种:用户既不知道缺什么,也不知道该找谁,只会再问一遍或者直接投诉。
4.3 官方自己写的局限,正好是这套闸门的边界
Anthropic 在同一篇文档里明确写了这些做法的边界:
although these techniques significantly reduce hallucinations, they don’t eliminate them entirely. Always validate critical information, especially for high-stakes decisions.
这句必须原样保留:提示词层(包括「允许说不知道」和「要求引用」)只是第一道闸门,不是全部。它降低的是「模型明知不确定还硬答」的那部分,管不了「模型确信自己知道但其实错了」的那部分——而后面这一类,只能靠检索分数、支撑校验、字段比对这些外部机制去拦。
这一章用到的提示词模板与验收清单:把拒答话术的三段式模板、字段校验的抽取规则整理成了一份可抄的清单,另外也放了 RAG 相关的官方文档与实战视频。扫码即可获取:
五、这套闸门的最小基建,以及谁为「拒错了」负责
四道闸门能不能跑起来,取决于一件事:每次请求的判决有没有被记下来。没有日志,阈值只能靠猜,误拒也没人知道。
最小基建是每条请求落五个字段:查询原文、top1 检索分数、支撑分、四道闸门的判决(哪一道拦的)、最终出口(直答 / 转人工 / 拒答)。有了这五列,任何一次阈值调整都能在一周后拿数据回看;没有这五列,调阈值就是每次都在盲改。
| 闸门 | 拦截目标 | 落地动作 | 没有它会怎样 |
|---|---|---|---|
| 1 检索分数 | 库里根本没有 | 分数低于阈值转人工,不生成 | 0.10 阈值下,2000 条「库里没有」里 1977 条被直接答了 |
| 2 支撑 | 检索到了但答案没用到 | 支撑分低于 0.45 打回重写;数字走字段校验 | 句式照抄、只换一个数字,读者查不出来 |
| 3 一致性 | 同一问题两次答案实体不一致 | 抽数字/型号/日期逐项比对,不一致降级拒答 | 单条看着都对,换个问法换一个答案 |
| 4 出口话术 | 拒答变成哑巴 | 三段式:缺什么 / 查到了什么 / 下一步找谁 | 用户被拒但不知道补什么,直接转投诉 |
5.1 谁为「拒错了」负责
这张表最后要落到人。四道闸门分属不同的 owner,出事的时候不能互相推:
- 第一道的阈值归检索/索引的人。重建索引、换 embedding、改切块长度,都必须重新标定,标定样本要留档。索引一改阈值不动,是最常见的翻车方式。
- 第二、三道的判据归应用层的人。支撑分怎么算、字段怎么抽、比对哪些实体,这些是代码里的逻辑,改一次要跑回归。
- 第四道的话术归业务或客服的人。用户被拒之后去哪儿,只有他们知道。技术团队写的话术通常是「无法回答」,业务团队写的是「我帮你转给谁」。
- 误拒的申诉通道归业务。这一条最容易被漏掉:误答有人投诉,误拒没人投诉——用户被拒一次就走了。所以误拒必须自己有出口,比如「这个回答不对/漏了」的按钮,把被拒的请求原样落库,每周抽样看有多少是真该答的。
5.2 什么时候该停手
有一个信号说明闸门已经到极限了:在你能接受的代价比下,最优阈值对应的误拒条数已经超过下游能接的人工量。
用第二章的数:如果业务只能承接 800 条转人工,那么 5:1 的代价比(误拒 873 条)已经超了,20:1(1664 条)更不可能。这时候继续抬阈值不是治理,是把问题从「答错」搬到「没人接」。正确的动作是回到检索本身:补语料、改切块、加同义改写,把「可答」那一簇的分数整体推高,让两簇分得更开——分布分得越开,同一个代价比下的误拒就越少。
闸门治不了「库里就是没有」这件事。它只能保证:没有的时候,系统会说没有。
这篇的验收清单与阈值标定脚本:把四道闸门的检查项、阈值标定所需的样本口径整理成了一份清单,配合 RAG 实战视频看更省事。扫码即可获取:
附表 A:本文引用事实与出处对照表
| 事实 | 出处 | 本文位置 |
|---|---|---|
| 「允许模型说不知道」可以大幅减少虚假信息:Allow Claude to say “I don’t know”: Explicitly give Claude permission to admit uncertainty. This technique can drastically reduce false information. | 《Reduce hallucinations》;Anthropic 官方文档;https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations | 第 4 章 |
| 官方给出的不确定表达句式:If you’re unsure about any aspect or if the report lacks necessary information, say “I don’t have enough information to confidently assess this.” | 同上 | 第 4 章 |
| 长文档任务先抽取原文引文再做后续处理:Use direct quotes for factual grounding … ask Claude to extract word-for-word quotes first before performing its task. | 同上 | 第 4 章 |
| 要求逐条标注引文与来源:Verify with citations: Make Claude’s response auditable by having it cite quotes and sources for each of its claims. | 同上 | 第 4 章 |
| 上述做法的局限:although these techniques significantly reduce hallucinations, they don’t eliminate them entirely. Always validate critical information, especially for high-stakes decisions. | 同上 | 第 4 章 |
| 两类分数分布(各 2000 条)重叠下扫阈值 0.10~0.90:0.10 时误答 1977 条;代价比 1:1 / 5:1 / 20:1 对应最优阈值 0.50 / 0.60 / 0.75 | 本文实测,脚本work/exp1028/e04_thresh.py,种子 20261028 | 第 2 章 |
| 支撑闸门(字符二元组重叠)扫描 0~0.60:净拦峰值在 0.45(拦 534 / 误伤 1);「照抄只换数字」支撑分最低 0.765,高于真答案最高 0.680 | 本文实测,脚本work/exp1028/e04_support.py,种子 20261028 | 第 3 章 |
口径:两个实验均为合成数据,用于说明两类错误的交换关系与单道闸门的判定上限,分布形态不代表任何线上服务的真实分布;阈值落地前须在自有索引上重新标定。截至 2026-10-28,上述引用内容与官方页面一致。
写在最后:这篇用到的资料
写这篇文章时,把相关的官方文档和源码又翻了一遍,顺手也整理了几份配套的东西:
- 大模型学习路线图:从零基础到能自己动手做 Agent,按阶段说明每一步该学什么、哪些可以先跳过
- 《LangChain + LangGraph + MCP 智能体开发实战》视频课:7 个模块,从私有化部署、Embedding+RAG 到 MCP+Agent 全流程
- AI 大模型知识库(在线可查):Agent Skills 从入门到落地、Claude Skills 完全指南等专题,按目录浏览即可
- 640 套 AI 大模型行业报告 + 经典 PDF 书籍:看行业落地案例和别人怎么做的时候用得上
- 大模型零基础到精通教学视频:跟着敲一遍,比只读文档快得多
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「AI」,优先通过。
资料按「先路线、再动手、最后查漏」的顺序整理好了,建议先看学习路线那一份,照着它挑一条适合自己当前基础的路径再往下看。