大模型处理表格:扁平化序列化与结构感知

FreeGuideOnline 最新 2026-06-23

大模型处理表格:扁平化序列化与结构感知

为什么大模型“看”表格会困难?

表格是人类最熟悉的数据组织形式,但对大语言模型(LLM)而言,二维网格与纯文本输入之间存在天然鸿沟。模型只能处理一维的 token 序列,而表格却拥有行、列、合并单元格、多层表头等丰富结构。如果直接将表格“拍平”送入模型,往往会导致信息丢失或推理偏差。

本教程将带你了解两种主流表格表示方法:扁平化序列化结构感知,并学会在不同场景下选择合适策略。


扁平化序列化:表格“文本化”的基础

扁平化序列化(Flat Serialization)是将表格数据转换成线性文本,使得大模型可以像阅读普通段落一样处理表格。这种方法实现简单,但必须保留足够的行列关系线索。

1. CSV / TSV 格式

逗号分隔值(CSV)或制表符分隔值(TSV)是最直接的序列化方式。
优点

  • 结构规整,易于解析生成
  • 模型在预训练中已见过大量类似数据

缺点

  • 没有显式列名与数据类型信息
  • 对缺失值、空格、特殊字符敏感
  • 模型可能把逗号当作普通标点,丢失对齐

示例

Name,Age,City
Alice,30,New York
Bob,25,Los Angeles

2. Markdown 表格

Markdown 表格以人类可读的方式呈现单元格边界,是目前最受推荐的扁平化方案。

Name Age City
Alice 30 New York
Bob 25 Los Angeles

为什么 Markdown 表格更优?

  • 竖线和连字符提供了视觉锚点,帮助模型识别行列分隔
  • 对齐符号“:---”天然携带列类型信息(虽然微弱)
  • 许多新一代模型在微调时被特意训练了大量 Markdown 表格上下文

实战技巧

  • 确保表头与分隔行正确,否则模型可能误解为普通文本
  • 包含复杂内容时,考虑用引号包裹单元格内特殊字符
  • 超大表格应拆分,避免超过上下文窗口

3. JSON 数组表示

将表格转为对象数组,每个对象代表一行,键为列名。

[
  {"Name": "Alice", "Age": 30, "City": "New York"},
  {"Name": "Bob", "Age": 25, "City": "Los Angeles"}
]

适用场景:当模型需要进行键值查询或结构化输出时,JSON 格式可以更好地保存列名与值的对应关系。但大量冗余的键名会消耗更多 token,且深层嵌套结构不易处理。


结构感知:让模型真正“理解”表格

扁平方法丢失了表格的内在关系,比如同一单元格的多层级归属、汇总行与明细行的区分、合并单元格等。结构感知(Structure-Aware)方法通过注入位置编码或额外描述,让模型掌握表格的几何与语义结构。

1. 树形 / 层级序列化

当表格存在多层表头或分组时,可以用缩进、括号或 XML 标签构建树状结构。

示例(多层表头表格):

TopLevel: 
  -> SubLevelA: 
       Column1: Value1
       Column2: Value2
  -> SubLevelB:
       Column1: Value3
       Column2: Value4

也可以使用类似 HTML 表格的嵌套标签:

<table>
  <tr><td rowspan="2">Region</td><td colspan="2">Revenue</td></tr>
  <tr><td>Q1</td><td>Q2</td></tr>
  <tr><td>East</td><td>100</td><td>120</td></tr>
</table>

大部分大模型能理解 HTML 结构,这种表示直接传达了合并单元格的信息。

2. 坐标化位置编码

为每个单元格赋予所在行、列索引以及跨越信息,以纯文本或特殊标记呈现。

Cell(0,0,"Name") Cell(0,1,"Age") Cell(0,2,"City")
Cell(1,0,"Alice") Cell(1,1,"30") Cell(1,2,"New York")
Cell(2,0,"Bob") rowspan=2 Cell(2,1,"25") Cell(2,2,"Los Angeles")
Cell(3,0,colspan=2,"Charlie")

