前沿探索:基于华为云 OBS 与向量数据库构建多模态(图文)智能检索系统
一、 前言
在前几天的文章中,我们详细探讨了基于文本的 RAG(检索增强生成)和智能客服系统。然而在真实的企业业务场景中(如电商平台、工业制造、设计文创等),数据往往是多模态(Multimodal)的:
1. 用户不仅会输入文字提问,还可能上传一张产品故障照片,要求 AI 给出维修方案。
2. 企业拥有海量的产品图片,单纯依靠人工打标签效率极低。
随着多模态大模型(如 CLIP、华为云盘古多模态大模型等)的发展,多模态向量检索成为了解决这一难题的关键技术。
今天,我们就以华为云 OBS(对象存储服务) 存放海量图片,结合 Python 与多模态嵌入模型,打造一个基础的图文跨模态检索原型。
────────────────────────────────────
二、 核心架构设计
一个完整的多模态检索系统通常包含以下几个步骤:
1. 海量资源托管(OBS):将企业的所有图片资源上传至华为云 OBS 进行统一安全托管。
2. 多模态向量化(Embedding):利用多模态模型(如 OpenAI CLIP 或开源多模态模型),将“文本”和“图片”映射到同一个高维数学空间中。
3. 向量数据库存储:将图片特征向量及对应的 OBS 图片访问链接存入向量数据库(如 Chroma)。
4. 跨模态检索(Cross-Modal Search):用户输入一段文字(例如:“红色运动鞋”),系统通过计算文本向量与数据库中图片向量的余弦相似度,精准召回最匹配的图片。
────────────────────────────────────
三、 环境准备与依赖安装
在开始写代码前,请确保安装了处理图像、调用多模态模型和连接 OBS 的依赖库:
pip install torch torchvision transformers pillow chromadb requests
────────────────────────────────────
四、 核心代码实战
以下是一个精简的 Python 实现脚本,模拟了多模态向量化并进行“以文搜图”的全过程:
import os
from PIL import Image
import chromadb
import torch
from transformers import CLIPModel, CLIPProcessor
# ==================== 1. 初始化多模态模型 (以开源 CLIP 为例) ====================
print("=== 正在加载多模态 CLIP 模型 ===")
MODEL_NAME = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(MODEL_NAME)
processor = CLIPProcessor.from_pretrained(MODEL_NAME)
# 初始化本地向量数据库
chroma_client = chromadb.Client()
collection = chroma_client.get_or_create_collection(
name="multimodal_image_search"
)
# ==================== 2. 模拟图片入库与特征提取 ====================
def index_images_to_vector_db():
# 模拟本地或华为云 OBS 上的图片路径
# 在生产环境中,图片通常存放在华为云 OBS 中,此处为演示创建测试图片
os.makedirs("./sample_images", exist_ok=True)
# 创建一张模拟的红色跑车图片和蓝色衣服图片
img1_path = "./sample_images/car.jpg"
img2_path = "./sample_images/shirt.jpg"
Image.new("RGB", (200, 200), color="red").save(img1_path)
Image.new("RGB", (200, 200), color="blue").save(img2_path)
images = {
"img_001": {
"path": img1_path,
"obs_url": (
"https://your-bucket.obs.cn-north-4.myhuaweicloud.com/car.jpg"
),
},
"img_002": {
"path": img2_path,
"obs_url": (
"https://your-bucket.obs.cn-north-4.myhuaweicloud.com/shirt.jpg"
),
},
}
print("=== 开始提取图片多模态特征并入库 ===")
for img_id, info in images.items():
image = Image.open(info["path"])
# 提取图片特征向量
inputs = processor(images=image, return_tensors="pt", padding=True)
with torch.no_grad():
image_features = model.get_image_features(**inputs)
# 归一化特征
image_features = image_features / image_features.norm(
dim=-1, keepdim=True
)
vector = image_features.squeeze(0).tolist()
# 存入向量数据库,并把华为云 OBS 地址作为元数据绑定
collection.add(
ids=[img_id],
embeddings=[vector],
metadatas=[{"obs_url": info["obs_url"]}],
)
print(f"图片 {img_id} 入库成功,绑定 OBS 地址: {info['obs_url']}")
# ==================== 3. 执行“以文搜图”跨模态检索 ====================
def search_images_by_text(query_text: str):
print(f"\n用户输入的检索文本: 【{query_text}】")
# 提取文本特征向量
inputs = processor(text=[query_text], return_tensors="pt", padding=True)
with torch.no_grad():
text_features = model.get_text_features(**inputs)
text_features = text_features / text_features.norm(dim=-1, keepdim=True)
query_vector = text_features.squeeze(0).tolist()
# 在向量数据库中检索最相似的图片
results = collection.query(query_embeddings=[query_vector], n_results=1)
if results and results["metadatas"]:
best_match = results["metadatas"][0][0]
print(f"检索成功!最匹配的图片 OBS 访问地址为: {best_match['obs_url']}")
return best_match["obs_url"]
else:
print("未找到匹配的图片。")
return None
# ==================== 4. 主程序测试 ====================
if __name__ == "__main__":
# 执行图片入库初始化
index_images_to_vector_db()
# 测试跨模态检索
search_images_by_text("一辆红色的汽车")
────────────────────────────────────
五、 生产环境架构优化建议
如果将多模态检索系统推向亿级图片规模的生产环境,建议做以下架构升级:
1. 华为云 OBS 存储分离:不要将图片保存在本地服务器,所有原图及缩略图统一持久化存储在华为云 OBS(对象存储服务)中,享受高吞吐与极低成本。
2. 分布式向量数据库:当图片数量超过千万级别时,建议使用分布式向量检索方案(如 Milvus、Elasticsearch 向量检索或华为云 GaussDB 的向量扩展能力),确保毫秒级响应。
3. 结合 CDN 加速:检索出 OBS 图片地址后,通过华为云 CDN(内容分发网络)将图片极速分发给前端用户,带来丝滑的加载体验。
────────────────────────────────────
六、 总结
通过今天的实战,我们打通了“华为云 OBS 海量图文资源 $\rightarrow$ 多模态 Embedding 向量化 $\rightarrow$ 向量数据库 $\rightarrow$ 跨模态以文搜图”的全链路。
随着多模态大模型的普及,企业的数据资产正在从单纯的“文字”走向“图文声像并茂”。借助华为云强大的存储与计算底座,开发者可以轻松构建出领先的多模态智能应用。
如果你在对接华为云 OBS 或运行多模态模型时遇到显存或接口问题,欢迎在评论区留言交流!
- 点赞
- 收藏
- 关注作者
评论(0)