本文档记录当前 PDF 入库策略,重点解决国标文件中大量表格、限量值、单位和页码溯源的问题。
PDF
-> PyMuPDF 按页读取
-> 页面正文块提取
-> 表格区域检测
-> 正文块避开表格区域
-> 表格转 Markdown
-> 表格逐行转“检索事实”
-> RuleChunker 切块
-> 每个 chunk 加来源文件、页码、内容类型、表格号、表题
-> BGE Embedding
-> ChromaDB
当前会生成以下 chunk_type:
| 类型 | 说明 |
|---|---|
page_text |
PDF 页面正文,不包含检测到的表格区域 |
table_markdown |
表格原文转 Markdown,保留整体结构 |
table_row_fact |
表格每一行转成面向问答检索的自然语言事实 |
原始表格可能是:
| 食品名称 | 食品添加剂 | 最大使用量/(g/kg) |
|---|---|---|
| 糕点 | 山梨酸钾 | 1.0 |
入库时会生成类似文本:
来源文件:GB xxxx.pdf;页码:第12页;内容类型:table_row_fact;表格:2。
来源:第12页,表格2。检索事实:山梨酸钾在糕点中的最大使用量/(g/kg)为1.0,单位见字段“最大使用量/(g/kg)”。可检索问法:山梨酸钾在糕点中的限量是多少。完整字段:食品名称为糕点;食品添加剂为山梨酸钾;最大使用量/(g/kg)为1.0。
这样比单纯保存表格文本更适合回答:
山梨酸钾在糕点中的限量是多少?
当前还没有真正接入 PaddleOCR。对于扫描件 PDF,后续会增加:
页面渲染为图片 -> PaddleOCR -> 版面/表格恢复 -> 同样生成 page_text/table_row_fact
当前也没有使用 DeepSeek 做表格抽取。原因是基础表格解析和类型识别应优先使用确定性工程逻辑;DeepSeek 更适合后续做:
- 表格标题补全
- 字段语义归一
- 复杂表头解释
- 自动生成更多问法
- 对 OCR 噪声进行纠错
只运行预处理脚本不会影响向量库。
调用 /api/v1/documents/upload 会写入:
- SQLite:
data/app.db - 原始文件:
data/uploads/ - ChromaDB:
data/chroma/
目前重复上传同一文件会产生多个 document_id 和重复向量。后续应增加 file_hash,支持重复文件跳过或覆盖。