使用CLIP和LLM构建多模态RAG系统

在本文中我们将探讨使用开源大型语言多模态模型(Large Language Multi-Modal)构建检索增强生成(RAG)系统。本文的重点是在不依赖LangChain或LLlama index的情况下实现这一目标,这样可以避免更多的框架依赖。

什么是RAG

在人工智能领域,检索增强生成(retrieve - augmented Generation, RAG)作为一种变革性技术改进了大型语言模型(Large Language Models)的能力。从本质上讲,RAG通过允许模型从外部源动态检索实时信息来增强AI响应的特异性。

该体系结构将生成能力与动态检索过程无缝结合,使人工智能能够适应不同领域中不断变化的信息。与微调和再训练不同,RAG提供了一种经济高效的解决方案,允许人工智能在不改变整个模型的情况下能够得到最新和相关的信息。

RAG的作用

1、提高准确性和可靠性:

通过将大型语言模型(llm)重定向到权威的知识来源来解决它们的不可预测性。降低了提供虚假或过时信息的风险,确保更准确和可靠的反应。

2、增加透明度和信任:

像LLM这样的生成式人工智能模型往往缺乏透明度,这使得人们很难相信它们的输出。RAG通过允许组织对生成的文本输出有更大的控制,解决了对偏差、可靠性和遵从性的关注。

3、减轻幻觉:

LLM容易产生幻觉反应——连贯但不准确或捏造的信息。RAG通过确保响应以权威来源为基础,减少关键部门误导性建议的风险。

4、具有成本效益的适应性:

RAG提供了一种经济有效的方法来提高AI输出,而不需要广泛的再训练/微调。可以通过根据需要动态获取特定细节来保持最新和相关的信息,确保人工智能对不断变化的信息的适应性。

多模式模态模型

多模态涉及有多个输入,并将其结合成单个输出,以CLIP为例:CLIP的训练数据是文本-图像对,通过对比学习,模型能够学习到文本-图像对的匹配关系。

该模型为表示相同事物的不同输入生成相同(非常相似)的嵌入向量。

多模

态大型语言(multi-modal large language)

GPT4v和Gemini vision就是探索集成了各种数据类型(包括图像、文本、语言、音频等)的多模态语言模型(MLLM)。虽然像GPT-3、BERT和RoBERTa这样的大型语言模型(llm)在基于文本的任务中表现出色,但它们在理解和处理其他数据类型方面面临挑战。为了解决这一限制,多模态模型结合了不同的模态,从而能够更全面地理解不同的数据。

多模态大语言模型它超越了传统的基于文本的方法。以GPT-4为例,这些模型可以无缝地处理各种数据类型,包括图像和文本,从而更全面地理解信息。

与RAG相结合

这里我们将使用Clip嵌入图像和文本,将这些嵌入存储在ChromDB矢量数据库中。然后将利用大模型根据检索到的信息参与用户聊天会话。

我们将使用来自Kaggle的图片和维基百科的信息来创建一个花卉专家聊天机器人

首先我们安装软件包:

 ! pip install -q timm einops wikipedia chromadb open_clip_torch!pip install -q transformers==4.36.0!pip install -q bitsandbytes==0.41.3 accelerate==0.25.0

预处理数据的步骤很简单只是把图像和文本放在一个文件夹里

可以随意使用任何矢量数据库,这里我们使用ChromaDB。

 import chromadbfrom chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunctionfrom chromadb.utils.data_loaders import ImageLoaderfrom chromadb.config import Settingsclient = chromadb.PersistentClient(path="DB")embedding_function = OpenCLIPEmbeddingFunction()image_loader = ImageLoader() # must be if you reads from URIs

ChromaDB需要自定义嵌入函数

 from chromadb import Documents, EmbeddingFunction, Embeddingsclass MyEmbeddingFunction(EmbeddingFunction):def __call__(self, input: Documents) -> Embeddings:# embed the documents somehow or imagesreturn embeddings

这里将创建2个集合,一个用于文本,另一个用于图像

 collection_images = client.create_collection(name='multimodal_collection_images', embedding_function=embedding_function, data_loader=image_loader)collection_text = client.create_collection(name='multimodal_collection_text', embedding_function=embedding_function, )# Get the ImagesIMAGE_FOLDER = '/kaggle/working/all_data'image_uris = sorted([os.path.join(IMAGE_FOLDER, image_name) for image_name in os.listdir(IMAGE_FOLDER) if not image_name.endswith('.txt')])ids = [str(i) for i in range(len(image_uris))]collection_images.add(ids=ids, uris=image_uris) #now we have the images collection

