使用 LlamaIndex 进行多语言多模态搜索
时间:15 分钟 | 级别:初级 | 输出:GitHub |
---|
概述
结合不同类型的数据时,我们通常能更有效地理解和分享信息。例如,舒适食物的味道可以触发童年记忆。我们可能只用“pam pam clap”的声音来描述一首歌,而不是写一段文字。有时,我们可能会使用表情符号和贴纸来表达感受或分享复杂的想法。
将文本、图像、视频和音频等多种数据模态以不同组合方式使用,可以为语义搜索应用带来有价值的使用场景。
向量数据库是模态无关的,非常适合构建这些应用。
在这个简单的教程中,我们将使用两种简单的模态:图像和文本数据。然而,如果你选择合适的嵌入模型来弥合语义鸿沟,你可以使用任何模态组合来创建语义搜索应用。
语义鸿沟指的是低级特征(如亮度)和高级概念(如可爱)之间的差异。
例如,LlamaIndex 的 vdr-2b-multi-v1 模型专为多语言嵌入设计,对于跨多种语言和领域的视觉文档检索特别有效。它无需 OCR 或其他数据提取管道,即可搜索和查询视觉丰富的多语言文档。
设置
首先,安装所需的库 qdrant-client
和 llama-index-embeddings-huggingface
。
pip install qdrant-client llama-index-embeddings-huggingface
数据集
为了简化演示,我们为你创建了一个包含图像及其描述的小型数据集。
图像可以从 这里 下载。重要的是,将它们放在与你的代码/notebook 相同的文件夹中,并命名为 images
文件夹。
向量化数据
LlamaIndex
的 vdr-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
- 为 Qdrant 创建客户端对象.
from qdrant_client import QdrantClient, models
# docker run -p 6333:6333 qdrant/qdrant
client = QdrantClient(url="http://localhost:6333/")
- 为带描述的图像创建新集合.
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),
}
)
- 将带描述的图像上传到集合.
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'])
响应
图像到文本
现在,使用以下图像进行反向搜索
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 社区,在这里我们讨论向量搜索和相似性学习,进行实验,并享受乐趣!