资讯动态

掌握多模态RAG:图文并茂的知识库构建与检索,小白程序员必备收藏指南

发布时间:2026/8/22 13:51:36 来源:尧图企业网站定制
本文深入探讨了如何利用多模态RAG技术将图像、表格和文字信息有效整合进知识库并通过三种主流方案——CLIP多模态嵌入、图生文摘要和ColPali视觉检索——详细解析了实现路径。文章强调了处理PDF文档时不同内容类型的特殊策略并指出了常见的技术陷阱旨在帮助读者构建高效、精准的多模态检索系统。上一篇我们把 GraphRAG 拆了个底朝天搞清楚了知识图谱怎么接进检索链路、多跳推理为什么准确率能翻倍。这篇我们换一个维度——不聊图谱了聊「图片」。真实业务的文档里有多少内容是纯文字的不多。一份技术报告里大量是架构图一份财务 PDF 里最关键的是那张趋势表格一份产品文档里全是截图和流程图。你用纯文本 RAG 去做检索模型看到的是 OCR 识别后的乱码或者直接就是空——图片根本没进知识库。结果就是用户问「第三页那个流程图怎么理解」系统返回一大堆不相关的文字段落或者直接说「没找到相关信息」。这坑把太多人坑过了。这篇我们从三种主流方案入手把多模态 RAG 的实现路径一次讲透图片怎么入库、表格怎么处理、复杂 PDF 怎么解析以及什么场景用哪种方案。1、 纯文本 RAG 的视觉盲区信息不处理就丢失先把问题说清楚再谈方案。当你用UnstructuredLoader或PDFLoader加载一份 PDF 时底层是这样处理内容的文字内容直接提取为文本成功表格则交给 OCR 识别结构往往被破坏图片要么直接丢弃要么保存为图片文件但没有任何处理——对检索系统来说等于不存在。丢失的不是装饰往往是核心信息架构图里的系统组件关系、财务表格里的季度增长数字、操作手册里的界面截图。我有个客户搭了个内部知识库工程师反映检索总是答非所问。排查发现核心系统架构知识全存在 PPT 的图里文本提取拿到的是「架构设计详见图2」这种废话。解法有三条路先看一眼对比方案核心思路精度成本适用场景多模态嵌入CLIP图文映射到同一向量空间~60%低图像相似搜索图生文摘要CaptionVLM 先把图片转为文字描述再做文本检索~90%中-高文档精准问答ColPali 视觉检索整页 PDF 直接作为图片索引零 OCR最高中复杂排版文档下面逐个拆。2 、方案一CLIP 多模态嵌入——图文统一向量空间CLIP 是 OpenAI 2021 年发布的对比学习模型核心能力是把文字和图片映射到同一个高维向量空间语义相近的文字和图片在空间里距离相近。用文字问它能找到语义最匹配的图片。TypeScript 实现LangChain ChromaDB OpenCLIPimport { Chroma } from langchain/community/vectorstores/chroma; import { OpenCLIPEmbeddings } from langchain/community/embeddings/openclip; import { ChatOpenAI } from langchain/openai; import * as fs from fs; import * as path from path; // 1. 初始化多模态向量库 const embeddings new OpenCLIPEmbeddings(); const vectorStore await Chroma.fromExistingCollection(embeddings, { collectionName: multimodal_docs, }); // 2. 图片和文字都写入同一向量库 const imageUris fs .readdirSync(./docs/images) .filter((f) f.endsWith(.png) || f.endsWith(.jpg)) .map((f) path.join(./docs/images, f)); await vectorStore.addImages(imageUris); // 图片用 URI 写入 await vectorStore.addDocuments([ { pageContent: Q3 企业级销售推动了 15% 的营收增长, metadata: { type: text } }, ]); // 3. 文字查询检索最匹配的图片 const retriever vectorStore.asRetriever({ k: 3 }); const results await retriever.invoke(Q3 营收增长趋势); // 4. 把检索到的图片送给 VLM 回答 const visionModel new ChatOpenAI({ model: gpt-4o }); for (const doc of results) { if (doc.metadata.type image) { const imageBase64 fs.readFileSync(doc.metadata.uri, base64); const response await visionModel.invoke([ { role: user, content: [ { type: text, text: 分析这张图表总结核心趋势 }, { type: image_url, image_url: { url: data:image/png;base64,${imageBase64} } }, ], }, ]); console.log(response.content); } }CLIP 的短板在哪它给每张图生成的是一个全局向量——一张图里同时有文字、表格、折线图压缩成一个向量之后细节全没了。你问「表格第三行的数字」它可能找到一张完全不相关但视觉相似的图。精度 ~60% 的根源就在这里全局向量必然丢细节细粒度查询答不上来。3 、方案二图生文摘要——让 VLM 先把图「翻译」成文字这个方案的逻辑更直接图片本身不入向量库让 VLMGPT-4o / Claude先把图片「翻译」成详细的文字描述再把文字描述入库做检索。检索时用文字找文字找到匹配摘要后再取回原始图片送给 VLM 作答。为什么精度能到 90%Caption 是模型读懂图片后的文字描述包含了图中所有关键信息数字、趋势、结构关系。文本检索本来就精度高配合高质量 Caption效果自然好。TypeScript 实现MultiVectorRetriever 方案import { MultiVectorRetriever } from langchain/retrievers/multi_vector; import { InMemoryStore } from langchain/core/stores; import { OpenAIEmbeddings, ChatOpenAI } from langchain/openai; import { Chroma } from langchain/community/vectorstores/chroma; import { Document } from langchain/core/documents; import { v4 as uuidv4 } from uuid; import * as fs from fs; const visionModel new ChatOpenAI({ model: gpt-4o }); const embeddings new OpenAIEmbeddings(); // Step 1: 用 GPT-4o 生成图片摘要Caption async function generateImageCaption(imagePath: string): Promisestring { const imageBase64 fs.readFileSync(imagePath, base64); const response await visionModel.invoke([ { role: user, content: [ { type: text, text: 请详细描述这张图片图片类型流程图/表格/折线图等、主要数据或结论、关键元素之间的关系。100-200字尽可能具体。, }, { type: image_url, image_url: { url: data:image/png;base64,${imageBase64} } }, ], }, ]); return response.content as string; } // Step 2: 批量生成摘要 const imageFiles [./docs/arch_diagram.png, ./docs/q3_revenue.png]; const captions await Promise.all(imageFiles.map(generateImageCaption)); // Step 3: 建立 MultiVectorRetriever摘要入向量库原图路径入 docStore const vectorStore await Chroma.fromDocuments([], embeddings, { collectionName: image_captions, }); const docStore new InMemoryStore(); const retriever new MultiVectorRetriever({ vectorstore: vectorStore, byteStore: docStore, idKey: doc_id }); const ids imageFiles.map(() uuidv4()); const captionDocs captions.map((caption, i) new Document({ pageContent: caption, metadata: { doc_id: ids[i] } }) ); await retriever.vectorstore.addDocuments(captionDocs); await retriever.byteStore.mset( ids.map((id, i) [id, new TextEncoder().encode(imageFiles[i])]) ); // Step 4: 查询时返回的是原始图片路径不是摘要 const results await retriever.invoke(系统架构里的核心组件是什么); // 拿到图片路径传给 VLM 作答成本是真实痛点。 给 1000 张图批量生成 CaptionGPT-4o 的费用可能是 20-50 美元视图片复杂度。图片多的知识库入库成本不小。而且 Caption 质量直接决定检索上限——「这是一张图片包含一些数字」这种摘要等于没写。4、 方案三ColPali 视觉检索——把整页 PDF 当图片索引前两种方案都有一个共同前提你得先把 PDF 里的图片提取出来。但真实 PDF 排版复杂度超出想象多栏排版文字和图交错、扫描版 PDF 根本没文字层、表格边界模糊 OCR 识别后乱成一锅粥、公式化学结构式纯文本提取全废。ColPaliPaliGemma 视觉后期交互的思路是不提取直接把整页 PDF 当图片索引。传统方案走PDF → OCR/解析 → 文本块 → 向量化 → 检索OCR 错误率 5-15%表格结构常常被破坏。ColPali 走PDF → 渲染为页面图片 → 视觉 Transformer 编码 → 多向量索引 → 检索保留原始排版零 OCR 误差。它用 Late Interaction 机制类似 ColBERT把查询的每个 Token 向量与文档页面的每个视觉 Patch 逐一比对不是整页压缩成一个全局向量精度显著高于 CLIP。TypeScript 集成 ColPali 服务import { ChatOpenAI } from langchain/openai; import * as fs from fs; // ColPali 服务封装本地或云端部署需 GPU 16GB async function indexPdfWithColPali(pdfPath: string): Promisestring[] { // 1. 把每页 PDF 渲染为图片用 pdf2pic / pdfjs 等库 const pageImages: string[] []; // base64 编码的页面图片数组 // 2. 调用 ColPali 服务批量建索引 const indexResp await fetch(http://localhost:8000/index, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ images: pageImages, collection_id: my_docs }), }); const { doc_ids } await indexResp.json(); return doc_ids; } async function queryWithColPali(query: string): Promisestring { // 3. 文字查询返回最相关的页面图片 const searchResp await fetch(http://localhost:8000/search, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ query, collection_id: my_docs, top_k: 3 }), }); const { results } await searchResp.json(); // base64 图片数组 // 4. 把相关页面图片送给 VLM 作答 const visionModel new ChatOpenAI({ model: gpt-4o }); const answer await visionModel.invoke([ { role: user, content: [ { type: text, text: query }, ...results.map((img: string) ({ type: image_url, image_url: { url: data:image/png;base64,${img} }, })), ], }, ]); return answer.content as string; } await indexPdfWithColPali(./technical_report.pdf); const answer await queryWithColPali(第三章架构图里的核心模块有哪些);ColPali 的现实限制需要运行 PaliGemma 模型至少 16GB 显存个人项目不一定划算。Vespa、Milvus 已开始原生支持 ColPali 索引未来部署门槛会降低。5 、表格的特殊处理结构信息不能丢表格是最容易被忽视又最重要的内容类型。纯文本提取之后季度 Q1 Q2 Q3 Q4 / 营收 120 145 178 203 / 增长 - 20.8% 22.8% 14.0%这样一行行数字的行列关系完全丢失VLM 根本读不懂。策略一用 unstructured 提取 HTML 表格首选import{UnstructuredLoader}fromlangchain/community/document_loaders/fs/unstructured;const loadernew UnstructuredLoader(./financial_report.pdf,{strategy:hi_res, // 高精度模式 extractImageBlockTypes:[Table], // 专门提取表格 inferTableStructure: true, // 推断表格结构 outputFormat:application/json,});const docsawait loader.load();// 表格元素有 type:Table标记pageContent 是保留行列结构的 HTML const tablesdocs.filter(dd.metadata.typeTable);// 单独入库加上 source_page、table_index 等元数据检索时按类型过滤策略二扫描版表格截图直接送 VLMasync function extractTableFromImage(imagePath: string): Promisestring { const visionModel new ChatOpenAI({ model: gpt-4o }); const imageBase64 fs.readFileSync(imagePath, base64); const response await visionModel.invoke([ { role: user, content: [ { type: text, text: 把这张表格以 Markdown 格式输出保留完整的行列结构和所有数值。 }, { type: image_url, image_url: { url: data:image/png;base64,${imageBase64} } }, ], }, ]); return response.content as string; }表格处理的核心原则不要和正文文字混在同一个 chunk 里入库。表格单独切分加结构化元数据检索时按表格类型过滤精度更高。6、 完整多模态 RAG 管道统一处理文字/表格/图片把上面的方案拼在一起就是一个生产级的文档入库管道。核心设计原则摘要用于检索原始内容用于回答。向量库存摘要检索精度高docStore 存原始图片路径和原始表格内容回答质量高。import { UnstructuredLoader } from langchain/community/document_loaders/fs/unstructured; import { OpenAIEmbeddings, ChatOpenAI } from langchain/openai; import { Chroma } from langchain/community/vectorstores/chroma; import { MultiVectorRetriever } from langchain/retrievers/multi_vector; import { InMemoryStore } from langchain/core/stores; import { Document } from langchain/core/documents; import { v4 as uuidv4 } from uuid; import * as fs from fs; async function buildMultimodalKB(pdfPath: string) { const visionModel new ChatOpenAI({ model: gpt-4o }); const embeddings new OpenAIEmbeddings(); // Step 1: unstructured 提取所有内容类型 const loader new UnstructuredLoader(pdfPath, { strategy: hi_res, extractImageBlockTypes: [Image, Table], inferTableStructure: true, }); const rawDocs await loader.load(); // Step 2: 按类型分别处理生成摘要, 原始内容对 const pairs: Array{ summary: string; raw: string; type: string } []; for (const doc of rawDocs) { if (doc.metadata.type Image) { const imagePath doc.metadata.image_path as string; const imageBase64 fs.readFileSync(imagePath, base64); const captionResp await visionModel.invoke([ { role: user, content: [ { type: text, text: 详细描述这张图片类型、主要内容、关键数据或结论100-200字。 }, { type: image_url, image_url: { url: data:image/png;base64,${imageBase64} } }, ], }, ]); pairs.push({ summary: captionResp.content as string, raw: imagePath, type: image }); } else if (doc.metadata.type Table) { pairs.push({ summary: doc.pageContent, raw: doc.pageContent, type: table }); } else { pairs.push({ summary: doc.pageContent, raw: doc.pageContent, type: text }); } } // Step 3: 摘要入向量库原始内容入 docStore const vectorStore new Chroma(embeddings, { collectionName: multimodal_kb }); const docStore new InMemoryStore(); const retriever new MultiVectorRetriever({ vectorstore: vectorStore, byteStore: docStore, idKey: doc_id }); const ids pairs.map(() uuidv4()); const summaryDocs pairs.map((p, i) new Document({ pageContent: p.summary, metadata: { doc_id: ids[i], type: p.type } }) ); await retriever.vectorstore.addDocuments(summaryDocs); await retriever.byteStore.mset( ids.map((id, i) [id, new TextEncoder().encode(JSON.stringify({ type: pairs[i].type, raw: pairs[i].raw }))]) ); return retriever; }查询时根据检索到的内容类型分别处理图片取路径后 base64 送 VLM文字和表格直接作为文本上下文全部打包给 VLM 一次性回答。7、 常见坑这些问题让多模态 RAG 上线后一塌糊涂坑 1把 base64 图片存进向量库元数据一张 PNG 图 base64 之后轻松 500KB 到 2MB存进 ChromaDB 元数据里几百张图之后性能直线下降还可能触发存储限制。正确做法图片存磁盘或对象存储OSS/S3元数据里只存路径或 URL。坑 2Caption 质量太差「这是一张图片包含一些数字和图表」这种摘要没有任何用处。Caption 必须包含图片类型、具体数值、趋势描述、关键结论。Prompt 工程直接决定你的检索天花板。坑 3图片分辨率压缩过度很多人为了省 Token 把图片压缩到 200×200结果图里的数字全模糊了GPT-4o 也看不清。合理做法下采样到 1024×768清晰度和 Token 消耗取平衡点。坑 4扫描版 PDF 直接用文本解析扫描版 PDF 本质是一张图没有文字层PDFLoader 加载得到空文档。必须先跑 OCRunstructured 高精度模式或者直接用 ColPali。坑 5三种内容用同一检索策略表格适合精确检索BM25图片 Caption 适合语义检索向量长文档适合混合检索。混在同一个 collection 里用同一个参数精度被平均拉低。坑 6Caption 批量生成没有限速一次性给 GPT-4o 发 200 张图触发 Rate Limit任务挂掉。Caption 生成要批次控制每批 10-20 张 重试机制触发 Rate Limit任务挂掉。Caption 生成要批次控制每批 10-20 张 重试机制async function batchGenerateCaptions(imagePaths: string[], batchSize 10, delayMs 1000): Promisestring[] { const captions: string[] []; for (let i 0; i imagePaths.length; i batchSize) { const batch imagePaths.slice(i, i batchSize); const batchCaptions await Promise.all(batch.map(p generateImageCaptionWithRetry(p, 3))); captions.push(...batchCaptions); if (i batchSize imagePaths.length) { await new Promise(resolve setTimeout(resolve, delayMs)); } } return captions; }总结多模态 RAG 的核心矛盾是你的文档有多少信息在图里而不是在文字里。 搞清楚这个选方案就有方向了CLIP 多模态嵌入实现简单、成本低但全局向量丢细节精度约 60%适合图片相似搜索不适合精准文档问答图生文摘要Caption MultiVectorRetriever精度最高~90%检索走文字、回答走原图代价是入库成本高图片多时费用可观ColPali 视觉检索整页 PDF 当图片索引零 OCR 误差复杂排版文档首选但需要 GPU 部署16GB 显存起步表格必须单独处理用unstructured保留 HTML 结构或截图给 VLM 提取绝对不要和正文混在同一个 chunk 里最后对于正在迷茫择业、想转行提升或是刚入门的程序员、编程小白来说有一个问题几乎人人都在问未来10年什么领域的职业发展潜力最大答案只有一个人工智能尤其是大模型方向当下人工智能行业正处于爆发式增长期其中大模型相关岗位更是供不应求薪资待遇直接拉满——字节跳动作为AI领域的头部玩家给硕士毕业的优质AI人才含大模型相关方向开出的月基础工资高达5万—6万元即便是非“人才计划”的普通应聘者月基础工资也能稳定在4万元左右。再看阿里、腾讯两大互联网大厂非“人才计划”的AI相关岗位应聘者月基础工资也约有3万元远超其他行业同资历岗位的薪资水平对于程序员、小白来说无疑是绝佳的转型和提升赛道。对于想入局大模型、抢占未来10年行业红利的程序员和小白来说现在正是最好的学习时机行业缺口大、大厂需求旺、薪资天花板高只要找准学习方向稳步提升技能就能轻松摆脱“低薪困境”抓住AI时代的职业机遇。如果你还不知道从何开始我自己整理一套全网最全最细的大模型零基础教程我也是一路自学走过来的很清楚小白前期学习的痛楚你要是没有方向还没有好的资源根本学不到东西下面是我整理的大模型学习资源希望能帮到你。扫码免费领取全部内容1、大模型学习路线2、从0到进阶大模型学习视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、 入门必看大模型学习书籍文档.pdf书面上的技术书籍确实太多了这些是我精选出来的还有很多不在图里4、AI大模型最新行业报告2026最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5、面试试题/经验【大厂 AI 岗位面经分享107 道】【AI 大模型面试真题102 道】【LLMs 面试真题97 道】6、大模型项目实战配套源码适用人群四阶段学习规划共90天可落地执行第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容3、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价