使用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 chromadb
 
 from chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunction
 from chromadb.utils.data_loaders import ImageLoader
 from chromadb.config import Settings
 
 
 client = chromadb.PersistentClient(path="DB")
 
 embedding_function = OpenCLIPEmbeddingFunction()
 image_loader = ImageLoader() # must be if you reads from URIs

ChromaDB需要自定义嵌入函数

 from chromadb import Documents, EmbeddingFunction, Embeddings
 
 class MyEmbeddingFunction(EmbeddingFunction):
     def __call__(self, input: Documents) -> Embeddings:
         # embed the documents somehow or images
         return 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 Images
 IMAGE_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 plt
 
 retrieved = 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 DB
 from chromadb.utils import embedding_functions
 default_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_list
 
 collection_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_download
 
 hf_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 LlavaForConditionalGeneration
 import torch
 
 model = LlavaForConditionalGeneration.from_pretrained("visheratin/LLaVA-3b")
 model = model.to("cuda")

加载tokenizer

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

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

 from processing_llava import LlavaProcessor, OpenCLIPImageProcessor
 
 image_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|>system
 A 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【html+css+js】实例自习笔记–前端基础知识–绝对定位的盒子水平居中

【htmlcssjs】实例自习笔记–前端基础知识–绝对定位的盒子水平居中 【CSS面试题】绝对定位的盒子水平居中 问题&#xff1a; 代码如图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

Spring上下文之support模块MessageSourceAccessor

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

DNS从入门到精通

DNS从入门到精通 Dns从入门到精通 DNS从入门到精通一、DNS原理二、企业高速缓存dns的搭建三、DNS相关名词解释四、权威DNS搭建编辑子配置文件&#xff08;主要写我们维护的域zone)开始解析 五、权威dns中的数据记录种类及应用编辑子配置文件&#xff08;主要写我们维护的域zone…

【LeetCode: 208. 实现 Trie (前缀树)】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

关于晶振回流焊工艺,你知道哪些呢!

晶振&#xff0c;作为现代电子设备中的核心元件&#xff0c;其制造过程需要经过多道精密的工艺流程。其中&#xff0c;回流焊工艺是晶振制造过程中一个至关重要的环节。本文将详细介绍回流焊工艺在晶振制造中的应用&#xff0c;以及关键的注意事项。 一、回流焊工艺简介 回流…

划重点!多微信号一键定时发圈,省时省力!

发朋圈对于很多职场人来说是一种社交媒体营销和个人品牌建设的重要手段。 然而&#xff0c;一个人面对几个微信号的朋友圈&#xff0c;难免会有应付不过来的时候&#xff0c;这时候只需要一个个微管理管理系统&#xff0c;就能帮你一键定时发圈&#xff0c;省去重复发布的时间…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (1) | 引言与知识基础

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

Mybatis 分页插件 PageHelper

今天记录下 Mybatis 分页插件 pageHelper 的使用。 背景 有一个员工表(employee)&#xff0c;现在要使用 pageHelper 插件实现员工的分页查询。 员工表 create table employee (id bigint auto_increment comment 主键primary key,name varchar(32) not …

springboot基于WEB的旅游推荐系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

postman上传文件文件名有黄色图标

问题&#xff1a; 解决方案 步骤一&#xff1a;设置处打开settings 步骤二&#xff1a;打开location&#xff0c;选择文件所在磁盘目录 步骤三&#xff1a;关闭选项框 文件报错问题解决

cmd输入Python后Python环境无反馈,空

我用cmd输入Python后Python环境无反馈没打开Python环境。 解决方法&#xff1a; 一、打开电脑 [设置] 或 [控制面板] &#xff1b; 二、点到 [系统] 或 [系统和安全] 后&#xff0c;你要看一下找到 [系统信息] 然后点击&#xff1b; 三、 [高级系统设置] 点击后跳出 [系统属…

Pixart PAR2861 蓝牙 keyboard 开发笔记

Pixart PAR2861 是一款采用32 bits ARM Cortex-M0 低功耗、高效能 2.4GHz RF 的 SoC。 该 SoC 整合了高效能的 2.4GHz RF 收发器、硬体Keyscan、硬体按键防弹跳、SPI、I2C、PWM LED、ADC、UART等。内建 DC/DC 转换器和 LDO 为独立 HID 应用提供完整的低功耗 SoC 解决方案。 1.…

uniapp下各端调用三方地图导航

技术栈 开发框架&#xff1a; uniappvue 版本&#xff1a; 2.x 需求 使用uniapp在app端(Android&#xff0c;IOS)中显示宿主机已有的三方导航应用&#xff0c;由用户自主选择使用哪家地图软件进行导航&#xff0c;选择后&#xff0c;自动将目标地址设为终点在导航页面。 使用…

宋仕强论道之华强北的“熵增”定律(四十二)

熵增”是热力学第二定律概念&#xff0c;描述了关于生命体的能量耗散的问题&#xff0c;即当一个封闭系统内没有新的能量输入时&#xff0c;就会逐渐失能无序发展至混乱直至混沌状态,后面我还会讲到“华强北的焓值”。华强北目前的情况就是“熵增”现象非常严重&#xff0c;人流…

SpringBoot---CRUD测试案例:

1. 概述 本次案例模拟公司后端人员开发场景&#xff1a; 当前案例的前端工程&#xff0c;前端人员已经帮我们开发好了&#xff0c;我们只需要关注服务端接口的开发。 1.1 页面原型 产品经理绘制的的页面原型的展示效果&#xff1a; 成品展示&#xff1a;完成部门管理和员工…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法…

CAN工具 - ValueCAN3 - 基础介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 CAN/CANFD通讯广泛存在于整个车载网络中&#xff0c;几乎每一块软硬件的开发都需要用到CAN工具&#xff0c…

iOS UIViewContentMode 不同效果图文对比

一. iOS提供了的ContentMode有如下几种 其中默认mode是UIViewContentModeScaleToFill typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is tr…

leetcode第365题:水壶问题

有两个水壶&#xff0c;容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。 如果可以得到 targetCapacity 升水&#xff0c;最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。 你可以&a…