链载Ai

标题: 打造自己的RAG解析大模型:简单高效的跨页表格合并方案 [打印本页]

作者: 链载Ai    时间: 昨天 11:58
标题: 打造自己的RAG解析大模型:简单高效的跨页表格合并方案

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;line-height: normal;text-align: center;background-color: rgb(255, 255, 255);visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">


在构建 RAG 知识库时,PDF文档中的表格跨页现象是一个常见挑战。传统方法依赖复杂的逻辑来判断和合并表格,而更简单、高效的方案可以通过 chunk 的存储和上下文管理来解决。

两种表格合并算法

两种算法都基于版面识别判断法。

前提:正确识别版面并去除每页的页眉、页脚。

1. 合并后存储为一个chunk

判断当前页最后一个元素和下一页第一个元素的类型:

示例代码:

def merge_cross_page_tables(tables_per_page):  merged_tables = []  temp_table = None
forpage_num, tables inenumerate(tables_per_page): fortable in tables: iftemp_table: # 上一页存在未合并的表格 temp_table += table # 合并表格内容 merged_tables.append({"page": page_num,"table": temp_table}) temp_table = None else: temp_table = table iftemp_table: # 表格延续至下一页 continue returnmerged_tables


2. 基于分块与描述同步法(推荐)

将跨页表格的两部分分别提取,并生成独立的 chunk,一般第一个表格的描述信息就是第二页表格的描述信息,需要特殊处理就可以实现跨页。

这种方法无需实时合并表格,通过 LLM 在检索时合并上下文中的表格 chunk,完美解决跨页问题。

示例代码:

importpdfplumber
defextract_tables_as_chunks(pdf_path): chunks = [] prev_table_desc ="" table_counter =1
withpdfplumber.open(pdf_path)aspdf: forpage_num, pageinenumerate(pdf.pages): tables = page.extract_tables() fortableintables: ifprev_table_desc: desc =f"表格 {table_counter}(延续部分),前页描述:{prev_table_desc}" prev_table_desc =""# 重置描述 else: desc = f"表格 {table_counter}(第1部分)" prev_table_desc = desc
chunk = {"description": desc, "data": table, "page": page_num + 1} chunks.append(chunk) table_counter += 1
return chunks

两种方案的对比

方法
实现复杂度
存储结构
检索合并方式
版面元素判断法,合并
中等
单个 chunk 存完整表格
不需要额外合并
版面元素判断法,分块与描述同步法(推荐)
简单
多个 chunk
描述增强关联性 LLM 上下文自动合并输出


RAG 系统中的应用

存储:将跨页表格分为多个 chunk 存储,确保数据完整。

检索:用户查询时,RAG 系统会同时检索到表格的多个 chunk。

生成:LLM 根据表格的描述和数据自动合并,输出完整表格内容。

优势总结






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5