<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Thomas Veasey - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Thomas Veasey - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/cn/search-labs/author/thomas-veasey</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/author/thomas-veasey</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/author/thomas-veasey.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Mon, 19 Oct 2026 16:16:32 GMT</lastBuildDate>
  <item>
    <title><![CDATA[加速合并 HNSW 图表]]></title>
    <description><![CDATA[探索我们为降低构建多个 HNSW 图形的开销所做的工作，尤其是降低合并图形的成本。]]></description>
    <content:encoded><![CDATA[<p>过去，<a href="https://www.elastic.co/cn/search-labs/blog/multi-graph-vector-search">我们讨论过</a>搜索多个<a href="https://www.elastic.co/cn/search-labs/blog/hnsw-graph">HNSW 图表所</a>面临的一些挑战，以及我们是如何缓解这些挑战的。当时，我们提到了我们计划进行的一些进一步改进。这篇文章就是这项工作的结晶。</p><p>你可能会问，为什么要使用多图表呢？这是 Lucene 架构选择的副作用：不可变的段。与大多数建筑选择一样，有利也有弊。例如，我们最近对无服务器 Elasticsearch 进行了 GA。在这种情况下，我们从不可变分段中获得了非常显著的优势，包括高效的索引复制以及将索引和查询计算解耦并独立自动扩展的能力。对于矢量量化，分段合并让我们有机会更新参数，使其适应数据特征。按照这种思路，我们认为有机会测量数据特征和重新审视索引选择还有其他好处。</p><p>在这篇文章中，我们将讨论我们为大幅降低构建多个 HNSW 图形的开销，尤其是降低合并图形的成本所做的工作。</p><h3>背景</h3><p>为了保持可管理的分段数量，Lucene 会定期检查是否应该合并分段。这相当于检查当前分段数是否超过目标分段数，目标分段数由基本分段大小和合并策略决定。如果超过该计数，Lucene 会合并片段组，同时违反约束条件。这一过程在<a href="https://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html">其他地方有</a>详细描述。</p><p>Lucene 选择合并大小相似的数据段，因为这样可以实现写入放大的对数增长。就向量索引而言，写入放大是指向量插入图形的次数。Lucene 会尝试以大约 10 个为一组合并数据段。因此，向量插入图的次数大约为 {10}\left (\frac{n}{n_0} \right )次，其中是索引向量数，n 是预期的基本段向量数。由于写入量呈对数增长，即使是庞大的指数，写入放大率也只有个位数。不过，合并图形所花费的总时间与写入放大率成线性比例。</p><p>在合并 HNSW 图形时，我们已经进行了小幅优化：保留最大分段的图形，并将其他分段的向量插入其中。这就是上述 9/10 因素的原因。下面，我们将展示如何通过使用我们正在合并的所有图表中的信息来大幅提高性能。</p><h3>HNSW 图表合并</h3><p>此前，我们保留了最大的图形，并从其他图形中插入矢量，但忽略了包含这些矢量的图形。我们在下文中利用的关键见解是，我们丢弃的每个 HNSW 图形都包含了有关其所含向量的重要邻近性信息。我们希望利用这些信息来加快插入至少部分载体的速度。</p><p>我们重点讨论将较小的图插入较大的图 _l=(V _l, E _l)的问题，因为这是一个原子操作，我们可以用它来构建任何合并策略。</p><p>策略是找到的一个顶点子集，将其插入大图中。然后，我们利用这些顶点在小图中的连通性，加速插入剩余的顶点。在下文中，我们用和分别表示小图和大图中顶点的邻居。具体流程如下</p><p><code>MERGE-HNSW</code></p><p><code>Inputs </code><code> and </code></p><p><code>1</code><code>Find </code><code> to insert into </code><code> using COMPUTE-JOIN-SET</code>
<code>2</code><code>Insert each vertex </code><code> into </code>
<code>3</code><code>for </code><code> do</code>
<code>4</code>
<code>5</code>
<code>6</code><code>FAST-SEARCH-LAYER</code>
<code>7</code><code>SELECT-NEIGHBORS-HEURISTIC</code>
<code>8</code></p><p>我们使用下面讨论的程序来计算集合（第 1 行）。然后，我们使用标准的 HNSW 插入程序将中的每个顶点插入大图中（第 2 行）。对于我们尚未插入的每个顶点，我们都要找到已插入的邻接顶点及其在大图中的邻接顶点（第 4 行和第 5 行）。我们使用<code>FAST-SEARCH-LAYER</code> 程序（第 6 行）作为种子程序，从 HNSW<a href="https://arxiv.org/pdf/1603.09320">论文</a>（第 7 行）中找到<code>SELECT-NEIGHBORS-HEURISTIC</code> 的候选者。实际上，我们在<code>INSERT</code> 方法（论文中的算法 1）中替换了<code>SEARCH-LAYER</code> 来查找候选集，其他方面没有变化。最后，我们将刚刚插入的顶点添加到（第 8 行）。</p><p>很明显，要做到这一点，中的每个顶点都必须在至少有一个邻居。事实上，我们要求对于中的每个顶点，|J\capfor some M，即最大层连接性。我们观察到，在真实的 HNSW 图中，顶点度的分布相当广泛。下图显示了 Lucene HNSW 图表底层顶点度的典型累积密度函数。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc815e1a9c3bb0d06/6a17e178ec0f89308a5a6564/44f001b3a1bc6627e172fed5c52a02cfdcb4cd66-1324x898.png" alt="HNSW 图形：顶点度分布示例" /><p>我们探讨了的固定值以及使其成为顶点度函数的方法。第二种选择会带来更快的速度，而对图形质量的影响却很小，因此采用了以下方案</p><p>请注意，根据定义，|N_s| 等于小图中顶点的度数。下限为 2 意味着我们将插入每个度数小于 2 的顶点。</p><p>一个简单的计数论证表明，如果我们仔细选择 ，我们只需要在 中直接插入大约具体来说，如果我们将一条图边的一个末端顶点恰好插入到，我们就会给这条图边着色。那么我们知道，对于 中 至少有  个 邻居，我们至少需要给 条边着色。此外，我们预计</p><p>这里，_U（left[N_s(U)|\right]）是小图中的平均顶点度。对于每个顶点u\我们最多为 |N_s条边着色。因此，我们期望着色的边的总数最多为 |J|\_U\left[|N_s(U)|\right].我们希望通过仔细选择，使着色的边数接近这一数字，因此，为了覆盖所有顶点，J| 需要满足以下条件</p><p>这意味着 {1}{4}|V_s|=\frac{1}{5} |V_s|。</p><p>如果<code>SEARCH-LAYER</code> 的运行时间占主导地位，这表明我们可以将合并时间最多提高。考虑到写入放大率的对数增长，这意味着即使对于非常大的索引，我们的构建时间通常也只比构建一个图形多一倍。</p><p>这种策略的风险在于会破坏图形质量。我们最初尝试使用无操作程序<code>FAST-SEARCH-LAYER</code> 。我们发现这降低了图表质量，以至于影响了作为延迟函数的召回率，尤其是在合并到单个片段时。然后，我们通过对图形的有限搜索，探索了各种替代方案。最终，最有效的选择是最简单的。使用<code>SEARCH-LAYER</code> ，但<code>ef_construction</code> 要低。通过这种参数设置，我们能够获得质量极佳的图形，同时还能将合并时间平均缩短 30% 多一点。</p><h3>计算连接集</h3><p>寻找一个好的连接集可以表述为一个 HNSW 图覆盖问题。贪婪启发式是一种简单有效的近似最优图覆盖的启发式。我们采用的方法是按增益递减的顺序逐个选取顶点添加到。增益定义如下</p><p>这里，表示向量在中的邻域数，是指示函数。增益包括我们添加到的顶点计数的变化，即 \max，因为我们添加了一个覆盖范围较小的顶点，从而更接近我们的目标。下图展示了中心橙色顶点的增益计算。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7a353d56fa09af5f/6a17e17a2f4a5c33f7fa8825/fe11cd55a7d94d9e0b0f4d47ea309a99075c355d-540x474.png" alt="加入 HNSW 图中连接集 J 的顶点增益" /><p>我们为每个顶点 维护以下状态</p><ol><li><p>是否陈旧、</p></li><li><p>其增益</p></li><li><p>中相邻顶点的计数，用 表示、</p></li><li><p>范围为 [0,1] 的随机数，用于打破平局。</p></li></ol><p>计算连接集的伪代码如下。</p><p><code>COMPUTE-JOIN-SET</code></p><p><code>Inputs </code></p><p><code>1</code>
<code>2</code>
<code>3</code><code>for </code><code> do</code>
<code>4</code>
<code>5</code>
<code>6</code>
<code>7</code><code>while </code><code> do
8</code><code> maximum gain vertex in </code>
<code>9</code><code>Remove the state for </code><code> from </code>
<code>10</code><code>if </code><code> is not stale then</code>
<code>11</code>
<code>12</code>
<code>13</code><code>for </code><code> do</code>
<code>14</code><code>mark </code><code> as stale if </code>
<code>15</code><code>mark neighbors of </code><code> stale if </code><code>
16</code><code>
17</code><code>else
18</code><code>
19</code><code>if </code><code> then
20</code><code>
21</code><code>return </code></p><p>我们首先在第 1-5 行中初始化状态。</p><p>在主循环的每次迭代中，我们首先提取最大增益顶点（第 8 行），然后随机打破平局。在进行任何更改之前，我们需要检查顶点的增益是否过时。特别是，每次我们将一个顶点添加到，都会影响其他顶点的增益：</p><ol><li><p>由于它的所有邻居在中都多了一个邻居，因此它们的收益会发生变化（第 14 行）</p></li><li><p>如果它的任何一个邻居现在被完全覆盖，其所有邻居的收益都会发生变化（第 14-16 行）</p></li></ol><p>我们以一种懒散的方式重新计算增益，因此只有当我们想要将某个顶点插入，才会重新计算该顶点的增益（第 18-20 行）。由于增益只会减少，我们永远不会错过应该插入的顶点。</p><p>请注意，我们只需跟踪我们添加到的顶点的总增益，就能确定何时退出。此外，当 {exit} 时，至少有一个顶点的增益不为零，因此我们总能取得进展。</p><h3>实施结果</h3><p>我们在四个数据集上进行了实验，这四个数据集涵盖了我们支持的三种距离度量（欧氏、余弦和内积）：</p><ol><li><p>quora-E5-small：522931 个文档，384 个维度，使用余弦相似性、</p></li><li><p>cohere-wikipedia-v2：1M 文档，768 维度，使用余弦相似性、</p></li><li><p>gist：100 万个文档、960 个维度并使用欧氏距离，以及</p></li><li><p>cohere-wikipedia-v3：100 万文档，1024 维度，使用最大内积。</p></li></ol><p>对于每个数据集，我们都会评估两种量化水平：</p><ol><li><p>int8 - 每个维度使用一个 1 字节的整数，而</p></li><li><p>BBQ - 每个维度使用一个比特。</p></li></ol><p>最后，在每个实验中，我们在两个检索深度对搜索质量进行了评估，并在建立索引后和强制合并为单一片段后对搜索质量进行了检查。</p><p>总之，我们在索引和合并方面实现了持续的大幅提速，同时保持了图的质量，因此在所有情况下都能保持搜索性能。</p><h4>实验 1：int8 量化</h4><p>从基线到候选方案（建议的修改）的平均提速为</p><p>索引时间加速：<strong>1.</strong> 次</p><p>强制合并加速：<strong>1.</strong> 次</p><p>运行时间细分如下</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8422be122ef1a9c9/6a17e17bbe6086522e00467d/5f9f6d487b4c74c4998aa47465912c1a9743e928-734x479.png" alt="基线和候选合并策略的索引和合并时间" /><p>为完整起见，确切时间为</p><p></p><p>索引</p><p></p><p>合并</p><p></p><p>数据集</p><p>底线</p><p>候选人</p><p>构建</p><p>候选人</p><p>quora-E5-small</p><p>112.41s</p><p>81.55s</p><p>113.81s</p><p>70.87s</p><p>wiki-cohere-v2</p><p>158.1s</p><p>122.95s</p><p>425.20s</p><p>239.28s</p><p>要领</p><p>141.82s</p><p>119.26s</p><p>536.07s</p><p>279.05s</p><p>wiki-cohere-v3</p><p>211.86s</p><p>168.22s</p><p>654.97s</p><p>414.12s</p><p>下面我们展示了候选方案（虚线）与基线在两种检索深度下的召回率与延迟对比图：多段索引的召回率@10 和召回率@100（我们的默认合并策略在索引所有矢量后的最终结果），以及强制合并为单段后的召回率与延迟对比图。曲线越高、越靠左越好，这意味着在较低的延迟条件下有更高的记忆率。</p><p>正如您所看到的，对于 Cohere v3 数据集来说，候选者的多分段指数更好，而对于所有其他数据集来说，候选者的多分段指数稍差，但几乎不相上下。合并为单一网段后，所有情况下的召回曲线几乎相同。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf674622469bf6a90/6a17e17dfbc5f874a84919c9/9195297f19f90b172d832ba56bdada7b0d8a768b-985x392.png" alt="建立索引后的 10 倍和 100 倍召回率与延迟时间对比" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltde89f7e94ac823f4/6a17e17fe9ea876429a9c507/c866f32d579ae2b841e92ca733dd29c0e214ac6b-986x386.png" alt="合并为单一网段后，10 和 100 的召回率与延迟对比" /><h4>实验 2：烧烤量化</h4><p>从基准线到候选方案的平均加速度为</p><p>索引时间加速：<strong>1.</strong> 次</p><p>强制合并加速：<strong>1.</strong> 次</p><p>运行时间细分如下</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5b0eb305222fa5c2/6a17e18125daab514f08a18c/11be0cf6b63480dc703409329357ea4847b55051-740x415.png" alt="基线和候选合并策略的索引和合并时间" /><p>为完整起见，确切时间为</p><p></p><p>索引</p><p></p><p>合并</p><p></p><p>数据集</p><p>底线</p><p>候选人</p><p>构建</p><p>候选人</p><p>quora-E5-small</p><p>70.71s</p><p>58.25s</p><p>59.38s</p><p>40.15s</p><p>wiki-cohere-v2</p><p>203.08s</p><p>142.27s</p><p>107.27s</p><p>85.68s</p><p>要领</p><p>110.35s</p><p>105.52s</p><p>323.66s</p><p>202.2s</p><p>wiki-cohere-v3</p><p>313.43s</p><p>190.63s</p><p>165.98s</p><p>159.95s</p><p>对于多分段索引，候选者在几乎所有数据集上都更胜一筹，但 cohere v2 除外，基线略胜一筹。就单段指数而言，所有情况下的召回曲线几乎相同。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb12174abeadbcdd1/6a17e1822f4a5c4cc2fa8829/7da1be27bab5a7f5f9c9a1882ea35761a4a0ba5c-973x383.png" alt="建立索引后的 10 倍和 100 倍召回率与延迟时间对比" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1b88d4f7fec9905/6a17e184414c64a8de9450b4/a26af30a56c55a12addee7e4fb7e8f606f366668-979x386.png" alt="恢复 @10 和 @100 与合并为单一分段后的延迟对比" /><h3>结论</h3><p>本博客中讨论的算法将在即将发布的 Lucene 10.2 以及基于该算法的 Elasticsearch 版本中提供。用户将能利用这些新版本中改进的合并性能和缩短的索引构建时间。这一变更是我们为使 Lucene 和 Elasticsearch 在矢量和混合搜索方面快速高效而不断努力的一部分。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hnsw-graphs-speed-up-merging</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hnsw-graphs-speed-up-merging</guid>
    <category><![CDATA[向量数据库]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Thomas Veasey,Mayya Sharipova]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9fca6a01d0541cfb/6a17e187033c8d46486bb0e1/49a6c880f5dedd0fa502ece5be124824ee218cc0-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[评估搜索相关性第一部分 —— BEIR 基准测试]]></title>
    <description><![CDATA[学习在深入理解 BEIR 基准测试的背景下评估您的搜索系统，并掌握提升搜索评估流程的技巧与方法。]]></description>
    <content:encoded><![CDATA[<p>这是系列博客文章的第一篇，探讨如何在更好地理解 BEIR 基准测试的背景下，评估您自己的搜索系统。我们将介绍具体的技巧与方法，帮助您在深入理解 BEIR 的背景下改进搜索评估流程。我们还将指出常见的陷阱，这些陷阱会降低评估的可靠性。最后，我们注意到，LLM 为搜索工程师提供了一种强大的新工具，我们将通过示例展示如何利用它们来协助搜索评估。</p><h2>理解搜索相关性评估中的 BEIR 基准测试</h2><p>要改进任何系统，您需要能够衡量其表现。在搜索领域，<a href="https://arxiv.org/abs/2104.08663">BEIR</a>（或等效 <a href="https://huggingface.co/spaces/mteb/leaderboard">MTEB</a> 排行榜的检索部分）被认为是信息检索社区的“圣杯”，这并不令人意外。它是一个结构非常完善的基准测试，涵盖了不同任务的多样化数据集。更具体地说，它涵盖了以下领域：</p><ul><li><p>参数检索 (ArguAna, Touche2020)</p></li><li><p>开放领域问答 (HotpotQA, Natural Questions, FiQA)</p></li><li><p>段落检索（MSMARCO）</p></li><li><p>重复问题检索（Quora，CQADupstack）</p></li><li><p>事实核查（FEVER, Climate-FEVER, Scifact）</p></li><li><p>生物医学信息检索（TREC-COVID、NFCorpus、BioASQ）</p></li><li><p>实体检索 (DBPedia)</p></li><li><p>引文预测 (SCIDOCS)</p></li></ul><p>它提供了一个单一的统计信息 nDCG@10，用于衡量系统在其返回的顶部结果中，为每个任务样例匹配最相关文档的程度。对于人机交互的搜索系统来说，顶部结果的相关性至关重要。然而，评估搜索效果有很多细微差别，而单一的汇总统计数据无法涵盖这些差别。</p><h2>BEIR 数据集的结构</h2><p>每个基准测试包含三个组成部分：</p><ul><li><p>要检索的语料库或文档</p></li><li><p>查询</p></li><li><p>查询的相关性判断（也称为 <code>qrels</code>）。</p></li></ul><p>相关性判断以零或更高的分数表示。非零分数表示文档与查询有一定的相关性。</p><p>数据集</p><p>语料库大小</p><p>#测试集中的查询数量</p><p>#qrels 中正向标注的数量</p><p>#qrels 等于零</p><p>#语料库中的重复项数量</p><p>Arguana</p><p>8,674</p><p>1,406</p><p>1,406</p><p>0</p><p>96</p><p>Climate-FEVER</p><p>5,416,593</p><p>1,535</p><p>4,681</p><p>0</p><p>0</p><p>DBPedia</p><p>4,635,922</p><p>400</p><p>15,286</p><p>28,229</p><p>0</p><p>FEVER</p><p>5,416,568</p><p>6,666</p><p>7,937</p><p>0</p><p>0</p><p>FIQA-2018</p><p>57,638</p><p>648</p><p>1,706</p><p>0</p><p>0</p><p>HotpotQA</p><p>5,233,329</p><p>7,405</p><p>14,810</p><p>0</p><p>0</p><p>Natural Questions</p><p>2,681,468</p><p>3,452</p><p>4,021</p><p>0</p><p>16,781</p><p>NFCorpus</p><p>3,633</p><p>323</p><p>12,334</p><p>0</p><p>80</p><p>Quora</p><p>522,931</p><p>10,000</p><p>15,675</p><p>0</p><p>1,092</p><p>SCIDOCS</p><p>25,657</p><p>1,000</p><p>4,928</p><p>25,000</p><p>2</p><p>Scifact</p><p>5,183</p><p>300</p><p>339</p><p>0</p><p>0</p><p>Touche2020</p><p>382,545</p><p>49</p><p>932</p><p>1,982</p><p>5,357</p><p>TREC-COVID</p><p>171,332</p><p>50</p><p>24,763</p><p>41,663</p><p>0</p><p>MSMARCO</p><p>8,841,823</p><p>6,980</p><p>7,437</p><p>0</p><p>324</p><p>CQADupstack (sum)</p><p>457,199</p><p>13,145</p><p>23,703</p><p>0</p><p>0</p><p><strong>表 1</strong>：数据集统计信息。这些数字是在数据集的测试部分计算得出的（<code>MSMARCO</code> 的 <code>dev</code>）。</p><p><strong>表 1</strong> 列出了构成 <code>BEIR</code> 基准的数据集的一些统计数据，如语料库中的文档数量、测试数据集中的查询数量以及 <code>qrels</code> 文件中的正/负（查询、文档）对数量。通过快速查看数据，我们可以立即推断出以下几点：</p><ul><li><p>大多数数据集在 <code>qrels</code> 文件中不包含任何负面关系，即零分，这会明确地将文档标记为与给定查询无关。</p></li><li><p>每个查询的平均文档关联数（<code>#qrels</code>/<code>#queries</code>）从 <code>ArguAna</code> 的 1.0 到 493.5（<code>TREC-COVID</code>）不等，但大多数情况下的值为 <code>&lt;</code> 5。</p></li><li><p>一些数据集的语料库中存在重复文档，在某些情况下可能导致评估不准确，例如，当一个文档被认为与查询相关但其重复文档却不相关时。例如，在 <code>ArguAna</code> 中，我们识别出 96 个重复文档对案例，每对中只有一个文档被标记为与查询相关。通过将初始 qrels 列表“扩展”以包含重复文档，我们观察到 <code>nDCG@10</code> 分数平均相对提高了约 1%。</p></li></ul>{
  "_id": "test-economy-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
{
  "_id": "test-society-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
<p><strong>ArguAna 中的重复对示例。在 qrels 文件中，只有第一个文档显示为与查询（“test-economy-epiasghbf-pro02a”）相关（作为反方论点）</strong></p><p>在 MTEB 排行榜上比较模型时，人们很容易将重点放在平均检索质量上。这虽然是模型整体质量的一个良好代理指标，但并不一定能说明它在您特定场景下的表现。由于结果按数据集报告，因此值得了解不同数据集与您的搜索任务的关联程度，并仅使用最相关的数据集重新评估模型。如果您想深入研究，还可以检查各数据语料库的主题重叠情况。按主题对质量指标进行分层，可以更精细地评估模型的具体优势与劣势。</p><p>这里需要特别注意，当文档未在 <code>qrels</code> 文件中标注时，默认情况下它被视为与查询不相关。我们对此领域进行了更深入的探究，并收集了一些证据，以更清晰地阐明以下问题：“评估者面对没有真实标注信息的（查询，文档）对的频率有多高？”。这一点之所以重要，是因为当只有浅层标注可用时（即并非每个相关文档都被标记），一个信息检索系统可能仅仅因为它“选择”呈现了不同的相关（但未标记）文档，而被判定为比另一个系统更差。这是创建高质量评估集时的常见陷阱，尤其是对于大型数据集。为了可行，人工标注通常会关注当前系统返回的顶部结果，因此可能会遗漏其盲区中的相关文档。因此，通常更可取的做法是将更多资源集中在少数查询的更完整标注上，而不是广泛的浅层标注。</p><h2>利用 BEIR 基准测试进行搜索相关性评估</h2><p>为了启动分析，我们实施了以下场景（见<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">笔记本</a>）：</p><ol><li><p>首先，我们将每个数据集的语料库加载到 Elasticsearch 索引中。</p></li><li><p>对于测试集中的每个查询，我们使用 BM25 检索前 100 个文档。</p></li><li><p>我们使用多种 SOTA 重排序模型对检索到的文档进行重新排序。</p></li><li><p>最后，我们报告第 2 步（检索后）和第 3 步（重新排序后）得出的前 10 名文档的 "评判率"。换句话说，我们计算的是 <code>qrels</code> 文件中得分排名前 10 的文档的平均百分比。</p></li></ol><p>我们使用的模型重新排序列表如下：</p><ul><li><p><a href="https://docs.cohere.com/reference/rerank">Cohere 的</a> <code>rerank-english-v2.0</code> 和 <code>rerank-english-v3.0</code></p></li><li><p><a href="https://huggingface.co/BAAI/bge-reranker-base">BGE-base</a></p></li><li><p><a href="https://huggingface.co/mixedbread-ai/mxbai-rerank-xsmall-v1">mxbai-rerank-xsmall-v1</a></p></li><li><p><a href="https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2">MiniLM-L-6-v2</a></p></li></ul><p></p><p>检索</p><p>重排序</p><p></p><p></p><p></p><p></p><p>数据集</p><p>BM25（%）</p><p>Cohere Rerank v2 (%)</p><p>Cohere Rerank v3 (%)</p><p>BGE-base (%)</p><p>mxbai-rerank-xsmall-v1 (%)</p><p>MiniLM-L-6-v2 (%)</p><p>Arguana</p><p>7.54</p><p>4.87</p><p>7.87</p><p>4.52</p><p>4.53</p><p>6.84</p><p>Climate-FEVER</p><p>5.75</p><p>6.24</p><p>8.15</p><p>9.36</p><p>7.79</p><p>7.58</p><p>DBPedia</p><p>61.18</p><p>60.78</p><p>64.15</p><p>63.9</p><p>63.5</p><p>67.62</p><p>FEVER</p><p>8.89</p><p>9.97</p><p>10.08</p><p>10.19</p><p>9.88</p><p>9.88</p><p>FiQa-2018</p><p>7.02</p><p>11.02</p><p>10.77</p><p>8.43</p><p>9.1</p><p>9.44</p><p>HotpotQA</p><p>12.59</p><p>14.5</p><p>14.76</p><p>15.1</p><p>14.02</p><p>14.42</p><p>Natural Questions</p><p>5.94</p><p>8.84</p><p>8.71</p><p>8.37</p><p>8.14</p><p>8.34</p><p>NFCorpus</p><p>31.67</p><p>32.9</p><p>33.91</p><p>30.63</p><p>32.77</p><p>32.45</p><p>Quora</p><p>12.2</p><p>10.46</p><p>13.04</p><p>11.26</p><p>12.58</p><p>12.78</p><p>SCIDOCS</p><p>8.62</p><p>9.41</p><p>9.71</p><p>8.04</p><p>8.79</p><p>8.52</p><p>Scifact</p><p>9.07</p><p>9.57</p><p>9.77</p><p>9.3</p><p>9.1</p><p>9.17</p><p>Touche2020</p><p>38.78</p><p>30.41</p><p>32.24</p><p>33.06</p><p>37.96</p><p>33.67</p><p>TREC-COVID</p><p>92.4</p><p>98.4</p><p>98.2</p><p>93.8</p><p>99.6</p><p>97.4</p><p>MSMARCO</p><p>3.97</p><p>6.00</p><p>6.03</p><p>6.07</p><p>5.47</p><p>6.11</p><p>CQADupstack（平均）</p><p>5.47</p><p>6.32</p><p>6.87</p><p>5.89</p><p>6.22</p><p>6.16</p><p><strong>表 2</strong>：在检索/重新排序的前 10 个文档上计算的（数据集、重排序器）对的评判率</p><p>从 <strong>表 2</strong> 可以看出，除了 <code>TREC-COVID</code>（覆盖率&gt;90%）、<code>DBPedia</code>（~65%）、<code>Touche2020</code> 和 <code>nfcorpus</code>（~35%）之外，大多数数据集在检索或重新排序后的标注率介于 5% 到略高于 10% 之间。这并不意味着所有这些未标注文档都是相关的，但其中可能有一个子集——特别是那些排在靠前位置的——可能是正例。</p><p>随着通用指令调优语言模型的出现，我们拥有了一种新的强大工具，它有可能自动化判断相关性。这些方法的计算成本通常太高，不适合在线搜索，但我们这里关注的是离线评估。在下文中，我们将使用它们来探究一些 BEIR 数据集可能存在浅层标注问题的证据。</p><p>为了进一步验证这一假设，我们决定专注于 MSMARCO 数据集，选择 100 个查询及其前 5 个经重排序（使用 Cohere v2）且当前未被标记为相关的文档。我们遵循了两种不同的评估路径：首先，我们使用精心调优的提示（后续文章中将详述）引导最近发布的 <a href="https://huggingface.co/microsoft/Phi-3-mini-4k-instruct">Phi-3-mini-4k</a> 模型来预测文档与查询的相关性（或不相关性）。与此同时，这些案例也进行了人工标注，以评估 LLM 输出与人工判断之间的一致性率。总体而言，我们可以得出以下两个结论：</p><ul><li><p>LLM 响应与人工标注之间的一致性率接近 80%，作为该方向的起点，这似乎足够好。</p></li><li><p>在 57.6% 的情况下（基于人工判断），返回的文档被判定为实际上与查询相关。换一种说法：对于 100 个查询，我们有 107 个文档被判定为相关，但至少还有 0.576 × 5 × 100 = 288 个额外文档实际上是相关的！</p></li></ul><p>以下是一些从 <code>MSMARCO</code>/<code>dev</code> 数据集中提取的示例，其中包含查询、注释的正例文档（来自 <code>qrels</code>）一个由于标注不全导致的假负例文档：</p><p>示例 1：</p>{
  "query":
    {
        "_id": 155234,
        "text": "do bigger tires affect gas mileage"
    },
  "positive_doc":
    {
        "_id": 502713,
        "text": "Tire Width versus Gas Mileage. Tire width is one of the only tire size factors that can influence gas mileage in a positive way. For example, a narrow tire will have less wind resistance, rolling resistance, and weight; thus increasing gas mileage.",
    },
    "negative_doc":
    {
        "_id": 7073658,
        "text": "Tire Size and Width Influences Gas Mileage. There are two things to consider when thinking about tires and their effect on gas mileage; one is wind resistance, and the other is rolling resistance. When a car is driving at higher speeds, it experiences higher wind resistance; this means lower fuel economy."
    }
}
<p>示例 2：</p>{
  "query":
    {
        "_id": 300674,
        "text": "how many years did william bradford serve as governor of plymouth colony?"
    },
  "positive_doc":
    {
        "_id": 7067032,
        "text": "http://en.wikipedia.org/wiki/William_Bradford_(Plymouth_Colony_governor) William Bradford (c.1590 \u00e2\u0080\u0093 1657) was an English Separatist leader in Leiden, Holland and in Plymouth Colony was a signatory to the Mayflower Compact. He served as Plymouth Colony Governor five times covering about thirty years between 1621 and 1657."
    },
    "negative_doc":
    {
        "_id": 2495763,
        "text": "William Bradford was the governor of Plymouth Colony for 30 years. The colony was founded by people called Puritans. They were some of the first people from England to settle in what is now the United States. Bradford helped make Plymouth the first lasting colony in New England."
    }
}
<p>人工评估此类特定查询，是理解搜索质量的一种普遍有用的技术，它是对 nDCG@10 等定量指标的补充。如果您有一组代表性的查询集，在每次修改搜索时都运行它们，这将为您提供关于性能如何变化的重要定性信息，而这些信息在统计数据中是看不见的。例如，它为您提供了更多关于搜索返回的错误结果的见解：它可以帮助您发现检索结果中的明显错误，相关错误类别，如误解特定领域术语等等。</p><p>我们的结果与围绕 <code>MSMARCO</code> 评估的相关研究一致。例如，<a href="https://arxiv.org/pdf/2109.00062">Arabzadeh 等人</a> 遵循类似的流程，他们雇用众包工人进行偏好判断：除其他发现外，他们表明在许多情况下，重新排序模块返回的文档比 MSMARCO <code>qrels</code> 文件中的文档更受青睐。另一项证据来自 <a href="https://arxiv.org/pdf/2010.08191">RocketQA</a> 重新排序器的作者，他们报告称，经过人工检查，超过 70% 的重排序文档被判定为相关。</p><p> 更新 - 2023 年 9 月 9 日：在对数据集进行仔细重新评估后，我们识别出另外 15 个相关文档案例，使其总数从 273 个增加到 288 个。</p><h2>主要要点和后续步骤</h2><ul><li><p>对更高质量真实标注的追求永无止境，因为它对于基准测试和模型比较至关重要。如果谨慎使用并配以适当的指令调优，LLM 可以在某些评估领域提供协助</p></li><li><p>更普遍地说，鉴于基准测试永远不会完美，从单纯的分数比较转向捕捉统计显著性差异的更稳健技术可能更可取。<a href="https://arxiv.org/pdf/2109.00062">Arabzadeh 等人</a>等人的工作提供了一个很好的例子，他们基于研究结果构建了 95% 置信区间，以表明不同运行之间是否存在显著（或不显著）差异。在随附的<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">笔记本</a>中，我们提供了使用<a href="https://en.wikipedia.org/wiki/Bootstrapping_(statistics)">自助法</a>实现置信区间的方法。</p></li><li><p>从最终用户的角度来看，在阅读基准测试结果时，考虑任务对齐性是有益的。例如，对于构建 RAG 管道的 AI 工程师来说，如果知道最典型的用例涉及从不同来源汇集多条信息，那么在 HotpotQA 等多跳问答数据集上评估其检索模型的性能，会比在整个 BEIR 基准测试的全局平均分更有意义</p></li></ul><p>在<a href="https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-2">下一篇博客文章</a>中，我们将更深入地探讨如何使用 Phi-3 作为 LLM 评判工具，以及调优它以预测相关性的过程。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</guid>
    <category><![CDATA[ML 研究]]></category>
    <category><![CDATA[Python]]></category>
    <dc:creator><![CDATA[Thanos Papaoikonomou,Thomas Veasey]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9912c8d4187096/6a1704f5b0367d30e672bc17/54a6e5197f5721b36fc65f27387d29803ed35589-721x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>