上周一 arXiv 挂了一篇,编号 arXiv:2609.15234,标题我复制了两遍才念顺:CWM: Controllable White-Box Meta-Prompting for Adaptive Retrieval-Augmented Generation and Reasoning Ability。作者 Keuntae Kim、Eunhye Jeong、Yong Suk Choi,EMNLP 2026 findings 收了。
这类论文我平时扫一眼摘要就划过去。这篇停下来,是因为摘要里那句话:不挂外部决策模块,也不依赖多次采样。做自适应 RAG 的人看到这句大概都会愣一下——「这次到底要不要检索」这个判断,主流做法基本就两条路,它一句话把两条都堵了。
一条是外挂。训个小分类器,或者写几条启发式规则,先给 query 打个标签,外层逻辑再决定去不去查库。这条路我踩过,问题不在效果,在脱节:分类器看到的是文本,主模型看到的是自己那一层的隐状态,两边说的不是同一套语言,阈值怎么调都约等于瞎猜。后来我干脆把分类器删了,换成一条固定规则,宁可多查几次。
另一条是让模型自己采样几次,看答案稳不稳,稳就不查。我不喜欢它的成本:判断本身就要多跑几遍,省下来的检索开销又贴回去了。而且采样有随机性,同一个 query 今天判要查、明天判不查,想上生产还得再包一层兜底。
# 大概是这两种形状,伪代码,不是论文里的
if classifier(query).score > THRESHOLD: # 外部黑盒
context = retriever.search(query)
for _ in range(n): # 自采样
ans = llm(query)
if unstable(answers):
context = retriever.search(query)
CWM 走的是第三条:直接操控模型内部的信号来调节检索决策。作者用的是 controllable 这个词,我觉得它比 accurate 值钱——它给的不是一个更准的判官,而是一个你能拧的旋钮,能多查一点、能少查一点,而且大致知道拧的是哪儿。调过 RAG 的都懂,「我知道该动哪个开关」这件事有多省命。不过标题里那个 meta-prompting 和「操控内部信号」到底怎么接上的,摘要没讲清楚,先留个坑,等读完正文再说。
结果那栏,作者报了三个自适应 RAG 基准,在 GPT-oss-20b、Qwen3-14b 和 Llama3.1-8b 上拿了最先进性能。数字我倒没什么感觉,让我在意的是这三个模型的体量:20b、14b、8b,都是你本地能拉起来的量级。一个需要偷偷多采样几次的方法放到 8b 上,成本和延迟会很难看;不需要额外采样的方法在同一个量级上就比较站得住。这是我的偏好,不算给论文背书。
作者还把 CWM 往推理任务上扩了一版,说是展示通用性。这段我持保留态度。自适应检索和通用推理共享同一套内部信号,中间怎么统一的,摘要看不出来,正文那部分我也还没读到。真有一个信号能同时管「要不要查库」和「推理走到第几步」,那挺有意思;如果只是同一套开关换个任务重训一遍,那「统一框架」这个词就用得有点满。先挂着。
代码我还没跑。论文里给了仓库链接,arXiv 版本是 v1,DOI 那栏标着还在注册中,这版大概还会改。我打算先做两件很朴素的事。
- 把仓库拉下来,配一个最小的自适应 RAG 环境(本地起个小向量库就够),跑一遍默认设置,确认三件事:它改的是哪一层的信号、需不需要动推理框架、换个基座模型是不是得从头再来。
- 拿手头一组「越查越差」的 query 去试。那种模型自己明明知道答案、却被检索塞进来的噪声带偏的问题,最能看出「少查」到底值多少。
💡 小技巧:看这类白盒方法,先别急着跑 benchmark,去找它 hook 在哪一层。改的是 logits、中间层激活、还是某个 attention head,直接决定这东西能不能搬进你正在用的推理框架,论文里的分数不会告诉你这件事。
这一步我之前吃过亏。看另一篇做内部状态干预的论文时,我以为思路是通用的,结果那方法 hook 在解码阶段的某个位置上,我当时那套推理栈根本不往那个位置留接口,白读了两天,最后只抄了个思路走。
划重点:第一,把「要不要检索」这个决策从外挂模块挪进模型内部,方向值得跟,因为它让判断变得可观测、可干预;第二,不依赖多次采样是实打实的好处,尤其在 8b 这个量级上,成本是硬约束;第三,别只看 SOTA 那一行数字,先确认它 hook 在哪儿,再判断能不能落到你手上的框架里。这篇就记到这,仓库我留在标签页里了,这周跑一遍,跑完回来补一条。你要是已经在试这个仓库,踩到什么,说一声。
