RAG 表格文档怎么切片:保留表头、按行组切分与结构化双写
RAG 系统处理表格文档,最重要的原则是:不要按固定字数把表格切碎;每个切片都要带上表头和表格标题,按行组或按实体切分,必要时把每行转成一句完整描述,复杂查询则走结构化表。 这样检索到的片段才能独立回答问题。
为什么表格容易出错
常规切片按字数或段落切,表格被转成纯文本后,表头在第一块,后面的数据行在第二、三块。用户问「B 套餐的月费是多少」,检索命中了含「B 套餐」的那行数字,却没有表头,模型不知道哪个数字是月费。
第一步:解析时识别表格
- PDF、Word、网页解析时,用能输出表格结构的解析器,把表格保存为行列结构(如 Markdown 表或 JSON),而不是一串文字。
- 记录元数据:所属文档、章节标题、表格标题、页码。
- 合并单元格要展开填充,否则行数据会缺字段。
第二步:选择切分方式
小表:整表一块
行数少、内容短的表,整张表作为一个切片,前面加上表格标题和所在章节。
中大型表:按行组切分
每块包含若干行,每块都重复表头:
[文档:资费说明 / 章节:个人套餐 / 表:月费对照]
| 套餐 | 月费 | 流量 | 通话 |
| B 套餐 | … | … | … |
| C 套餐 | … | … | … |
实体型表:一行一句
产品参数、人员通讯录这类「一行一个实体」的表,可以把每行转成句子:
B 套餐:月费为…,包含流量…,通话…(来源:资费说明·个人套餐)
句子形式对语义检索更友好,也便于生成时引用。
第三步:复杂问题走结构化
「月费低于某值且流量最多的套餐是哪个」这类筛选、排序、聚合问题,向量检索并不擅长。可以把表格同时写入数据库或表格引擎(结构化双写),由路由判断问题类型:事实查找走向量检索,筛选聚合走结构化查询。
验收方法
准备一组针对表格的问题,覆盖:
- 单元格查找(某行某列的值)
- 跨行对比(两个实体对比)
- 需要表头才能理解的数字
- 表格标题或脚注里的限定条件
检查检索结果是否包含回答所需的表头和行,而不只看最终答案。
常见坑
- 脚注丢失:「以上价格不含税」常在表格下方,要并入切片或元数据。
- 跨页表格:解析后要拼接,否则第二页没有表头。
- 数字被模型改写:生成提示中要求数字原样引用,并附来源。