尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

RAG 知识库问答实战(6):处理表格图片等多模态文档

RAG 知识库问答实战(6):处理表格图片等多模态文档 上一篇用混合召回和重排提高了纯文本证据的覆盖率。然而财报中的数值关系、操作手册里的截图箭头、扫描合同上的印章都无法靠扁平文本完整表达。本篇把解析层扩展为版面元素、表格与图片并让它们仍能进入统一检索和引用链路。一、痛点把页面抽成一串字会丢失关系表格的含义来自行标题、列标题与单元格交叉。若 PDF 抽取结果按阅读顺序变成“华东 120 华南 98 2025 2026”模型无法判断数字属于哪个年份。图片可能承载架构连接、按钮位置或故障现象OCR 只能识别文字不能解释空间关系。扫描页甚至没有文本层需要先检测再 OCR。处理多模态文档的核心不是给每页生成一段长摘要而是建立页面坐标系中的元素模型。每个元素记录类型、边界框、页码、父级标题、原始资源 URI、抽取器版本和置信度。阅读顺序由版面模型决定表格保留二维结构图片保存原图与可检索描述。引用则链接到页码甚至高亮区域。二、原理检索表示与展示证据可以不同表格至少保存三种形式HTML 或二维数组用于忠实展示按行展开的自然语言用于嵌入原始截图用于复核。比如单元格 120 应展开为“2025 年华东区销售额为 120 万元”把表头补进每行。复杂合并单元格要先规范化单位与脚注不能丢失。图片可走两路OCR 文本用于精确词召回视觉语言模型生成的受控描述用于语义召回。若系统支持多模态嵌入也可直接编码图像但仍应保留文字描述以便审计。下面把二维表转换为自包含的行级证据验证表头、单位与来源稳定继承。fromdataclassesimportdataclassdataclass(frozenTrue)classTableEvidence:evidence_id:strtext:strpage:introw_index:intdeftable_to_evidence(headers:list[str],rows:list[list[str]],page:int,unit:str,)-list[TableEvidence]:ifany(len(row)!len(headers)forrowinrows):raiseValueError(ragged table)result[]forrow_index,rowinenumerate(rows,start1):pairs[f{key}{value}forkey,valueinzip(headers,row,strictTrue)]text.join(pairs)f单位{unit}result.append(TableEvidence(fp{page}-r{row_index},text,page,row_index))returnresult headers[地区,2025年,2026年]rows[[华东,120,138],[华南,98,105]]foritemintable_to_evidence(headers,rows,page7,unit万元):print(f{item.evidence_id}\t{item.text})运行输出p7-r1 地区华东2025年1202026年138单位万元 p7-r2 地区华南2025年982026年105单位万元行级证据适合“华东 2026 年是多少”整表证据适合比较与汇总。可以同时索引两种粒度通过parent_table_id关联命中某行后将相关表头与必要邻行一起送给模型。绝不能让模型凭摘要进行精确算术重要数值应从结构化单元格读取并由代码计算。三、实现建立检测、抽取、校验和降级队列PDF 页面先判断是否存在足够文本层没有则以合适分辨率渲染并 OCR。文本型页面也要做版面检测识别标题、正文、列表、表格、图片和脚注。常用工具包括 PyMuPDF、pdfplumber、Unstructured、PaddleOCR、Tesseract 与文档理解模型。选择时用自己的双栏、旋转页、中文表格和扫描质量测试。任何视觉抽取都带置信度。低置信页面进入人工复核或标记为不可回答不要静默写入索引。下例实现一组可自动化的页面质量门输出明确状态和原因便于路由到 OCR、复核或正常索引。fromdataclassesimportdataclassdataclass(frozenTrue)classPageStats:page:inttext_chars:intocr_confidence:float|Nonetable_cells:intmalformed_cells:intdefroute(page:PageStats)-tuple[str,str]:ifpage.text_chars20andpage.ocr_confidenceisNone:returnocr,text layer is nearly emptyifpage.ocr_confidenceisnotNoneandpage.ocr_confidence0.80:returnreview,low OCR confidenceifpage.table_cellsandpage.malformed_cells/page.table_cells0.10:returnreview,table structure is unreliablereturnindex,quality gate passedpages[PageStats(1,850,None,0,0),PageStats(2,0,None,0,0),PageStats(3,120,0.72,20,1),PageStats(4,300,0.95,40,2),]forpageinpages:status,reasonroute(page)print(fpage{page.page}status{status}reason{reason})运行输出page1 statusindex reasonquality gate passed page2 statusocr reasontext layer is nearly empty page3 statusreview reasonlow OCR confidence page4 statusindex reasonquality gate passed图片描述提示应要求陈述可见事实、文本、对象关系与不确定性禁止补猜看不清的数值。保存所用模型、提示版本和原图哈希模型升级后可只重算图片描述。敏感图像调用外部视觉 API 前须完成数据分级和脱敏不能因为“只是索引”绕过合规边界。元素之间的父子关系同样重要。正文中的“如下图所示”应通过页面距离、编号和标题关联到对应图片表格脚注必须挂到表格而非普通段落。检索命中图片描述时可同时取回前置说明和图注但要设置邻域上限。关系边应保存置信度低置信关联不自动用于高风险回答。四、踩坑跨页、单位和坐标变换最容易出错跨页表格可能在第二页重复表头也可能省略表头。合并时用列数、标题和几何位置判断保留原页范围不能仅因两页相邻就拼接。负号、千位分隔、百分号和脚注星号必须经过类型校验。OCR 常混淆0/O、1/l对于金额、日期和编号应加正则与业务范围检查。页面旋转、裁剪和缩放会改变坐标。引用高亮必须保存抽取时页面尺寸与坐标原点并在前端做明确变换。若只存截图坐标换渲染 DPI 后框会偏移。对图表不要仅提取图例文字趋势、轴单位和数据点关系需要视觉模型或专门解析器并在低置信时显示原图供用户核验。还要控制制品体积和重复计算。原始文件、页面渲染图、裁剪元素、OCR JSON 和缩略图分层存储以内容哈希去重并设置生命周期。索引只保存可检索文本与资源引用不把大图直接塞进元数据。处理任务记录 CPU、GPU 与页耗时才能识别某类复杂 PDF 是否拖垮整个队列。五、验证按元素类型分别建立黄金集测试集应包含普通文本、双栏、扫描、旋转页、合并单元格、跨页表、流程图和截图。表格评测单元格准确率、结构相似度及问答正确率OCR 看字符或词错误率图片描述看关键实体与关系覆盖引用验证页码和高亮框。最终还要检查“命中行—取回整表—回答数值”这一端到端路径。本篇让表格与图片成为可追踪证据而非不可见附件。下一篇将进一步约束生成阶段用证据充分性判断、引用校验和声明级溯源减少幻觉。参考来源Unstructured文档元素与 hi_res 策略PaddleOCRPP-Structure 文档分析PyMuPDF文本与图像抽取 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《RAG 知识库问答实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
返回列表