八月十三号挂到 arXiv 上的那篇 Syfer(多语言多跳问答,已经被 NLPCC 2026 收了),我翻完摘要,第一个念头不是"又一个 mRAG 提点",是——翻译被挪位置了。
挪位置这件事本身,比它涨了几个点有意思得多。
先交待我以前的默认认知。多语言 RAG 里把检索到的文档翻成英文、或者把问题翻成文档的语言,我从来没把它当成一个"决定"。它就是个前置步骤,跟 import 一样,你不问为什么,它就在那儿躺着。这篇论文干的事,是把这一步拎出来,问了一句:你确定每次都得做?
先画老的两条路。
路线一,翻译对齐。 不管来的是什么语言,先统一翻成英文,英文检索、英文推理,答案再翻回去。
问题(目标语言) ──► [全量翻译成英文] ──► 英文检索 ──► 英文推理 ──► 答案 ──► 翻回目标语言
▲
这格是无条件的,谁来了都先翻
论文点的问题我记住两条:不加区分地全翻,会把只在目标语言里才成立的文化和语言信息翻没了——不是"翻得不好",是那部分信息在翻的过程中根本不存在了;以及,你翻的每一段都要付钱,这个钱按量走。
路线二,分解聚合。 干脆不翻译,把复杂问题拆成子问题,逐个检索、逐个推,最后把中间推理过程聚合成答案。
问题 ──► 拆成子问题 ──► 逐个「检索 + 推理」 ──► 把中间过程聚合 ──► 答案
它的问题也出在"无条件"上:拆的时候没有东西管你拆得对不对,于是会拆出一堆冗余的、绕着圈重复的子问题;每一步的小误差顺着链条往下传,最后聚合那一下再放大一次。
读到这儿我都还觉得这是篇正常的对比论文。然后我看到了 Syfer 的做法,第一版我画错了。
我第一版画成这样:
问题 ──► 先分解 ──► 效果不好 / 拆不动 ──► 再翻译 ──► 重来
"推迟翻译",我理解成"晚点翻译"——顺序上往后挪一格。听着挺合理,也挺无聊的。
不对,完全不对。它不是一个两阶段的顺序流水线,它是一个条件分支。重画:
问题(目标语言)
│
▼
分解器:格式受约束,在原语言下产出「子问题图」
│
▼
分解质量检查 ──通过──► 子问题按序「先检索、后回答」,全程走目标语言 ──► 聚合 ──► 答案
│
└──没过──► 才切到英文翻译路径(配一个双语子问题图对齐)
看清了吗:检查通过,一次翻译都不发生。只有检查没过,才启用英文那条路。
"推迟"这个词把我骗了。它不是"晚点做",是"大概率不做"。翻译从一个必经节点,降级成了一个兜底分支。
我盯着这个结构看了一会儿,才反应过来这篇论文真正教我的东西跟多语言没什么关系。
等等等等,先别急。我知道"加个 if"听起来一点也不酷。但这个 if 加的位置很讲究——它加在了分解质量的检查上。也就是说,系统手里有了一个可以自己判断"我现在到底需不需要翻译"的信号,而不是由人拍脑袋定"这是多语言场景,所以我们要翻译"。
✨ 这一下我咔哒扣上了。翻译贵,大家都知道;难的是找到一个判据,让你知道这笔钱该不该花。
打个比方:老做法像所有快递都先拉到中心仓再分发,哪怕收件人和发件人就在同一条街上。Syfer 做的是先看一眼这单跨不跨区,不跨,直接送。
这个比喻漏风的地方我得老实标出来。中心仓那套是能靠更聪明的路由优化的——距离是物理量,你算得越准,省得越多,但省的是成本,件本身没变。翻译不一样:同一句话翻过去,丢的是它原本带着的语言和文化信息,这个损失没法靠"更聪明的路由"补回来,信息已经没了。所以"默认不翻"在这里同时干了两件事——省钱,和保真。两个动机指同一个方向的时候,这个设计决定基本不会错。
对了,名字里那个"折叠"(synthesizer-folding),我到现在也没能把它跟这张图对上号。这一段先撂这儿,哪天画明白了再补,先不装懂。
拉回来。
我想说的其实是这个:默认值是最贵的隐藏成本,因为它不出现在任何一处日志里。
你去翻手上随便一条 RAG 或者 agent 的链路——query 改写、文档重排、上下文摘要、把整段 history 塞进 prompt——里面总有几个步骤是"每次都会执行、但没人问过为什么"的。它们大多是从 demo 阶段带过来的,那时候你为了第一次能跑通,什么保险都往里加。后来链路越接越长,这些步骤就变成了地板,没人低头看。
那篇论文干的事,拆到最里面,是给其中一个步骤找到了一个能算出来的判断条件。有判据,无条件步骤就能降级成条件分支;没有判据,你就只能一直付。
这才是它值得被画开的地方。不在多语言,不在 mRAG。
照例留个自检:现在把你那条链路里所有"每次都会执行"的步骤列出来,挑一个,问两个问题——它在什么条件下才是必要的?那个条件我能不能算出来?能算出来的,你就拿到一个分支;算不出来的,这一步大概率是在替别人交税。
下期想画开哪个概念你说了算。我候选清单上排着两个:embedding 凭什么能"找相似",还有 KV cache 到底缓存了个啥。