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

一、多模态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并进行问答,如下所示:

from llama_index.multi_modal_llms import OpenAIMultiModalfrom llama_index import SimpleDirectoryReaderimage_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填充物和维基百科页面的截图来查询特斯拉。

加载文本和图像混合文本:

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

       然后,我们在Qdrant中定义两个独立的矢量数据库:一个用于存储文本文档,一个用于存储图像。然后我们定义一个MultiModalVectorStoreIndex。

# 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:检索增强字幕

       我们复制/粘贴初始图像标题作为输入,以获得检索增强输出:

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首先检索相关图像/文本集,并将其输入给视觉模型,以便合成响应。

from llama_index.query_engine import SimpleMultiModalQueryEnginequery_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter 实战 之 dio小实践

我们要对dio进行封装 class HttpRequest {static Future request(String url,{String method "get",Map<String,dynamic>? params})async{// 创建dio实例BaseOptions baseOptions BaseOptions(baseUrl: base_url,connectTimeout: Duration(seconds: 1));fi…

50 个具有挑战性的概率问题 [04/50]:尝试直至首次成功

一、说明 你好&#xff0c;我最近对与概率相关的问题产生了兴趣。我偶然发现了 Frederick Mosteller 所著的《五十个具有挑战性的概率问题及其解决方案》这本书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇文章仅包含 1 个问题&#xff0c;使其…

【四】【C语言\动态规划】地下城游戏、按摩师、打家劫舍 II,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

一款超好看流行的HTML随机视频播放背景引导页面源码

前言 今天宋佳乐博客给大家带来一款2024新版视频背景网址导航引导页面源码带背景动态HTML源码 源码介绍 2024新版视频背景网址导航引导页面源码带背景动态HTML源码&#xff0c;非常的炫酷&#xff0c;有需要的自行去体验吧&#xff0c;还是非常不错的 演示地址&#xff1a;点…

《xHCI 1.2》3体系结构概览

3.2 xHCI数据结构 3.2.1 Device Context Base Address Array 3.2.2 Device Context 3.2.3 Slot Context

keystone和beaengine的编译

编译Keystone 根据github的文档编译不出来&#xff0c;所以还是用CMake项目转成Visual Studio的项目来编译 1、下载源码 https://github.com/keystone-engine/keystone clone或者直接下载zip都行 2、CMake创建Visual Studio项目 下载和安装CMake就不细说了&#xff0c;在…

网络7层架构

网络 7 层架构 什么是OSI七层模型&#xff1f; OSI模型用于定义并理解数据从一台计算机转移到另一台计算机&#xff0c;在最基本的形式中&#xff0c;两台计算机通过网线和连接器相互连接&#xff0c;在网卡的帮助下共享数据&#xff0c;形成一个网络&#xff0c;但是一台计算…

正餐---二叉树的OJ题

目录​​​​​​​ 前言&#x1f36f; 1. 检查两颗树是否相同&#x1f947; 1.1 思路分析&#x1fa99; 1.2 代码实现&#x1f9f0; 2. 单值二叉树&#x1f332; 2.1 思路分析&#x1f52e; 2.2 代码实现&#x1f488; 3. 二叉树的前序遍历&#x1f39f;️ 3.1 思路分…

【数据结构】线性表

一.线性表 1.定义&#xff1a; n个同类型数据元素的有限序列&#xff0c;记为 L为表名&#xff0c;i为数据元素在线性表中的位序&#xff0c;n为线性表的表长&#xff0c;n0时称为空表。 2.数据元素之间的关系&#xff1a; 直接前驱和直接后继 3.抽象数据类型线性表的定义…

git首次使用--去公司第一次拉取

文章目录 一&#xff0c; 在企业中首次拉取项目二&#xff0c;提交项目1. 提交----新添加的文件2. 将分支上的代码同步到master3. 提交----更改后的文件 三&#xff0c;常见问题1. Git Pull Failed 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一&am…

固定效应模型-以stata为工具

固定效应模型-以stata为工具 文章目录 1.固定效应模型2. 模型原理3. `stata`代码实现1.固定效应模型 固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学…

qt项目-《图像标注软件》源码阅读笔记-类图

目录 1. 开源项目链接 2. 项目界面 3. 项目类图 3.1 形状的绘制及形状的存储 3.2 主窗口中心组件的界面管理 3.3 Command负责实现撤销和重做功能 3.4 其他类 3.5 枚举 3.5.1 Status 主窗口的状态变量 3.5.2 Mode 主窗口模式状态变量 3.5.3 shapeStatus 中心组件状态…

josef约瑟 电流继电器 RL-D1 电压AC220V 整定范围0-9.99AAC

系列型号 RL-D1型电流继电器&#xff1b; RL-D2型电流继电器&#xff1b; 基本参数 RL-D系列电流继电器用于发电机、变压器和输电线的过负荷和短路保护装置中作为启动元件。本继电器为集成电路型继电器&#xff0c;精度高、功耗小、动作时间快&#xff0c; 返回系数高、整定…

AndroidStudio无法新建aidl文件解决办法

我用的 AS 版本是 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 右键新建 aidl 文件&#xff0c; 提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file 解决办法 修改 app 的 build.…

03_排序

03_排序 一、简单排序Comparable接口介绍需求&#xff1a; 冒泡排序排序原理&#xff1a;冒泡排序API设计&#xff1a; 选择排序排序原理&#xff1a;选择排序API设计&#xff1a;选择排序的时间复杂度分析&#xff1a; 插入排序需求&#xff1a;排序原理&#xff1a;插入排序A…

三菱人机交互GT Designer的安装

今天&#xff0c;与小编一起来学习三菱的GT Designer软件&#xff0c;下面就是小编记录的软件查找&#xff0c;安装的全过程&#xff0c;希望对你学习三菱有帮助。 目录 安装 选择官网下载安装包 解压安装包进行安装 创建一个工程 安装 选择官网下载安装包 三菱&#xff08;中…

如何在linux安装软件

一.安装种类 1.编译安装&#xff1a;灵活性高&#xff0c;难度较大&#xff0c; 可以安装新版本 2.rpm安装&#xff1a;查软件信息&#xff0c;是否安装&#xff0c;文件列表 3.yum&#xff1a;是rpm的升级版本&#xff0c;解决rpm的弊端 rpm安装&#xff1a; 安装软件的时…

【架构】ServerLess

文章目录 概述什么是serverless无服务与传统模式架构区别serverless优缺点使用serverless的应用场景有哪些“无服务器”搭建网站Serverless的落地案例来源 概述 架构 单体&#xff08;三层架构&#xff09;微服务分布式ServerLess 什么是serverless无服务 serverless中文的…

VirtualBox虚拟机使用USB3.0网卡与开发板通信

因为我的笔记本没有带网口&#xff0c;所以我使用的是USB网卡。我按照网上其他人发的“VirtualBox与开发板、主机相互ping通”文章中提到的方法&#xff0c;进行网络设置后发现仍然无法实现Ubuntu虚拟机与主机和Linux开发板相互ping通。 仔细回想以前Ubuntu虚拟机使用USB读卡器…

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…