使用 GPT-4 Vision 的 CLIP 嵌入来改进多模态 RAG

news2024/9/22 15:41:38

多模态 RAG 将附加模态集成到传统的基于文本的 RAG 中,通过提供额外的背景信息和基础文本数据来增强 LLM 的问答能力,从而提高理解力。

我们直接嵌入图像进行相似性搜索,绕过文本字幕的有损过程,以提高检索准确性。

使用基于 CLIP 的嵌入可以进一步使用特定数据进行微调或使用看不见的图像进行更新。

该技术通过使用用户提供的技术图像搜索企业知识库来提供相关信息来展示。

安装

首先我们来安装相关的软件包。

#installations
%pip install clip
%pip install torch
%pip install pillow
%pip install faiss-cpu
%pip install numpy
%pip install git+https://github.com/openai/CLIP.git
%pip install openai

然后让我们导入所有需要的包。

# model imports
import faiss
import json
import torch
from openai import OpenAI
import torch.nn as nn
from torch.utils.data import DataLoader
import clip
client = OpenAI()

# helper imports
from tqdm import tqdm
import json
import os
import numpy as np
import pickle
from typing import List, Union, Tuple

# visualisation imports
from PIL import Image
import matplotlib.pyplot as plt
import base64

现在让我们加载 CLIP 模型。

#load model on device. The device you are running inference/training on is either a CPU or GPU if you have.
device = "cpu"
model, preprocess = clip.load("ViT-B/32",device=device)

我们现在将:

  1. 创建图像嵌入数据库
  2. 设置对视觉模型的查询
  3. 执行语义搜索
  4. 将用户查询传递给图像

创建图像嵌入数据库

接下来,我们将从图像目录中创建图像嵌入知识库。这将是我们搜索的技术知识库,用于向用户提供他们上传的图像的信息。

我们传入存储图像的目录(JPEG 格式)并循环遍历每个目录以创建嵌入。

我们还有一个 description.json。它为我们知识库中的每个图像都有一个条目。它有两个键:“image_path”和“description”。它将每张图片映射到该图片的有用描述,以帮助回答用户的问题。

首先,让我们编写一个函数来获取给定目录中的所有图像路径。然后,我们将从名为“image_database”的目录中获取所有 jpeg

def get_image_paths(directory: str, number: int = None) -> List[str]:
    image_paths = []
    count = 0
    for filename in os.listdir(directory):
        if filename.endswith('.jpeg'):
            image_paths.append(os.path.join(directory, filename))
            if number is not None and count == number:
                return [image_paths[-1]]
            count += 1
    return image_paths
direc = 'image_database/'
image_paths = get_image_paths(direc)

接下来,我们将编写一个函数,根据一系列路径从 CLIP 模型中获取图像嵌入。

我们首先使用之前得到的预处理函数对图像进行预处理。这会执行一些操作以确保 CLIP 模型的输入具有正确的格式和维度,包括调整大小、规范化、颜色通道调整等。

然后,我们将这些预处理过的图像堆叠在一起,这样我们就可以一次性将它们传递到模型中,而不是循环传递。最后返回模型输出,即嵌入数组。

def get_features_from_image_path(image_paths):
  images = [preprocess(Image.open(image_path).convert("RGB")) for image_path in image_paths]
  image_input = torch.tensor(np.stack(images))
  with torch.no_grad():
    image_features = model.encode_image(image_input).float()
  return image_features
image_features = get_features_from_image_path(image_paths)

我们现在可以创建我们的矢量数据库。

index = faiss.IndexFlatIP(image_features.shape[1])
index.add(image_features)

并提取我们的 json 以进行图像描述映射并创建一个 json 列表。我们还创建了一个辅助函数来搜索此列表以查找我们想要的图像,这样我们就可以获得该图像的描述

data = []
image_path = 'train1.jpeg'
with open('description.json', 'r') as file:
    for line in file:
        data.append(json.loads(line))
def find_entry(data, key, value):
    for entry in data:
        if entry.get(key) == value:
            return entry
    return None

让我们显示一个示例图像,这将是用户上传的图像。这是在 2024 年 CES 上亮相的一项技术。它是 DELTA Pro Ultra 全屋电池发电机。

im = Image.open(image_path)
plt.imshow(im)
plt.show()

在这里插入图片描述

查询视觉模型

现在我们来看看 GPT-4 Vision(之前它肯定没有见过这项技术)会把它标记为什么。

首先,我们需要编写一个函数以 base64 格式对图像进行编码,因为这是我们将传递到视觉模型的格式。然后,我们将创建一个通用的 image_query 函数,以便我们可以使用图像输入查询 LLM。

def encode_image(image_path):
    with open(image_path, 'rb') as image_file:
        encoded_image = base64.b64encode(image_file.read())
        return encoded_image.decode('utf-8')

