[毕业设计]@RAG学习:多模态RAG Multimodal RAG applications

发现colab也有AI助手了

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

作者给了个colab的链接,跑了一下

代码实操解读(claude生成)

  1. 安装必要的库:
!pip install clip torch pillow datasets lancedb tqdm matplotlib
!pip install git+https://github.com/openai/CLIP.git
import clip
import torch
import os
from datasets import load_dataset

这段代码使用!pip install命令安装了clip、torch、pillow、datasets、lancedb、tqdm和matplotlib等库。其中,clip库是从OpenAI的GitHub仓库中直接安装的。然后,代码导入了clip、torch、os和datasets等库。

  1. 加载数据集和CLIP模型:
ds = load_dataset("vipulmaheshwari/GTA-Image-Captioning-Dataset")
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)

这段代码使用datasets库的load_dataset函数加载了名为"vipulmaheshwari/GTA-Image-Captioning-Dataset"的数据集,该数据集包含GTA游戏截图和对应的文本描述。接着,代码根据设备的可用性选择使用GPU (cuda) 还是CPU (cpu)。最后,使用clip.load加载预训练的CLIP模型(ViT-L/14),并将其放置在选定的设备上。

  1. 定义embed_image函数:
def embed_image(img):
    processed_image = preprocess(img)
    unsqueezed_image = processed_image.unsqueeze(0).to(device)
    embeddings = model.encode_image(unsqueezed_image)

    # Detach, move to CPU, convert to numpy array, and extract the first element as a list
    result = embeddings.detach().cpu().numpy()[0].tolist()
    return result

这段代码定义了一个名为embed_image的函数,用于将图像编码为向量表示。函数首先使用CLIP模型的预处理函数preprocess对图像进行预处理。然后,将处理后的图像在第0维上增加一个维度(unsqueeze),并将其移动到选定的设备上。接着,使用CLIP模型的encode_image方法对图像进行编码,得到图像的向量表示。最后,将向量从PyTorch的Tensor格式转换为NumPy数组,并提取第一个元素作为列表返回。

  1. 创建LanceDB数据库和表:
import pyarrow as pa
import lancedb
import tqdm

# define a schema for the lancedb table
db = lancedb.connect('./data/tables')
schema = pa.schema(
  [
      pa.field("vector", pa.list_(pa.float32(), 768)),
      pa.field("text", pa.string()),
      pa.field("id", pa.int32())
  ])
tbl = db.create_table("gta_data", schema=schema, mode="overwrite")

这段代码首先导入了pyarrow、lancedb和tqdm库。然后,使用lancedb.connect连接到指定路径(‘./data/tables’)的LanceDB数据库。接着,使用pyarrow定义了表的schema,包含三个字段:向量(768维浮点数列表)、文本和ID。最后,使用db.create_table创建了一个名为"gta_data"的表,指定了表的schema,并设置模式为"overwrite"(覆盖已有表)。

  1. 将数据集中的图像和文本添加到LanceDB表中:
data = []
for i in range(len(ds["train"])):
    img = ds["train"][i]['image']
    text = ds["train"][i]['text']

    # Encode the image
    encoded_img = embed_image(img)
    data.append({"vector": encoded_img, "text": text, "id" : i})
tbl.add(data)
tbl.to_pandas()

这段代码遍历训练集中的每个样本。对于每个样本,提取图像和对应的文本描述。然后,使用之前定义的embed_image函数对图像进行编码,得到图像的向量表示。将编码后的向量、对应的文本和样本的ID添加到data列表中。遍历完所有样本后,使用tbl.add将data列表中的数据添加到LanceDB表中。最后,使用tbl.to_pandas()将表转换为Pandas的DataFrame。

  1. 定义plot_images函数:
from textwrap import wrap
import matplotlib.pyplot as plt
import numpy as np

def plot_images(images, captions):
    plt.figure(figsize=(15, 7))
    for i in range(len(images)):
        ax = plt.subplot(1, len(images), i + 1)
        caption = captions[i]
        caption = "\n".join(wrap(caption, 12))
        plt.title(caption)
        plt.imshow(images[i])
        plt.axis("off")

这段代码定义了一个名为plot_images的函数,用于绘制图像和对应的文本描述。函数首先创建一个尺寸为(15, 7)的图形。然后,对于每个图像及其对应的文本描述,在子图中显示图像并将文本描述作为标题。文本描述使用textwrap库的wrap函数进行换行,每行最多12个字符。最后,关闭坐标轴的显示。

  1. 随机选择两个样本并绘制图像和文本描述:
# Assuming ds is a dictionary with "train" key containing a list of samples
sample_dataset = ds["train"]
random_indices = np.random.choice(len(sample_dataset), size=2, replace=False)
random_indices = [index.item() for index in random_indices]

