• 文档
  • 多语言与多模态RAG与LlamaIndex

使用LlamaIndex进行多语言和多模态搜索

Snow prints

时间: 15 分钟级别: 初学者输出: GitHubOpen In Colab

概述

我们通常通过结合不同类型的数据来更有效地理解和分享信息。例如,舒适食物的味道可以唤起童年的记忆。我们可能只用“pam pam clap”的声音来描述一首歌,而不是写段落。有时,我们可能会使用表情符号和贴纸来表达我们的感受或分享复杂的想法。

数据的多种形式,如文本图像视频音频,以各种组合形式构成了语义搜索应用的宝贵用例。

向量数据库,由于其模态无关性,非常适合构建这些应用程序。

在这个简单的教程中,我们正在处理两种简单的模态:图像文本数据。然而,如果你选择了正确的嵌入模型来弥合语义鸿沟,你可以创建任何模态组合的语义搜索应用程序。

语义鸿沟指的是低级特征(即亮度)与高级概念(即可爱度)之间的差异。

例如,LlamaIndex的vdr-2b-multi-v1模型专为多语言嵌入设计,特别适用于跨多种语言和领域的视觉文档检索。它允许搜索和查询视觉丰富的多语言文档,而无需OCR或其他数据提取管道。

设置

首先,安装所需的库 qdrant-clientllama-index-embeddings-huggingface

pip install qdrant-client llama-index-embeddings-huggingface

数据集

为了使演示简单,我们为您创建了一个包含图像及其标题的小型数据集。

图片可以从这里下载。将它们放在与您的代码/笔记本相同的文件夹中,文件夹名为images,这是重要的。

向量化数据

LlamaIndexvdr-2b-multi-v1模型支持跨语言检索,允许在不同语言和领域中进行有效搜索。它将文档页面截图编码为密集的单向量表示,消除了对OCR和其他复杂数据提取过程的需求。

让我们将图像及其标题嵌入到共享嵌入空间中。

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

model = HuggingFaceEmbedding(
    model_name="llamaindex/vdr-2b-multi-v1",
    device="cpu",  # "mps" for mac, "cuda" for nvidia GPUs
    trust_remote_code=True,
)

documents = [
    {"caption": "An image about plane emergency safety.", "image": "images/image-1.png"},
    {"caption": "An image about airplane components.", "image": "images/image-2.png"},
    {"caption": "An image about COVID safety restrictions.", "image": "images/image-3.png"},
    {"caption": "An confidential image about UFO sightings.", "image": "images/image-4.png"},
    {"caption": "An image about unusual footprints on Aralar 2011.", "image": "images/image-5.png"},
]

text_embeddings = model.get_text_embedding_batch([doc["caption"] for doc in documents])
image_embeddings = model.get_image_embedding_batch([doc["image"] for doc in documents])

上传数据到Qdrant

  1. Create a client object for Qdrant.
from qdrant_client import QdrantClient, models

# docker run -p 6333:6333 qdrant/qdrant
client = QdrantClient(url="http://localhost:6333/")
  1. Create a new collection for the images with captions.
COLLECTION_NAME = "llama-multi"

if not client.collection_exists(COLLECTION_NAME):
    client.create_collection(
        collection_name=COLLECTION_NAME,
        vectors_config={
            "image": models.VectorParams(size=len(image_embeddings[0]), distance=models.Distance.COSINE),
            "text": models.VectorParams(size=len(text_embeddings[0]), distance=models.Distance.COSINE),
        }
    )
  1. Upload our images with captions to the Collection.
client.upload_points(
    collection_name=COLLECTION_NAME,
    points=[
        models.PointStruct(
            id=idx,
            vector={
                "text": text_embeddings[idx],
                "image": image_embeddings[idx],
            },
            payload=doc
        )
        for idx, doc in enumerate(documents)
    ]
)

文本到图像

让我们看看查询“雪山的冒险”会得到什么图像。

from PIL import Image

find_image = model.get_query_embedding("Adventures on snow hills")

Image.open(client.query_points(
    collection_name=COLLECTION_NAME,
    query=find_image,
    using="image",
    with_payload=["image"],
    limit=1
).points[0].payload['image'])

让我们也用意大利语运行相同的查询并比较结果。

现在,让我们使用意大利语查询进行多语言搜索:

Image.open(client.query_points(
    collection_name=COLLECTION_NAME,
    query=model.get_query_embedding("Avventure sulle colline innevate"),
    using="image",
    with_payload=["image"],
    limit=1
).points[0].payload['image'])

响应:

Snow prints

图像转文本

现在,让我们用以下图片进行反向搜索:

Airplane

client.query_points(
    collection_name=COLLECTION_NAME,
    query=model.get_image_embedding("images/image-2.png"),  
    # Now we are searching only among text vectors with our image query
    using="text",
    with_payload=["caption"],
    limit=1
).points[0].payload['caption']

响应:

'An image about plane emergency safety.'

下一步

仅图像和文本多模态搜索的用例就数不胜数:电子商务、媒体管理、内容推荐、情感识别系统、生物医学图像检索、口语手语转录等。

想象一个场景:用户想要找到与他们拥有的图片相似的产品,但他们也有特定的文本要求,比如“米色”。你可以仅使用文本或图像进行搜索,并以后期融合方式(求和和加权可能会出奇地有效)结合它们的嵌入。

此外,使用发现搜索的两种模式,您可以为用户提供无法通过单一模式检索的信息!

加入我们的Discord社区,在这里我们讨论向量搜索和相似性学习,进行实验,并享受乐趣!

这个页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 你可以在GitHub上编辑这个页面,或者创建一个GitHub问题。