我有一个已经跑了一年多的本地知识库:PARA 结构、单索引 RAG + 卡片索引层、每日增量同步、21 题召回回归。检索能力经过验证——问"青春期孩子怎么沟通"它能从 300 问 Q&A 里精准捞出答案。

但上个月我问它一个问题,它露馅了。

我问:“铜管是不是涨价了?涨了多少?”

RAG 给我捞回来几段文字,每段都说得像模像样。但我一对原始数据——数字对不上。模型从 78,647 行的采购长表里"挑"数字,挑错了行、错了口径,还挑得理直气壮。

这就是 RAG 的天花板:它能找到"哪份文件讲了什么",但它算不准"数字到底是多少"。 长表格塞进上下文窗口,模型挑数就像让人在电话簿里核对账单——看错行的概率永远不为零。

这篇文章记录我怎么解决这个问题:给知识库加一层「SPU 卡片索引」,让 AI 从"在长表里挑数"变成"读一张预聚合的小卡片"。文末有完整的搭建方法和踩坑清单。

一、核心思路:三层分工

升级后的知识库分三层,每层只干自己擅长的事:

1
2
3
4
5
6
7
8
9
┌─────────────────────────────────────┐
│  L4 输出层  聚合报告(TOP10/预警/对标)  │
├─────────────────────────────────────┤
│  L3 分析层  粗筛→族归组→下钻(prompt链) │  ← 新增
├─────────────────────────────────────┤
│  L2 索引层  SPU 卡片 × 23,743         │  ← 新增
├─────────────────────────────────────┤
│  L1 数据层  行级明细 78,647 行         │  ← 已有(Cost-DNA)
└─────────────────────────────────────┘
  • RAG 层(原有):负责"哪份文件讲了什么"——模糊知识、背景、方法论
  • 卡片层(新增):负责"数字到底是多少"——每个 SPU 一张预聚合的标准答案
  • LLM 层:只负责"这意味着什么"——解读、判断、建议

关键设计:卡片是 JSON 格式,刻意不进 RAG 索引。RAG 擅长语义匹配,不擅长精确算数——让它俩各守边界,互不污染。

二、一张 SPU 卡片长什么样

每个 SPU(物料编码)一张卡,大约 2KB:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "spu_id": "SPU-005",
  "物料编码": "01.23.COPPER 121",
  "物料名称": "铜管(捆喉)",
  "累计金额": "2435853.xx",
  "数据行号": [7815, 8474, 10001, ...],    指回 Excel 行号
  "年度金额": {"2023": "...", "2024": "..."},
  "年度均价": {"2023": "66.00", "2024": "71.19"},
  "主供应商_脱敏": "SUP-007",
  "供应商数": 1,
  "价格离散系数": "1.52",
  "波动预警": false,
  "数据源SHA256": "72c8f84d...",
  "p0_行数校验": true,
  "p0_总额校验": true
}

三个设计决定:

1. 数据行号指针。卡片不放原始数据,放"答案在哪一行"。要下钻时,加载器按行号一跳直达原始明细——结论永远可以回溯验证。

2. 供应商脱敏。卡片里供应商是 SUP-007 这种代码,真名存在单独的映射文件里(不进任何索引)。卡片可以给任何 Agent 用,不怕泄露。

3. 每张卡带验证状态。行数校验、总额校验、源文件 SHA256——引用任何数字前先看卡片的"体检报告"。

三、实战效果:铜管涨价核查

升级前,“铜管是不是涨价了"这个问题:

  • 人工路径:打开 10.3MB Excel → 透视(铜管散在 5+ 个编码,要手工拼条件)→ 逐年手工算加权均价 → 30-60 分钟
  • LLM 直读:78,647 行远超上下文窗口,切片后模型挑行照样会错

升级后:

1
2
3
4
5
6
7
步骤 1(0.02 秒):读 500 张卡片,命中 5 个铜管 SPU
  → 立即发现:5 个编码全部同一供应商,涨幅 12.8%~41.8%
  → 这是"供应商级涨价",不是编码噪声

步骤 2(5.8 秒):对金额最大的 SPU-005 下钻,取回 26 行原始明细
  → 四年加权均价:66.00 → 71.19 → 76.12 → 90.71
  → 2026 年涨 19.2% 且在加速,采购量同时缩了 44%

总耗时 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),含:日期、供应商、物料编码、物料名称、分类、数量、单价、金额、年度。关键校验:

1
2
3
4
# P0 预检:行数 + 总额双锚点
EXPECTED_ROWS = 78_647
EXPECTED_TOTAL = Decimal("214956793.43")
# 对不上就停,不许带病生成卡片

第 2 步:生成卡片(一次全量,成本极低)

聚合逻辑:按物料编码分组 → 累计金额(Decimal 精确)→ 年度金额/年度均价(加权=金额÷数量)→ 供应商集合 → 单价区间 → 价格离散系数(max/min)→ 行号指针列表。

实测:23,743 张卡,生成时间不到 1 分钟,93MB。全量卡片对数后与权威总额差额 0.00

第 3 步:写加载器(卡片 → 原始行的一跳桥)

输入 SPU id,按卡片里的行号指针从源文件抽对应行。这样任何卡片数字都能一键回溯原始明细——审计、复盘、跟供应商对账都用得上。

第 4 步:建粗筛分析链

三信号排序:价格离散(分层阈值)→ 单价同比异动(±10% 预警线)→ 供应商集中度(只看大额档)。输出候选清单,每条带卡片指针。LLM 只做最后的解读,不做任何数据计算。

第 5 步:接自动化防线

  • 时效自动检测:记录源文件 SHA,变了才重生成卡片,没变就跳过(幂等,每天跑都行)
  • 一键管线:生成→粗筛→族归组→对数验证,一条命令跑完,报告落盘
  • 月度复验:自动化任务每月跑一次全链验收,输出"要不要复制到其他数据域"的决策建议

第 6 步:反孤岛自检(容易漏)

每份新产出的分析报告,正文末尾加"关联导航"段链接到相关笔记。否则知识库的孤岛检测器会把它们标成孤立文件——别问我怎么知道的。

卡片层与 RAG 层的守边界设计、verify 门禁与题库维护决策树的细节,见主文《从零搭建本地 AI 知识库》。

六、这套方法的边界

诚实说清楚三点:

  1. 它只解决"精确数字"问题。模糊知识、方法论、经验,还是 RAG 的地盘。两层互补,不替代。
  2. 卡片有时效。源数据更新后要重生成——所以第 5 步的自动化防线不是可选项,是必需品。
  3. LLM 的判断仍然是判断。卡片告诉你"涨了 19.2%、单一来源、在加速",但"该不该换供应商、谈判怎么谈"还是人的决策。这套系统的价值是把你的时间从"找数、算数、验数"挪到"判断、谈判、决策"。

七、下一步

这套体系目前只落在采购数据上。跑满一个月后,如果月度复验全绿,计划复制到:

  • 价目数据(41,729 条报价)——能回答"报价 vs 实采价差",直接服务议价
  • 销售数据——客户/产品维度的同构卡片

方法论已经验证,第二域的搭建成本预计是第一域的三分之一——因为坑都踩过了。


本文数据均为实测值(2026-08-31 快照):卡片 23,743 张 / 全量对数差额 0.00 / RAG 回归 21/21(门禁 19)/ 自动化 13 个 / 死链 0 / 铜管案例耗时 6 秒。