QMedia 多模态 RAG 检索管线源码解析:MultiModalVectorStoreIndex 如何融合文本与图像向量
【免费下载链接】QmediaAn open-source AI content search engine designed specifically for content creators. Supports extraction of text, images, and short videos. Allows full local deployment (web app, RAG server, LLM server). Supports multi-modal RAG content Q&A.项目地址: https://gitcode.com/gh_mirrors/qm/Qmedia
QMedia 是一款专为内容创作者设计的开源 AI 内容搜索引擎,支持图文/短视频内容提取、全本地化部署,并基于多模态 RAG 实现内容搜索问答。本文带你完整走读它的检索管线:从素材入库、多模态 Reader 信息提取,到 MultiModalVectorStoreIndex 如何同时融合文本与图像向量,最终让一句问题同时搜到"文案"和"图片"。适合想看懂 LlamaIndex 多模态检索实现的开发者。
🧭 一张图看懂 QMedia 多模态 RAG 架构
QMedia 由三组可分离部署的服务组成:
- mm_server:多模态模型服务(OCR、CLIP 编码、BGE 文本编码、Whisper 语音转录)
- mmrag_server:RAG 检索问答服务,检索管线就在这里
- qmedia_web:内容卡片展示前端
整个管线入口是 mmrag_server/services/nodes.py 中的build_index()函数。
📥 第一步:把图文/短视频拆成"多模态文档"
每一条内容(NoteData)由三部分构成:图片image_data、视频video_data、文案info_data。管线会为每部分内容调用不同的 Reader:
| Reader | 职责 | 产出 |
|---|---|---|
ImageReader | 登记图片素材 | ImageDocument(留给 CLIP 编码) |
ImageOcrReader | 调 mm_server 的 OCR 模型提取图中文字,按字号分档排序 | 文本 Document |
NoteInfoReader | 把标题、描述、标签拼成结构化文本 | 文本 Document |
AudioTranscriptionReader | faster-whisper 转录视频语音 + LLM 生成总结 | 文本 Document |
关键细节:所有 Document 都在 metadata 里带上note_id,这样检索命中后能回溯到原始内容卡片,前端才能展示"答案来自哪篇笔记"。
Reader 源码集中在 mmrag_server/services/readers/,其中 OCR 的字号分档逻辑见 image_ocr.py。
🔀 第二步:MultiModalVectorStoreIndex 如何融合文本与图像向量
文本先经SentenceSplitter切分成节点,然后由build_store_index()创建索引(nodes.py):
MultiModalVectorStoreIndex(nodes, image_embed_model=CLIP, embed_model=BGE)融合机制有 4 个关键点:
- 文本节点走 BGE 嵌入模型(
bge-small-en-v1.5),擅长语义级文本匹配; - 图像节点走 CLIP(
ViT-B/32),把图片编码进向量空间; - CLIP 的文本嵌入与图像嵌入处于同一向量空间——同一个查询文本可以转成 CLIP 文本向量去比对图像,这就是连接文本与图像的"桥梁",实现真正的跨模态检索;
- 检索时查询双路并行:文本路取 top 3(
similarity_top_k),图像路取 top 4(image_similarity_top_k),两路结果合并交给 LLM 生成答案。
两个编码模型都不在 RAG 服务里本地加载,而是通过 HTTP 调用 mm_server:BGE 文本编码走/api/embeddings,CLIP 图像/文本编码走/api/clip-image-embeddings与/api/clip-text-embeddings,封装在 mmrag_server/services/llm/remote_embedding.py 的RemoteClipEmbedding类中——模型与检索应用解耦,方便随时换模型。
💾 第三步:索引三级缓存,重启秒级加载
build_index(mode="auto")会按磁盘状态自动选择构建方式,这是很实用的工程细节:
- raw:首次启动,从原始素材完整走"提取 → 切分 → 编码"全流程
- docs_from_persist:文档已存储,跳过模型提取,只重新切分编码
- nodes_from_persist:向量已存储,直接加载索引,秒级重启
持久化由 mmrag_server/services/storage.py 完成:persist_index()把向量索引序列化到db/目录,persist_documents()把文档存储为docstore.json,索引 ID 与路径等配置都在 mmrag_server/config.py.local。
🎯 第四步:检索与问答——从向量到答案
mmrag_server/services/retriever/mm_retriver.py 的build_mm_rag_pipeline()把索引转成 retriever,再组装RetrieverQueryEngine:
- 用户提问 → 文本嵌入 + CLIP 文本嵌入,双路检索
- 命中的文本节点 + 图像节点按 QA 模板拼进 Prompt
- LLM(默认 llama3)基于上下文生成回答
- 前端根据
note_id展示来源内容卡片
如果想让模型"看着图回答",还可以切换build_mm_query(),用 llava-llama3 视觉理解大模型做多模态问答。
🗺️ 源码阅读路线:10 分钟上手这份多模态检索管线
| 你想了解的环节 | 去哪里看 |
|---|---|
| 管线入口、索引构建与三级缓存 | mmrag_server/services/nodes.py |
| 图文/视频信息提取 Reader | mmrag_server/services/readers/ |
| 向量索引与文档持久化 | mmrag_server/services/storage.py |
| 检索器与问答引擎组装 | mmrag_server/services/retriever/mm_retriver.py |
| CLIP / BGE 远程编码封装 | mmrag_server/services/llm/remote_embedding.py |
| 模型服务(OCR、CLIP、Whisper) | mm_server/ |
一句话总结:BGE 负责"读懂文字",CLIP 负责"让文字和图片说同一种向量语言",MultiModalVectorStoreIndex 把两路向量收进同一个索引——这正是 QMedia 多模态 RAG 能让一句话同时搜到图文与短视频素材的核心秘密。
【免费下载链接】QmediaAn open-source AI content search engine designed specifically for content creators. Supports extraction of text, images, and short videos. Allows full local deployment (web app, RAG server, LLM server). Supports multi-modal RAG content Q&A.项目地址: https://gitcode.com/gh_mirrors/qm/Qmedia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考