对于Clip,我们可以像这样使用文本检索图像

 from matplotlib import pyplot as pltretrieved = collection_images.query(query_texts=["tulip"], include=['data'], n_results=3)for img in retrieved['data'][0]:plt.imshow(img)plt.axis("off")plt.show()

也可以使用图像检索相关的图像

文本集合如下所示

 # now the text DBfrom chromadb.utils import embedding_functionsdefault_ef = embedding_functions.DefaultEmbeddingFunction()text_pth = sorted([os.path.join(IMAGE_FOLDER, image_name) for image_name in os.listdir(IMAGE_FOLDER) if image_name.endswith('.txt')])list_of_text = []for text in text_pth:with open(text, 'r') as f:text = f.read()list_of_text.append(text)ids_txt_list = ['id'+str(i) for i in range(len(list_of_text))]ids_txt_listcollection_text.add(documents = list_of_text,ids =ids_txt_list)

然后使用上面的文本集合获取嵌入

 results = collection_text.query(query_texts=["What is the bellflower?"],n_results=1)results

结果如下:

 {'ids': [['id0']],'distances': [[0.6072186183744086]],'metadatas': [[None]],'embeddings': None,'documents': [['Campanula () is the type genus of the Campanulaceae family of flowering plants. Campanula are commonly known as bellflowers and take both their common and scientific names from the bell-shaped flowers—campanula is Latin for "little bell".\nThe genus includes over 500 species and several subspecies, distributed across the temperate and subtropical regions of the Northern Hemisphere, with centers of diversity in the Mediterranean region, Balkans, Caucasus and mountains of western Asia. The range also extends into mountains in tropical regions of Asia and Africa.\nThe species include annual, biennial and perennial plants, and vary in habit from dwarf arctic and alpine species under 5 cm high, to large temperate grassland and woodland species growing to 2 metres (6 ft 7 in) tall.']],'uris': None,'data': None}

或使用图片获取文本

 query_image = '/kaggle/input/flowers/flowers/rose/00f6e89a2f949f8165d5222955a5a37d.jpg'raw_image = Image.open(query_image)doc = collection_text.query(query_embeddings=embedding_function(query_image),n_results=1,)['documents'][0][0]

上图的结果如下:

 A rose is either a woody perennial flowering plant of the genus Rosa (), in the family Rosaceae (), or the flower it bears. There are over three hundred species and tens of thousands of cultivars. They form a group  of plants that can be erect shrubs, climbing, or trailing, with stems  that are often armed with sharp prickles. Their flowers vary in size and shape and are usually large and showy, in colours ranging from white  through yellows and reds. Most species are native to Asia, with smaller  numbers native to Europe, North America, and northwestern Africa.  Species, cultivars and hybrids are all widely grown for their beauty and often are fragrant. Roses have acquired cultural significance in many  societies. Rose plants range in size from compact, miniature roses, to  climbers that can reach seven meters in height. Different species  hybridize easily, and this has been used in the development of the wide  range of garden roses.

这样我们就完成了文本和图像的匹配工作,其实这里都是CLIP的工作,下面我们开始加入LLM。

 from huggingface_hub import hf_hub_downloadhf_hub_download(repo_id="visheratin/LLaVA-3b", filename="configuration_llava.py", local_dir="./", force_download=True)hf_hub_download(repo_id="visheratin/LLaVA-3b", filename="configuration_phi.py", local_dir="./", force_download=True)hf_hub_download(repo_id="visheratin/LLaVA-3b", filename="modeling_llava.py", local_dir="./", force_download=True)hf_hub_download(repo_id="visheratin/LLaVA-3b", filename="modeling_phi.py", local_dir="./", force_download=True)hf_hub_download(repo_id="visheratin/LLaVA-3b", filename="processing_llava.py", local_dir="./", force_download=True)

我们是用visheratin/LLaVA-3b

 from modeling_llava import LlavaForConditionalGenerationimport torchmodel = LlavaForConditionalGeneration.from_pretrained("visheratin/LLaVA-3b")model = model.to("cuda")

加载tokenizer

 from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("visheratin/LLaVA-3b")

然后定义处理器,方便我们以后调用

 from processing_llava import LlavaProcessor, OpenCLIPImageProcessorimage_processor = OpenCLIPImageProcessor(model.config.preprocess_config)processor = LlavaProcessor(image_processor, tokenizer)