关键点

  • 明确写出 rowspan / colspan 数值
  • 将坐标信息显式注入,帮助模型计算相对位置

对于需要进行空间推理的任务(如“第三行第二列是什么?”),坐标化方法准确率大幅提升。

3. 图结构编码

将表格视为节点图:每个单元格是节点,通过边连接同行、同列或同语义归属。用标记语言描述节点和边。

Node1: Name, row=0, col=0
Node2: Age, row=0, col=1
Edge: same_row(Node1,Node2)

这种方法的实现成本高,但能处理极复杂的表格,比如财务报表中的公式引用、交叉汇总。通常需要定制解析器,适合对准确度要求极高的企业场景。


选择策略:什么时候用扁平?什么时候用结构感知?

场景特征 推荐方法 理由
简单二维表格,无合并单元格 Markdown 表格 Token 节省、通用性强
需要模型返回 JSON 结构化答案 JSON 数组 保留键值关系,便于后处理
包含多级表头或跨列单元格 HTML / 树结构 显式表达合并关系
需要精确位置回答(如单元格坐标) 坐标化位置编码 提供行列索引,消除歧义
超大表格且需要逐步推理 分块扁平化 + 结构标记 平衡长度与结构完整性

混合策略:在实际工程中,可以先用扁平方法加载表格概览,再对局部复杂区域应用结构感知序列化,并配合提示工程引导模型关注特定结构。


实战演练:构建一个表格问答 Prompt

目标:回答“2023年哪个城市销售额最高?”表格包含多级表头且存在合并项。

1. 原始表格(部分)

  • 表头第一层:“Region”、“2023”、“2024”
  • “2023”下分为“Q1, Q2”
  • 某些地区单元格跨行

2. 采用 HTML 结构序列化

<table>
<tr><th rowspan="2">Region</th><th colspan="2">2023</th><th colspan="2">2024</th></tr>
<tr><th>Q1</th><th>Q2</th><th>Q1</th><th>Q2</th></tr>
<tr><td>North</td><td>200</td><td>250</td><td>300</td><td>320</td></tr>
<tr><td>South</td><td>180</td><td>220</td><td>270</td><td>290</td></tr>
</table>

3. 构建 Prompt

你是一个数据分析助手。请分析以下HTML表格,提取2023年(即Q1和Q2合计)每个地区的总销售额,并找出最高销售额的地区。

表格数据:
[粘贴HTML]

请按JSON格式输出结果:{"top_region": "...", "max_total_sales": ...}

4. 模型输出

{"top_region": "North", "max_total_sales": 450}

如果仅用 Markdown 扁平化,合并单元格信息会丢失,可能产生错误汇总。而 HTML 结构直接告知了列的多级归属,模型能正确计算。


常见陷阱与调试建议

  1. Token 浪费:JSON 数组键名冗余,一个1000行的表格可能消耗数万 token,优先考虑 CSV 或 Markdown 表格格式,除非确需结构化检索。
  2. 数字被割裂:扁平化时,长数字可能被分词器切断,如“100,000”被切成“100”和“,000”。建议去除数字中的格式化逗号,或用空格代替。
  3. 对齐幻觉:模型可能“脑补”表格对齐,即使你给的文本排版错乱。始终用代码块包裹表格,并添加横线分隔。
  4. 跨行合并检测:如果必须用扁平化,可额外用文字描述合并区域,例如:“注意:Region列中‘East’占据第2-3行。”

总结

表格对大模型并非不可逾越的障碍,关键在于选择恰当的表示语言。扁平化序列化(尤其是Markdown表格)适合大多数轻量级任务,而结构感知方法在复杂表格理解中表现不可或缺。掌握这两类技巧,你就能让大模型像真正的数据分析师一样“读表”。

下一步学习建议:尝试用 Python 的 pandas 将 Excel 表格动态转换为 Markdown 或 HTML,配合 LangChain 构建一个自动化表格问答应用。