跳到正文
LlamaIndex:产品、工程与评测·· 2023-11-10精选AI 评分65

LlamaIndex 推出多模态 RAG 新抽象,支持 GPT-4V 与 CLIP 的图文混合检索

Multi-Modal RAG

AI 导读

LlamaIndex 发布多模态 RAG 支持能力,新增 OpenAIMultiModal、ReplicateMultiModal、MultiModalEmbedding(CLIP)和 MultiModalVectorStoreIndex 等抽象,可对文本和图像统一索引与检索。

推荐理由

原文由 LlamaIndex 给出多模态 RAG 的新抽象与代码示例,读者可以直接了解 GPT-4V、CLIP 与 Qdrant 在同一管线中的组合方式。

正文 · AI 翻译

(由 Haotian Zhang、Laurie Voss 和 Jerry Liu @ LlamaIndex 共同撰写)

概述

在这篇博客中,我们很高兴地介绍一个全新的范式:多模态检索增强生成(RAG)。我们在 LlamaIndex 中提出了新的抽象,现在可以实现以下功能:

立即探索我们的免费和付费计划。

  • 多模态 LLM 和嵌入
  • 多模态索引和检索(与向量数据库集成)

OpenAI Dev Day 上最令人兴奋的公告之一是 GPT-4V API 的发布。GPT-4V 是一个多模态模型,可以接收文本/图像,并输出文本响应。这是近期多模态模型系列进展中的最新模型:LLaVa 和 Fuyu-8B。

这将以令人兴奋的新方向扩展 LLM 的能力。在过去一年中,围绕文本输入/文本输出范式涌现了完整的应用栈。最显著的例子之一是检索增强生成(RAG)——将 LLM 与外部文本语料库结合,以对模型未训练过的数据进行推理。RAG 对最终用户最重要的影响之一是它极大地加速了对非结构化文本数据的洞察时间。通过处理任意文档(PDF、网页),将其加载到存储中,并输入到 LLM 的上下文窗口中,你可以从中提取任何想要的见解。

GPT-4V API 的引入使我们能够将 RAG 概念扩展到图像/文本混合领域,并从更大的数据语料库(包括图像)中释放价值。

思考一下标准 RAG 管道中的所有步骤,以及如何将其扩展到多模态设置。

  • 输入:输入可以是文本或图像。
  • 检索:检索到的上下文可以是文本或图像。
  • 合成:答案可以在文本和图像上合成。
  • 响应:返回的结果可以是文本和/或图像。

这只是整个领域的一小部分。你可以进行链式/顺序调用,在图像和文本推理之间交替,例如检索增强图像描述或多模态代理循环。

LlamaIndex 中的抽象

我们很高兴在 LlamaIndex 中提出新的抽象,帮助实现多模态 RAG。对于每个抽象,我们明确说明我们目前已经完成的工作以及仍待完成的工作。

多模态 LLM

我们通过 OpenAIMultiModal 类直接支持 GPT-4V,并通过 ReplicateMultiModal 类支持开源多模态模型(目前处于测试阶段,因此名称可能会更改)。我们的 SimpleDirectoryReader 长期以来一直能够摄取音频、图像和视频,但现在你可以直接将它们传递给 GPT-4V 并询问相关问题,如下所示:

from llama_index.multi_modal_llms import OpenAIMultiModal
from llama_index import SimpleDirectoryReader

image_documents = SimpleDirectoryReader(local_directory).load_data()

openai_mm_llm = OpenAIMultiModal(
    model="gpt-4-vision-preview", api_key=OPENAI_API_TOKEN, max_new_tokens=300
)
response = openai_mm_llm.complete(
    prompt="what is in the image?", image_documents=image_documents
) 

这是一个新的基础模型抽象。与我们默认的 LLM 类不同,后者具有标准的补全/聊天端点,多模态模型(MultiModalLLM)可以同时接收图像和文本作为输入。

