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

Azure AI Search多索引条件语义检索解决方案咨询

解决方案

方案1:查询主题分类 + 多索引选择性检索

这是适配现有索引拆分方案的直接做法,核心是先判断查询的主题类别,再定向到对应索引执行检索,最后合并结果。

步骤:

  1. 查询主题分类:
    • 用Azure OpenAI的文本分类能力,让模型判断查询属于「生物类」「科技/AI类」「其他类」;
    • 也可采用自定义关键词匹配(比如包含「细胞」「基因」归为生物类,包含「AI」「机器学习」归为科技类),适合规则明确的场景。
  2. 定向检索:根据分类结果,初始化对应索引的SearchClient执行检索。
  3. 结果合并排序:将多索引检索结果合并,按相关性得分排序后传入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的筛选器实现定向检索,避免多索引的麻烦。

步骤:

  1. 重构索引结构:添加以下字段:
    • category:枚举类型,可选值biology/engineering_tech/art_architecture
    • language:标记文本语言(fr/en)
    • region:标记适用区域(global/us_uk)
  2. 数据重新导入:将三个索引的数据导入新索引,并填充上述字段。
  3. 基于筛选器的检索:根据查询主题构造筛选条件,执行单索引检索。

代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:33:12