☰
Qdrant之二: Multimodal RAG
2026/10/9 10:04:19 网站建设 项目流程

Qdrant之二: Multimodal RAG

教程来源:https://qdrant.tech/documentation/tutorials-build-essentials/multimodal-search/
功能:实现图文跨模态检索、多语言检索(文搜图、图搜文),基于vdr‑2b‑multi‑v1模型,无需OCR提取图像文本

1. 环境依赖安装

pipinstallqdrant-client llama-index-embeddings-huggingface torchvision pillow

启动Qdrant向量数据库(Docker方式)

dockerrun-p6333:6333 qdrant/qdrant

2. 准备数据集

  1. 下载教程数据集图片,全部放到代码同级目录下的images文件夹
  2. 文件列表:
  • images/image‑1.png:飞机应急安全
  • images/image‑2.png:飞机零部件结构图
  • images/image‑3.png:新冠防疫限制
  • images/image‑4.png:UFO目击机密图片
  • images/image‑5.png:Aralar 2011神秘脚印

3. 完整Python代码

fromllama_index.embeddings.huggingfaceimportHuggingFaceEmbeddingfromqdrant_clientimportQdrantClient,modelsfromPILimportImage# ---------------------- 1. 初始化多模态Embedding模型 ----------------------# vdr‑2b‑multi‑v1:支持多语言图文跨模态嵌入,不需要OCRmodel=HuggingFaceEmbedding(model_name="llamaindex/vdr-2b-multi-v1",device="cpu",# Mac使用 "mps";N卡GPU使用 "cuda"trust_remote_code=True,)# ---------------------- 2. 准备图文数据集 ----------------------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"},]# ---------------------- 3. 向量化:文本、图像分别生成Embedding ----------------------text_captions=[doc["caption"]fordocindocuments]image_paths=[doc["image"]fordocindocuments]# 批量生成文本向量、图像向量text_embeddings=model.get_text_embedding_batch(text_captions)image_embeddings=model.get_image_embedding_batch(image_paths)# ---------------------- 4. 连接Qdrant,创建集合 ----------------------client=QdrantClient(url="http://localhost:6333/")COLLECTION_NAME="llama-multi"# 如果集合不存在,则创建集合,同时定义text、image两套向量ifnotclient.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),})# ---------------------- 5. 将向量+元数据payload上传Qdrant ----------------------points=[]foridx,docinenumerate(documents):point=models.PointStruct(id=idx,vector={"text":text_embeddings[idx],"image":image_embeddings[idx],},payload=doc)points.append(point)client.upload_points(collection_name=COLLECTION_NAME,points=points)# ---------------------- 6. 检索示例1:文搜图 Text‑to‑Image ----------------------print("=====【文搜图:英文查询】=====")query_text_en="Adventures on snow hills"query_emb=model.get_query_embedding(query_text_en)result_en=client.query_points(collection_name=COLLECTION_NAME,query=query_emb,using="image",# 使用image向量空间检索with_payload=["image"],limit=1)img_path_en=result_en.points[0].payload["image"]print(f"检索得到图片路径:{img_path_en}")Image.open(img_path_en).show()# ---------------------- 7. 检索示例2:图搜文 Image‑to‑Text ----------------------print("\n=====【图搜文:输入图片检索文本caption】=====")query_img_path="images/image-2.png"img_query_emb=model.get_image_embedding(query_img_path)result_img2text=client.query_points(collection_name=COLLECTION_NAME,query=img_query_emb,using="text",# 使用text向量空间检索,用图像向量去匹配文本向量with_payload=["caption"],limit=1)retrieved_caption=result_img2text.points[0].payload["caption"]print(f"图搜文返回的caption:{retrieved_caption}")

注意:首次运行会自动下载llamaindex/vdr‑2b‑multi‑v1模型,模型体积较大,需要预留足够磁盘空间。GPU环境可以显著加速嵌入计算。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询