文本 RAG 看不见的东西上传一份年报 PDF,里面有营收走势图、产品对比表格、架构示意图。传统 RAG 怎么处理?用 PDF 解析器提取文本对文本分块、Embedding、存入向量库用户问"第三季度营收环比增长多少"问题是:营收走势图是一张图片,PDF 解析器只会把它的 alt text(通常是空的)或者图片文件名提取出来。数字在图里,不在文本里,RAG 永远找不到。表格情况稍好,但也有问题:解析器可能把表格拉平成一行行文字,原来的行列结构丢失,语义变得混乱。这是真实的业务痛点。文档里 30%–50% 的信息通常以非纯文本形式存在。三条处理路线路线一:提取 + 文本化最直接、最成熟的方案:把图片和表格转换成文字描述,再走标准的文本 RAG 流程。图片处理:用视觉语言模型(VLM)生成描述fromopenaiimportOpenAIimportbase64defdescribe_image(image_path:str)-str:withopen(image_path,"rb")asf:image_data=base64.b64encode(f.read()).decode("utf-8")client=OpenAI()response=client.chat.completions.create(model="gpt-4o",messages=[{"role":"user","content":[{"type":"image_url","image_url":{"url":f"data:image/png;base64,{image_data}"}},{"type":"text","text":"详细描述这张图片的内容,包括所有数字、标签、趋势和关键信息。如果是图表,列出所有数据点。"}]}])returnresponse.choices[0].message.content表格处理:用pdfplumber保留结构,转成 Markdownimportpdfplumberdefextract_tables_as_markdown(pdf_path:str)-list[str]:tables_md=[]withpdfplumber.open(pdf_path)aspdf:forpage_num,pageinenumerate(pdf.pages):fortableinpage.extract_tables():ifnottable:continue# 第一行作表头header=table[0]rows=table[1:]md="| "+" | ".join(str(hor"")forhinheader)+" |\n"md+="| "+" | ".join("---"for_inheader)+" |\n"forrowinrows:md+="| "+" | ".join(str(cor"")forcinrow)+" |\n"tables_md.append(f"[第{page_num+1}页表格]\n{md}")returntables_md整合进 RAG 流程:fromlangchain_core.documentsimportDocumentdefprocess_document(pdf_path:str)-list[Document]:docs=[