我有一个已经跑了一年多的本地知识库:PARA 结构、单索引 RAG + 卡片索引层、每日增量同步、21 题召回回归。检索能力经过验证——问"青春期孩子怎么沟通"它能从 300 问 Q&A 里精准捞出答案。
但上个月我问它一个问题,它露馅了。
我问:“铜管是不是涨价了?涨了多少?”
RAG 给我捞回来几段文字,每段都说得像模像样。但我一对原始数据——数字对不上。模型从 78,647 行的采购长表里"挑"数字,挑错了行、错了口径,还挑得理直气壮。
这就是 RAG 的天花板:它能找到"哪份文件讲了什么",但它算不准"数字到底是多少"。 长表格塞进上下文窗口,模型挑数就像让人在电话簿里核对账单——看错行的概率永远不为零。
这篇文章记录我怎么解决这个问题:给知识库加一层「SPU 卡片索引」,让 AI 从"在长表里挑数"变成"读一张预聚合的小卡片"。文末有完整的搭建方法和踩坑清单。
一、核心思路:三层分工
升级后的知识库分三层,每层只干自己擅长的事:
| |
- RAG 层(原有):负责"哪份文件讲了什么"——模糊知识、背景、方法论
- 卡片层(新增):负责"数字到底是多少"——每个 SPU 一张预聚合的标准答案
- LLM 层:只负责"这意味着什么"——解读、判断、建议
关键设计:卡片是 JSON 格式,刻意不进 RAG 索引。RAG 擅长语义匹配,不擅长精确算数——让它俩各守边界,互不污染。
二、一张 SPU 卡片长什么样
每个 SPU(物料编码)一张卡,大约 2KB:
| |
三个设计决定:
1. 数据行号指针。卡片不放原始数据,放"答案在哪一行"。要下钻时,加载器按行号一跳直达原始明细——结论永远可以回溯验证。
2. 供应商脱敏。卡片里供应商是 SUP-007 这种代码,真名存在单独的映射文件里(不进任何索引)。卡片可以给任何 Agent 用,不怕泄露。
3. 每张卡带验证状态。行数校验、总额校验、源文件 SHA256——引用任何数字前先看卡片的"体检报告"。
三、实战效果:铜管涨价核查
升级前,“铜管是不是涨价了"这个问题:
- 人工路径:打开 10.3MB Excel → 透视(铜管散在 5+ 个编码,要手工拼条件)→ 逐年手工算加权均价 → 30-60 分钟
- LLM 直读:78,647 行远超上下文窗口,切片后模型挑行照样会错
升级后:
| |
总耗时 6 秒,上下文 59KB(对比全表 10.3MB,降 99.4%),数字全部可回溯。
而且有个意外收获:“5 个铜管编码全是同一家供应商"这个结构性事实,卡片粗筛一眼就能看到——传统透视几乎不可能顺手发现,但这恰恰是议价谈判里最值钱的信息。
四、踩过的坑(这部分最值钱)
坑 1:杂码桶假信号
第一版粗筛跑出来,“价格离散预警"TOP20 全是离散系数几万倍的怪物。下钻一看——一个"五金类万能代码"混装了 N 种实物,单价从 0.01 元到 628 元都有。
**教训:结构性噪声 ≠ 真实波动。**解法是金额分层阈值(大金额严、小金额宽)+ 噪声编码白名单。修完后候选从 48 个缩到 20 个,且全部变成真实品类。
坑 2:SHA 漂移虚惊
权威源 Excel 的哈希和验收记录对不上。按流程这该阻塞。但跑了全量数学对数——行数、总额、逐年合计全对,差额 0.00。判断是文件被重新保存过(xlsx 重打包),数据等价。
**教训:P0 校验要双锚点——哈希管"文件没被换”,数学锚点管"数据没被改”。**哈希漂移不一定是事故,数学一致才是硬道理。
坑 3:孤岛检测器报警
卡片体系上线后,每天刷 3 次的孤岛索引突然把我的 3 份分析报告标记为"孤立文件”——因为我写完报告忘了在正文里加指向其他笔记的链接。
**教训:任何自动化检测器的判定口径,都是新结构的潜在冲突点。**现在的规则是:动知识库结构之前,先过一遍所有自动化任务的检测口径。新产出的每份笔记必须自带"关联导航"段。
坑 4:召回被自己污染
有个质量问题追踪了 11 天:RAG 每天验证 21 道标准题,其中"板材价格"题连续命中错误文件。排查发现——我之前记录排查过程的笔记,本身成了这道题的最强召回源。越记录,回音越响。
**教训:召回被干扰时,第一反应不该是调参数,而是问"这个问题的最佳答案文件存在吗"。**我用卡片数据写了一篇《板材价格标准答案》,数字全部锚定卡片——当天,21/21 全绿,11 天的悬案清零。
五、完整搭建方法(可直接复用)
第 1 步:准备数据底座(你已有就跳过)
前提是一份结构化的行级明细(Excel/CSV),含:日期、供应商、物料编码、物料名称、分类、数量、单价、金额、年度。关键校验:
| |
第 2 步:生成卡片(一次全量,成本极低)
聚合逻辑:按物料编码分组 → 累计金额(Decimal 精确)→ 年度金额/年度均价(加权=金额÷数量)→ 供应商集合 → 单价区间 → 价格离散系数(max/min)→ 行号指针列表。
实测:23,743 张卡,生成时间不到 1 分钟,93MB。全量卡片对数后与权威总额差额 0.00。
第 3 步:写加载器(卡片 → 原始行的一跳桥)
输入 SPU id,按卡片里的行号指针从源文件抽对应行。这样任何卡片数字都能一键回溯原始明细——审计、复盘、跟供应商对账都用得上。
第 4 步:建粗筛分析链
三信号排序:价格离散(分层阈值)→ 单价同比异动(±10% 预警线)→ 供应商集中度(只看大额档)。输出候选清单,每条带卡片指针。LLM 只做最后的解读,不做任何数据计算。
第 5 步:接自动化防线
- 时效自动检测:记录源文件 SHA,变了才重生成卡片,没变就跳过(幂等,每天跑都行)
- 一键管线:生成→粗筛→族归组→对数验证,一条命令跑完,报告落盘
- 月度复验:自动化任务每月跑一次全链验收,输出"要不要复制到其他数据域"的决策建议
第 6 步:反孤岛自检(容易漏)
每份新产出的分析报告,正文末尾加"关联导航"段链接到相关笔记。否则知识库的孤岛检测器会把它们标成孤立文件——别问我怎么知道的。
卡片层与 RAG 层的守边界设计、verify 门禁与题库维护决策树的细节,见主文《从零搭建本地 AI 知识库》。
六、这套方法的边界
诚实说清楚三点:
- 它只解决"精确数字"问题。模糊知识、方法论、经验,还是 RAG 的地盘。两层互补,不替代。
- 卡片有时效。源数据更新后要重生成——所以第 5 步的自动化防线不是可选项,是必需品。
- LLM 的判断仍然是判断。卡片告诉你"涨了 19.2%、单一来源、在加速",但"该不该换供应商、谈判怎么谈"还是人的决策。这套系统的价值是把你的时间从"找数、算数、验数"挪到"判断、谈判、决策"。
七、下一步
这套体系目前只落在采购数据上。跑满一个月后,如果月度复验全绿,计划复制到:
- 价目数据(41,729 条报价)——能回答"报价 vs 实采价差",直接服务议价
- 销售数据——客户/产品维度的同构卡片
方法论已经验证,第二域的搭建成本预计是第一域的三分之一——因为坑都踩过了。
本文数据均为实测值(2026-08-31 快照):卡片 23,743 张 / 全量对数差额 0.00 / RAG 回归 21/21(门禁 19)/ 自动化 13 个 / 死链 0 / 铜管案例耗时 6 秒。
