You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure AI Search向量搜索报错:SearchIndexClient无embeddings属性求解决方案

问题解决:SearchIndexClient无embeddings属性 + AzureOpenAIVectorizer模型配置

1. AttributeError错误原因及修复

SearchIndexClient的作用是管理Azure AI Search的索引(创建、修改、删除),它不具备生成向量的能力,embeddings.create()是Azure OpenAI客户端的专属方法,不能用SearchIndexClient调用。

正确流程:

  • 单独用Azure OpenAI客户端生成查询向量;
  • 用SearchClient(而非SearchIndexClient)执行向量搜索。

代码示例:

# 导入依赖
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
from openai import AzureOpenAI

# 1. 初始化Azure OpenAI客户端,生成查询向量
aoai_client = AzureOpenAI(
    api_key="你的Azure OpenAI密钥",
    api_version="2024-02-01",  # 替换为你的AOAI API版本
    azure_endpoint="你的Azure OpenAI端点"
)

query_text = "需要搜索的文本内容"
embedding_response = aoai_client.embeddings.create(
    input=query_text,
    model="你的嵌入模型部署名称"  # 注意:填部署名,不是模型官方ID
)
query_vector = embedding_response.data[0].embedding

# 2. 初始化SearchClient,执行向量搜索
search_client = SearchClient(
    endpoint="你的Azure AI Search端点",
    index_name="目标索引名称",
    credential=AzureKeyCredential("你的AI Search密钥")
)

# 执行向量搜索
search_results = search_client.search(
    search_text="",  # 纯向量搜索可留空,结合关键词则填入对应文本
    vector=query_vector,
    k=5,  # 返回Top 5结果
    vector_fields="你的向量字段名称"  # 对应索引中定义的向量字段
)

# 遍历输出结果
for result in search_results:
    print(result["你的文档字段名"], result["@search.score"])

2. AzureOpenAIVectorizer未配置model_name的问题

AzureOpenAIVectorizer必须指定model_name才能正常工作,之前注释它导致的报错,大概率是你填了模型的官方ID(比如text-embedding-ada-002),而非Azure OpenAI中该模型的部署名称。

两种向量化场景的配置方式:

场景1:索引自动向量化(上传文档时AI Search调用AOAI生成向量)

创建索引时,AzureOpenAIVectorizer的model_name必须填你在Azure OpenAI中部署的嵌入模型的部署名称,同时要确保AI Search有访问AOAI的权限(比如配置托管身份或存储AOAI密钥到AI Search的密钥库)。

索引配置关键部分示例:

from azure.search.documents.indexes import SearchIndexClient, SearchIndex
from azure.search.documents.indexes.models import (
    HnswAlgorithmConfiguration,
    VectorSearch,
    VectorSearchProfile,
    AzureOpenAIVectorizer,
    SearchField,
    SearchFieldDataType
)

# 定义向量字段
vector_field = SearchField(
    name="content_vector",
    type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
    searchable=True,
    vector_search_dimensions=1536,  # 对应嵌入模型的维度,比如ada-002是1536
    vector_search_profile_name="my-vector-profile"
)

# 配置AzureOpenAIVectorizer
vectorizer = AzureOpenAIVectorizer(
    name="aoai-vectorizer",
    azure_open_ai_endpoint="你的AOAI端点",
    azure_open_ai_key="你的AOAI密钥",
    model_name="你的嵌入模型部署名称"  # 必须填部署名
)

# 配置向量搜索配置和Profile
vector_search = VectorSearch(
    algorithms=[HnswAlgorithmConfiguration(name="my-hnsw")],
    vectorizers=[vectorizer],
    profiles=[VectorSearchProfile(
        name="my-vector-profile",
        algorithm_configuration_name="my-hnsw",
        vectorizer_name="aoai-vectorizer"
    )]
)

# 创建索引
index = SearchIndex(
    name="你的索引名",
    fields=[vector_field, ...],  # 补充其他业务字段
    vector_search=vector_search
)

index_client = SearchIndexClient(
    endpoint="你的AI Search端点",
    credential=AzureKeyCredential("你的AI Search密钥")
)
index_client.create_or_update_index(index)

场景2:手动生成向量后上传

如果是你自己提前用AOAI生成向量,再上传到AI Search,那么索引中的向量字段只需定义维度,不需要依赖AzureOpenAIVectorizer配置:

vector_field = SearchField(
    name="content_vector",
    type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
    searchable=True,
    vector_search_dimensions=1536
)

此时搜索时,仍然需要用Azure OpenAI客户端生成查询向量,再用SearchClient执行搜索(和前面的代码示例一致)。

内容的提问来源于stack exchange,提问作者VictorGram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:14:52