完全指南:从 GPT-4V 推理到多模态 RAG)
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 等视觉大模型接入到MultiModalVectorStoreIndex、MultiModalRetriever、SimpleMultiModalQueryEngine构建的端到端多模态检索增强生成Multi-Modal RAG流水线。读完本文你将掌握如何在 LlamaIndex 中完成图像加载、图文联合检索、图文问答以及多模态 RAG 的效果评估。概念从 LLM 到 LMM 的抽象传统大语言模型LLM是文本进、文本出的模型。而大型多模态模型Large Multi-modal ModelsLMM将这种能力推广到文本之外的模态例如 GPT-4V 可以同时输入图片与文本并输出文本。LlamaIndex 为此提供了一个基类抽象MultiModalLLM用于统一文本 图片模型的接入方式文档中特别注明该命名未来可能调整。在源码中MultiModalLLM位于 llama-index-core/llama_index/core/multi_modal_llms/base.py它继承自BaseComponent与DispatcherSpanMixin是一套声明式抽象接口主要包含以下端点同步端点complete(prompt, image_documents)补全、stream_complete(...)流式补全、chat(messages)对话、stream_chat(...)流式对话异步端点acomplete、astream_complete、achat、astream_chat等用于 asyncio 环境元数据每个模型通过metadata属性暴露MultiModalLLMMetadata。MultiModalLLMMetadatabase.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_nameunknown模型名称用于日志、测试与 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( modelgpt-4-vision-preview, api_keyOPENAI_API_KEY, max_new_tokens300 ) response openai_mm_llm.complete( promptwhat is in the image?, image_documentsimage_documents )其中load_image_urls定义于 llama-index-core/llama_index/core/multi_modal_llms/generic_utils.py实现非常直接——把每个 URL 包装成ImageDocument(image_urlurl)返回。generic_utils.py中还提供了一组与图像编码相关的工具函数它们在底层完成图片 → base64 → 请求体的转换是理解整个多模态调用链路的关键encode_image(image_path)读取本地图片并返回 base64 字符串image_documents_to_base64(image_documents)遍历ImageDocument依次尝试使用已编码的image字段、image_path、metadata[file_path]或image_url通过requests.get拉取进行编码infer_image_mimetype_from_file_path/infer_image_mimetype_from_base64推断图片 MIME 类型支持 jpeg、png、gif、webp无法识别时默认image/jpegset_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(pathqdrant_mm_db) # 如果只需要 image_store 做图片检索可以移除 text_store text_store QdrantVectorStore( clientclient, collection_nametext_collection ) image_store QdrantVectorStore( clientclient, collection_nameimage_collection ) storage_context StorageContext.from_defaults( vector_storetext_store, image_storeimage_store ) # 从本地文件夹加载文本与图片文档 documents SimpleDirectoryReader(./data_folder/).load_data() # 创建多模态索引 index MultiModalVectorStoreIndex.from_documents( documents, storage_contextstorage_context, )从源码结构看MultiModalVectorStoreIndexllama-index-core/llama_index/core/indices/multi_modal/base.py#L46继承自普通VectorStoreIndex并通过image_namespace image在StorageContext中注册一个独立的图片向量存储命名空间。它的初始化参数值得逐一说明参数默认值说明embed_modelSettings.embed_model文本嵌入模型image_embed_modelclip:ViT-B/32图片嵌入模型默认 CLIP ViT-B/32image_vector_storeNone图片向量存储兼容旧接口也可通过storage_context传入image_storeis_image_to_textFalse是否在嵌入图片的同时用文本嵌入模型对图片的文本描述caption做二次嵌入is_image_vector_store_emptyFalse仅使用单一向量存储时的标记表示图片向量存储为空is_text_vector_store_emptyFalse同上表示文本向量存储为空索引构建时见_get_node_with_embeddingbase.py#L232-L285ImageNode会通过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_k3, image_similarity_top_k3 ) # 从 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_llmopenai_mm_llm, text_qa_templateqa_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.pyMultiModalVectorIndexRetriever继承自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_retrieveretriever.py#L166-L182改用图片嵌入模型image_embed_model.get_agg_embedding_from_queries对 query 编码再到图片向量库检索实现文字找图image_to_image_retrieveretriever.py#L208-L215用图片嵌入模型对输入图片编码实现以图搜图。关于SimpleMultiModalQueryEngine的重要提示当前仓库源码中SimpleMultiModalQueryEnginellama-index-core/llama_index/core/query_engine/multi_modal.py#L52已被标记为deprecated自 0.14.23 起。官方推荐迁移到标准引擎的多模态能力使用RetrieverQueryEngine.from_args(retriever..., llm..., multimodalTrue)需要引用式回答时用CitationQueryEngine.from_args(..., multimodalTrue)配合支持多模态 content block 的 chat LLM。迁移要点是多模态模型改由llm传入text_qa_template与image_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 排序融合而音频、视频两种模态在文档写作时仍处于不可用状态。这也解释了为什么MultiModalRetriever与SimpleMultiModalQueryEngine目前只聚焦于文本↔图片的互检索与融合排序。多模态视觉模型支持情况官方文档以示例 Notebook 形式整理了主流视觉大模型在 LlamaIndex 中的集成状态对应仓库中的 docs/examples/multi_modal/ 目录多模态视觉模型单图推理多图推理图片嵌入Simple Query EnginePydantic 结构化输出GPT4VOpenAI API✅✅✅✅GPT4V-AzureAzure API✅✅✅✅GeminiGoogle✅✅✅✅CLIP本地✅LLaVareplicate✅✅⚠️Fuyu-8Breplicate✅✅⚠️ImageBindMeta文档标注待集成✅MiniGPT-4✅✅⚠️CogVLMTHUDM 开源项目✅✅⚠️Qwen-VL阿里通义千问视觉模型✅✅⚠️从表中可以提炼出两条选型经验推理类任务单图/多图问答优先选 GPT-4V、GPT-4V-Azure 或 Gemini它们同时支持 Pydantic 结构化输出嵌入类任务以图搜图目前主要由 CLIP 承担而 CLIP 不具备生成式推理能力——这正是推理模型与嵌入模型分工的体现。需要说明的是仓库中实际存放的示例还覆盖了更多模型例如 openai_multi_modal.ipynb、anthropic_multi_modal.ipynb、mistral_multi_modal.ipynb、nvidia_multi_modal.ipynb 等可结合实际需求参考。多模态向量存储支持情况MultiModalVectorStoreIndex的核心设计是为文本和图片分别维护独立的向量存储。官方文档对比了三种存储方案的差异多模态向量存储单一向量存储多向量存储文本嵌入图片嵌入LlamaIndex 自建多模态索引✅任意文本嵌入默认 GPT3.5任意图片嵌入默认 CLIPChroma✅CLIP ✅CLIP ✅Weaviatemulti2vec-bind 模块文档标注待集成✅CLIP ✅ / ImageBind ✅CLIP ✅ / ImageBind ✅要点总结LlamaIndex 自建多模态索引采用双向量存储架构即前面代码示例中的text_storeimage_store文本与图片嵌入模型可分别配置灵活性最高Chroma等外部存储则在单个存储内同时容纳文本与图片向量嵌入模型统一使用 CLIP需要图文互检索时图片与文本嵌入应来自同一或兼容的嵌入空间如 CLIP 的 text encoder 与 image encoder这是保证相似度可比的前提。在代码层面图片嵌入的统一抽象是MultiModalEmbeddingllama-index-core/llama_index/core/embeddings/multi_modal_base.py#L16它继承自BaseEmbedding并新增了get_image_embedding/aget_image_embedding图片嵌入支持同步/异步同时保留了文本嵌入能力从而让同一个模型既能嵌入文本又能嵌入图片。多模态 LLM 模块与更多示例官方文档列出的多模态 LLM 模块清单对应 docs/examples/multi_modal/ 目录中的 NotebookOpenAIGPT-4V / GPT-4oGeminiGoogleAnthropicOpus、SonnetReplicateLLaVA、Fuyu-8B、MiniGPT-4、CogVLMPydantic Multi-Modal结构化输出GPT-4V COT Experiments思维链实验Llava Tesla 10q财报问答实战此外官方文档还声明支持 BLIPSalesforce等多模态嵌入模型以及更多社区集成。多模态检索增强生成Multi-Modal RAG将多模态 LLM 与多模态向量存储组合即可搭建多模态 RAG 流水线。官方文档给出的参考示例GPT-4v RetrievalGPT-4V 多模态索引的端到端检索问答Multi-Modal Retrieval通用的多模态检索组合Image-to-Image Retrieval以图搜图CLIP 嵌入Chroma Multi-ModalChroma 单存储方案一条典型的多模态 RAG 流程是加载图文文档 → 分别嵌入文本与图片 → 构建双向量存储索引 → 用文本/图片 query 检索 → 用 GPT-4V 等 LMM 综合上下文生成答案。检索器通过文本检索 文本→图片检索的合并结果即文档中提到的 Simple Fusion 排序融合把图片证据与文本证据同时送入 LMM从而支撑图文联合问答。多模态评估EvaluationLlamaIndex 为多模态 LLM 与多模态 RAG 提供了基础的评估能力参考示例为 docs/examples/evaluation/multi_modal/multi_modal_rag_evaluation.ipynb。在源码层面核心实现是MultiModalRelevancyEvaluatorllama-index-core/llama_index/core/evaluation/multi_modal/relevancy.py#L39它充当多模态 LLM 裁判评估检索到的图片与文本上下文、以及最终回答相对于 query 的相关性relevancy。其关键设计默认使用OpenAIResponses(modelgpt-4.1)作为裁判模型需安装llama-index-llms-openai也可通过multi_modal_llm参数传入自定义 LMM支持eval_template评估模板与refine_template精炼模板采用先评估、必要时用新增上下文再精炼的流程避免因上下文过长导致漏判评估结果覆盖检索上下文是否相关与回答是否相关两个维度可用于量化多模态 RAG 的检索质量与生成质量。总结LlamaIndex 的多模态支持围绕三条主线展开MultiModalLLM抽象统一各类视觉大模型的推理接口MultiModalEmbeddingMultiModalVectorStoreIndex实现图文双通道的向量化与存储MultiModalVectorIndexRetriever与查询引擎完成跨模态检索与生成。当前能力矩阵中文本与图片链路已完整可用推理、嵌入、检索、问答、评估音频与视频尚待补齐。对于新项目建议关注SimpleMultiModalQueryEngine的废弃迁移方向——标准引擎的multimodalTrue方案并参考仓库中 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),仅供参考