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

