LlamaIndex 多模态模型(Multi-Modal Models)完全指南:从 GPT-4V 推理到多模态 RAG
2026/9/12 1:43:55 网站建设 项目流程

LlamaIndex 多模态模型(Multi-Modal Models)完全指南:从 GPT-4V 推理到多模态 RAG

【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index

本文基于 LlamaIndex 官方模块指南 multi_modal.md 展开,系统讲解 LlamaIndex 中的多模态抽象体系:从MultiModalLLM基类、GPT-4V/Gemini 等视觉大模型接入,到MultiModalVectorStoreIndexMultiModalRetrieverSimpleMultiModalQueryEngine构建的端到端多模态检索增强生成(Multi-Modal RAG)流水线。读完本文,你将掌握如何在 LlamaIndex 中完成图像加载、图文联合检索、图文问答以及多模态 RAG 的效果评估。

概念:从 LLM 到 LMM 的抽象

传统大语言模型(LLM)是"文本进、文本出"的模型。而大型多模态模型(Large Multi-modal Models,LMM)将这种能力推广到文本之外的模态:例如 GPT-4V 可以同时输入图片与文本,并输出文本。

LlamaIndex 为此提供了一个基类抽象MultiModalLLM,用于统一"文本 + 图片"模型的接入方式(文档中特别注明:该命名未来可能调整)。在源码中,MultiModalLLM位于 llama-index-core/llama_index/core/multi_modal_llms/base.py,它继承自BaseComponentDispatcherSpanMixin,是一套声明式抽象接口,主要包含以下端点:

  • 同步端点complete(prompt, image_documents)(补全)、stream_complete(...)(流式补全)、chat(messages)(对话)、stream_chat(...)(流式对话);
  • 异步端点acompleteastream_completeachatastream_chat等,用于 asyncio 环境;
  • 元数据:每个模型通过metadata属性暴露MultiModalLLMMetadata

