初探多模态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) 生成答案。

具体步骤:

  1. 数据预处理与关联:

    • 从设计文档(PDF, Word 等)中提取文本内容和图像。
    • 识别图像类型(原理图、版图、波形图等)。
    • 建立文本与图像之间的关联(例如,通过图表标题、编号、上下文段落)。一个文本 Chunk 可能关联一个或多个图像,一个图像也可能对应多个文本描述。
    • 为每个文档/图像分配唯一标识符。
  2. 多模态编码:

    • 使用强大的多模态模型(如 CLIP)分别或联合地对文本片段和图像进行编码,生成向量表示 (Embeddings)。
    • 探索不同的编码策略:
      • 策略 A (分离编码): 为文本和图像生成各自独立的向量。
      • 策略 B (联合编码/融合): 对图文对生成单一的融合向量,或在编码时考虑对方信息。对于查询,也进行相应编码。
  3. 索引构建:

    • 将生成的文本向量和图像向量(以及可能的融合向量)存入高效的向量数据库或索引库 (如 Faiss)。
    • 同时,在关系型数据库或文档数据库 (如 SQLite, PostgreSQL) 中存储元数据,包括:文档来源、文本内容、图像文件路径/引用、文本与图像的关联关系、向量库中的 ID 等。
    • 根据编码策略,可能需要构建独立的文本索引库、图像索引库,或统一的多模态索引库。
  4. 多模态检索:

    • 处理查询: 支持三种查询模式:
      • 纯文本查询: "解释什么是带隙基准?"
      • 纯图像查询: 输入一张电路图,"查找与此类似的原理图" 或 "解释这个电路的功能"。
      • 混合查询: 输入文本+图像,"根据这个波形图,解释电路的启动特性"。
    • 查询编码: 使用与索引时相同的编码器对查询中的文本和/或图像进行编码。
    • 向量搜索: 在相应的向量索引库中执行相似性搜索。
      • 文本查询主要搜索文本索引库。
      • 图像查询主要搜索图像索引库(可能利用 CLIP 的图生文能力或图生图相似度)。
      • 混合查询可能需要在文本库、图像库或融合库中搜索,或进行多路召回再融合。
    • 结果获取与排序: 获取 Top-K 最相关的向量 ID,并通过元数据存储检索对应的文本片段、图像引用/路径及其他上下文信息。进行重排序(Re-ranking)优化结果。
  5. 上下文构建与答案生成:

    • 将检索到的最相关的文本片段和图像信息(可能是图像的描述、文件名、或者对于支持多模态输入的 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 (与向量索引配合) 或 PostgreSQLSQLite 已足够启动。若元数据关系复杂或数据量巨大,可迁移至 PostgreSQL。
检索器 (Retriever)处理查询、编码、执行搜索、整合上下文自定义 Python 逻辑业务逻辑核心,需紧密结合编码、索引和生成环节,灵活实现不同检索策略。
生成器 (LLM)基于查询和检索到的上下文生成答案智谱 AI API (GLM-4-Flash, GLM-4, 或 GLM-4V) + zhipuai SDK国产领先模型,支持中文,效果优异。根据是否需要 LLM 直接理解图像,选择纯文本或多模态版本。
整体框架串联各组件,提供接口LangChain / LlamaIndex (可选) 或 自定义 Python 框架可选框架能加速开发,提供标准化组件。自定义框架提供更大灵活性。初期可先自定义,后续按需引入框架。

4. 后续改进与探索方向

  1. 编码模型优化:

    • 领域微调 (Fine-tuning): 在半导体电路相关的图文数据集上微调 CLIP 模型,提升其在专业领域的理解能力。
    • 探索其他模型: 关注学界和业界最新的多模态预训练模型,尤其是针对科技、工程领域的模型。
  2. 索引与检索策略:

    • 混合索引/检索: 结合关键词搜索和向量搜索,处理特定术语或精确匹配查询。
    • 多路召回与重排序: 同时从文本库、图像库进行检索,使用更复杂的模型(如 Cross-Encoder)对初步结果进行重排序。
    • 图数据库: 探索使用图数据库存储和查询图文之间的复杂关联关系。
    • 文本/图像分块 (Chunking): 对长文本和复杂大图进行合理分块,建立更细粒度的索引。
  3. LLM 的选择与应用:

    • 切换到多模态 LLM (GLM-4V): 这是最重要的演进方向之一。让 LLM 直接接收图像输入,可以极大提升图文理解和生成能力,避免信息在“图像->文本描述”转换中丢失。需要相应修改 Prompt 和数据流。
    • Prompt 工程: 持续优化与 LLM 的交互方式,设计更有效的指令,引导模型更好地结合多模态上下文。
  4. 数据处理能力增强:

    • 支持更多格式: 增加对特定 CAD 文件格式的解析能力(可能需要专用库)。
    • OCR 应用: 对包含内嵌文本的图像(如扫描件、部分图表)应用 OCR 技术提取文字信息。
    • 自动化图文关联: 研究更智能的算法自动识别和关联文档中的图文对应关系。
  5. 评估体系建设:

    • 建立一套针对半导体电路设计领域的多模态 RAG 评测基准和指标,量化评估系统在真实场景下的效果。
  6. 用户体验与集成:

    • 开发更友好的用户界面,支持图像上传查询、结果可视化(展示检索到的图像)。
    • 探索将 RAG 功能嵌入现有的 EDA 工具或设计平台。

结论: 通过引入多模态能力,RAG 系统有望在半导体电路设计领域发挥更大作用,从简单处理文本信息升级为能够理解和利用关键视觉元素的智能助手。本方案提供了一个初步的技术选型和实现思路,后续需要在实践中不断迭代和优化。

写在最后

欢迎关注我的小红书号,Java人什么都能干 才发现最近鱼总也在做类似Manus的东西,正好下一个任务是做一个AI智能体,或者也可以做一个Agentic RAG。爽了

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
UltramanZero
作者分享
HTTP和HTTPS差别之一
2
好好好 三天被老登安排的明明白白 麻了 但今天还是抽空复习了Redis!为自己点赞!
1
记录一下 15:31完成场景题复习 感觉忘掉的10%不到 可喜可贺 下了大功夫终究还是会有收获的 MQ启动
1
记录一下 10:28 完成数据库复习 也就那点东西 数据库范式与反范式 更新事务是怎么实现的 bufferpool 四个隔离级别,如何解决脏读幻读不可重复读 MVCC原理 索引 联合索引 索引下推 索引覆盖 索引失效原因 索引的作用 锁 行级锁 表级锁 意向锁 字典锁用来保证表结构不被改变 auto-inc锁确保主键自增 自增主键用完了怎么办 orderby实现原理 filesort 全字段排序 row_id 数据库的主从复制 两阶段提交 组复制 binlog undolog redolog分别什么作用 InnoDB的数据结构 为什么用B+树不用跳表 redis为什么用跳表不用B+树 逻辑都蛮清晰的,真真切切感受到老前辈们的奇思妙想 技术性的八股还是比较容易记住的,常看常新。用的时候一些犄角旮旯奇奇怪怪的东西就比较难记了 加油吧!半小时后开组会 也算是完成了上午的任务 中午算法继续 下午先场景题 再mq 晚上redis
3
今天不出意外完成了数据库的白送和初步复习 感觉 忘掉了70%...难过 临睡前回顾一下场景题 一周没看果然也忘掉了50% 更难过了 好多东西要背 明天计划: 1. 复习数据库 2h 9-11 2. 复习场景题 2h 13-15 中午看几道算法题 就暂定五道吧 背就完了 3. redis 2h 15-17 五点去健个身 4. mq 2h 20-22 终究还是接近考研的强度 加油!最近还是好消息多多的
3
下载 APP