• 文档
  • 使用 LlamaIndex 构建多语言多模态 RAG

使用 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

数据集

为了简化演示,我们为你创建了一个包含图像及其描述的小型数据集。

图像可以从 这里 下载。重要的是,将它们放在与你的代码/notebook 相同的文件夹中,并命名为 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. 为 Qdrant 创建客户端对象.
from qdrant_client import QdrantClient, models

# docker run -p 6333:6333 qdrant/qdrant
client = QdrantClient(url="http://localhost:6333/")
  1. 为带描述的图像创建新集合.
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. 将带描述的图像上传到集合.
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 issue。