TATECHATLAS
◎ 简体中文
人工智能 / 指南

在 Azure AI 搜索中索引多模态内容:文本和图像的向量化

本文介绍如何在 Azure AI 搜索中设置多模态搜索,通过文本和图像的向量化实现跨模态检索。涵盖创建索引、选择模型(如 CLIP)、生成嵌入的方法,以及执行混合查询以提升相关性。

本文内容

要在 Azure AI 搜索中实现多模态搜索,需创建包含向量字段的索引,使用 OpenAI CLIP 等模型对文本和图像进行向量化,选择在索引器内部或外部生成嵌入的方法,并结合全文搜索与向量搜索执行混合查询,以实现基于相似度的内容检索。

理解 Azure AI 搜索中的多模态搜索

Azure AI 搜索中的多模态搜索能够跨越数据类型(文本或图像)查找语义相似的内容,其原理是将不同形式的数据转换为数值向量(即嵌入),向量之间的距离反映语义上的相似程度。例如,即使图像没有文字标签,输入查询“幼犬”也能返回相关的狗图片。

该方法依赖于向量搜索技术,不仅支持文本到文本的匹配,还能实现文本到图像的检索,适用于混合场景。向量化过程能捕捉概念层面的相似性,比如‘狗’与‘犬类’之间,或一段描述文字与其对应图像之间的关联。

向量搜索还可以与全文搜索并行执行并合并为单一结果集,这正是 Azure AI 搜索所定义的混合搜索:向量字段负责概念相似匹配,非向量字段负责精确关键词匹配(如产品编号、日期和人名),两者互补通常比单独使用任一种方式获得更好的相关性。

为向量数据准备索引

为了存储向量表示,Azure AI 搜索索引必须包含类型为 Edm.Single 的字段,并配置 vectorSearchProfile 属性。这些字段用于保存数字数组形式的嵌入,向量维度取决于所用模型(例如 CLIP 为 512 维)。

from azure.search.documents.indexes import SearchIndexClient
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes.models import (
    SearchIndex,
    SearchField,
    SearchFieldDataType,
    VectorSearch,
    HnswVectorSearchAlgorithmConfiguration
)

# Create client
client = SearchIndexClient(endpoint="https://<service>.search.windows.net", credential=AzureKeyCredential("<key>"))

# Define fields
fields = [
    SearchField(name="id", type=SearchFieldDataType.String, key=True),
    SearchField(name="text", type=SearchFieldDataType.String),
    SearchField(name="image_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile"),
    SearchField(name="text_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile")
]

# Configure vector search
vector_search = VectorSearch(
    algorithm_configurations=[
        HnswVectorSearchAlgorithmConfiguration(name="myHnswProfile", kind="hnsw")
    ]
)

# Create index
index = SearchIndex(name="multimodal-index", fields=fields, vector_search=vector_search)
client.create_or_update_index(index)

选择图像向量化的模型

将图像转换为向量时,可使用 Foundry Tools 图像检索向量化 API 或多模态模型如 OpenAI CLIP。这些模型在大量图文配对数据上训练,能生成共享的向量空间。

例如,将一张狗的图片传入 API 后,会返回一个 512 维的向量并存入 image_vector 字段,从而可通过向量距离与文本查询进行比较。

选择文本向量化的模型

文本向量化可选用 Azure OpenAI 的 text-embedding-ada-002 或 SBERT 模型。它们能将文本描述(如‘草地上的幼犬’)转换为与图像向量相同维度的嵌入,确保二者处于同一向量空间。

嵌入生成可在外部(使用 OpenAI SDK)完成,也可在索引器内集成,只需配置 Azure OpenAI 的端点和密钥即可。

import openai
openai.api_type = "azure"
openai.api_key = "<key>"
openai.api_base = "https://<resource>.openai.azure.com/"
openai.api_version = "2023-05-15"

response = openai.Embedding.create(input="puppy", engine="text-embedding-ada-002")
text_embedding = response['data'][0]['embedding']

集成式与外部向量化

Azure AI 搜索支持两种方式:通过索引器内置向量化,或使用预计算嵌入的外部向量化。集成方式需配置技能集和 Azure OpenAI 资源。

外部向量化提供更高控制力,适合大规模数据集。嵌入预先计算后随文档上传,当使用索引器不直接支持的模型时,此方法必不可少。

创建多模态索引

多模态索引在一个模式中整合文本、图像及其向量表示。字段如 text 和 image_vector 支持全文搜索与向量搜索,构成混合查询的基础。

每条文档包含 ID、原始文本或图像描述及对应的向量。所有数据统一索引,确保搜索时的一致性。

执行多模态搜索查询

搜索通过混合查询实现,包含 search(用于文本)和 vectorQueries(用于向量)。例如,将查询词‘puppy’向量化后,与索引中的 image_vector 进行比对。

全文搜索与向量搜索结果通过倒数排名融合(RRF)合并,提升整体相关性。最终返回按综合相似度排序的单一结果列表。

import requests

url = "https://<service>.search.windows.net/indexes/multimodal-index/docs/search?api-version=2023-11-01"
headers = {"Content-Type": "application/json", "api-key": "<key>"}
payload = {
    "search": "puppy",
    "vectorQueries": [
        {
            "kind": "vector", 
            "vector": text_embedding, 
            "k": 10, 
            "fields": "image_vector"
        }
    ],
    "select": "id,text",
    "top": 5
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

评估与优化搜索结果

搜索质量可通过精确率、召回率等指标评估。使用标注好的查询-图像相关性数据集进行测试。精确率衡量返回结果中正确匹配的比例。

为提升相关性,可启用带语义排序的混合搜索(queryType=semantic),调整向量查询中的 k 值和过采样参数,并尝试不同的过滤策略。

评估前必须先明确标签域与正类。本例中 y_true 与 y_pred 的取值只有 0 和 1 两个标签,正类由 pos_label=1 指定(这也是默认值),average='binary' 时只报告正类的精确率。按 tp/(tp+fp) 计算,真阳性为 2、假阳性为 1,因此示例输出为 Precision: 0.67。需要注意 pos_label 只用于选择报告哪一个类,并不会把多类数组转换成二元目标;若标签域包含三个及以上类别,应改用 average='macro'、'micro' 或 None 等多类平均方式。

当某个类别的真阳性与假阳性之和为 0 时,精确率属于未定义指标,默认 zero_division='warn' 会返回 0 并发出警告;可通过 zero_division=0、1.0 或 np.nan 显式指定处理方式,以保证评估结果可复现。

from sklearn.metrics import precision_score

# Example evaluation (hypothetical values)
y_true = [1, 0, 1, 1, 0]  # 1 = relevant, 0 = not
y_pred = [1, 1, 1, 0, 0]  # predicted results
precision = precision_score(y_true, y_pred, average='binary')
print(f"Precision: {precision:.2f}")

检查清单

  • 已创建包含向量字段的索引
  • 已指定向量搜索配置文件(HNSW)
  • 文本与图像嵌入具有相同维度
  • 混合查询包含 search 和 vectorQueries
  • 结果通过 RRF 合并

2019 年 1 月 1 日前创建的服务不支持向量搜索功能。使用 Azure OpenAI 或 Foundry API 生成嵌入可能产生费用。

参考来源

  1. Microsoft Learn: vector search ↗
  2. Microsoft Learn: hybrid search ↗
  3. scikit-learn: precision_score ↗
返回顶部 ↑