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

Azure AI Search搜索分数归一化问题求助

问题原因与解决方案

核心原因

  • 向量分数的内部归一化逻辑:Azure AI Search返回的@search.score并非原始余弦相似度(0-1),而是系统基于查询上下文和文档集分布做了内部调整的分数。当查询向量(尤其是随机字符串)与绝大多数文档向量相似度极低时,这些低分数会被“压缩”到相近区间,导致区分度丧失。
  • 短文本向量的分布特性:你的文档都是短术语(如"white wine"),这类文本的向量本身分布可能相对密集,相关术语与随机字符串的向量距离差异没有长文本那么显著,进一步放大了分数趋同的问题。
  • 语义排序的适配性问题:语义排序依赖于模型对文本语义的理解,随机字符串无有效语义信息,相关术语又是短文本,模型无法提取足够的差异化信号,因此无法有效拉开分数差距。

实现合理分数归一化的方法

1. 直接使用原始余弦相似度替代@search.score

在查询时指定返回原始向量相似度,而非系统处理后的@search.score:

  • 查询请求中添加$select=*,search.vectorSimilarity(<向量字段名>),获取范围为0-1的原始余弦相似度值。
  • 将该值乘以100,直接转换为0-100%的匹配度百分比。

2. 基于向量相似度分布自定义阈值与归一化

  • 先统计10万条文档的向量相似度分布:用典型相关查询和随机查询,获取原始余弦相似度的区间范围(比如相关查询集中在0.6-0.9,随机查询集中在0-0.2)。
  • 自定义归一化规则,示例代码:
    def normalize_score(raw_similarity):
        if raw_similarity < 0.2:
            return 0  # 随机输入直接归为0分
        elif raw_similarity >= 0.6:
            return round(raw_similarity * 100, 2)  # 高相似度直接转百分比
        else:
            # 中间区间线性映射到0-60%
            return round((raw_similarity - 0.2) / (0.6 - 0.2) * 60, 2)
    
  • 查询结果返回后,用该函数对原始相似度进行转换,得到符合预期的分数。

3. 优化向量字段的配置与索引构建

  • 选用适配短文本的嵌入模型:比如针对术语/短语优化的模型(如Azure OpenAI的text-embedding-ada-002短文本模式),提升短术语向量的区分度。
  • 重新生成嵌入向量:若之前使用的模型不合适,重新为10万条文档生成向量,确保相关术语与无关字符串的向量距离足够大。

4. 结合关键词查询增强区分度

  • 对用户输入同时发起向量查询+关键词查询,将两个分数加权合并:
    • 关键词查询用BM25分数,向量查询用原始余弦相似度。
    • 示例公式:最终分数 = (BM25_score * 0.3) + (vector_similarity * 0.7) * 100
    • 随机字符串在关键词查询中会得到极低分数,从而拉低最终总分,实现有效区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:39:58