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
相关产品推荐
相关产品推荐

