RAG 重排别再喂大模型了:421M 开源小引擎,33 毫秒给候选文档打完分
做过 RAG 的人大概都经历过这个瞬间:用户问一句话,后台先哗啦啦捞出五十段资料,然后把这五十段原封不动塞给大模型——“你帮我看看哪几段最相关”。
页面转了两三秒,账单上多了一串 token。好不容易出结果,模型还在开头写了一段“好的,根据您提供的资料……”。
最近技术社区里有个思路被反复讨论:排序这件事,根本不需要一个会写作文的模型。
一个叫 Laya 的开源小引擎,把重排变成了“涂答题卡”——它不生成一个字,33 毫秒就能给一道题打完分。
一、先说明白:RAG 的“重排”,到底在排什么
用图书馆打个比方。
你问管理员“公司出差住宿能报多少”,他先凭关键词从书架上抱来五十本书——这一步叫召回,讲究的是“别漏”。
但关键词很笨。“住宿”“报销”“标准”这几个词,年会通知里有,员工旅游方案里也有,甚至招聘启事里都有。
所以还得有个老编辑,快速翻一遍这五十本,挑出真正能回答问题的三五本——这一步叫重排,讲究的是“排得准”。
现在大多数团队,这位老编辑请的是 GPT 这类大模型。它确实读得懂,但毛病也摆在明面上:
- 慢:一次判断几十个候选,几百毫秒到几秒;
- 贵:每次都按 token 计费,量一大就是一笔雷打不动的开销;
- 不稳:让它吐个分数,它可能回一段解释,可能给你个 JSON 里套着中文,甚至把 0.9 写成“很高”;
- 会编:候选里明明没答案,它也能顺着话头给你圆一个。
可重排这个活儿,本质上只是“给每段资料打个相关度分”。这是一道判断题,不是作文题。
用大模型干这个,多少有点杀鸡用牛刀。
二、Laya 是个啥?一个只涂答题卡、从不写作文的“AI 判卷老师”
一句话:它是个专门做结构化判断的小模型。你把题目和选项给它,它直接告诉你每个选项的概率。
打个比方。普通大模型像那种被要求“写出解题过程”的学生,得一步一步把想法写成文字,你再去文字里刨答案;Laya 像直接拿到答题卡的学生,扫一眼题目,在 A、B、C、D 上涂卡,交卷。
几个关键点,翻译成人话:
它不生成文字。所以没有“输出格式不对”这回事,也没有“编一段看起来很像的话”这回事。返回的永远是干净字段:选哪个、几分、是或否、有多大把握。
它一次算完。不是“一个字一个字往外蹦”,是把整道题一次性读完、一次性算完。官方在 T4 显卡上实测,单题 33 到 39 毫秒。
三种题型够用。多选一(这段资料属于哪个主题)、分档打分(相关度零到三档)、是或否判断(这段话里有没有答案)。RAG 重排恰好就是第二种。
它会说自己有多大把握。它不只告诉你“这段相关”,还会告诉你“我有 0.93 的把握”。这个数字经过校准,后面会讲为什么它比准确率还值钱。
它很小。英文版 421M 参数,多语种版 322M,一张普通显卡甚至 CPU 都能跑,权重是 Apache 2.0,可以整个搬进自己机房。
说白了,Laya 没打算跟大模型抢饭碗。它干的是大模型身边最脏最累的那份活:大量、重复、只需要判断、不需要表达的活。
三、怎么把它塞进重排环节?三步就够
不用改架构,思路只有一句:把“让大模型读一遍再说话”,换成“给每段候选出一道打分题”。
第一步:装起来
官方给了 Python 包,一行安装命令的事。第一次运行会自动下载权重,英文版八百多兆,多语种版六百多兆,跟动辄几十 G 的大模型完全不是一个体量。
如果你压根不想碰 Python,它还自带一个 HTTP 服务,接口形状和同类产品 Jev 完全一样——老客户端把请求地址一改就能用。Docker、LangChain 这些常见集成方式也都有现成的。
第二步:把候选文档变成“考题”
假设用户问:“出差住宿报销上限是多少?”检索已经捞回五十段。
对每一段,你只要拼出一句话喂给它:问题是这句,候选资料是这段,请判断这段资料对回答问题的帮助有多大。
选项就设四档:完全无关、沾一点边、能部分回答、直接给出答案。
这里有个特别省事的细节:五十段资料可以打包成五十道题,一次请求全部问完。
官方实测,五十道题批量跑只要 337 毫秒,平均一道 6.8 毫秒。也就是说,一次 top-50 的重排,比你眨一次眼还快。
第三步:拿分数排序,用“把握”兜底
它返回的不是一个孤零零的标签,而是四档各自的概率。你可以按概率加权,算出一个零到三的期望分,直接排序取前几段。
更妙的是那个“把握”值。举个示意(数字为演示):
- A 段《差旅费用报销管理办法》第四条:相关度 2.8 / 3,把握 0.93
- B 段《员工出行交通指引》:相关度 1.2 / 3,把握 0.71
- C 段《年会活动通知》:相关度 0.1 / 3,把握 0.96
看出门道没有?C 段的把握也很高,但它高在“我很确定这段没用”。
真正要盯住的,是那些分数不上不下、把握又低的候选——这种模棱两可的,才交给大模型复核,或者干脆从上下文里剔掉。
这套“小模型先筛、大模型兜底”的打法,才是它最实用的地方:八成以上的候选,根本不需要惊动大模型。
四、算笔实账:快多少、省多少、准多少
先看速度。官方在单张 T4 上做的对比,对手是同类的商用决策模型 Jev:
- 单题延迟:Laya 大约 33 毫秒,Jev 第三方实测 236 到 276 毫秒,差7 到 8 倍;
- 10 题批量:72 毫秒,平均 7.2 毫秒一题;
- 50 题批量:337 毫秒,平均 6.8 毫秒一题;
- 每秒能处理一百到三百多道判断题。
再看钱。Jev 是闭源 API,每百万 token 收 0.042 美元;Laya 权重开源、自己部署,边际成本是零。
对那些每天要重排几十万次的团队来说,这不是省一点,是把这项支出从账上直接抹掉。
然后是准确率,这块反而最容易被忽略。
在仓库自带的评测里,两万三千多道判断题上,整体准确率 0.753;如果只回答它最有把握的那一半题目,准确率能冲到0.947。其中跟 RAG 最贴近的“搜索相关性”任务,733 道题准确率 0.628,校准误差只有 0.066。
再对比几个公开数字:
- 新闻分类四选一:Laya 0.950,Jev 0.910;
- 情绪识别六选一:Laya 0.595,Jev 0.480;
- 置信度校准误差:Laya 0.081,Jev 0.246,好了三倍。
“校准误差”这词听着唬人,其实就一个问题:模型说“我有九成把握”的时候,是不是真有九成是对的?数字越小越诚实。
大模型重排最坑的地方,就是它经常一本正经地把不相干的段落排到第一;而一个校准良好的小模型,起码能在不确定的时候明确告诉你“我不确定”。
上面这张图就是它的“诚实度体检”:整体校准误差 0.030,曲线几乎压在对角线上。
对做线上系统的人来说,这比多零点几的准确率更让人安心——因为你可以放心拿它做阈值判断。
顺便提一句确定性:同样的输入,它永远给同样的输出。做过大模型重排的人应该懂,这一条能省下多少回归测试的命。
五、丑话说前头:这三个坑,别踩
开源项目最怕被吹成万能药。Laya 官方文档里那节“诚实的局限”,反而值得逐条看完。
第一,它不是零样本神器。
官方自己承认,在复杂的多步决策基准上,没经过微调的基础模型准确率只有 0.362,连“永远选出现最多的那一类”(0.461)都不如。
它的正确用法是:拿你业务里的几百上千条数据微调一遍。
好消息是门槛不高,官方给了现成的笔记本,在 Kaggle 免费的双 T4 上就能跑完全流程。微调之后,同一个基准上的准确率从 0.362 跳到 0.766,甚至超过了当初标注数据那位“老师”的 0.735 上限。
第二,选项一多就露怯。
它给每个选项分配的描述空间有限,选项超过二十个,准确率会明显下滑。在一个 77 类的意图数据集上,它只有 0.425,而 Jev 有 0.870。
所以拿它做重排,姿势要对:一道题只判断一段资料、只给一个档位,而不是“从一百段里挑一段”。
想省事也行,有人用“先粗筛二十、再精排五”的两段式,效果和成本都挺舒服。
第三,出厂设置有点“过度自信”,个别题型还有怪癖。
官方建议先在你自己的数据上重新拟合一次温度参数,把校准误差压下来再用。
另外那个“是/否”题型,在英文版上偶尔会盯着选项标签自己发挥,把明显肯定的内容答成“否”。规避办法很土但很有效:别用是或否,改成两个中性选项的二选一。
还有长文档:英文版上下文 512 token,多语种版 1024,特殊配置下能开到 8192。RAG 的段落本来就切得碎,一般够用;真要把整篇 PDF 塞进去,还是得先切。
六、它适合谁,不适合谁
适合:正在被重排成本折磨的 RAG 团队;每天要处理海量工单、邮件、评论的分诊场景;Agent 里“该调哪个工具”的选择题;内容审核、意图路由这类高频低延迟的判断。
硬件上,一张 T4 级别的卡就能撑起不错的并发;纯 CPU 也能跑,单题 0.2 到 0.5 秒,适合离线跑分或者量很小的内部系统。
不适合:写文案、做总结、多轮聊天——它压根不生成文字,这些活它干不了。
它也不是“把大模型整条链路换掉”的方案,而是给大模型减负的配角。
写在最后
这两年大家习惯了一个思路:遇到问题,就上一个更大的模型。
但真实的生产系统里,很多环节根本不需要“会说话”。它只需要稳稳地、便宜地、可解释地做一个判断。
Laya 代表的其实是另一种分工:生成的事交给大模型,判断的事交给小模型。
一个大模型负责“想”,一堆小模型负责“筛”,链路反而更快、更便宜,也更好排查问题。
最后留个问题:你们线上那套 RAG,一次重排要花多少毫秒、烧多少 token?如果换成这种“只打分不写字”的小模型,你觉得准确率会掉,还是会涨?评论区聊聊你的实测数据。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考