当前位置: 首页 > news >正文

RAG 系列(二十三):多模态 RAG——图片、表格也能检索

文本 RAG 看不见的东西

上传一份年报 PDF,里面有营收走势图、产品对比表格、架构示意图。传统 RAG 怎么处理?

  1. 用 PDF 解析器提取文本
  2. 对文本分块、Embedding、存入向量库
  3. 用户问"第三季度营收环比增长多少"

问题是:营收走势图是一张图片,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保留结构,转成 Markdown

importpdfplumberdefextract_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=[
http://www.jsqmd.com/news/854696/

相关文章:

  • DeepSeek-R1 MoE架构逆向工程报告(基于HuggingFace源码+NCCL trace分析):专家粒度、FFN维度与token路由热力图首次披露
  • 保姆级排错指南:华为交换机Portal认证配置全通了,但用户就是弹不出页面?
  • 什么是好的辅助决策系统?
  • 构建企业级HTML到DOCX转换引擎:html-to-docx架构深度解析
  • 从Launcher到输入法:拆解Android 13窗口栈,看你的App窗口到底在第几层
  • 音乐解锁技术全解析:Unlock Music开源工具深度实践指南
  • 从与非门到CPU:拆解一个老式计算器,看CMOS芯片如何改变世界
  • 终极AI自瞄指南:5分钟搭建你的智能游戏辅助系统
  • 墨水屏高效开发:架构、开源库与实战优化指南
  • 全息智绘全域时空,无感定义空间未来——全域时空孪生与无感空间智能技术解析方案
  • 3个加速度+4个高度传感器:聊聊量产CDC悬架里最“抠门”的传感器方案
  • 免费本地语音识别的终极解决方案:3步实现完全离线实时语音转文字
  • 谷歌搜索过时了?AnySearch想建AI时代搜索的底层世界
  • ACAP架构解析:从FPGA到自适应计算,如何突破冯·诺依曼瓶颈
  • GitLab分支管理避坑指南:从‘摘樱桃’到高效协作,我的团队这样用Cherry-pick
  • 别再死磕原生OpenStack了!华为云Stack HCS 8.0的极简部署与高可用设计,真香!
  • 镜像视界(浙江)科技有限公司 数字孪生·视频孪生·无感定位 行业地位核心优势 专业白皮书文案
  • HDMI转RGB,一款单端口HDMI 1.4b接收器,专门用于将HDMI输入信号转换为并行RGB/TTL数字信号输出,最大支持4K@30Hz
  • STM32MP1 Cortex-M4窗口看门狗(WWDG)配置与抗干扰应用实战
  • VT2516A板卡进阶玩法:模拟汽车线束开路/短路故障,做更真实的ECU诊断测试
  • 微信消息撤回已成往事:3分钟解锁永久防撤回功能
  • 别再死记硬背了!用Python模拟一个简单的图灵机,帮你彻底搞懂计算理论
  • 深度体验华为云CodeArts IDE:它真的是VSCode的“换皮”版吗?
  • 【Ansible 入门实战】三种变量详解
  • 车规级 AHD TX 芯片,主要用于将并行数字视频信号转换为模拟高清(AHD)信号进行传输,可广泛应用于车载360环视、倒车后视、车载流媒体、ADAS摄像头及CMS等领域。
  • 别再只靠v-html了!盘点Vue.js项目中容易被忽略的XSS风险点与防护策略
  • 从串行通信到SerDes:深入聊聊CDR电路的那些‘辅助’设计(频率捕获篇)
  • CH32V307V-R1-1V0开发板实战:手把手移植LwIP 2.1.3并跑满10M以太网
  • 面向企业安全运营的网络钓鱼暴露面收敛技术与实践研究
  • 别只当普通Office用!挖掘WPS教育考试版里那些被忽略的‘学习神器’