
上交&清华开源ST-Raptor:无需SQL、无需OCR,直接对话任意复杂表格
一、半结构化的痛点
在真实业务中,80% 以上的“表格”并非标准的关系型二维表,而是带有合并单元格、层级标题、嵌套子表、行列交叉说明的半结构化表格。 布局五花八门、结构复杂多变,让自动化数据处理变得异常困难。 典型场景包括:
- 医院 EMR 里的检验报告单
- 券商 PDF 年报里的财务报表
- Excel 里的项目进度横道图
- 电商后台的订单汇总表
这些表格无法用固定 schema 建模,却承载了高价值知识。过去,只能依赖业务专家“肉眼”检索,耗时且易错。
二、已有的技术路线回顾
技术路线 | 代表工作 | 主要瓶颈 |
NL2SQL | OpenSearch-SQL、PETSQL | 必须先转成结构化表,合并单元格被打碎,行列语义丢失 |
NL2Code | ReAcTable、TAT-LLM | 依赖 Pandas 的行列索引,无法表达“跨子表”关系 |
多模态 VLM | TableLLaVA、mPLUG-DocOwl | 表格转图片→100+ 行就超出视觉窗口;文字密集时OCR 噪音大 |
直接 LLM 提示 | GPT-4o、DeepSeek-V3 | 线性化 HTML/JSON 后“迷失在中间”,对层级标题、合并单元格** hallucination 严重** |
结论:在“布局理解”与“内容检索”两个核心环节,现有方法均出现结构性信息损耗,导致问答精度卡在 60% 左右。
三、ST-Raptor方案
ST-Raptor试图解决半结构化表格以下三个痛点:
- 如何在不破坏布局的前提下,让大模型“看懂”复杂表格?
- 如何让模型像业务人员一样,先定位标题、再交叉比对、最后汇总答案?
- 如何在多跳推理链条中自动校验,避免一步错步步错?
3.1 ST-Raptor 的核心创新有六点:
- HO-Tree 表达:首次提出“层级-正交”双树结构,把任意半结构化表格无损压缩成一棵树,节点=单元格,边=层级/并列关系。
- 原子操作集:设计 9 种树原语(取父节点、取子树、条件过滤、数值计算…),把“表格问答”形式化为“树遍历脚本”。
- 问题分解+对齐:LLM 先将复杂问句拆成单跳子问句,再通过嵌入相似度把操作参数对齐到树节点,解决“指代漂移”。
- 双向验证:
- 正向——每步执行后检查返回节点是否为空、是否偏离问题语义;
- 反向——用最终答案反生成多套等价问句,若原始问句与反生成问句的脚本差异大则打低置信度。
- 基准 SSTQA:采集 102 张真实业务表、764 问,** nesting 深度、合并单元格密度、问题类型**均超出现有数据集一个量级。
- 效果:在 SSTQA 上比 GPT-4o 绝对提升 10.23%,在 Hard 表上领先 20%+;消融实验表明** HO-Tree 结构建模单点贡献 15.15%**。
3.2 ST-Raptor架构
ST-Raptor 框架共 4 个模块,流水线如图 3 所示。下文按“建树→问句解析→脚本执行→答案验证”四段展开。
3.3 HO-Tree:一张表就是一片“森林”
3.3.1 形式化定义
对任意半结构化表 T,将其拆成元数据树 MTree与数据树 BTree,再建立“叶-层”指针,形成 HO-Tree:
- MTree 节点 = 表头、子表标题、合并格;
- BTree 节点 = 纯内容单元格;
- 边语义 = 层级包含或正交并列;
- 指针:MTree 的叶节点 → BTree 的对应层,实现“标题列”到“数据列”的硬链接。
例:图 4 右下角“TD Tech”表,可递归解析为L4(Header-Orthogonal-Subtables) → L3(Orthogonal-Subtables) → [L2(Header-Multiple-Values)]最终得到 3 层嵌套 HO-Tree。
3.3.2 建树算法(Algorithm 1)
输入:Excel/PDF/HTML 原始表输出:HO-Tree 森林
步骤 0:VLM 截图识别
- headless 浏览器渲染 → 高清图 → InterVL2-26B 提示词:“请给出这张表如果存成 JSON 可能出现的所有 key” → 拿到候选标题集合 C。
步骤 1:Embedding 对齐
- 用 Multilingual-E5 对所有单元格做 embedding,与 C 做余弦相似度,≥阈值 τ=0.82者标记为标题格。
步骤 2:表格分区(TablePart)
- 原则 P1:若合并格跨整行/列 → 顶级标题,下方或右侧划为子表;
- 原则 P2:若同时出现顶对齐与左对齐标题,格多者建 MTree,另一方入 BTree;
- 原则 P3:检测到正交子表 → 递归切片。
步骤 3:DFS 组装
- 对每片子表,按 L1-L4 类型执行 ConsTree:– L1、L2 → 单层树;– L3、L4 → 节点 value 字段再挂一棵子 HO-Tree,实现无限级嵌套。
复杂度:最坏扫描全表 2 次,**O(N·M)**,N、M 为行列数;嵌入比对可 GPU 批量化,102 张表平均 2.3 s 完成森林构建。
3.4 原子操作集:9 个“树 API”搞定 95% 查询
作者从 2 万张真实问句中归纳出 9 种高频操作,分为 4 类:
类别 | 操作 | 说明 | 示例 |
数据检索 | CHL(V) | 取 V 的所有子节点 | CHL(“Employee Info”)→[Mark, Jone, Ray…] |
FAT(V) | 取父节点 | FAT(“Mark”)→“Research 1” | |
EXT(V1,V2) | 交叉检索 | EXT(“Level”,“A+”)→[Mark, Jone] | |
数据操作 | Cond(D,func) | 过滤 | Cond(EXT(…), λx: x>30) |
Math(D,func) | 聚合 | Math(CHL(“Age”), max) | |
Cmp(D1,D2,func) | 比较 | Cmp(EXT(2022), EXT(2023), >) | |
对齐 | Align(P,HO-Tree) | 把自然语言 P 对齐到节点 | Align(“highest paid”→“Salary” |
推理 | Rea(Q,D) | LLM 总结/判断 | Rea(“是否盈利”, D)→“是” |
脚本示例:“部门 A 与 C 中评级高于 A 的员工共几人?”→ 分解为
- SQ1: Count(Cond(EXT(Department, A), Level>A))
- SQ2: Count(Cond(EXT(Department, C), Level>A))
- SQ3: Math([SQ1, SQ2], sum)
3.5 问题分解与操作-表对齐
3.5.1 分解策略
- 采用 few-shot 提示:动态检索与当前问句最相似的 3 个示例(embedding 相似度),连同 HO-Tree 的元信息一起喂给 DeepSeek-V3。
- 要求模型输出“子问句 + 依赖关系图”,保证下游可并行可串行。
3.5.2 对齐策略
- 对操作中的每个参数 p,用 E5 编码后与 HO-Tree 所有节点做最近邻搜索,Top1 置信度<0.75 时触发人工模板兜底。
- 连续值列额外用规则正则提取范围,解决“大于 30 岁”这类阈值描述。
3.6 双向验证:让模型“自检”
3.6.1 正向验证(Forward)
- 每步执行完检查:
返回节点非空;
节点类型与问题期望一致(数值/文本/日期);
行号/列号未越界。
- 任一失败 → 重生成操作,最多重试 3 次,仍失败则返回“无法回答”。
3.6.2 反向验证(Backward)
- 用最终答案 A 反生成 5 个等价问句(few-shot 提示)。
- 对这 5 个问句再走一遍完整 pipeline,得到 5 个脚本。
- 用最长公共子序列(LCS)计算与原始脚本的相似度,平均相似度<0.6 时置信度=0,系统输出“可疑答案”标记。
四、可落地的工业实践建议
- 数据入口:直接解析 Excel/PDF,无需人工整理成数据库;
- 质检场景:把 HO-Tree 脚本固化成规则,每晚批量跑,异常答案自动告警;
- 交互分析:在前端嵌入“子问句+中间表”展开,业务人员可点选修正,形成人机协同闭环;
五、个人总结:为什么值得一读
ST-Raptor 给出了一个“把视觉布局压缩成可计算结构”的完整范式:
- HO-Tree让“合并单元格”第一次拥有了无损的代数表达;
- 原子操作把表格问答从“黑盒提示”变成白盒脚本,可调试、可验证;
- 双向自检机制对幻觉“零容忍”,让大模型在严肃场景落地成为可能。
如果你正在做文档智能、财务审核、医疗质控、报表自动化等方向,这篇论文提供了从模型到 benchmark 再到工程细节值得细细品味。
本文转载自CourseAI,作者:CourseAI
