<?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/kr/search-labs/author/thomas-veasey</link>
    </image>
    <link>https://www.elastic.co/kr/search-labs/author/thomas-veasey</link>
    <atom:link href="https://www.elastic.co/kr/search-labs/rss/author/thomas-veasey.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[kr]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 05:13:21 GMT</lastBuildDate>
  <item>
    <title><![CDATA[HNSW 그래프 병합 속도 향상]]></title>
    <description><![CDATA[여러 개의 HNSW 그래프를 작성하는 데 드는 오버헤드를 줄이기 위해, 특히 그래프 병합 비용을 줄이기 위해 저희가 해온 작업을 살펴보세요.]]></description>
    <content:encoded><![CDATA[<p>과거에는 여러 개의 <a href="https://www.elastic.co/kr/search-labs/blog/hnsw-graph">HNSW 그래프를</a> 검색해야 할 때 발생하는 몇 가지 문제와 이를 완화할 수 있는 방법에 대해 논의한<a href="https://www.elastic.co/kr/search-labs/blog/multi-graph-vector-search">적이 있습니다.</a> 당시 저희는 계획했던 몇 가지 추가 개선 사항을 암시했습니다. 이 게시물은 그 작업의 정점입니다.</p><p>왜 여러 개의 그래프를 사용해야 하나요? 이는 불변 세그먼트라는 루씬의 아키텍처 선택에 따른 부작용입니다. 대부분의 아키텍처 선택과 마찬가지로 장단점이 있습니다. 예를 들어, 저희는 최근에 서버리스 Elasticsearch를 정식 버전으로 출시했습니다. 이러한 맥락에서 우리는 효율적인 인덱스 복제, 인덱스와 쿼리 계산을 분리하고 독립적으로 자동 확장하는 기능 등 불변 세그먼트를 통해 매우 중요한 이점을 얻었습니다. 벡터 양자화의 경우 세그먼트 병합을 통해 데이터 특성에 맞게 파라미터를 업데이트할 수 있습니다. 이러한 맥락에서 데이터 특성을 측정하고 인덱싱 선택을 재검토할 수 있는 기회를 갖는다는 것은 다른 장점도 있다고 생각합니다.</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 )번 그래프에 삽입되며, 여기서  인덱스 벡터 수이고  예상되는 기본 세그먼트 벡터 수입니다. 대수적 증가로 인해 쓰기 증폭은 거대한 인덱스의 경우에도 한 자릿수입니다. 그러나 그래프를 병합하는 데 소요되는 총 시간은 쓰기 증폭에 선형적으로 비례합니다.</p><p>HNSW 그래프를 병합할 때 가장 큰 세그먼트의 그래프를 유지하고 다른 세그먼트의 벡터를 삽입하는 작은 최적화를 이미 수행했습니다. 이것이 위의 9/10 요소의 이유입니다. 아래에서는 병합하는 모든 그래프의 정보를 사용하여 훨씬 더 나은 결과를 얻을 수 있는 방법을 보여줍니다.</p><h3>HNSW 그래프 병합</h3><p>이전에는 가장 큰 그래프를 유지하고 벡터가 포함된 그래프를 무시하고 다른 그래프에서 벡터를 삽입했습니다. 아래에서 사용하는 핵심 인사이트는 우리가 폐기하는 각 HNSW 그래프에 포함된 벡터에 대한 중요한 근접성 정보가 포함되어 있다는 것입니다. 이 정보를 사용하여 적어도 일부 벡터의 삽입을 가속화하고자 합니다.</p><p>병합 정책을 구축하는 데 사용할 수 있는 원자 연산이므로 작은 그래프  )를 큰 그래프 )에 삽입하는 문제에 중점을 둡니다.</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>SEARCH-LAYER</code> 을 <code>INSERT</code> 방법(논문의 알고리즘 1)의 후보 집합을 찾는 것으로 대체하는 것이며, 그 외에는 변경 사항이 없습니다. 마지막으로 방금 삽입한 버텍스를  추가합니다(8행).</p><p>이 기능이 작동하려면  모든 버텍스에  이웃이 하나 이상 있어야 합니다. 실제로, 우리는  버텍스에 대해 최대 레이어 연결성인 일부   실제 HNSW 그래프에서는 정점 각도가 상당히 분산되어 있는 것을 관찰할 수 있습니다. 아래 그림은 Lucene HNSW 그래프의 최하위 레이어에 대한 일반적인 버텍스 도의 누적 밀도 함수를 보여줍니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc815e1a9c3bb0d06/6a17e178ec0f89308a5a6564/44f001b3a1bc6627e172fed5c52a02cfdcb4cd66-1324x898.png" alt="HNSW 그래프: 버텍스 차수 분포 예시" /><p> 고정값을 사용하는 방법과 버텍스 차수의 함수로 만드는 방법을 살펴봤습니다. 두 번째 선택은 그래프 품질에 미치는 영향을 최소화하면서 속도를 크게 향상시킬 수 있으므로 다음과 같이 선택했습니다.</p><p>정의상 |는 작은 그래프에서 정점  차수와 같다는 점에 유의하세요. 하한이 2라는 것은 차수가 2보다 작은 모든 정점을 삽입한다는 의미입니다.</p><p>간단한 계산 인수를 통해  신중하게 선택하면   직접 삽입하기만 하면 된다는 것을 알 수 있습니다. 구체적으로 그래프의 끝 꼭지점 중 하나를  정확히 삽입하면 그래프의 가장자리에 색을 입힙니다.   최소  이웃을 가지려면  에지를 채색해야 한다는 것을 알 수 있습니다. 또한 다음을 기대합니다.</p><p>여기서  _U\left [N_s(U)|\right] 는 작은 그래프에서 평균 버텍스 차수입니다.  각 정점 u에 대해 최대  의 가장자리를 색칠합니다. 따라서 채색할 에지의 총 개수는 최대 _U\left [|N_s(U)|\right]입니다.  신중하게 선택하면 이 수의 가장자리에 가깝게 색을 칠할 수 있으므로 모든 정점을 포함하려면  다음을 만족해야 합니다.</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>여기서 는  벡터  개수를 나타내고  은 표시 함수입니다. 이득에는  추가한 버텍스 수의 변화, 즉 이 포함되는데, 이는 덜 커버되는 버텍스를 추가함으로써 목표에 더 가까워지기 때문입니다. 이득 계산은 아래 그림에서 중앙 주황색 버텍스에 대해 설명합니다.</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}적어도 하나의 버텍스는 0이 아닌 이득을 가지므로 항상 진전이 있습니다.</p><h3>결과</h3><p>지원되는 세 가지 거리 메트릭(유클리드, 코사인, 내적 곱)을 모두 포함하는 네 가지 데이터 세트에 대해 실험을 진행했습니다:</p><ol><li><p>쿼라-E5-small: 522931개 문서, 384개 차원, 코사인 유사도를 사용합니다,</p></li><li><p>코히어-위키백과-v2: 1백만 개의 문서, 768개의 차원, 코사인 유사도를 사용합니다,</p></li><li><p>요점 1백만 문서, 960개 차원, 유클리드 거리 사용, 그리고</p></li><li><p>코히어-위키백과-v3: 1M 문서, 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>쿼라-E5-small</p><p>112.41s</p><p>81.55s</p><p>113.81s</p><p>70.87s</p><p>위키-코히어-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>위키-코히어-v3</p><p>211.86s</p><p>168.22s</p><p>654.97s</p><p>414.12s</p><p>아래에는 여러 세그먼트가 있는 인덱스(모든 벡터를 인덱싱한 후 기본 병합 전략의 최종 결과)와 단일 세그먼트로 강제 병합한 후의 두 가지 검색 깊이인 recall@10과 recall@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: BBQ 정량화</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>쿼라-E5-small</p><p>70.71s</p><p>58.25s</p><p>59.38s</p><p>40.15s</p><p>위키-코히어-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>위키-코히어-v3</p><p>313.43s</p><p>190.63s</p><p>165.98s</p><p>159.95s</p><p>여러 세그먼트 인덱스의 경우, 기준선이 약간 더 나은 코히어 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[검색 정확도 평가 1부 - 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>오픈 도메인 QA(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>정확도 판단 값은 0점 이상의 점수로 제공됩니다. 점수가 0이 아니라면 문서가 쿼리와 어느 정도 관련이 있음을 나타냅니다.</p><p>데이터 세트</p><p>코퍼스 크기</p><p>테스트 세트의 쿼리 수</p><p>#qrels에 긍정적으로 레이블이 지정됨</p><p>정확도 판단 값이 0인 항목 수</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(합계)</p><p>457,199</p><p>13,145</p><p>23,703</p><p>0</p><p>0</p><p><strong>표 1</strong>: 데이터 세트 통계 수치는 각 데이터 세트의 구간을 기준으로 산출되었습니다(<code>dev</code> 대상: <code>MSMARCO</code>).</p><p><strong>표 1</strong>은 코퍼스의 문서 수, 테스트 데이터 세트의 쿼리 수, <code>qrels</code> 파일의 긍정/부정(쿼리, 문서) 쌍의 수와 같은, <code>BEIR</code> 벤치마크를 구성하는 데이터 세트에 대한 몇 가지 통계를 제시합니다. 데이터를 간단히 살펴보면 다음과 같은 사실을 즉시 추론할 수 있습니다.</p><ul><li><p>대부분의 데이터 세트는 <code>qrels</code> 파일에 부정 관계가 포함되어 있지 않습니다. 즉, 주어진 쿼리와 무관함을 명시적으로 나타내는 0점 항목이 없다는 의미입니다.</p></li><li><p>쿼리당 문서 관계의 평균 수(<code>#qrels</code> / <code>#queries</code>)는 <code>ArguAna</code>의 경우 1.0에서 <code>TREC-COVID</code>의 경우 493.5까지 다양하며, 대부분의 경우 <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>검색된 문서들은 최신 성능의 다양한 순위 재지정 모델을 사용해 다시 정렬합니다.</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 (avg.)</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>(90% 이상 커버리지), <code>DBPedia</code>(~65%), <code>Touche2020</code>, <code>nfcorpus</code>(~35%)를 제외한 대부분의 데이터 세트는 검색 또는 재순위화 이후의 라벨링 비율이 5%에서 10%를 조금 넘는 수준에 불과함을 알 수 있습니다. 이는 표시되지 않은 문서들이 모두 관련 문서라는 뜻은 아니지만, 그중 일부는 특히 상위 순위에 위치한 경우 긍정적인, 즉 관련성 있는 문서일 가능성이 있다는 점을 시사합니다.</p><p>범용 목적의 지시 튜닝 언어 모델의 등장으로, 관련성 판단을 자동화할 잠재력을 지닌 새롭고 강력한 도구를 갖게 되었습니다. 이러한 방법들은 일반적으로 계산 비용이 너무 커서 실제 온라인 검색에 사용하기는 어렵지만, 여기서는 오프라인 평가에 초점을 맞추고 있습니다. 다음에서는 이를 활용해 일부 BEIR 데이터 세트가 얕은 마크업 문제를 겪고 있다는 증거를 살펴봅니다.</p><p>이 가설을 더 자세히 검증하기 위해 MSMARCO에 초점을 맞추고, 현재 관련 문서로 표시되지 문서 중 Cohere v2로 재순위화된 상위 5개 문서를 포함해 100개의 쿼리 하위 집합을 선택했습니다. 평가는 두 가지 서로 다른 경로로 진행했습니다. 첫째, 신중하게 조정된 프롬프트(자세한 내용은 나중에 다룰 예정)를 사용해 최근 공개된 <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> 업데이트 - 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 엔지니어라면 일반적인 사용 사례가 서로 다른 출처의 여러 정보를 조합하는 것임을 알고 있을 것입니다. 이런 경우에는 BEIR 전체 벤치마크의 전역 평균 성능을 보는 것보다, HotpotQA와 같은 멀티홉 QA 데이터 세트에서 검색 모델의 성능을 평가하는 편이 훨씬 더 의미가 있습니다.</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>