文档问答引擎
本地检索 · 带出处 · 可增量扩展
把一批 PDF 文档变成能问、能溯源的知识库。回答永远带原文出处,
用户可核对;答不出时明确说"找不到"。
同一套引擎装了三种完全不同的语料,每种都针对性地调过检索与提示词。
它解决什么
不是"算得更准",而是"翻得更快"
一份 200~300 页的年报,想知道"公司靠什么赚钱",
得翻到第 30 页左右;想知道"研发方向是什么",又是一处;想知道"有哪些风险",再翻一遍。
这套系统把它变成一句话。用户省下的是翻找的时间,不是判断的脑力
—— 所以设计上刻意做了一件事:每个答案都能追到原文。
三套语料
同一个引擎,换语料、换检索策略、换提示词
| 语料 | 内容 | 文档 | 切块 | 特有问题 |
| A · 单公司年报 | 华润微 2019–2022 | 4 | 2,955 |
表格列与年份对应不上 |
| B · 行业知识库 | 半导体 5 家公司 | 15 | 10,947 |
多源归因:不能把甲公司的说成乙公司的 |
| C · 制度知识库 | 华润微全套管理制度 | 10 | 627 |
条款精确:关联交易/对外投资/对外担保规定不同,不能混 |
实测效果
下面每一条都来自真实运行,不是示意
A · 单公司年报 —— 跨年对比
问华润微的营业收入从2019年到2022年是怎么变化的?
华润微营业收入逐年上升:
· 2019年度为 5,742,784,130.70 元(57.43 亿元)
· 2021年度为 9,249,202,849.06 元
· 2022年度为 10,060,129,516.04 元
2019 年到 2022 年整体呈增长趋势,2022 年较 2021 年增长约 8.77%(按营业总收入口径)。
★ 三个数值与独立抽取的报表数据交叉验证一致 · 检索覆盖 2019 / 2021 / 2022 三个年份
B · 行业知识库 —— 多源归因
问这几家公司在半导体产业链上分别处于什么位置?
华润微(2019)
· 中国领先的拥有芯片设计、晶圆制造、封装测试等全产业链一体化经营能力的半导体企业(华润微 2019)。
· 在2018年排名前十的中国本土半导体企业中,是唯一一家以IDM模式为主运营的半导体企业(华润微 2019)。
中芯国际(2022)
· 处于集成电路晶圆代工行业(中芯国际 2022)。
· 公司针对行业共同面临的困境,积极寻求与产业链上下游的多元化合作(中芯国际 2022)。
国芯科技(2021、2022)
· 2022年牵头整合长三角区域…组建"苏州自主可控智能汽车电子芯片创新联合体"(国芯科技 2022)。
芯海科技(2021)
· 全信号链集成电路设计企业,国内上市企业中唯一一家模拟信号链和MCU双平台驱动(芯海科技 2021)。
小结(按产业链环节归纳):
· 芯片设计:芯海科技、国芯科技
· 晶圆制造:中芯国际、华润微
★ 每个结论都标了出处 —— 这是 B 场景最关键的机制
C · 制度知识库 —— 条款精确
问对外投资的审批权限是怎么划分的?董事会和股东大会各自能批多大额度?
对外投资审批权限按"股东会—董事会—董事长/总裁"三级划分:
一、股东会 —— 最高决策机构
股东会是公司对外投资的最高决策机构(《对外投资管理制度》第五条)。
二、董事会 —— 在股东会授权范围内决策
交易涉及的资产总额占公司最近一期经审计总资产的10%以上,应当提交董事会审议(《章程》第一百零八条)。
三、董事长或总裁
未达到董事会审议标准的对外投资,由董事长或总裁在董事会的授权范围内决定(《对外投资管理制度》第五条)。
补充说明:制度未对股东会、董事会各自审批的具体金额上限/下限作出明确规定。
★ 引用精确到条款;且主动说明"制度里没规定什么"
切块质量
切块是检索的地基 —— 这里每一项都是测出来的
| 指标 | 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,且没有冷启动。
这也是它能免费部署的原因。
架构
构建期(运作者做,一次性)
PDF ──解析──> 清洗 ──> 结构感知切块 ──> 去重 ──> 分片 ──> 上传 CDN
成本:约 40 秒/份
运行期(用户提问)
浏览器 ──按需下载语料分片──> 本地 BM25 检索 ──> 拼上下文
│
免费后端(只转发) ──> LLM ──> 带出处的回答
增量更新
新增一份文档 → 只处理这一份 → 上传一个文件
已有的内容一个字节都不用动
明确不做的事
知道不该做什么,和知道该做什么一样重要
| 不做 | 为什么 |
| 用 RAG 回答具体财务数据 |
企业实践里这类需求走数仓 / Text2SQL,不走 RAG。用文档检索去查数字,是拿短板碰长板 |
| 让模型替用户做计算 |
需要精确计算时应让代码算,模型只负责找与说 |
| 假装什么都能答 |
答不出时明确说"找不到" —— 实测这类判断的正确率是 87.7% |