前沿探索:基于华为云 OBS 与向量数据库构建多模态(图文)智能检索系统

举报
cl16315 发表于 2026/11/06 07:27:44 2026/11/06
【摘要】 一、 前言在前几天的文章中,我们详细探讨了基于文本的 RAG(检索增强生成)和智能客服系统。然而在真实的企业业务场景中(如电商平台、工业制造、设计文创等),数据往往是多模态(Multimodal)的:1. 用户不仅会输入文字提问,还可能上传一张产品故障照片,要求 AI 给出维修方案。2. 企业拥有海量的产品图片,单纯依靠人工打标签效率极低。随着多模态大模型(如 CLIP、华为云盘古多模态大模...

一、 前言

在前几天的文章中,我们详细探讨了基于文本的 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 或运行多模态模型时遇到显存或接口问题,欢迎在评论区留言交流!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。