def image_query(query, image_path):
    response = client.chat.completions.create(
        model='gpt-4-vision-preview',
        messages=[
            {
            "role": "user",
            "content": [
                {
                "type": "text",
                "text": query,
                },
                {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{encode_image(image_path)}",
                },
                }
            ],
            }
        ],
        max_tokens=300,
    )
    # Extract relevant features from the response
    return response.choices[0].message.content
image_query('Write a short label of what is show in this image?', image_path)

“自动送货机器人”
我们可以看到,它尽了最大努力利用训练过的信息,但由于在训练数据中没有看到任何类似的东西,它犯了一个错误。这是因为这是一张模糊的图像,很难推断和推论。

执行语义搜索

现在让我们执行相似性搜索,以在我们的知识库中找到两张最相似的图像。我们通过获取用户输入的 image_path 的嵌入,检索数据库中相似图像的索引和距离来实现此目的。距离将成为我们相似性的代理指标,距离越小意味着越相似。然后我们根据距离按降序排序。

image_search_embedding = get_features_from_image_path([image_path])
distances, indices = index.search(image_search_embedding.reshape(1, -1), 2) #2 signifies the number of topmost similar images to bring back
distances = distances[0]
indices = indices[0]
indices_distances = list(zip(indices, distances))
indices_distances.sort(key=lambda x: x[1], reverse=True)

我们需要索引,因为我们将使用它来搜索我们的 image_directory 并选择索引位置处的图像以输入到 RAG 的视觉模型中。

让我们看看它带回了什么(我们按相似度顺序显示它们):

#display similar images
for idx, distance in indices_distances:
    print(idx)
    path = get_image_paths(direc, idx)[0]
    im = Image.open(path)
    plt.imshow(im)
    plt.show()

在这里插入图片描述
在这里插入图片描述

我们可以看到它返回了两张包含 DELTA Pro Ultra 全屋电池发电机的图像。其中一张图像中还有一些背景,可能会分散注意力,但它设法找到了正确的图像。

用户查询最相似的图像

现在,对于我们最相似的图像,我们希望将其及其描述与用户查询一起传递给 GPT-V,以便他们可以查询他们可能购买的技术。这就是视觉模型的强大之处,您可以向模型提出尚未明确训练的一般查询,并且它会以高精度做出响应。

在下面的例子中,我们将询问所讨论物品的容量。

similar_path = get_image_paths(direc, indices_distances[0][0])[0]
element = find_entry(data, 'image_path', similar_path)

user_query = 'What is the capacity of this item?'
prompt = f"""
Below is a user query, I want you to answer the query using the description and image provided.

user query:
{user_query}

description:
{element['description']}
"""
image_query(prompt, similar_path)

“便携式家用电池 DELTA Pro 的基本容量为 3.6kWh。使用附加电池,容量可扩大至 25kWh。图片展示了 DELTA Pro,其交流输出功率容量也高达 3600W。”
我们发现它能够回答这个问题。这只有通过直接匹配图像并从中收集相关描述作为上下文才有可能。

结论

在本文,我们介绍了如何使用 CLIP 模型,并使用 CLIP 模型创建图像嵌入数据库、执行语义搜索并最终提供用户查询来回答问题的示例。

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

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

相关文章

Ted靶机

端口扫描 靶机ip地址为 192.168.153.156 目录扫描 访问80端口 测试弱口令 根据响应包分析,存在弱口令 admin,admin 但是需要hash加密 加密后得到 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 登录成功 有搜素框,测…

网站数据导出为excel 源码大全java php c# js python 与网络安全兼顾-阿雪技术观

一、阿雪技术观谈网站安全 1.保护用户隐私和数据 用户在访问网站时会提供各种个人信息,如姓名、地址、联系方式、信息等。如果网站存在安全漏洞,这些敏感信息可能会被黑客窃取,导致用户遭受身份盗窃、欺诈等 2.维护企业声誉和信任 一个安全可…

【Windows】Q-Dir(资源管理器)软件介绍

软件介绍 Q-Dir是一款免费的文件管理器软件,它可以让您更方便地浏览和管理计算机上的文件和文件夹。与Windows自带的资源管理器相比,Q-Dir具有更多的功能和选项。 安装教程 软件下载完成,解压软件。 点击Q-Dir.exe即可打开软件。 功能…

WPF WindowChrome、WindowStyle 自定义窗体样式

渐变参数 WindowChrome 这个图就是WindowChrome的模型。其中Caption区域,表示标题栏,就是它,允许窗体被鼠标拖动。GlassFrameThickness就是Aero窗体的透明边框(Aero主体只在部分操作系统中支持)。ResizeBorderThicknes…

从快到慢学习Git指令

Git是现在最流行的版本控制工具之一。无论是在开源社区还是企业软件开发中,Git都扮演着至关重要的角色。本文将根据不同的需求,分别提供快速上手和深入学习Git的指南。 如果你只想下载代码 如果你只是想下载GitHub或其他代码仓库的代码,那你只需要了解以下两个命令: git clo…

