『LLM 连个数都数不清』,这话被讲了好几年,讲到现在都快成模型的生理缺陷了。我的判断是:RAG 系统里数错数,锅大半不在模型,在管道。模型只是站在最外面,所以每次都由它背锅。
七月底 dev.to 上有个案例,Rodrigo Diego 写的。我第一眼也以为是“模型数学差”的日常,读完发现根本不是那回事。先看我第一版的归因,是错的,照例留着:
数据库里 84 个 ──► 模型只"看见"一部分 ──► 数错了
↑
归因:token 切块,数着数着接歪了
这个归因不算全错,让模型顺着 context 数几十个条目,接龙接歪是常有的事,这个我之前画 token 的时候讲过。但它解释不了后面那个细节。
案例本身是个给质量管理产品做的文档搜索 copilot,LangGraph 加 Bedrock 那套多智能体。用户问“某个作者写了多少篇文档”,数据库里的真答案是 84,copilot 报了个错数。到这为止都平平无奇,下一段才是让我坐直的地方——
文档服务每次带过滤条件的查询,其实都返回了真实总数。84 这个数,从头到尾都在管道里。
等等等等,先别急。总数既然在,模型怎么会不知道?往下看:权限门控那个节点,用自己经手的表面计数,把状态里那个总数覆盖掉了。同一个字段,管道前半段装的是“库里真有 84”,走到后半段变成了“我这边过了 N 个”。一个字段,两个含义,下游拿到的是后一个。
读到这里我咔哒一下扣上了:模型不是数错了,是它拿到的那个“总数”根本就不是总数。✨
这才是该画的图。重来:
数据库过滤 ── 返回结果 + 总数 84 ✔(它说了!)
│
▼
top-k 截断 ── 只往下传前 k 个
│
▼
权限门控 ── 把"总数"改写成"我放行的数量" ✘(便签被换了)
│
▼
版本合并 ── 同一文档多版本并成一张卡
│
▼
展示上限 ── 最多 30 张卡片
│
▼
模型 ── 问总数?我只能数我看见的
五道工序,每道都在做减法,没有一道吱一声“我减过了”。模型隔着五道墙数仓库,数出来不是 84,你回头骂它数学差,讲不讲理。
打个比方:你雇了个会计,公司账本八十四页,你每天只把前三十页拍照发他,月底他报的账对不上,你骂他不会算术。更损的是,账本首页本来就印着“共 84 页”,是中间某个环节的人觉得这数字“不对”,拿涂改液改成了自己手上的份数。
这个比喻有个地方漏风,得老实标出来:会计知道自己只拿到三十页,报账时至少会补一句“仅据部分凭证”;模型没有这个自觉,它不知道自己看到的是残缺集合,在它眼里,窗口里的世界就是全部世界。所以光指望模型“谦虚点、数之前先声明”没用,它连“我该谦虚”的信号都收不到。想让模型念对数,就得让权威数字自己走进它的 context。
他们的修法也是这个方向:新开一个独立字段 total_matching_records,专门存数据库真实总数,规则就一条,不许下游覆盖。UI 上显示这个数,prompt 里也喂这个数。模型的活儿从“算”降级成“念”。
这个降级是整篇里最值钱的一步。LLM 不该算任何聚合值——计数、求和、找最新,都不该;这些活儿是数据库的,模型只负责把结果组织成人话。写代码的人听到这句可能觉得是废话,但你看那个 bug 是怎么来的:没人明着让模型算,是管道悄悄把真相剥掉了,又把“补真相”这个坑留给了它。
作者自己也承认修得不算完:没强制模型采用权威数字(它想自己再数一遍还是拦不住),只覆盖了计数,求和、平均值那些没管,纯内容型的语义搜索压根没有真实总数可显。还有个设计取舍我挺喜欢:权威数字直接内联在工具结果里,而不是另开一个“查总数”的工具,数字在搜索过程中已经产生了,再开个工具让模型去取,多一跳延迟不说,模型还可能压根不调。能省的自主性,别留给概率。
修完还钉了三个测试:总数大于展示卡片数时显示计数提示,全部展示时不显示,纯语义搜索永远不显示。修完不是完,得钉死,不然下个人重构管道,又给你覆盖回去了。
写到这我本来想收了,结果文末还挂着个同源问题,不放上来可惜:
模型不知道今天几号。用户问“最近 10 天的文档”,模型就猜一个日期范围,猜错了。结构跟数数那个一模一样:缺的不是能力,是 context 里根本没有真相。修法是加了个 LangGraph 中间件,每次模型调用往 system message 里注入当前 UTC 日期。讲究的是后半句,这个日期故意不写进持久对话历史,不然你三天后恢复对话,“今天”还停在三天前。
数数如此,日期如此。管道把真相一路剥掉,再把账算到模型头上,这套剧情你以后会在无数个“AI 不靠谱”的故事里撞见。撞见的时候先别转发,先画开看看真相是在哪一站丢的。
照例留个自检:你的 copilot 报出一个数,你能不能顺着管道说出它是哪一段产生的,数据库给的、门控算的、还是模型自己数的?说不出是哪段,下个 84 大概就埋在那。
本期画开:模型不会数数?是没人把数给它。这玩意儿捋顺了再看,真的挺酷的。