下面就可以直接使用了

 question = 'Answer with organized answers: What type of rose is in the picture? Mention some of its characteristics and how to take care of it ?'query_image = '/kaggle/input/flowers/flowers/rose/00f6e89a2f949f8165d5222955a5a37d.jpg'raw_image = Image.open(query_image)doc = collection_text.query(query_embeddings=embedding_function(query_image),n_results=1,)['documents'][0][0]plt.imshow(raw_image)plt.show()imgs = collection_images.query(query_uris=query_image, include=['data'], n_results=3)for img in imgs['data'][0][1:]:plt.imshow(img)plt.axis("off")plt.show()

得到的结果如下:

结果还包含了我们需要的大部分信息

这样我们整合就完成了,最后就是创建聊天模板,

 prompt = """<|im_start|>systemA chat between a curious human and an artificial intelligence assistant.The assistant is an exprt in flowers , and gives helpful, detailed, and polite answers to the human's questions.The assistant does not hallucinate and pays very close attention to the details.<|im_end|><|im_start|>user<image>{question} Use the following article as an answer source. Do not write outside its scope unless you find your answer better {article} if you thin your answer is better add it after document.<|im_end|><|im_start|>assistant""".format(question='question', article=doc)

如何创建聊天过程我们这里就不详细介绍了,完整代码在这里:

https://avoid.overfit.cn/post/c2d8059cc5c145a48acb5ecb8890dc0e

作者:Ahmed Haytham

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

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

相关文章

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…

Ubuntu 22.04.3 LTS arm64 aarch64 ISO jammy-desktop-arm64.iso 下载

Ubuntu 22.04.3 LTS (Jammy Jellyfish) Daily Build 参考 Are there official Ubuntu ARM / aarch64 desktop images? - Ask Ubuntu

浅谈有源滤波装置应用在水处理行业配电系统中

摘要&#xff1a;水处理行业供配电系统涉及曝气风机、提升泵、污泥脱水设备等负载设备&#xff0c;导致异步电机产生更多无功功率和大量谐波&#xff0c;降低系统功率因数&#xff0c;对配电系统和负载造成很大危害。因此&#xff0c;水处理行业需要更加重视电能质量&#xff0…

解码数据:数据可视化的魔力在于快速概括

在信息爆炸的时代&#xff0c;我们每天都面临着海量的数据&#xff0c;无论是个人生活中的各种记录&#xff0c;还是工作中的业务数据&#xff0c;都充斥着我们的日常。如何从这些数据中快速实现归纳总结&#xff0c;理清思路&#xff0c;找出关键信息&#xff1f;数据可视化应…

记录浏览器莫名其妙部分网页无法访问的一个解决办法

问题描述&#xff1a; 不知道什么原因&#xff0c;浏览器无法访问CSDN了&#xff0c;访问其他网站都可以正常加载。 经电脑网络诊断检测&#xff0c;反馈内容大致为&#xff1a; 资源处于联机状态但未对连接尝试做出响应&#xff0c;远程计算机不接受端口443上的连接。 测试…

CNAS中兴新支点——软件测试报告如何编写,出检测报告第三方实验室推荐

进行软件测试工作&#xff0c;编写一份软件测试报告对于测试人员来说必不可少。虽然编写软件测试报告是软件测试人员的工作&#xff0c;但是项目的开发人员比如程序员、软件使用单位对软件测试报告的组成部分有一定的了解也是十分有必要的&#xff0c;软件测试报告比较容易理解…

统计学-R语言-1

文章目录 统计学介绍基本类型数据和变量数据抽样总结 统计学介绍 统计学(statistics)是“数据的科学” 1.是用以收集数据、分析数据和由数据得出结论的一组概念、原则和方法。 2.统计学进行推断的基础是数据(data)。数据不仅仅限于数字&#xff0c;也可能是图表、视频、音频或…

Talk|斯坦福大学史浩辰:学习结构化世界模型用于现实世界中柔性物体的操控

本期为TechBeat人工智能社区第562期线上Talk。 北京时间1月10日(周三)20:00&#xff0c;斯坦福大学博士生—史浩辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “学习结构化世界模型用于现实世界中柔性物体的操控”&#xff0c;介绍了他的团队在…

03-JVM虚拟机-课堂笔记

