RAG 这个名字起得就坏。它把"检索"两个字摆在前头,于是所有人都在卷检索,后半截那根管子没人回头看。
前阵子点开一篇讲多智能体出题的——八月十三号挂上 arXiv,cs.CL,编号 2608.13708,叫 TeachMateGPT。我本来是冲着"多智能体"去的。结果让我从椅子上坐直的,反倒不是那几个 agent,是中间一道闸:证据不够,它就不生成。
画开看看。普通 RAG 那根管子,大概长这样:
你提问
│
▼
[ 检索 ] ──► 一堆 chunk,谁跟问句近谁上
│
▼
[ 生成 ] ──► 无论如何都得给你编一段出来
盯它三秒。最要命的不是第一格的检索粗糙,是第二格没有出口——它压根不存在"我不干"这个状态。
论文列了现有方案的几条不足:扁平化检索、只能生成单个问题、缺少证据不足时的防护、不好适配按会考结构组织的课程体系。前几条我翻过去了。第二条我甚至不太认同,"一次出一道题"本来就是多数场景的用法,除非你在批量出卷,那属于产品取舍,算不上方案缺陷。只有最后那条,让我把页面往回滚了一屏。
TeachMateGPT 自己的流水线,画出来是这样:
你提问
│
▼
[ 路由 ] 这一步到底要不要搜?
│
▼
[ 检索 ] 稠密 + 词法两路融合 ──► 覆盖度达标了吗?
│ │
│ 不够 ──┴──► 拒答,到此为止
▼
[ 起草 ] 客观题一个智能体 / 建构作答题另一个,分开走
│
▼
[ SAVER ] 对证据打三类分:忠实度、相关性、幻觉风险
│
▼
[ 教师 ] 人过一遍,不是自动过滤
"fail-closed"是这道闸的关键词。默认关着——你得拿出足够的证据,它才打开。
我见过的绝大多数 agent 是反过来的,默认开着:你丢个问题过来,我总能往外吐点什么。哪怕检索回来的东西驴唇不对马嘴,它也能硬着头皮把那几段缝进答案,缝得还挺像模像样,你读完一时看不出哪里不对。
打个比方:这道闸像保险丝。电流一异常,它烧断,电路停在那儿,不冒火花。
这个比喻好用,漏风的地方我也得标出来——保险丝烧了,是有人来换一根,然后继续;可系统拒答之后呢?老师面前弹出一句"证据不足",这到底算问题被解决了,还是原封不动推回给了人?这一格我暂时画不出来,先放这儿。
第二件让我停下来琢磨的事,是它怎么切文档。
一般做法按 token 窗口切,五百一刀,切完一堆碎片谁也不认识谁。COPE 换了个切法:按教学大纲的结构切,再用一个可遍历的图式谱系把三种粒度串起来。
按 token 窗口: 教材 ──✂──► [ 500 ][ 500 ][ 500 ] … 每块各活各的
按大纲结构: 教材 ──► 章 ──► 节 ──► 知识点
▲ 每块都挂在树上,能往上走也能往下走
一句话:前者是"切得均匀",后者是"切得知道自己在哪"。
(顺带说一句,这个切法其实跟 embedding 怎么算强相关,那是另一张图的事,先记下,别扯远。)
同一个地方也漏风——大纲不是一条直线,是一棵树,往狠了说接近一张网。同一个知识点可能同时挂在"力"和"能量"底下。"按大纲切"这个说法还是太整了,真正难的是让一个碎片同时挂在好几个父节点上还不出乱子。这块我从摘要里看不出它做到什么程度,标记一下,别当我已经懂了。
第三块是 SAVER,对检索回来的证据打分:忠实度、相关性、幻觉风险,创作题还额外对四个子部分做更严的依据检查。最后一道交回给三个在职教师,人机协同——不是让模型自己给自己判卷。
生成出来的那套东西叫 NCTB-SciGen8:198 道题,143 道选择、55 道创作,覆盖八年级科学教材十四章,平均一章十四道。这个体量说白了就是个样例,别当基准数据集使。
跟普通 RAG 基线比,忠实度 0.68 提到 0.96,相关性 0.60 提到 0.89。
我第一反应是——这个提升里有多大一截,不是"生成得更好了",而是"烂的那些在闸那儿就被拒了,根本没进统计的分母"?摘要里看不出评测用的是不是同一批题,所以我没法确认。先放这儿,谁手里有全文,帮我瞄一眼这个数是怎么算的。
等等等等,先别急着觉得"加道闸就完了"。闸是有代价的,代价叫吞吐。
拒答率一上去,老师能拿到的题就变少。少到某个程度,他还不如自己动手出。这道闸开多紧算合适,摘要里没数字,看不到的部分我不替它说。
所以我不觉得这篇给出了答案。它给的是一个比答案更值钱的东西:把"该不该说"从"该怎么说好"里单独拎出来,做成流水线里一个有名字、有门槛、允许失败的格子。
一个系统能有"我现在不该说话"这个状态,比它多答对几道题难得多。💡
留个自检:现在你闭上眼,能画出普通 RAG 和这条流水线的差别落在哪一格吗?画不出来,多半是那道闸还没在你脑子里成形——它不是一个附加步骤,它是整条管子里唯一被允许说"不"的地方。
下期想画开哪个,你说了算。