把一批 PDF 文档变成能问、能溯源的知识库。回答永远带原文出处,
用户可核对;答不出时明确说"找不到"。
同一套引擎装了三种完全不同的语料,每种都针对性地调过检索与提示词。
一份 200~300 页的年报,想知道"公司靠什么赚钱", 得翻到第 30 页左右;想知道"研发方向是什么",又是一处;想知道"有哪些风险",再翻一遍。
这套系统把它变成一句话。用户省下的是翻找的时间,不是判断的脑力 —— 所以设计上刻意做了一件事:每个答案都能追到原文。
| 语料 | 内容 | 文档 | 切块 | 特有问题 |
|---|---|---|---|---|
| A · 单公司年报 | 华润微 2019–2022 | 4 | 2,955 | 表格列与年份对应不上 |
| B · 行业知识库 | 半导体 5 家公司 | 15 | 10,947 | 多源归因:不能把甲公司的说成乙公司的 |
| C · 制度知识库 | 华润微全套管理制度 | 10 | 627 | 条款精确:关联交易/对外投资/对外担保规定不同,不能混 |
| 指标 | A 年报 | B 行业 | C 制度 | 说明 |
|---|---|---|---|---|
| 块数 | 2,955 | 10,947 | 627 | |
| 超长块(>900字) | 0.00% | 0.25% | 0.00% | 超了会被模型静默截断 |
| 标题路径覆盖 | 99.9% | 99.9% | 98.7% | 没有路径的块 = 召回了也不知道出自哪 |
| 正文重复 | 0.0% | 1.0% | 0.0% | 重复块会挤占 TopK 名额 |
| 问题 | 后果 | 修法 |
|---|---|---|
| 制度文档的「章」层级丢失 | 路径只剩"第X节",不知道属于哪一章 | 层级扩到 5 层(章/节/条/一、/(一)) |
| 「条」把整条正文吞进标题路径 | 路径里塞满正文,内容反而丢了 | 路径只放"第X条"编号 |
| 10~12% 的模板重复块 | 跨公司套话挤占检索名额 | 跨公司模板剔除 + 同公司跨年保留最新 |
| 问题 | 现象 | 修法 |
|---|---|---|
| B:检索被单一公司垄断 | 问"这几家公司处于什么位置",只召回华润微一家(它年报里相关词密度最高),另外 4 家全被挤出 | 按公司分组检索,每家保底取 2 条再合并 |
| A:跨年问题召不全 | 问"2019到2022年营收",含数值的块排在第 18~92 名,Top-8 里一条完整年度营收都没有 | 按年份分组检索,每年保底取 4 条 |
| A:科目名与提问不一致 | 利润表里写"营业总收入",用户问"营业收入",字符二元组匹配不上 | 术语同义词扩展(营业收入 → 营业总收入 / 主营业务收入 / 营收),块从第 20 名升到榜首 |
在 60 道真实问题上做过对照实验:
| 策略 | Top-6 命中 | |
|---|---|---|
| 纯向量检索 | 22% | |
| BM25 关键词 | 92% | ← 采用 |
| RRF 等权融合 | 47% | |
| 向量top3 + BM25top3 | 82% |
结论是只用 BM25。原因:中文企业文档的提问自带精确术语 ("所得税影响额""对外投资审批权限"),关键词匹配一击即中; 而向量模型会把整页内容平均成一个语义向量,具体术语被稀释。
不用向量检索,就不需要嵌入模型、不需要 ONNX、不需要 WebAssembly。 检索完全在浏览器里用纯 JS 跑,首屏只需几百 KB,且没有冷启动。 这也是它能免费部署的原因。
| 不做 | 为什么 |
|---|---|
| 用 RAG 回答具体财务数据 | 企业实践里这类需求走数仓 / Text2SQL,不走 RAG。用文档检索去查数字,是拿短板碰长板 |
| 让模型替用户做计算 | 需要精确计算时应让代码算,模型只负责找与说 |
| 假装什么都能答 | 答不出时明确说"找不到" —— 实测这类判断的正确率是 87.7% |