理解并输出图片的RAG

理解并输出图片的RAG
orzCat前言
从前面工作[[从0开始构建简单RAG]]已经得到了一个基本的rag结构,但是对图片并没有进行处理,主要需要解决的问题在于
我的知识库文档是带有图片的,我希望RAG能理解图片并在我需要的时候回答
有些希望做知识库的文档是PDF格式,并非markdown格式
有些文档中的图片是没有意义的配图,知识库里面不需要这些
我希望回答能直接给出相关的图片而不是路径或者别的什么
解决思路
引入VLM模型
传统对于图片的解决方案是使用ocr,但是我希望能对于图片有更好的理解方便召回,同时能抛去无意义图片,并对于复杂的图片(代码,图表等)有更好的效果,于是可以选择VLM
使用方式
在导入文档的时候,如果是markdown格式的文档,图片会给出位置,我们获取图片位置的base64调用VLM模型让其描述图片,将描述的内容直接作为一个chunk进行嵌入,更进一步的,我们可以将其base64或者其文件位置(统一用绝对路径防止出错)作为元数据在嵌入时一并存入数据库进行保存
排除无关图片
在引入VLM模型后,更进一步可以将上下文一并传递给VLM,让其判断该图片是否是一个有意义的图片,还是一个无意义的配图等
- 参考prompt:
请根据上下文分析这张图片是否包含有意义的信息。
如果图片只是装饰性的、无实质内容的配图(如分隔线、背景图、装饰性插图等),请直接回复”None”。
如果图片包含有意义的信息(如图表、数据可视化、流程图、实质性内容的照片等),请描述这张图片的内容;同时在处理VLM传回的信息后加一层判断
随后在处理VLM返回的信息时加上一层判断(返回了None或者长短小于10等待)即可
优化RAG问答prompt
现在图片的对应描述已经存入到知识库中,只需要将索引到的内容加上图片地址并要求LLM回答时给出图片的地址且使用markdown格式,就能实现图片的RAG问答,最后再将输出用markdown格式渲染即可
优化VLM处理速度
先前的处理逻辑时碰到图片,进行处理嵌入,然后继续向下的顺序处理。为了加快速度,可以在碰到图片时先保存相关信息并跳过,留下一个占位符,然后所有文本信息处理完了之后在并发进行VLM的处理(前提是使用api支持并发),将有文本描述的图片嵌入,没有意义的图片将占位符删除即可
使用MinerU转pdf
上面的所有实现都是基于markdown,对于pdf文件可以使用MinerU进行处理,MinerU可以将pdf转为markdown,单个pdf在GPU加速下需要一两分钟,但是效果非常好,markdown文件和提取出来的图片都会一并保存好
待优化
对于markdown文件中图片是使用图床的情况,可以通过获取图床图片继续后续流程