一、排序算法概述:从搜索的本质说起

大家好,我是这门课的主讲人。今天咱们聊聊排序算法——这个看似基础、实则贯穿整个搜索系统的核心话题。

说实话,我刚入行那会儿,觉得排序不就是把一堆东西排个序嘛,有什么好讲的?直到我在一个电商搜索项目中栽了跟头——用户搜"手机",结果第一页全是几十块的老人机,用户直接骂娘。嗯,从那以后我才真正明白:排序算法,决定了用户看到什么,也决定了搜索系统的生死

什么是排序算法?

排序算法,说白了就是给一堆杂乱无章的东西排个先后顺序。在搜索场景里,就是决定哪些结果排在前面,哪些排在后面。

你想想看,用户搜一个关键词,系统可能召回了几万条结果。但用户只看得见前10条、前20条。这时候,排序算法就是那个"裁判"——它决定谁能站上领奖台。

我个人习惯把排序算法分成两类:

  • 传统排序:比如冒泡、快排、归并——这些是"怎么排"的问题
  • 搜索排序:比如BM25、Learning to Rank——这些是"按什么标准排"的问题

咱们这门课,重点讲的是后者。但别急,前者的一些思想也会穿插进来。

排序算法在搜索中的重要性

我见过太多团队,花大把精力搞召回、搞索引,最后排序随便写个公式就上线了。结果呢?用户留存率惨不忍睹。

为什么排序这么重要?我给你三个理由:

  1. 用户只看前几条——研究表明,超过70%的用户不会翻到第二页。排在前面的结果,直接决定了用户对搜索系统的第一印象。
  2. 排序影响转化率——我在做电商搜索时发现,把高转化商品排到前三,整体GMV能提升15%以上。这不是玄学,是实打实的数据。
  3. 排序体现"理解"——好的排序算法,能理解用户意图。比如搜"苹果",有人想要水果,有人想要手机。排序算法得能区分这些。

核心观点:搜索系统里,召回决定了"有没有",排序决定了"好不好"。没有好的排序,再牛的召回也是白搭。

评价指标:怎么衡量排序好不好?

聊完重要性,咱们得说说怎么评价排序效果。我踩过的坑太多了——曾经有个项目,上线前看指标一片大好,上线后用户反馈一塌糊涂。为什么?因为指标选错了。

下面这几个指标,是我个人认为最常用的,也是面试必问的:

1. 准确率(Precision)

准确率,就是"你排上去的结果里,有多少是相关的"。

公式很简单:

Precision = 相关的结果数 / 返回的结果总数

举个例子:你返回了10条结果,其中7条是用户想要的。那准确率就是70%。

但要注意——准确率有个坑。我曾经在一个项目中只追求准确率,结果排上去的都是最保守、最安全的结果,用户觉得"搜来搜去就那几样"。说白了,准确率高了,但多样性没了。

2. 召回率(Recall)

召回率,就是"所有相关的结果里,你找回来了多少"。

Recall = 相关的结果数 / 系统中所有相关的结果总数

还是那个例子:系统里有100条相关结果,你只返回了7条。那召回率就是7%。

你可能会问:那是不是召回率越高越好?不一定。我见过有人为了追求召回率,把一堆不相关的结果也塞进来,结果准确率暴跌。准确率和召回率,就像跷跷板的两头——你压下去一个,另一个就翘起来。

我的经验:实际项目中,我们通常用F1-score来平衡两者。F1 = 2 * (Precision * Recall) / (Precision + Recall)。这个值越高,说明整体效果越好。

3. NDCG(归一化折损累计增益)

这个指标,我得说——它是排序评价的"王牌"。为什么?因为它不仅关心结果是否相关,还关心相关的结果排在了哪里

NDCG的核心思想很简单:

  • 相关的结果,排得越靠前越好
  • 排在前面的结果,权重更高
  • 排在后面对用户影响小,权重就低

计算公式分三步:

1. CG(累计增益):把所有结果的相关性得分加起来
   CG = rel1 + rel2 + ... + reln

2. DCG(折损累计增益):位置越靠后,折损越大
   DCG = rel1 + rel2/log2(2) + rel3/log2(3) + ... + reln/log2(n)

3. NDCG:用DCG除以理想情况下的IDCG
   NDCG = DCG / IDCG

举个例子你就明白了:

位置 结果A(相关性分) 结果B(相关性分)
1 3(非常相关) 1(不太相关)
2 1 3
3 2 2

结果A的DCG = 3 + 1/log2(2) + 2/log2(3) ≈ 3 + 1 + 1.26 = 5.26
结果B的DCG = 1 + 3/log2(2) + 2/log2(3) ≈ 1 + 3 + 1.26 = 5.26

你看,DCG值一样。但直觉告诉我们,结果A更好——因为最相关的结果排在了第一位。这时候NDCG就派上用场了:

理想排序应该是 [3, 2, 1],IDCG = 3 + 2/log2(2) + 1/log2(3) ≈ 3 + 2 + 0.63 = 5.63

结果A的NDCG = 5.26 / 5.63 ≈ 0.93
结果B的NDCG = 5.26 / 5.63 ≈ 0.93

嗯?还是一样?别急,这是因为例子太简单了。实际场景中,相关性分数差异更大,NDCG能很好地反映排序质量。

避坑指南:我曾经在一个项目中直接用DCG做评估,结果发现不同查询的DCG值差异巨大,根本没法横向比较。后来改用NDCG,才解决了这个问题。记住:一定要用归一化后的版本

4. MAP(平均准确率均值)

MAP,全称是Mean Average Precision。它衡量的是在所有相关结果的位置上,准确率的平均值

怎么算?分两步:

  1. 对每个查询,计算AP(Average Precision)
  2. 对所有查询的AP取平均,得到MAP

AP的计算公式:

AP = (1/相关结果总数) * Σ(每个相关结果位置的准确率)

举个例子:假设有3个相关结果,排在第1、第3、第5位。

  • 第1位:准确率 = 1/1 = 1.0
  • 第3位:准确率 = 2/3 ≈ 0.67
  • 第5位:准确率 = 3/5 = 0.6

AP = (1.0 + 0.67 + 0.6) / 3 ≈ 0.76

MAP就是所有查询的AP的平均值。

MAP和NDCG的区别在哪?我个人的理解是:

  • MAP更关注"相关结果有没有被排上来"
  • NDCG更关注"相关结果排得够不够靠前"

实际项目中,我通常两个都看。如果MAP高但NDCG低,说明相关结果都找回来了,但排得不够靠前。如果NDCG高但MAP低,说明排在前面的结果很相关,但漏掉了一些相关结果。

小结

好了,这一章的内容就到这里。咱们聊了:

  • 排序算法是什么——说白了就是"排座次"
  • 排序为什么重要——它决定了用户看到什么
  • 四个核心指标——准确率、召回率、NDCG、MAP

下一章,咱们会深入讲传统排序算法,包括冒泡、快排、归并这些经典算法。别觉得它们过时了——很多搜索系统的底层,用的就是这些思想。

最后说一句:评价指标选对了,你的排序系统就成功了一半。我见过太多人一上来就调模型、调参数,结果连指标都没搞清楚。嗯,希望你不是这样的人。