这也统一了 GPT-4V 和开源模型之间的接口。

资源

我们为 GPT-4V 和托管在 Replicate 上的视觉模型提供了初步实现。我们还有一个多模态模型的文档页面:

给定文本查询“将图像描述为替代文本”时,GPT-4V 显示的图像和示例输出

仍待完成:

  • 更多多模态 LLM 集成
  • 聊天端点
  • 流式传输

多模态嵌入

我们引入了一个新的 MultiModalEmbedding 基类,它可以同时嵌入文本和图像。它包含我们现有嵌入模型(子类 BaseEmbedding)的所有方法,但也暴露了 get_image_embedding。

我们这里的主要实现是 ClipEmbedding 与 CLIP 模型。请参阅下文了解如何在实践中使用它。

即将推出的内容

  • 更多多模态嵌入集成

多模态索引与检索

我们创建了一个新索引,即 MultiModalVectorIndex,它可以将文本和图像索引到底层存储系统中——具体来说是向量数据库和文档存储。

与我们现有的(最流行的)索引 VectorStoreIndex 不同,这个新索引可以同时存储文本和图像文档。文本索引保持不变——它使用文本嵌入模型进行嵌入,并存储在向量数据库中。图像索引涉及一个单独的过程:

  1. 使用 CLIP 嵌入图像
  2. 将图像节点表示为 base64 编码或路径,并将其与其嵌入一起存储在向量数据库(与文本分开的集合)中。

我们将图像和文本分开存储,因为我们可能希望对文本使用仅文本嵌入模型,而不是 CLIP 嵌入(例如 ada 或 sbert)。

在检索时,我们执行以下操作:

  1. 通过对文本嵌入进行向量搜索来检索文本
  2. 通过对图像嵌入进行向量搜索来检索图像

文本和图像都作为结果列表中的节点返回。然后我们可以对这些结果进行综合。

即将推出的内容

  • 更多在向量存储中存储图像的原生方式(超越 base64 编码)
  • 更灵活的多模态检索抽象(例如将图像检索与任何文本检索方法结合)
  • 多模态响应综合抽象。目前处理长文本上下文的方式是进行“创建并精炼”或“树摘要”。对于多个图像和文本的通用响应综合是什么样子尚不清楚。

笔记本演练

让我们演练一个笔记本示例。这里我们介绍一个用例:根据特斯拉网站/车辆的截图、SEC 文件和维基百科页面来查询特斯拉。

我们将文档加载为文本文档和图像的混合:

documents = SimpleDirectoryReader("./mixed_wiki/").load_data()

然后我们在 Qdrant 中定义两个单独的向量数据库集合:一个用于文本文档的集合,一个用于图像的集合。然后我们定义一个 MultiModalVectorStoreIndex。

# Create a local Qdrant vector store
client = qdrant_client.QdrantClient(path="qdrant_mm_db")

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)

# Create the MultiModal index
index = MultiModalVectorStoreIndex.from_documents(
    documents, storage_context=storage_context, image_vector_store=image_store
)

然后我们可以对我们的多模态语料库提问。

示例 1:检索增强字幕

这里我们复制/粘贴一个初始图像字幕作为输入,以获得检索增强的输出:

retriever_engine = index.as_retriever(
    similarity_top_k=3, image_similarity_top_k=3
)

retrieval_results = retriever_engine.retrieve(query_str)

检索到的结果包含图像和文本:

检索到的文本/图像结果

我们可以将其输入 GPT-4V 以提出后续问题或综合出连贯的响应:

综合结果

示例 2:多模态 RAG 查询

这里我们提出一个问题,并从整个多模态 RAG 管道获得响应。SimpleMultiModalQueryEngine 首先检索相关图像/文本集,并将输入馈送到视觉模型以综合响应。

from llama_index.query_engine import SimpleMultiModalQueryEngine

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)

生成的结果 + 来源如下所示:

来源:LlamaIndex:产品、工程与评测 · llamaindex.ai