# Get the random images and their captions
random_images = [np.array(sample_dataset[index]["image"]) for index in random_indices]
random_captions = [sample_dataset[index]["text"] for index in random_indices]

# Plot the random images with their captions
plot_images(random_images, random_captions)

# Show the plot
plt.show()

这段代码从训练集中随机选择两个样本的索引。然后,使用选择的索引从训练集中获取对应的图像和文本描述。接着,使用之前定义的plot_images函数绘制选择的图像和文本描述。最后,使用plt.show()显示绘制的图形。

  1. 定义embed_txt函数:
def embed_txt(txt):
    tokenized_text = clip.tokenize([txt]).to(device)
    embeddings = model.encode_text(tokenized_text)

    # Detach, move to CPU, convert to numpy array, and extract the first element as a list
    result = embeddings.detach().cpu().numpy()[0].tolist()
    return result

这段代码定义了一个名为embed_txt的函数,用于将文本编码为向量表示。函数首先使用clip.tokenize对文本进行标记化,并将标记化后的文本移动到选定的设备上。然后,使用CLIP模型的encode_text方法对标记化的文本进行编码,得到文本的向量表示。最后,将向量从PyTorch的Tensor格式转换为NumPy数组,并提取第一个元素作为列表返回。

  1. 使用文本查询从LanceDB中检索相关图像:
res = tbl.search(embed_txt("a stop sign")).limit(5).to_pandas()
res

这段代码使用之前定义的embed_txt函数将查询文本"a stop sign"编码为向量表示。然后,使用tbl.search在LanceDB表中搜索与查询向量相似的向量,并限制返回结果数量为5。最后,将检索结果转换为Pandas的DataFrame。

  1. 显示检索到的图像和对应的文本描述:
# Display the relevant image based on the retrieved ID
data_id = int(res['id'][0])
display(ds["train"][data_id]['image'])
print(ds["train"][data_id]['text'])

这段代码从检索结果中获取第一个样本的ID。然后,使用获取到的ID从原始数据集中获取对应的图像和文本描述。最后,使用display函数显示图像,并使用print函数打印文本描述。

以上就是对整段代码的详细解读。这段代码展示了如何使用CLIP模型将图像和文本编码为向量表示,并使用LanceDB数据库进行高效的相似度搜索。通过输入一个文本查询,可以从数据库中检索出与之最相关的图像,实现了多模态检索和生成的功能。

文章解读(kimichat生成)

多模态AI的重要性

多模态AI指的是AI模型不仅能处理文本,还能理解和生成图像、音频等其他类型的数据。这种能力使得AI更加接近人类的感知和理解方式,能够更好地与现实世界的复杂性相匹配。

嵌入技术:连接不同数据的关键

为了让AI理解不同格式的数据,文章介绍了嵌入技术。嵌入是一种将文本、图像等数据转换为数值向量的方法,这些向量能够在机器学习模型中进行比较和关联。通过这种方式,AI可以识别出不同数据之间的相似性和联系。

对比学习:训练模型的新方法

一种通过正负样本对来训练模型的方法。通过对比学习,模型能够学会区分相关的图像和文本对与不相关的对,从而提高其理解和生成相关内容的能力。

LanceDB:高效的向量数据库

为了存储和管理大量的嵌入向量,文章推荐了LanceDB这一高效的向量数据库。LanceDB以其服务器无架构、开源性和高效率等特性,成为了处理AI/ML工作负载的理想选择。

实践案例:GTA-V图像描述数据集

文章通过GTA-V图像描述数据集的案例,展示了如何将理论应用于实践。作者详细介绍了如何使用CLIP模型将图像和文本转换为嵌入向量,并将这些向量存储到LanceDB中。这一过程不仅展示了多模态AI的潜力,也为未来的AI应用提供了宝贵的参考。

搜索与查询:实现多模态RAG的关键

文章还介绍了如何使用文本查询来搜索最相关的图像嵌入。通过LanceDB的近似最近邻搜索功能,AI能够快速找到与文本查询最匹配的图像,从而实现了多模态RAG的核心功能。

未来展望

最后,作者分享了对未来多模态AI发展的展望。随着更大规模的数据集和更先进的模型的出现,如Meta的ImageBind模型,我们有理由相信多模态AI将在未来发挥更大的作用。

结语

Blixxi Labs的文章为我们提供了一个深入了解多模态RAG应用的机会。通过结合最新的技术和创新的方法,我们期待AI能够在理解和生成多种数据类型方面取得更大的突破。这篇文章不仅是对当前技术的一个总结,也是对未来可能性的一个展望。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值