初探多模态RAG
垂直领域的多模态 RAG 技术方案
我的小红书号: AnthroSeekTheX 详细的技术文档: https://jjrh0ec8rc.feishu.cn/docx/V5BrdafX1ovqL2xbiNlcDdsHnUh 本项目的开源代码: https://github.com/singularguy/MultimodalRAG
前言:
其实上个月我就接到了做一个多模态RAG的任务,当时我心想:我连RAG的概念都搞不明白你让我搞多模态? 害怕 事实证明,并不需要慌张,找了两篇综述看了看RAG是啥以及多模态RAG发展的咋样了,然而综述看完我除了能吹几句牛以及在别人谈论RAG的帖子下发表一点看法并没有学会别的 那么,按照【学习的最好方法莫过于自己动手】的原则,开始看教程和技术文档 但依然不顺利,我很多名词都不知道,CLIP是啥?BLIP又是啥?怎么还有SigLIP???模态对齐是什么意思?实体对齐又是啥意思.. 好好好,这一大堆东西给我搞心态崩了 行吧,不管怎么样先搭一个demo出来 搭demo的过程中,搞清楚了概念和第三方库的使用方法(python特有的什么都有库) 还有Javaer特有的什么都能学!卷!卷起来!
1. 项目背景
当前,我们已经成功在半导体电路设计领域应用了基于文本的检索增强生成 (Retrieval-Augmented Generation, RAG) 系统。该系统在处理技术文档、数据手册 (Datasheet)、研究论文和设计笔记等方面表现良好,能够有效回答基于文本信息的设计问题,提高了信息检索和知识获取的效率。
然而,半导体电路设计是一个高度依赖视觉信息的领域。工程师日常工作中需要处理大量的电路原理图 (Schematics)、版图设计 (Layouts)、仿真波形图 (Simulation Plots) 以及封装图纸等。这些视觉信息包含了丰富的、难以完全用文本描述的设计细节、连接关系、物理约束和性能表现。
现有的纯文本 RAG 系统无法有效利用这些宝贵的视觉信息,导致在回答涉及图表内容、需要图文结合理解的问题时能力受限。例如,无法直接回答“这个原理图中 R1 和 Q1 的连接方式是什么?”或“对比这两个版图在关键路径上的差异”。
2. 项目实现思路
鉴于文本 RAG 已有良好基础,多模态 RAG 的核心思路是在现有框架上扩展,实现对图像信息的有效 编码、索引、检索 和 利用。
核心策略: 将文档中的文本信息和与之关联的关键视觉信息(图像)映射到统一或关联的向量空间中,使得系统能够根据文本查询、图像查询或图文混合查询,检索到最相关的文本片段和/或图像,并将这些多模态信息共同作为上下文提供给大型语言模型 (LLM) 生成答案。
具体步骤:
-
数据预处理与关联:
- 从设计文档(PDF, Word 等)中提取文本内容和图像。
- 识别图像类型(原理图、版图、波形图等)。
- 建立文本与图像之间的关联(例如,通过图表标题、编号、上下文段落)。一个文本 Chunk 可能关联一个或多个图像,一个图像也可能对应多个文本描述。
- 为每个文档/图像分配唯一标识符。
-
多模态编码:
- 使用强大的多模态模型(如 CLIP)分别或联合地对文本片段和图像进行编码,生成向量表示 (Embeddings)。
- 探索不同的编码策略:
- 策略 A (分离编码): 为文本和图像生成各自独立的向量。
- 策略 B (联合编码/融合): 对图文对生成单一的融合向量,或在编码时考虑对方信息。对于查询,也进行相应编码。
-
索引构建:
- 将生成的文本向量和图像向量(以及可能的融合向量)存入高效的向量数据库或索引库 (如 Faiss)。
- 同时,在关系型数据库或文档数据库 (如 SQLite, PostgreSQL) 中存储元数据,包括:文档来源、文本内容、图像文件路径/引用、文本与图像的关联关系、向量库中的 ID 等。
- 根据编码策略,可能需要构建独立的文本索引库、图像索引库,或统一的多模态索引库。
-
多模态检索:
- 处理查询: 支持三种查询模式:
- 纯文本查询: "解释什么是带隙基准?"
- 纯图像查询: 输入一张电路图,"查找与此类似的原理图" 或 "解释这个电路的功能"。
- 混合查询: 输入文本+图像,"根据这个波形图,解释电路的启动特性"。
- 查询编码: 使用与索引时相同的编码器对查询中的文本和/或图像进行编码。
- 向量搜索: 在相应的向量索引库中执行相似性搜索。
- 文本查询主要搜索文本索引库。
- 图像查询主要搜索图像索引库(可能利用 CLIP 的图生文能力或图生图相似度)。
- 混合查询可能需要在文本库、图像库或融合库中搜索,或进行多路召回再融合。
- 结果获取与排序: 获取 Top-K 最相关的向量 ID,并通过元数据存储检索对应的文本片段、图像引用/路径及其他上下文信息。进行重排序(Re-ranking)优化结果。
- 处理查询: 支持三种查询模式:
-
上下文构建与答案生成:
- 将检索到的最相关的文本片段和图像信息(可能是图像的描述、文件名、或者对于支持多模态输入的 LLM,是图像本身)整合成上下文 (Context)。
- 构建合适的提示 (Prompt),将原始查询和整合后的多模态上下文提供给大型语言模型 (LLM)。
- LLM 选择:
- 若使用 纯文本 LLM (如 GLM-4-Flash, GLM-4):Prompt 中需要包含图像的文本描述或标识符,并指导 LLM 如何结合这些信息回答。LLM 无法直接 "看到" 图像。
- 若使用 多模态 LLM (如 GLM-4V):可以将图像数据(如 Base64 编码)直接传入模型,LLM 能够直接理解图像内容,生成更自然的图文结合答案。
- LLM 基于提供的上下文生成最终答案。
3. 核心组件与技术选型
| 组件 | 核心功能 | 技术选型 (初步) | 选型理由 |
|---|---|---|---|
| 数据处理与关联 | 提取文本、图像,建立图文关联 | Python 脚本, PyMuPDF/pdfminer.six (PDF处理), Pillow (图像处理), 自定义逻辑 (关联规则) | 灵活,可定制化强,适用于处理多样化的内部文档格式。关联逻辑需根据实际数据特点设计。 |
| 多模态编码器 | 将文本、图像转化为向量表示 | Hugging Face Transformers 库 + CLIP 模型 (openai/clip-vit-base-patch32 或更高版本) | 效果公认,易于使用,能够将图文映射到统一语义空间。未来可考虑在电路设计数据上进行微调 (Fine-tuning)。 |
| 向量数据库/索引 | 存储和高效检索向量 | Faiss (IndexFlatIP, IndexIVFFlat) + SQLite (元数据存储) | Faiss: 开源、高性能,适合快速原型验证和中等规模数据。SQLite: 简单、轻量,易于集成,满足当前需求。 |
| 元数据存储 | 存储文本、图像路径、关联关系、向量 ID 等 | SQLite (与向量索引配合) 或 PostgreSQL | SQLite 已足够启动。若元数据关系复杂或数据量巨大,可迁移至 PostgreSQL。 |
| 检索器 (Retriever) | 处理查询、编码、执行搜索、整合上下文 | 自定义 Python 逻辑 | 业务逻辑核心,需紧密结合编码、索引和生成环节,灵活实现不同检索策略。 |
| 生成器 (LLM) | 基于查询和检索到的上下文生成答案 | 智谱 AI API (GLM-4-Flash, GLM-4, 或 GLM-4V) + zhipuai SDK | 国产领先模型,支持中文,效果优异。根据是否需要 LLM 直接理解图像,选择纯文本或多模态版本。 |
| 整体框架 | 串联各组件,提供接口 | LangChain / LlamaIndex (可选) 或 自定义 Python 框架 | 可选框架能加速开发,提供标准化组件。自定义框架提供更大灵活性。初期可先自定义,后续按需引入框架。 |
4. 后续改进与探索方向
-
编码模型优化:
- 领域微调 (Fine-tuning): 在半导体电路相关的图文数据集上微调 CLIP 模型,提升其在专业领域的理解能力。
- 探索其他模型: 关注学界和业界最新的多模态预训练模型,尤其是针对科技、工程领域的模型。
-
索引与检索策略:
- 混合索引/检索: 结合关键词搜索和向量搜索,处理特定术语或精确匹配查询。
- 多路召回与重排序: 同时从文本库、图像库进行检索,使用更复杂的模型(如 Cross-Encoder)对初步结果进行重排序。
- 图数据库: 探索使用图数据库存储和查询图文之间的复杂关联关系。
- 文本/图像分块 (Chunking): 对长文本和复杂大图进行合理分块,建立更细粒度的索引。
-
LLM 的选择与应用:
- 切换到多模态 LLM (GLM-4V): 这是最重要的演进方向之一。让 LLM 直接接收图像输入,可以极大提升图文理解和生成能力,避免信息在“图像->文本描述”转换中丢失。需要相应修改 Prompt 和数据流。
- Prompt 工程: 持续优化与 LLM 的交互方式,设计更有效的指令,引导模型更好地结合多模态上下文。
-
数据处理能力增强:
- 支持更多格式: 增加对特定 CAD 文件格式的解析能力(可能需要专用库)。
- OCR 应用: 对包含内嵌文本的图像(如扫描件、部分图表)应用 OCR 技术提取文字信息。
- 自动化图文关联: 研究更智能的算法自动识别和关联文档中的图文对应关系。
-
评估体系建设:
- 建立一套针对半导体电路设计领域的多模态 RAG 评测基准和指标,量化评估系统在真实场景下的效果。
-
用户体验与集成:
- 开发更友好的用户界面,支持图像上传查询、结果可视化(展示检索到的图像)。
- 探索将 RAG 功能嵌入现有的 EDA 工具或设计平台。
结论: 通过引入多模态能力,RAG 系统有望在半导体电路设计领域发挥更大作用,从简单处理文本信息升级为能够理解和利用关键视觉元素的智能助手。本方案提供了一个初步的技术选型和实现思路,后续需要在实践中不断迭代和优化。
写在最后
欢迎关注我的小红书号,Java人什么都能干 才发现最近鱼总也在做类似Manus的东西,正好下一个任务是做一个AI智能体,或者也可以做一个Agentic RAG。爽了
