目录 (Outline)
-
一、 为什么需要多模态 RAG?
-
二、 核心原理:跨模态向量嵌入 (Cross-modal Embeddings)
-
三、 实战 1:利用 GPT-4o 解析 PDF 复杂表格与图表
-
四、 实战 2:前端实现「以图搜图」与图片描述对话
-
五、 总结与性能调优建议
一、 为什么需要多模态 RAG?
1. 业务痛点
传统的 RAG 系统在处理说明书、财务报表或电商评论时,往往会丢失关键信息:
-
表格:纯文本转换会导致行号列号混乱,AI 无法进行精确计算。
-
图表:PDF 中的架构图或趋势图,纯文本 RAG 完全无法感知。
2. 解决方案
通过多模态模型(如 GPT-4o 或 Gemini 1.5 Pro),我们可以将图像内容「转译」为高度精确的文本描述,或直接在向量空间进行比对。
二、 核心原理:跨模态向量嵌入 (Cross-modal Embeddings)
1. 统一向量空间
传统的向量模型(如 text-embedding-3-small)只能处理文本。而多模态向量模型(如 CLIP)能将图片和文本映射到同一个坐标系中。
- 现象:在向量空间里,「一只猫的图片」与「字符串 ‘cat’」的距离非常接近。
三、 实战 1:利用 GPT-4o 解析 PDF 复杂表格与图表
实战流程
-
分片 (Chunking):不仅提取文本,还要提取 PDF 中的图片页。
-
多模态描述 (Captioning):利用 GPT-4o 的 Vision 能力,为每张图表生成详尽的 Markdown 描述。
-
入库:将原文与 AI 生成的描述一起存入向量库。
代码示例
import { ChatOpenAI } from "@langchain/openai";
// 1. 初始化多模态模型
const visionModel = new ChatOpenAI({ model: "gpt-4o", maxTokens: 1024 });
// 2. 将 PDF 页面图像喂给 AI 提取语义
const response = await visionModel.invoke([
{
type: "user",
content: [
{ type: "text", text: "请精准描述这张图表中的数据趋势,并以 Markdown 表格形式还原其中的核心数值。" },
{ type: "image_url", image_url: { url: `data:image/jpeg;base64,${base64Image}` } }
]
}
]);
const tableDescription = response.content; // 这部分内容将作为 RAG 的核心检索源
四、 实战 2:前端实现「以图搜图」与图片描述对话
实战步骤
-
用户上传一张图片作为提问。
-
前端调用向量库,检索出与该图语义最接近的「文档片段」。
-
AI 结合检索到的上下文和图片本身,生成回答。
代码示例
// 检索逻辑
const vectorStore = await MemoryVectorStore.fromDocuments(captionedDocs, embeddings);
// 用户提问:“这张图里的错误代码在文档中怎么解决?”
const result = await vectorStore.similaritySearch("错误代码 5001", 3);
// result 包含了从 PDF 图片中解析出来的“错误代码对照表”
五、 总结与性能调优建议
-
向量模型选型:对于高精度的图像检索,优先使用 OpenAI 的多模态 Embedding 接口。
-
存储优化:图片 Base64 极大,建议只存储其生成的文本描述(Captions)和原始图的 URL/哈希值。
-
建议:多模态 RAG 的成本比纯文本高得多。建议采用「两阶段法」:先用低成本模型初步过滤,再用高成本多模态模型精细化生成。
掌握了多模态 RAG,你的 AI 助手将不再是一个「书呆子」,而是一个能看懂图表、理解图片的真正智能体。