Azure AI Search多索引条件语义检索解决方案咨询
解决方案
方案1:查询主题分类 + 多索引选择性检索
这是适配现有索引拆分方案的直接做法,核心是先判断查询的主题类别,再定向到对应索引执行检索,最后合并结果。
步骤:
- 查询主题分类:
- 用Azure OpenAI的文本分类能力,让模型判断查询属于「生物类」「科技/AI类」「其他类」;
- 也可采用自定义关键词匹配(比如包含「细胞」「基因」归为生物类,包含「AI」「机器学习」归为科技类),适合规则明确的场景。
- 定向检索:根据分类结果,初始化对应索引的
SearchClient执行检索。 - 结果合并排序:将多索引检索结果合并,按相关性得分排序后传入LLM生成回答。
代码示例(基于现有单索引代码修改):
from azure.search.documents import SearchClient from azure.core.credentials import AzureKeyCredential import openai # 初始化指定索引的SearchClient def get_search_client(index_name): service_endpoint = "你的Azure AI Search端点" admin_key = "你的搜索密钥" return SearchClient(endpoint=service_endpoint, index_name=index_name, credential=AzureKeyCredential(admin_key)) # 查询主题分类(Azure OpenAI实现) def classify_query(query): prompt = f"""请将以下查询分类为三类: 1. 生物类:涉及生物学、医学相关内容 2. 科技类:涉及工程、技术、AI、数据科学相关内容 3. 其他类:不属于上述两类的内容 查询内容:{query} 仅返回分类结果的数字编号(1/2/3)""" response = openai.ChatCompletion.create( engine="你的Azure OpenAI部署名称", messages=[{"role": "user", "content": prompt}], temperature=0 ) return response.choices[0].message.content.strip() # 多索引检索逻辑 def multi_index_retrieve(query): category = classify_query(query) results = [] # 根据分类选择对应索引检索 if category == "1": # 生物类:检索Index1和Index2 client1 = get_search_client("Biology Index") res1 = client1.search(query, top=5) results.extend(list(res1)) client2 = get_search_client("Engineering and Technology Index") res2 = client2.search(query, top=5) results.extend(list(res2)) elif category == "2": # 科技类:仅检索Index2 client2 = get_search_client("Engineering and Technology Index") res2 = client2.search(query, top=10) results.extend(list(res2)) else: # 其他类:检索所有索引(可按需调整) client1 = get_search_client("Biology Index") res1 = client1.search(query, top=3) results.extend(list(res1)) client2 = get_search_client("Engineering and Technology Index") res2 = client2.search(query, top=3) results.extend(list(res2)) client3 = get_search_client("Art and Architecture Index") res3 = client3.search(query, top=4) results.extend(list(res3)) # 按相关性得分排序 results.sort(key=lambda x: x["@search.score"], reverse=True) return results[:10] # 返回前10条最相关结果 # 集成到现有RAG流程 query = "细胞分裂的AI模拟方法" retrieved_docs = multi_index_retrieve(query) # 后续传入LLM生成回答...
方案2:重构单索引 + 筛选器检索
如果索引拆分的核心需求是「条件检索」而非物理隔离(权限、语言可通过字段标记实现),可将所有数据合并回单索引,通过自定义字段标记属性,用Azure AI Search的筛选器实现定向检索,避免多索引的麻烦。
步骤:
- 重构索引结构:添加以下字段:
category:枚举类型,可选值biology/engineering_tech/art_architecturelanguage:标记文本语言(fr/en)region:标记适用区域(global/us_uk)
- 数据重新导入:将三个索引的数据导入新索引,并填充上述字段。
- 基于筛选器的检索:根据查询主题构造筛选条件,执行单索引检索。
代码示例:
def filtered_search(query, category): client = get_search_client("Unified-Enterprise-Index") filter_expr = "" if category == "1": # 生物类:筛选biology和engineering_tech分类 filter_expr = "category eq 'biology' or category eq 'engineering_tech'" elif category == "2": # 科技类:仅筛选engineering_tech分类 filter_expr = "category eq 'engineering_tech'" else: # 其他类:美英地区优先返回art_architecture分类内容 filter_expr = "region eq 'us_uk' or category ne 'art_architecture'" results = client.search(query, filter=filter_expr, top=10) return list(results)
方案3:自定义检索路由服务
如果需要更高扩展性(比如后续新增索引),可构建轻量级中间服务,专门处理查询分类、多索引检索路由,将检索逻辑与RAG流程解耦。
核心逻辑:
- 服务暴露API接口接收用户查询;
- 内部完成主题分类、多索引检索、结果聚合;
- 返回标准化检索结果给RAG流程。
优势:
- 后续修改索引规则无需改动RAG核心代码;
- 可添加缓存、限流等优化措施。
注意事项
- 生物类查询的法语内容,可在方案1中给Index1的结果设置更高权重,或合并时优先排序;
- 用Azure OpenAI做分类时,建议微调模型或添加few-shot示例,提升分类准确率;
- 方案2中若Index1是私有数据,可添加
is_private字段,结合Azure AI Search的角色访问控制实现权限隔离。
内容的提问来源于stack exchange,提问作者R_Student
相关产品推荐
相关产品推荐

