RAG 如何处理表格数据?
简化版
表格不能简单按行转纯文本,因为列头、合并单元格、单位和行列关系决定数值含义。结构化数据库优先用 Text-to-SQL/受控查询;文档表格则解析成带表名、表头、层级、行键、单位和页码的结构,按行组或子表建立索引,召回后携带必要表头,并用确定性计算器完成聚合与校验。
详细版
先识别表格类型:数据库表走 schema linking 和只读 SQL;PDF/图片表格做 OCR、单元格检测、row/column span 恢复。索引可同时存表级摘要、列级 schema、行级序列化和原图区域,多粒度召回:问题先找表与列,再筛相关行,避免把十万行全塞进上下文。
序列化必须保留列名与单位,例如 年份=2025 | 地区=华东 | 销售额_万元=120,不能只存 2025 华东 120。求和、排序、同比等交给 SQL/Python/计算器,LLM 规划并解释。评测拆成表召回、列/行命中、执行准确、答案与引用,加入合并表头、跨页、空值和 OCR 错误切片。
问题 -> 表/Schema召回 -> 列链接 -> 行过滤 -> 结构化执行 -> 结果+单元格/页码引用 -> LLM解释
完整版教学
一、表格语义来自二维结构
同一个“120”只有结合行键、列头和单位才知道是 2025 年华东销售额 120 万元。把 PDF OCR 文本按阅读顺序拼接,会让表头与数值脱离,模型可能把相邻列串错。表格处理第一目标是恢复结构,不是尽快生成 embedding。
多级表头和合并单元格尤其危险。上层“收入”可能横跨“国内/海外”两列,每个数据单元格需要继承完整 header path。跨页表还要识别重复表头与续表关系。
二、结构化与文档表格走不同路线
数据库已有类型、主键和约束,适合生成受限 SQL 并由数据库精确执行。PDF/HTML 表格需要先抽取网格和版面,再建立可搜索表示。把数据库百万行全部文本化做向量索引,既昂贵又无法可靠聚合。
| 来源 | 推荐主路径 | 补充能力 |
|---|---|---|
| SQL 数据库 | schema linking + SQL | 文档解释/术语检索 |
| HTML 表格 | DOM 解析 | 标题与周边文本 |
| 数字 PDF | 网格/坐标解析 | 原页引用 |
| 扫描表格 | OCR + 结构恢复 | VLM 复核低置信格 |
| 超宽/跨页表 | 子表与层级表头 | 邻接/父表回填 |
记忆钩子:数据库让引擎“算”,文档表格先让系统“认清行列”;LLM 最适合规划和解释,不适合心算大表。
三、多粒度索引怎样设计
表级文档存标题、说明、列名和时间范围,用于先找对表;列级表示帮助把“营收”链接到 revenue_cny;行级或行组表示用于筛具体实体。每层保留 table_id 和 cell 坐标,召回后能回到原结构。
table summary: 2024-2026各区域季度销售,单位万元
row record: table=T7; year=2025; region=华东; Q1=120; Q2=135
cell ref: T7[row=华东, col=2025/Q1] -> page 12 bbox(...)
行组不能过大导致主题稀释,也不能单格无上下文。常以主键行加完整相关表头为最小证据。
四、序列化如何避免歧义
自然语言序列化便于 embedding,但要显式重复列名、层级路径、单位和空值。null、0、破折号和“不适用”不能统一变空白。日期和千分位规范化时保留原文本,以便引用和核对。
对于 50 列宽表,只注入问题相关列及主键,但保留表级元数据。裁列由 schema linking 决定,并记录被裁列;用户问“同比”时必须保留两个时期,不能只取当前值。
五、Text-to-SQL 如何保证安全
给模型只读 schema 视图和允许表列,生成 AST/SQL 后解析检查只含 SELECT、限制行数与执行时间,并使用只读账户。租户和权限条件由后端强制注入,不能让模型决定是否添加。先 EXPLAIN 或在副本执行,防全表扫描。
SELECT SUM(amount_cny)
FROM sales_authorized_view
WHERE region = :region AND year = :year
LIMIT 1000;
参数化值防注入,授权视图防模型访问未列出的行。执行结果附 SQL 哈希、表版本和行数,便于审计。
六、计算为什么交给工具
求和、平均、排序、同比和 join 是确定性任务。LLM 对几十个数字心算容易漏项,应生成计划或公式,由数据库/计算器执行,再解释结果。工具返回数值、单位和数据来源,模型不得修改小数精度。
例如 2024 为 80,2025 为 100,同比增长应由工具算 (100-80)/80=25%。若分母为 0,工具返回特定错误状态,而不是让模型生成“无限增长”等未经业务定义的结论。
七、OCR 与引用怎样闭环
扫描表中小数点、负号和合并线容易误识别。每个 cell 保存 OCR 置信度与原图 bbox;关键金额低置信时放大 crop 用第二模型复核。行列总计可作为规则校验,例如分项和应接近合计。
答案引用应定位表名、页码、行键和列头,UI 高亮对应单元格。仅引用整份 100 页 PDF 无法核验。表格版本更新后绑定内容 hash,防旧答案跳到新数字。
八、常见误区与追问
- 误区:把 CSV 每行做 embedding 就解决表格 RAG。 缺表级检索、列语义、单位和聚合执行。
- 误区:LLM 可以直接对召回数字做可靠求和。 大量计算应交给 SQL/计算器并校验。
- 误区:OCR 字符正确就代表表格正确。 行列归属和合并表头错位仍会改变含义。
- 追问:大表如何控制上下文? 先表/列召回,再结构化过滤行,最后只注入结果和必要证据。
- 追问:如何处理跨页表? 根据表题、列宽和重复表头关联续表,统一 table_id 并保留页码。
- 追问:Text-to-SQL 如何防越权? 只读授权视图、SQL AST allowlist、强制租户谓词和资源限制。
九、加强记忆
表格 RAG 可记成“先认表、再找列、后筛行、工具算、单元格引用”。数据库走受控 SQL,文档表格恢复网格与层级表头;多粒度索引避免把整表塞给模型,确定性引擎负责聚合,答案回指具体页和 cell。保住行列、单位和版本,数字才真正有意义。