MultiModalLLMMetadata(base.py#L30-L72)包含以下字段,理解这些字段有助于评估不同 LMM 的接入能力:

字段默认值含义
context_windowDEFAULT_CONTEXT_WINDOW模型单次生成时可输入的 token 总数上限
num_outputDEFAULT_NUM_OUTPUTS模型单次生成可输出的 token 数上限
num_input_filesDEFAULT_NUM_INPUT_FILES模型单次生成时可接受的输入文件数量
is_function_calling_modelFalse是否支持 OpenAI 风格的 function calling 消息
is_chat_modelFalse是否暴露聊天接口(可传入消息序列而非纯文本)
model_name"unknown"模型名称,用于日志、测试与 sanity check

使用模式一:直接调用多模态 LLM(以 GPT-4V 为例)

第一步是掌握 LMM 的基本调用方式。官方文档给出的最小示例同时展示了两种图片来源:从 URL 加载、从本地目录加载。

from llama_index.multi_modal_llms.openai import OpenAIMultiModal from llama_index.core.multi_modal_llms.generic_utils import load_image_urls from llama_index.core import SimpleDirectoryReader # 从 URL 列表加载图片文档 image_documents = load_image_urls(image_urls) # 从本地目录加载图片文档 image_documents = SimpleDirectoryReader(local_directory).load_data() # 非流式调用 openai_mm_llm = OpenAIMultiModal( model="gpt-4-vision-preview", api_key=OPENAI_API_KEY, max_new_tokens=300 ) response = openai_mm_llm.complete( prompt="what is in the image?", image_documents=image_documents )

其中load_image_urls定义于 llama-index-core/llama_index/core/multi_modal_llms/generic_utils.py,实现非常直接——把每个 URL 包装成ImageDocument(image_url=url)返回。

generic_utils.py中还提供了一组与图像编码相关的工具函数,它们在底层完成"图片 → base64 → 请求体"的转换,是理解整个多模态调用链路的关键:

  • encode_image(image_path):读取本地图片并返回 base64 字符串;
  • image_documents_to_base64(image_documents):遍历ImageDocument,依次尝试使用已编码的image字段、image_pathmetadata["file_path"]image_url(通过requests.get拉取)进行编码;
  • infer_image_mimetype_from_file_path/infer_image_mimetype_from_base64:推断图片 MIME 类型(支持 jpeg、png、gif、webp,无法识别时默认image/jpeg);
  • set_base64_and_mimetype_for_image_docs:为图片文档统一填充 base64 与 mimetype 字段,供后续请求使用。

使用模式二:构建多模态向量存储与索引

当数据规模较大、需要检索时,就需要把图片和文本向量化后存入向量数据库。LlamaIndex 内置的MultiModalVectorStoreIndex支持为文本图片分别维护独立的向量存储。官方示例使用 Qdrant 作为底层存储:

from llama_index.core.indices import MultiModalVectorStoreIndex from llama_index.vector_stores.qdrant import QdrantVectorStore from llama_index.core import SimpleDirectoryReader, StorageContext import qdrant_client # 创建本地 Qdrant 向量存储 client = qdrant_client.QdrantClient(path="qdrant_mm_db") # 如果只需要 image_store 做图片检索,可以移除 text_store text_store = QdrantVectorStore( client=client, collection_name="text_collection" ) image_store = QdrantVectorStore( client=client, collection_name="image_collection" ) storage_context = StorageContext.from_defaults( vector_store=text_store, image_store=image_store ) # 从本地文件夹加载文本与图片文档 documents = SimpleDirectoryReader("./data_folder/").load_data() # 创建多模态索引 index = MultiModalVectorStoreIndex.from_documents( documents, storage_context=storage_context, )

从源码结构看,MultiModalVectorStoreIndex(llama-index-core/llama_index/core/indices/multi_modal/base.py#L46)继承自普通VectorStoreIndex,并通过image_namespace = "image"StorageContext中注册一个独立的图片向量存储命名空间。它的初始化参数值得逐一说明:

参数默认值说明
embed_modelSettings.embed_model文本嵌入模型
image_embed_model"clip:ViT-B/32"图片嵌入模型,默认 CLIP ViT-B/32
image_vector_storeNone图片向量存储(兼容旧接口,也可通过storage_context传入image_store
is_image_to_textFalse是否在嵌入图片的同时,用文本嵌入模型对图片的文本描述(caption)做二次嵌入
is_image_vector_store_emptyFalse仅使用单一向量存储时的标记,表示图片向量存储为空
is_text_vector_store_emptyFalse同上,表示文本向量存储为空

索引构建时(见_get_node_with_embedding,base.py#L232-L285),ImageNode会通过embed_image_nodes调用图片嵌入模型;若开启is_image_to_text,还会同时用文本嵌入模型生成 caption 嵌入并写入text_embedding字段。该索引还提供了from_vector_store(从已有向量存储构建)以及as_chat_engine(支持MultiModalContextChatEngine等聊天引擎)。

使用模式三:多模态检索器与查询引擎

索引构建完成后,即可进行图文联合检索与问答。官方文档示例通过as_retriever获得MultiModalVectorIndexRetriever,再通过as_query_engine组装查询引擎:

from llama_index.multi_modal_llms.openai import OpenAIMultiModal from llama_index.core import PromptTemplate from llama_index.core.query_engine import SimpleMultiModalQueryEngine retriever_engine = index.as_retriever( similarity_top_k=3, image_similarity_top_k=3 ) # 从 GPT-4V 的响应中检索更多信息 retrieval_results = retriever_engine.retrieve(response) # 如果只需要图片检索而不需要文本检索,可使用 text_to_image_retrieve # retrieval_results = retriever_engine.text_to_image_retrieve(response) qa_tmpl_str = ( "Context information is below.\n" "---------------------\n" "{context_str}\n" "---------------------\n" "Given the context information and not prior knowledge, " "answer the query.\n" "Query: {query_str}\n" "Answer: " ) qa_tmpl = PromptTemplate(qa_tmpl_str) query_engine = index.as_query_engine( multi_modal_llm=openai_mm_llm, text_qa_template=qa_tmpl ) query_str = "Tell me more about the Porsche" response = query_engine.query(query_str)

检索器内部原理(llama-index-core/llama_index/core/indices/multi_modal/retriever.py):

MultiModalVectorIndexRetriever继承自MultiModalRetriever,其_retrieve方法(retriever.py#L124-L138)的逻辑是:先做文本检索,再做"文本→图片"检索,最后合并结果。具体而言:

  • similarity_top_k(默认DEFAULT_SIMILARITY_TOP_K = 2)控制文本向量检索返回条数;
  • image_similarity_top_k(默认同为 2)控制图片向量检索返回条数;
  • text_retrieve:用文本嵌入模型对 query 编码后在文本向量库检索;
  • text_to_image_retrieve(retriever.py#L166-L182):改用图片嵌入模型(image_embed_model.get_agg_embedding_from_queries)对 query 编码,再到图片向量库检索,实现"文字找图";
  • image_to_image_retrieve(retriever.py#L208-L215):用图片嵌入模型对输入图片编码,实现"以图搜图"。

关于SimpleMultiModalQueryEngine的重要提示:当前仓库源码中,SimpleMultiModalQueryEngine(llama-index-core/llama_index/core/query_engine/multi_modal.py#L52)已被标记为deprecated(自 0.14.23 起)。官方推荐迁移到标准引擎的多模态能力:使用RetrieverQueryEngine.from_args(retriever=..., llm=..., multimodal=True)(需要引用式回答时用CitationQueryEngine.from_args(..., multimodal=True)),配合支持多模态 content block 的 chat LLM。迁移要点是:多模态模型改由llm=传入,text_qa_templateimage_qa_template合并为单个chat_content_qa_template(默认模板见 llama-index-core/llama_index/core/prompts/chat_prompts.py 中的CHAT_CONTENT_QA_PROMPT)。文档中的示例在旧版本 API 上依然成立,新项目建议采用上述迁移写法。

端到端多模态工作流与能力矩阵

官方文档给出了一张"能力矩阵"表格,用于快速判断目前各模态在 LlamaIndex 多模态 RAG 流水线中的支持状态。图例约定:

  • ✅ = 应该可以正常工作
  • ⚠️ = 有时不可靠,可能需要更多调优
  • 🛑 = 目前不可用
查询类型多模态向量存储/索引的数据源多模态嵌入检索器查询引擎输出数据类型
文本 ✅文本 ✅文本 ✅Top-k 检索 ✅ / Simple Fusion 检索 ✅Simple Query Engine ✅检索到文本 ✅ / 生成文本 ✅
图片 ✅图片 ✅图片 ✅ / 图片转文本嵌入 ✅Top-k 检索 ✅ / Simple Fusion 检索 ✅Simple Query Engine ✅检索到图片 ✅ / 生成图片 🛑
音频 🛑音频 🛑音频 🛑🛑🛑音频 🛑
视频 🛑视频 🛑视频 🛑🛑🛑视频 🛑

这张表的含义是:文本与图片两条链路目前已经打通(支持 top-k 检索与 simple fusion 排序融合),而音频、视频两种模态在文档写作时仍处于不可用状态。这也解释了为什么MultiModalRetrieverSimpleMultiModalQueryEngine目前只聚焦于"文本↔图片"的互检索与融合排序。

多模态视觉模型支持情况

官方文档以示例 Notebook 形式整理了主流视觉大模型在 LlamaIndex 中的集成状态(对应仓库中的 docs/examples/multi_modal/ 目录):

多模态视觉模型单图推理多图推理图片嵌入Simple Query EnginePydantic 结构化输出
GPT4V(OpenAI API)🛑
GPT4V-Azure(Azure API)🛑
Gemini(Google)🛑
CLIP(本地)🛑🛑🛑🛑
LLaVa(replicate)🛑🛑⚠️
Fuyu-8B(replicate)🛑🛑⚠️
ImageBind(Meta,文档标注"待集成")🛑🛑🛑🛑
MiniGPT-4🛑🛑⚠️
CogVLM(THUDM 开源项目)🛑🛑⚠️
Qwen-VL(阿里通义千问视觉模型)🛑🛑⚠️

从表中可以提炼出两条选型经验:

  1. 推理类任务(单图/多图问答)优先选 GPT-4V、GPT-4V-Azure 或 Gemini,它们同时支持 Pydantic 结构化输出;
  2. 嵌入类任务(以图搜图)目前主要由 CLIP 承担,而 CLIP 不具备生成式推理能力——这正是"推理模型"与"嵌入模型"分工的体现。

需要说明的是,仓库中实际存放的示例还覆盖了更多模型,例如 openai_multi_modal.ipynb、anthropic_multi_modal.ipynb、mistral_multi_modal.ipynb、nvidia_multi_modal.ipynb 等,可结合实际需求参考。

多模态向量存储支持情况

MultiModalVectorStoreIndex的核心设计是为文本和图片分别维护独立的向量存储。官方文档对比了三种存储方案的差异:

多模态向量存储单一向量存储多向量存储文本嵌入图片嵌入
LlamaIndex 自建多模态索引🛑任意文本嵌入(默认 GPT3.5)任意图片嵌入(默认 CLIP)
Chroma🛑CLIP ✅CLIP ✅
Weaviate(multi2vec-bind 模块,文档标注"待集成")🛑CLIP ✅ / ImageBind ✅CLIP ✅ / ImageBind ✅

要点总结:

  • LlamaIndex 自建多模态索引采用"双向量存储"架构(即前面代码示例中的text_store+image_store),文本与图片嵌入模型可分别配置,灵活性最高;
  • Chroma等外部存储则在单个存储内同时容纳文本与图片向量,嵌入模型统一使用 CLIP;
  • 需要"图文互检索"时,图片与文本嵌入应来自同一或兼容的嵌入空间(如 CLIP 的 text encoder 与 image encoder),这是保证相似度可比的前提。

在代码层面,图片嵌入的统一抽象是MultiModalEmbedding(llama-index-core/llama_index/core/embeddings/multi_modal_base.py#L16),它继承自BaseEmbedding并新增了get_image_embedding/aget_image_embedding(图片嵌入,支持同步/异步),同时保留了文本嵌入能力,从而让同一个模型既能嵌入文本又能嵌入图片。

多模态 LLM 模块与更多示例

官方文档列出的多模态 LLM 模块清单(对应 docs/examples/multi_modal/ 目录中的 Notebook):

  • OpenAI(GPT-4V / GPT-4o)
  • Gemini(Google)
  • Anthropic(Opus、Sonnet)
  • Replicate(LLaVA、Fuyu-8B、MiniGPT-4、CogVLM)
  • Pydantic Multi-Modal(结构化输出)
  • GPT-4V COT Experiments(思维链实验)
  • Llava Tesla 10q(财报问答实战)

此外,官方文档还声明支持 BLIP(Salesforce)等多模态嵌入模型,以及更多社区集成。

多模态检索增强生成(Multi-Modal RAG)

将多模态 LLM 与多模态向量存储组合,即可搭建多模态 RAG 流水线。官方文档给出的参考示例:

  • GPT-4v Retrieval:GPT-4V + 多模态索引的端到端检索问答
  • Multi-Modal Retrieval:通用的多模态检索组合
  • Image-to-Image Retrieval:以图搜图(CLIP 嵌入)
  • Chroma Multi-Modal:Chroma 单存储方案

一条典型的多模态 RAG 流程是:加载图文文档 → 分别嵌入文本与图片 → 构建双向量存储索引 → 用文本/图片 query 检索 → 用 GPT-4V 等 LMM 综合上下文生成答案。检索器通过"文本检索 + 文本→图片检索"的合并结果(即文档中提到的 Simple Fusion 排序融合),把图片证据与文本证据同时送入 LMM,从而支撑图文联合问答。

多模态评估(Evaluation)

LlamaIndex 为多模态 LLM 与多模态 RAG 提供了基础的评估能力,参考示例为 docs/examples/evaluation/multi_modal/multi_modal_rag_evaluation.ipynb。

在源码层面,核心实现是MultiModalRelevancyEvaluator(llama-index-core/llama_index/core/evaluation/multi_modal/relevancy.py#L39),它充当"多模态 LLM 裁判",评估检索到的图片与文本上下文、以及最终回答相对于 query 的相关性(relevancy)。其关键设计:

  • 默认使用OpenAIResponses(model="gpt-4.1")作为裁判模型(需安装llama-index-llms-openai),也可通过multi_modal_llm参数传入自定义 LMM;
  • 支持eval_template(评估模板)与refine_template(精炼模板),采用"先评估、必要时用新增上下文再精炼"的流程,避免因上下文过长导致漏判;
  • 评估结果覆盖"检索上下文是否相关"与"回答是否相关"两个维度,可用于量化多模态 RAG 的检索质量与生成质量。

总结

LlamaIndex 的多模态支持围绕三条主线展开:MultiModalLLM抽象统一各类视觉大模型的推理接口;MultiModalEmbedding+MultiModalVectorStoreIndex实现图文双通道的向量化与存储;MultiModalVectorIndexRetriever与查询引擎完成跨模态检索与生成。当前能力矩阵中,文本与图片链路已完整可用(推理、嵌入、检索、问答、评估),音频与视频尚待补齐。对于新项目,建议关注SimpleMultiModalQueryEngine的废弃迁移方向——标准引擎的multimodal=True方案,并参考仓库中 docs/examples/multi_modal/ 下的各 Notebook 快速搭建自己的多模态 RAG 应用。

【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询