LLM之RAG实战(七)| 利用llama_index实现多模态RAG

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574


一、多模态RAG

       OpenAI开发日上最令人兴奋的发布之一是GPT-4V API(https://platform.openai.com/docs/guides/vision)的发布。GPT-4V是一个多模态模子,可以接收文本/图像,并可以输出文本响应。近来还有一些其他的多模态模子:LLaVa和Fuyu-8B。
​      在已往的一年里,大部分应用步伐开发都是围绕文本输入/文本输出范式。最典型的例子之一是检索增强生成(RAG)——将LLM与外部文本语料库相结合,对模子未经练习的数据进行推理。通过处置惩罚恣意文档(比如PDF、网页),将其切分为块并存储到向量数据库中,然后通过检索到相干的块输入给LLM,让LLM给出用户等待的回复。
       与标准RAG pipeline对比,我们看一下多模态RAG的全部步骤:
输入:输入可以是文本或图像。
检索:检索到的上下文可以是文本或图像。
合成:答案可以在文本和图像上合成。
响应:返回的结果可以是文本和/或图像。
       也可以在图像和文本之间采用链式/次序调用,比方检索增强图像字幕或在多模态代理进行循环。
二、多模态LLM

   OpenAIMultiModal类可以直接支持GPT-4V模子,ReplicateMultiModal类可以支持开源多模式模子(目前处于测试版,因此名称可能会更改)。SimpleDirectoryReader可以或许接收音频、图像和视频,现在可以直接将它们传递给GPT-4V并进行问答,如下所示:
  1. from llama_index.multi_modal_llms import OpenAIMultiModalfrom 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)可以担当图像和文本作为输入。
三、多模态嵌入

      我们介绍一个新的MultiModalEmbedding基类,它既可以embedding文本也可以embedding图像。它包含了我们现有嵌入模子的全部方法(子类BaseEmbedding),但也公开了get_image_embedding。我们在这里的主要实现是利用CLIP模子的ClipEmbedding。
四、多模态索引与检索

      MultiModalVectorIndex可以从向量数据库中索引文本和图像。与我们现有的(最流行的)索引VectorStoreIndex不同,这个新索引可以存储文本和图像文档。索引文本与之前是一样的——利用文本嵌入模子嵌入的,并存储在矢量数据库中。图像索引是一个单独的过程,如下所示:、


  • 利用CLIP嵌入图像;
  • 利用base64编码或路径表示图像节点,并将其与嵌入一起存储在矢量数据库中(与文本分离)。
       我们将图像和文本分开存储,由于我们可能希望对文本利用纯文本嵌入模子,而不是CLIP嵌入(比方ada或sbert)。
在检索期间,我们执行以下操纵:


  • 通过在文本嵌入上进行矢量搜索来检索文本;
  • 通过在图像嵌入上进行矢量搜索来检索图像
文本和图像作为节点返回到结果列表中,然后再汇总这些结果。
五、多模态RAG实战

       下面我们以查询特斯拉为例展示llama_index实现多模态RAG,根据给出特斯拉的网站或车辆、SEC填充物和维基百科页面的截图来查询特斯拉。
加载文本和图像混淆文本:
  1. documents = SimpleDirectoryReader("./mixed_wiki/").load_data()
复制代码
       然后,我们在Qdrant中定义两个独立的矢量数据库:一个用于存储文本文档,一个用于存储图像。然后我们定义一个MultiModalVectorStoreIndex。
  1. # Create a local Qdrant vector storeclient = 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 indexindex = MultiModalVectorStoreIndex.from_documents(    documents, storage_context=storage_context, image_vector_store=image_store)
复制代码
       末了,我们可以通过我们的多模态语料库进行提问。
示例1:检索增强字幕
       我们复制/粘贴初始图像标题作为输入,以得到检索增强输出:
  1. retriever_engine = index.as_retriever(    similarity_top_k=3, image_similarity_top_k=3)# retrieve more information from the GPT4V responseretrieval_results = retriever_engine.retrieve(query_str)
复制代码
检索到的结果包含图像和文本:


我们可以将其提供给GPT-4V,以提出后续标题或综合一致的回答:


示例2:多模态RAG查询
      我们提出了一个标题,并从整个多模态RAG pipeline中得到回应。SimpleMultiModalQueryEngine起首检索相干图像/文本集,并将其输入给视觉模子,以便合成响应。
  1. 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)
复制代码
         生成的结果+来源如下所示:




参考文献:

[1] https://blog.llamaindex.ai/multi-modal-rag-621de7525fea
[2] https://github.com/run-llama/llama_index/blob/main/docs/examples/multi_modal/llava_multi_modal_tesla_10q.ipynb

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表