最近在搭一个基于RAG的文档问答系统,主要处理公司内部的PDF报告。目前用的langchain+chroma+openai embedding,分块策略是recursive split。但发现一个问题:只要文档里有表格或者图表,问答的时候模型就经常说“找不到相关信息”,明明表格里就是答案所在。感觉是分块时把表格内容切碎了,或者embedding时没有保留结构信息。请教各位大佬,有没有处理PDF中表格和图表的成熟思路?比如用多模态模型先把图转成文本描述,或者用OCR工具单独提取?希望不增加太多推理延迟。
RAG做PDF问答时,表格和图表内容总丢,有什么好办法?
全部回复
共 125 条这问题太典型了,recursive split对表格基本就是灾难,它按字符硬切,表头和数据行很容易被拆散,embedding的时候语义就全丢了。我之前试过先检测PDF里的表格区域,用camelot或者pdfplumber单独抽出来转成markdown格式,再作为一个独立chunk塞进库里,效果比直接切文本好不少。但图表又是另一回事,纯文本方案搞不定,得走多模态路线,比如把图截下来扔给GPT-4V或Qwen-VL生成结构化描述,再跟原图一起存,问答时优先检索描述文本。不过你说的延迟问题确实存在,如果每页都调视觉模型会很慢,我现在的做法是只在检测到图片或复杂表格时才触发OCR+描述,普通文本段落走原流程,这样能控制住大部分场景的耗时。还有个坑是表格转成文本后,如果数字多,openai embedding本身对密集数值的区分度就不够,你可能得混合关键词检索兜底,比如先用BM25召回候选段,再让LLM判断,比纯向量靠谱。你们公司报告里表格占比大概多少?如果特别多,可能还得考虑把表头信息和行数据单独存成结构化格式,问答时用代码解释器动态查。
试试把表格转成markdown再切块,图表用多模态模型生成摘要单独存,问答时合并检索,延迟可控。
表格确实容易在recursive split里被拦腰截断,我试过把chunk_size调大一点,配合pdfplumber先按表格区域提取,再单独喂给embedding,效果比直接切文本好不少。图表的话,如果不想上多模态模型,可以用现成的OCR工具把图里的关键数字和标题抽出来拼成一段描述,但速度会慢一些,得看你对延迟的容忍度。另外你用的是openai embedding,考虑过先把表格转成markdown格式再分块吗?结构保留得会好一点。
试试表格转成markdown再入库,检索效果比纯文本好不少,图表就上多模态描述吧。
表格这块我踩过类似的坑,后来改成先用unstructured把表格单独抽出来,转成markdown再单独入库,效果好了不少。图表的话确实麻烦,我试过用gpt-4o做图转文字描述,但延迟和成本都上去了。现在折中方案是表格走结构化提取,图表只对含关键词的页做多模态处理。你们内部报告图表多吗,如果不多其实可以人工补一下描述。