如何让Milvus化身电商平台/社区的“读心超人”,精准击中用户心头好?
体验阿里云 Milvus 轻松实现文搜图 & 图搜图的方案,可以按照以下步骤进行操作:
🌟 什么是 Milvus?
Milvus 是一个开源的向量数据库,专为处理大规模向量数据(如图像、文本、音频等)而设计。它支持高效的相似性搜索,适用于推荐系统、图像检索、语义搜索等场景。
阿里云提供了托管版 Milvus 服务(Zilliz Cloud),可以快速部署和管理 Milvus 实例,无需关注底层运维。
🧩 场景说明:文搜图 & 图搜图
文搜图(Text to Image Search):用户输入一段文字描述,从图片库中找出最匹配的图片。图搜图(Image to Image Search):用户上传一张图片,从图片库中找出相似的图片。
这本质上是 跨模态检索(text-image) 或 同模态检索(image-image) 的问题,核心思想是将文本或图像转换为嵌入向量(Embedding),然后在 Milvus 中进行近似最近邻(ANN)搜索。
🛠️ 技术栈与工具
组件用途Milvus / Zilliz Cloud向量存储与相似度检索CLIP 模型(OpenAI 或 Chinese CLIP)提取文本和图像的统一语义向量Python SDK / REST API构建检索服务FastAPI / Flask(可选)构建 Web 接口
📦 步骤概览
Step 1: 准备环境
✅ 部署 Milvus 实例
你可以选择:
使用 Zilliz Cloud 创建托管 Milvus 实例(推荐)或者使用本地 Docker 安装 Milvus Standalone
✅ 安装依赖库
pip install torch torchvision torchaudio
pip install open_clip_torch # 或者使用 Chinese CLIP
pip install pymilvus
Step 2: 数据准备与特征提取
🖼️ 加载图像数据集(如 COCO、Flickr 等)
from PIL import Image
import os
image_paths = [os.path.join('images', fname) for fname in os.listdir('images')]
🧠 使用 CLIP 模型提取图像 Embedding
import open_clip
import torch
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion400m_e32')
tokenizer = open_clip.get_tokenizer('ViT-B-32')
# 提取图像 embedding
def get_image_embedding(image_path):
image = preprocess(Image.open(image_path)).unsqueeze(0)
with torch.no_grad():
image_features = model.encode_image(image)
return image_features.squeeze().numpy()
📝 提取文本描述的 Embedding
def get_text_embedding(text):
text_tokens = tokenizer(text).to(device)
with torch.no_grad():
text_features = model.encode_text(text_tokens)
return text_features.squeeze().numpy()
Step 3: 将 Embedding 写入 Milvus
✍️ 创建集合(Collection)
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
connections.connect(host='localhost', port='19530')
fields = [
FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, dim=512)
]
schema = CollectionSchema(fields, 'Image and Text Embedding Database')
collection = Collection('multimodal_search', schema)
💾 插入数据
import numpy as np
embeddings = [get_image_embedding(p) for p in image_paths]
data = [np.array(embeddings)]
collection.insert(data)
🔍 创建索引(提高搜索效率)
index_params = {
'index_type': 'IVF_FLAT',
'params': {'nlist': 100},
'metric_type': 'L2'
}
collection.create_index('embedding', index_params)
Step 4: 实现搜索功能
🔍 文搜图(Text to Image)
text_emb = get_text_embedding('a dog playing with a ball')
collection.load()
results = collection.search([text_emb], 'embedding', param={'nprobe': 10}, limit=5)
for hits in results:
for hit in hits:
print(f'ID: {hit.id}, Distance: {hit.distance}')
🔍 图搜图(Image to Image)
query_emb = get_image_embedding('query.jpg')
results = collection.search([query_emb], 'embedding', param={'nprobe': 10}, limit=5)
Step 5: 构建 Web 服务(可选)
使用 FastAPI 构建接口,提供 RESTful 查询服务:
from fastapi import FastAPI
app = FastAPI()
@app.post('/search/text')
def search_by_text(query: str):
emb = get_text_embedding(query)
res = collection.search([emb], ...)
return {'results': res}
@app.post('/search/image')
def search_by_image(file: UploadFile):
...
🚀 阿里云 Zilliz Cloud 快速体验指南
访问 Zilliz Cloud注册并创建一个免费实例获取连接地址、用户名、密码修改代码中的连接配置:
connections.connect(
host='your-cluster-endpoint',
port='19530',
user='username',
password='password'
)
📊 效果展示(示例)
输入输出“蓝天白云下的雪山”返回包含雪山的图片上传一张狗的照片返回相似品种的狗图片
📚 参考资料
Milvus 官网:https://milvus.io/Zilliz Cloud:https://cloud.zilliz.com/OpenCLIP GitHub:https://github.com/mlfoundations/open_clipChinese CLIP:https://github.com/OFA-Sys/Chinese-CLIP
✅ 总结
通过 Milvus + CLIP 模型,我们可以轻松构建高效的文搜图、图搜图系统。阿里云提供的 Zilliz Cloud 服务大大降低了部署门槛,适合企业级应用快速上线。
如果你需要完整的代码模板或者想了解如何部署到云端,请告诉我,我可以为你生成完整的项目结构或帮助你集成到生产环境中!
是否需要我为你生成一个完整的 Python 示例工程?📦
赞17
踩0