SpringBoot 整合 Elasticsearch 实现商品搜索

一、Spring Data Elasticsearch Spring Data Elasticsearch 简介 Spring Data Elasticsearch是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。 常用注解 常用注解说明如下: 注解名称 作用 参数说明 Docu…

Python面试宝典第34题:旋转图像

题目 给定一个n n的二维矩阵matrix表示一个图像,请你将图像顺时针旋转90度。 注意:你必须在原地旋转图像。这意味着,你需要直接修改输入的二维矩阵,而不能使用另一个矩阵来旋转图像。 示例 1: 输入:matri…

Spark SQL Catalyst工作流程

我们写的SQL语句,会经过一个优化器 (Catalyst),转化为 RDD,交给集群执行。 而Catalyst在整个Spark 生态中的地位也是至关重要的。 SQL到RDD中间经过了一个Catalyst,它就是Spark SQL的核心,是针对Spark SQL语句执行过程…

【计算机网络】LVS四层负载均衡器

https://mobian.blog.csdn.net/article/details/141093263 https://blog.csdn.net/weixin_42175752/article/details/139966198 《高并发的哲学原理》 (基本来自本书) 《亿级流量系统架构设计与实战》 LVS 章文嵩博士创造 LVS(IPVS) 章⽂嵩发…

Agile Modbus移植教程--基于GD32F103C8T6+RT-Thread+mdk5

主机移植 0.下载源码 开源地址:GitHub - loogg/agile_modbus 1.复制源码 1.2、目录结构 名称说明doc文档examples例子参考示例figures素材inc头文件移植需要src源代码移植需要util提供简单实用的组件移植需要 本次移植需要的有 参考demo 头文件 源码 从机辅助文件 2.添…

【中等】 猿人学web第一届 第5题 js混淆-乱码增强

请求流程 打开 调试工具,查看数据接口 https://match.yuanrenxue.cn/api/match/5 请求参数 请求参数携带了 page, m, f 3个字段, page为页数, m 为时间戳 像是 new Date().getTIme() 生成的 f 为时间戳 像是 Date.parse(new Date()) 生成的 …

Spring boot敏感参数加密配置

一,背景 在项目中很多参数会被配置到配置文件中,比如说密钥,用户名,数据库连接,账号密码之类的,如果用明文配置,会有一定的安全风险。为了减小风险,增加对敏感配置数据的加密配置。…

Gerrit 使用教程

一、Gerrit简介 Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的程序员,可以相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统Git作为底…

LabVIEW光伏微网实验系统

开发了一个基于LabVIEW的光伏微网实验系统,系统主要服务于工程教育和技术研究,以提高学生对分布式电力系统的理解和操作能力。该实验系统能够模拟光伏微网的各种运行状态,包括能量的生成、存储和消费等,特别是在无电网状态下的独立…

Datawhale AI夏令营-大模型技术(微调)Task2打卡

1 输出结果要求 input:阅读文章本体与完成QAG的prompt target:题干、题目选项及答案 2 数据处理 2.1 Python 正则表达式 需要将文件中的数据读取出来,将语文数据与英语数据整理好后存储成可以微调的数据格式(csv与jsonl类型&a…

el-checkbox 状态不更新

文章目录 数据处理代码片段 🌰 大概举例原因解决方法 - 深拷贝forceUpdate - 强制更新 今天遇到了checkbox不更新的问题,相同的功能在其他地方正常使用,有些地方不能用。数据处理代码片段 🌰 大概举例 从现有数据中过滤出新的数据…

MySQL学习[4] ——MySQL锁

四、MySQL锁 4.1 MySQL有哪些锁? 4.1.1 全局锁 全局锁就是**对整个数据库实例加锁,主要用于全库逻辑备份**等场景。 flush tables with read lock # 加全局锁unlock tables # 解锁加上全局(读)锁后,整个数据库都…

网络安全-第二阶段-linux操作系统01

一. linux介绍: windows,mac,linux都是由unix系统发展而来。 linux:类unix系统; 二. Centos系统的安装: 可以去清华大学开源软件镜像站下载: 输入ip addr: 可以看到自己电脑的ip地址; 1. ssh远程连接linux: 使用windows或者linux的物理机或者虚拟机都可以连接上它,…

MPU6050+OLED读取姿态角(超级细讲)

STM32F103C8T6读取陀螺仪MPU6050的角度数据,使用6050自带DMP库姿态解算出各个方向的角度,并使用OLED实时刷新显示,同时可以将数据通过串口发送到计算机,每一组数据50ms。本操作过程简单,方便移植,显示屏接P…

ppt中添加页码(幻灯片编号)及问题解决方案

在幻灯片母版中,选择插入 幻灯片编号 右下角显示幻灯片编号 问题一:母版中没有显示编号 原因可能是母版版式中没有设置显示,勾选即可。 问题二:子母版中没有显示幻灯片 将母版中的编号复制到子母版中。 问题三:应用…