3-JVM虚拟机 灵魂三问&#xff1a; JVM是什么&#xff1f; JVM广义上指的是一种规范。狭义上的是JDK中的JVM虚拟机。 为什么要学习JVM&#xff1f; 面试过程中&#xff0c;经常会被问到JVM。 研发过程中&#xff0c;肯定会面临一些重难点问题与JVM有关系。例如&#xff1a…

计算机毕业设计------SSH宿舍管理系统

项目介绍 本项目分为三种角色&#xff1a;系统管理员、楼宇管理员、学生&#xff1b; 系统管理员主要功能如下&#xff1a; 楼宇管理员管理、学生管理、楼宇管理、宿舍管理、学生入住登记、学生寝室调换、学生迁出登记、学生缺勤记录、修改密码、退出登录 楼宇管理员主要功能…

密码学(三)

文章目录 前言一、Software Attestation Overview二、Authenticated Key Agreement三、The Role of Software Measurement 前言 本文来自 Intel SGX Explained 请参考&#xff1a; 密码学&#xff08;一&#xff09; 密码学&#xff08;二&#xff09; 一、Software Attesta…

单片机原理及应用:定时器与计数器中断

时间概念 中断结构 引脚 TCON TMOD IE IP 时间概念 在一般单片机中&#xff0c;有2个16位可编程的硬件计数模块T0和T1&#xff0c;我们称其为计数器或定时器&#xff0c;顾名思义&#xff0c;该模块可以实现定时和计数两种功能&#xff0c;其功能由软件控制和切换。实质…

信道编码理论【信息论安全】

目录 一. 信道编码模型 二. 信道编码速率与错误译码率 2.1 信道编码速率 2.2 平均错误率 三. 信道容量 四. 小结 一. 信道编码模型 &#xff08;1&#xff09;消息 假定消息集合为M&#xff0c;如下&#xff1a; &#xff08;2&#xff09;编码 将消息m映射成码字&…

[VisualStudioCode]_[VSCODE]_[C/C++开发环境配置-问题解决和补充]

场景 在使用VSCode配置C的开发环境时《VisualStudioCode_C/C开发环境配置[1]》&#xff0c;编译时会发现找不到标准库的std::mutex和std::thread的声明&#xff0c;而这两个的头文件已经引入&#xff0c;什么情况&#xff1f; 无论如何MinGW都是Windows上验证开发C特性比较新的…

11Spring IoC注解式开发(上)(元注解/声明Bean的注解/注解的使用/负责实例化Bean的注解)

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则&#xff0c;使用注解的开发的前提是需求比较固定&#xff0c;变动较小。 1 注解的注解称为元注解 自定义一个注解: package com.sunspl…

计算机毕业设计---SSH协会志愿者服务管理系统

项目介绍 该项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,志愿者管理,活动管理,捐赠管理,关于我们管理,友情链接管理,新闻类…

微服务-Gateway

案例搭建 官网地址 父Pom <com.alibaba.cloud.version>2.2.8.RELEASE</com.alibaba.cloud.version> <com.cloud.version>Hoxton.SR12</com.cloud.version> <com.dubbo.version>2.2.7.RELEASE</com.dubbo.version> <dependencyManagem…

阿里云独享型通用算力u1云服务器怎么样?通用算力型u1实例有什么优势?

在阿里云2024年的活动中&#xff0c;独享型通用算力u1云服务器是用户比较关注的云服务器&#xff0c;因为它的性能要比活动内的经济型e实例好&#xff0c;但是价格又比计算型c7、通用型g7等其他企业级实例的价格要便宜。那么&#xff0c;独享型通用算力u1云服务器到底怎么样呢&…

AirServer2024免费手机电脑高清投屏软件

AirServer 是适用于 Mac 和 PC 的先进的屏幕镜像接收器。 它允许您接收 AirPlay 和 Google Cast 流&#xff0c;类似于 Apple TV 或 Chromecast 设备。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器 &#xff0c;是一款十分强大的投屏软件。 它能够通…

哪种小型洗衣机好用?高性价比的小型洗衣机推荐

大型洗衣机作为家居必备小家电&#xff0c;对生活品质的提升十分显著&#xff0c;在很多人的认知中&#xff0c;这种大型洗衣机主要是用来清洁大件的衣服和外套的&#xff0c;不方便将内衣裤都放入到里面&#xff0c;内衣裤的材质和尺寸都是比较特殊&#xff0c;若是直接将其放…