miniCOIL: 실용적인 희소 신경 검색으로 가는 길

miniCOIL: 실용적인 희소 신경 검색으로 가는 길 (miniCOIL: on the Road to Usable Sparse Neural Retrieval)

희소 신경 검색(sparse neural retrieval)에 대해 들어 본 적 있나요? 그렇다면, 프로덕션에서 실제로 써 본 적도 있나요?

엄청난 잠재력을 가진 분야예요. 밀집 검색과 용어 기반 텍스트 검색의 강점을 결합한 접근을 쓰고 싶지 않은 사람이 어디 있겠어요? 그런데도 별로 인기가 없어요. 혹시 "종이 위에서는 좋아 보여도 실제로는 안 통한다"는 흔한 저주 때문일까요?

이 글은 우리가 희소 신경 검색을 그래야 하는 모습 그대로 — 단어 의미를 구분할 수 있는 가벼운 용어 기반 리트리버로 — 만들기까지의 여정을 담아요.

이전 시도들의 실수를 배워서, 하이브리드 검색에서 BM25의 자리를 대체할 새로운 희소 신경 후보 miniCOIL을 만들었어요. 여러분께 공유하게 되어 기쁘고, 피드백을 기다리고 있어요.

출처: 공식문서

좋은 것, 나쁜 것, 추한 것

희소 신경 검색은 그 기반이 되는 방법들 — 용어 기반 검색과 밀집 검색 — 에 비해 잘 알려져 있지 않아요. 이 두 방법의 약점이 이 분야의 발전을 이끌었죠. 그 여정을 따라가 볼게요.

Retrievers evolution

용어 기반 검색 (Term-based Retrieval)

용어 기반 검색은 보통 텍스트를 단어 가방(bag of words)으로 취급해요. 이 단어들은 저마다 다른 중요도를 가지며, 문서와 쿼리 사이의 전반적인 관련성 점수에 기여하죠.

유명한 BM25는 단어의 기여도를 다음에 기반해 추정해요.

  1. 특정 텍스트에서의 중요성 — Term Frequency(TF) 기반.
  2. 전체 코퍼스 내에서의 중요성 — Inverse Document Frequency(IDF) 기반.

또한 코퍼스의 일반적인 텍스트 길이를 반영하는 몇 가지 파라미터가 있는데, 정확한 의미는 BM25 공식에 대한 자세한 분석에서 확인할 수 있어요.

텍스트 안에서 단어의 중요성을 정확히 정의하는 것은 쉽지 않아요.

BM25는 용어의 중요도가 통계적으로 정의될 수 있다는 생각에 기반해요. 긴 텍스트에서는 특정 단어의 빈번한 반복이 텍스트가 그 개념과 관련 있다는 신호이므로, 이는 진실에서 멀지 않아요. 하지만 Retrieval Augmented Generation(RAG)을 위한 청크 같은 아주 짧은 텍스트에서는 덜 적용 가능해요. TF가 0이나 1이기 때문이죠. 우리는 BM25 알고리즘을 개량한 BM42에서 이 문제를 해결하는 데 접근했어요.

그런데 검색에 있어 단어 중요도의 한 구성 요소가 BM25에서 전혀 고려되지 않아요 — 바로 단어 의미(word meaning)죠. 같은 단어라도 맥락에 따라 다른 의미를 갖고, 그것이 텍스트의 관련성에 영향을 줘요. *"fruit bat"*과 *"baseball bat"*을 생각해 보세요. 텍스트에서의 중요도는 같지만 의미는 달라요.

밀집 검색 (Dense Retrieval)

의미를 어떻게 포착할까요? BM25 같은 bag-of-words 모델은 단어가 텍스트에 독립적으로 놓인다고 가정하지만, 언어학자들은 이렇게 말해요.

"단어는 그 주변에 함께 있는 것들로 알 수 있다" — John Rupert Firth

이 아이디어는 단어 관계를 수치로 표현하려는 동기와 함께, 밀집 벡터라는 검색의 두 번째 분기의 발전을 이끌었어요. attention 메커니즘을 가진 트랜스포머 모델이 텍스트 맥락에서 단어 의미를 구분하는 과제를 풀어내면서, 그것을 검색의 관련성 매칭의 일부로 만들었죠.

그런데 밀집 검색은 용어 기반 검색의 완전한 대체재가 되지 못했어요(그리고 될 수도 없어요). 밀집 리트리버는 넓은 의미론적 유사도 검색에는 뛰어나지만, 특정 키워드를 포함한 결과가 필요할 때는 정밀도가 부족해요.

밀집 리트리버로 정확 매칭을 시키는 건 소용없는 짓이에요. 그들은 모든 단어가 어떤 의미로든 모든 단어와 의미론적으로 매칭된다는 패러다임 위에 만들어졌고, 그 의미론적 유사도가 특정 모델의 훈련 데이터에 달려 있거든요.

희소 신경 검색 (Sparse Neural Retrieval)

그래서 한쪽에는 매칭에 대한 제어가 약해 검색 결과가 너무 넓어지곤 하는 것이 있고, 다른 쪽에는 의미론을 포착하지 못하는 가볍고 설명 가능하며 빠른 BM25 같은 용어 기반 리트리버가 있어요.

물론 우리는 두 세계의 최고만을, 어떤 단점도 없이 하나의 모델에 녹여 넣고 싶어요. 희소 신경 검색의 진화는 바로 이 욕망에 의해 추진됐어요.

  • 왜 **희소(sparse)**일까? 용어 기반 검색은 희소 벡터 위에서 동작할 수 있어요. 텍스트의 각 단어에 0이 아닌 값(이 텍스트에서의 중요도)이 할당되죠.
  • 왜 **신경(neural)**일까? 단어의 통계로 중요도 점수를 유도하는 대신, 단어의 의미를 인코딩할 수 있는 머신러닝 모델을 쓰자고요.

그래서 왜 널리 쓰이지 않을까?

Problems of modern sparse neural retrievers

희소 신경 검색의 자세한 역사는 별도의 아티클 하나가 될 만해요. 요약하자면, 밀집 인코더가 만든 단어 표현을 단일 값 중요도 점수로 매핑하려는 시도가 많았고, 그 대부분은 연구 논문 밖의 현실 세계를 본 적이 없어요(DeepImpact, TILDEv2, uniCOIL).

관련성 목적 함수로 end-to-end 훈련된 대부분의 희소 인코더는 단어 중요도를 특정 도메인에서만 잘 추정했어요. 훈련 중에 "보지 못한" 데이터셋에서의 도메인 밖 정확도는 BM25보다 나빴어요.

희소 신경 검색의 SOTA는 SPLADE(Sparse Lexical and Expansion Model)예요. 이 모델은 검색 시스템에 들어왔죠 — FastEmbed로 Qdrant에서 SPLADE++를 사용할 수 있어요.

하지만 함정이 있어요. SPLADE 이름의 "expansion(확장)" 부분은 용어 기반 검색의 또 다른 약점 — 어휘 불일치(vocabulary mismatch) — 에 대항하는 기법을 가리켜요. 밀집 인코더가 "fruit bat"과 "flying fox" 같은 관련 용어를 성공적으로 연결할 수 있는 반면, 용어 기반 검색은 이 작업에서 실패해요.

SPLADE는 문서와 쿼리를 추가적인 적합 용어로 확장해 이 문제를 해결해요. 하지만 이로 인해 SPLADE 추론이 무거워지고, 생성된 표현이 그렇게 희소하지 않게 되며(결과적으로 가볍지 않게 되고), 확장 선택을 ML 모델이 하므로 설명 가능성이 훨씬 떨어져요.

"갑옷 입은 큰 남자. 그걸 벗으면, 넌 뭐야?"

실험은 확장이 없는 SPLADE가 희소 인코더의 옛날 이야기를 그대로 반복한다는 걸 보여 줬어요 — BM25보다 나쁘게 동작하죠.

눈은 상에: 실용적인 희소 신경 검색

특정 벤치마크에서 완벽을 추구하다 보니, 희소 신경 검색 분야는 도메인 밖에서 BM25보다 나쁘게 동작하는 모델(아이러니하게도 BM25 기반 하드 네거티브로 훈련된)이나, 희소성을 낮추는 무거운 문서 확장에 기반한 모델을 만들어 냈어요.

프로덕션에서 쓰이려면 희소 신경 리트리버가 충족해야 할 최소 기준은 다음과 같아요.

  • 가벼운 희소 표현을 만들어야 한다(이름 자체에 그게 들어 있죠!). 용어 기반 검색의 장점을 물려받아 가볍고 단순해야 해요. 더 넓은 의미론적 검색은 밀집 리트리버가 담당하니까요.
  • 여러 도메인에서 랭킹이 BM25보다 나아야 한다. 목표는 BM25가 못 하는 것 — 단어 의미를 구분하는 것 — 을 할 수 있으면서 BM25의 도메인 밖 성능과 시간으로 검증된 성능을 보존하는 용어 기반 리트리버예요.

The idea behind miniCOIL

COIL에서 영감을 얻다

희소 신경 검색 분야의 시도 중 하나인 Contextualized Inverted Lists (COIL)는 용어 가중치 인코딩 방식이 두드러져요.

고차원 토큰 표현(보통 768차원 BERT 임베딩)을 단일 숫자로 찌부러뜨리는 대신, COIL 저자들은 그것들을 32차원의 더 작은 벡터로 투영해요. 그리고 이 벡터들을 (용어 기반 검색에서 쓰는) 역색인(inverted index)역목록(inverted lists) 에 그대로 저장하고, 벡터 표현을 dot product로 비교할 것을 제안해요.

이 접근은 더 깊은 의미론을 포착해요. 단일 숫자로는 단어가 가질 수 있는 모든 미묘한 의미를 전달할 수 없으니까요.

이런 장점에도 불구하고 COIL은 몇 가지 핵심 이유로 널리 채택되지 못했어요.

  • 역색인은 보통 벡터를 저장하고 벡터 연산을 수행하도록 설계되지 않았어요.
  • MS MARCO 데이터셋에서 관련성 목적 함수로 end-to-end 훈련되어, COIL의 성능은 도메인에 크게 묶여 있어요.
  • 또한 COIL은 BERT의 토크나이저를 재사용해 토큰 단위로 동작해요. 하지만 용어 기반 검색에는 단어 수준에서 동작하는 게 훨씬 나아요. 우리 문서에서 *"retriever"*를 검색하고 싶다고 상상해 보세요. COIL은 그것을 re, #trie, #ver 32차원 벡터로 쪼개고 세 부분을 각각 별도로 매칭할 거예요 — 그리 편리하지 않죠.

그래도 COIL 표현은 동형이의어(homograph) 구분을 가능하게 하는데, BM25가 부족한 능력이에요. 최고의 아이디어는 제로에서 시작하지 않아요. 우리는 COIL 위에 구축하되, 무엇을 고쳐야 하는지 염두에 둔 접근을 제안해요.

  1. 관련성 목적 함수로 end-to-end 훈련을 포기해야 해요. 그러면 도메인 밖 데이터에서 성능이 좋은 모델을 얻을 수 있어요. 일반화할 수 있는 모델을 훈련할 데이터가 충분하지 않으니까요.
  2. 표현을 희소하게 유지하고 고전적 역색인에서 재사용할 수 있게 해야 해요.
  3. 토크나이제이션을 고쳐야 해요. 이 문제는 이미 여러 희소 신경 리트리버에서 해결됐고, 우리도 BM42에서 배워 해결했기 때문에 가장 쉽게 풀 수 있어요.

BM25의 어깨 위에 서다

BM25는 여러 해 동안 다양한 도메인에서 괜찮은 베이스라인이었어요 — 이유가 있죠. 그럼 시간으로 검증된 공식을 왜 버릴까요?

희소 신경 리트리버에게 단어 중요도 점수를 부여하도록 훈련하는 대신, COIL에서 영감을 얻은 의미론적 컴포넌트를 BM25 공식에 더해 봅시다.

$$ \text{score}(D,Q) = \sum_{i=1}^{N} \text{IDF}(q_i) \cdot \text{Importance}^{q_i}_{D} \cdot {\color{YellowGreen}\text{Meaning}^{q_i \times d_j}} \text{, where term } d_j \in D \text{ equals } q_i $$

그러면 단어의 의미를 포착할 수 있다면, 우리 솔루션 하나만으로 의미론적으로 인지하는 리랭커와 결합한 BM25처럼 동작할 수 있어요. 달리 말하면:

  • 동형이의어의 차이를 볼 수 있어요;
  • 단어 어간(stem)과 함께 쓰면 품사를 구분할 수 있어요.

Meaning component

그리고 우리 모델이 훈련 중에 "보지 못한" 단어를 만나면, 원래 BM25 공식으로 폴백하면 돼요!

4차원의 단어 가방

COIL은 하나의 용어를 설명하는 데 32개의 값을 써요. 이렇게 많이 필요할까요? 추가 조사 없이 32개의 서로 다른 의미를 가진 단어를 몇 개나 이름 붙일 수 있을까요?

그런데 COIL 표현에서 더 적은 값을 쓴다고 해도, 밀집 벡터가 고전적 역색인에 맞지 않는다는 초기 문제는 여전해요. ...아주 간단한 트릭을 하지 않는 한요!

miniCOIL vectors to sparse representation

단어 가방 희소 벡터를 상상해 보세요. 어휘의 모든 단어가 한 칸을 차지해요. 단어가 인코딩된 텍스트에 있으면 어떤 가중치를 할당하고, 없으면 0이 돼요.

단어의 의미를 예를 들어 4차원 의미 공간으로 설명하는 미니 COIL 벡터가 있다면, 희소 벡터에서 단어에 4개의 연속된 칸을 할당하면 돼요. "의미" 차원당 한 칸이죠. 그렇지 않으면 순수 BM25 점수가 있는 고전적 한 칸 설명으로 폴백할 수 있어요.

이런 표현들은 어떤 표준 역색인에서도 사용할 수 있어요.

miniCOIL 훈련하기

이제 단어 의미의 저차원 캡슐화 — miniCOIL 벡터 — 를 어떻게 얻을지가 관건이에요.

더 똑똑하게, 덜 열심히 일하고 싶을 때는 시간으로 검증된 솔루션에 최대한 의존해요. 밀집 인코더는 맥락에서 단어의 의미를 인코딩하는 데 뛰어나므로, 그 출력을 재사용하면 편리해요. 게다가 하이브리드 검색에 miniCOIL을 추가하려면 — 밀집 인코더 추론을 어차피 하는 곳이니까 — 한 번에 두 마리 토끼를 잡을 수도 있어요.

차원 축소

밀집 인코더 출력은 고차원이므로, 맥락에서 단어의 의미를 보존하는 차원 축소가 필요해요. 목표는:

  • 관련성 목적 함수와 라벨링된 데이터셋에 대한 의존을 피한다;
  • 단어 의미 사이의 공간적 관계를 포착하는 타깃을 찾는다;
  • 가능한 가장 단순한 아키텍처를 쓴다.

훈련 데이터

miniCOIL 벡터가 단어의 의미에 따라 비교 가능하기를 원해요 — fruit batvampire bat은 저차원 벡터 공간에서 baseball bat보다 서로 더 가까워야 하죠. 그래서 단어의 맥락화된 표현의 차원을 줄일 때 보정할 무언가가 필요해요.

단어의 의미는 주변 맥락, 간단히 말해 그 단어를 포함한 어떤 텍스트에든 숨겨져 있다고 해요. 큰 텍스트에서는 단어의 의미가 흐릿해질 위험이 있어요. 그래서 문장 수준에서 작업하고, 한 단어를 공유하는 문장들이 클러스터를 이루어 각 클러스터가 그 단어가 한 특정 의미로 쓰인 문장들을 담게 하자고요.

그것이 사실이라면, 정교한 밀집 인코더로 다양한 문장을 인코딩해 입력 밀집 인코더의 재사용 가능한 공간 관계 타깃을 형성할 수 있어요. OpenWebText 데이터셋처럼 웹 전체를 아우르는 데이터셋이 있을 때, 자주 쓰이는 단어를 포함한 수많은 텍스트 데이터를 찾는 건 큰 문제가 아니에요. 이 정도의 데이터가 있으면, 관련성 목적 함수로는 달성하기 어려운 일반화와 도메인 독립성을 누릴 수 있어요.

될 거야, bat은

우리 가정을 테스트하고 *"bat"*이라는 단어를 살펴볼게요.

OpenWebText 데이터셋에서 샘플링한 이 단어가 있는 수천 개의 문장을 가져와 mxbai-embed-large-v1 인코더로 벡터화했어요. 목표는 *"bat"*이 같은 의미를 공유하는 문장들이 담긴 어떤 클러스터를 구분할 수 있는지 확인하는 거였어요.

Sentences with "bat" in 2D

결과는 *"bat"*이 동물인 경우와 스포츠 장비인 경우에 대한 두 개의 큰 클러스터와, 퍼덕이는 움직임과 스포츠에서 동사로 쓰인 경우에 대한 두 개의 작은 클러스터로 나왔어요. 될 수 있을 것 같아 보이죠!

아키텍처와 훈련 목적 함수

계속 *"bats"*를 다뤄 볼게요.

다른 의미로 *"bat"*이 포함된 문장들의 훈련 풀이 있어요. 선택한 밀집 인코더로 각 문장에서 맥락화된 "bat" 임베딩을 얻고, mxbai-embed-large-v1 문장 임베딩에 안내되어 그것을 저차원 miniCOIL "bat" 공간으로 압축하는 법을 배워요.

단어가 하나뿐이므로 차원 축소에 선형 레이어 하나면 충분할 거예요. 위에 Tanh 활성화를 붙여 압축 벡터의 값을 (-1, 1) 범위로 매핑해요. 활성화 함수 선택은 miniCOIL 표현을 주로 cosine similarity로 비교되는 밀집 인코더 표현과 정렬하기 위한 거예요.

miniCOIL architecture on a word level

훈련 목적 함수로는 triplet loss의 최소화를 고를 수 있어요. 트리플릿은 mxbai-embed-large-v1 문장 임베딩 사이의 거리에 기반해 고르고 정렬돼요. 우리는 "bat" miniCOIL 압축을 안내하는 데 mxbai-embed-large-v1의 신뢰도(margin 크기)에 의존해요.

miniCOIL training

miniCOIL 벡터는 cosine similarity 기반의 공간 관계를 반영하도록 훈련되므로, 단어 가방 희소 벡터에 넣기 전에(dot product로 비교되니까) 정규화해야 합니다.

코끼리를 한 입씩 먹기

이제 한 단어에 대한 miniCOIL 훈련 방법의 전체 아이디어가 생겼어요. 전체 어휘로 어떻게 확장할까요?

단순하게 유지하면서 단어별 모델을 계속 훈련하면 어떨까요? 몇 가지 이점이 있어요.

  1. 극도로 단순한 아키텍처: 단어당 레이어 하나로도 충분할 수 있어요.
  2. 매우 빠르고 쉬운 훈련 과정.
  3. 단순한 아키텍처 덕분에 싸고 빠른 추론.
  4. 성능이 낮은 단어를 발견하고 튜닝할 수 있는 유연성.
  5. 도메인과 사용 사례에 따라 어휘를 확장하거나 축소할 수 있는 유연성.

그다음 관심 있는 모든 단어를 훈련하고 모든 모델을 단순히 결합(스택)해 하나의 큰 miniCOIL로 만들면 돼요.

miniCOIL model

구현 세부사항

위에서 개략적으로 그린 훈련 접근의 코드는 이 저장소에 오픈소스로 공개되어 있어요.

이 접근에 기반해 우리가 훈련한 miniCOIL 모델의 구체적인 특성은 다음과 같아요.

Component Description
Input Dense Encoder jina-embeddings-v2-small-en (512 dimensions)
miniCOIL Vectors Size 4 dimensions
miniCOIL Vocabulary List of 30,000 of the most common English words, cleaned of stop words and words shorter than 3 letters, taken from here. Words are stemmed to align miniCOIL with our BM25 implementation.
Training Data 40 million sentences — a random subset of the OpenWebText dataset. To make triplet sampling convenient, we uploaded sentences and their mxbai-embed-large-v1 embeddings to Qdrant and built a full-text payload index on sentences with a tokenizer of type word.
Training Data per Word We sample 8000 sentences per word and form triplets with a margin of at least 0.1.
Additionally, we apply augmentation — take a sentence and cut out the target word plus its 1–3 neighbours. We reuse the same similarity score between original and augmented sentences for simplicity.
Training Parameters Epochs: 60
Optimizer: Adam with a learning rate of 1e-4
Validation set: 20%

각 단어는 CPU 하나에서만 훈련되었고, 훈련에 단어당 약 50초가 걸렸어요. 이 minicoil-v1 버전을 FastEmbed 라이브러리의 v0.7.0 릴리스에 포함했어요.

FastEmbed에서 minicoil-v1의 사용 예제는 HuggingFace 카드에서 확인할 수 있어요.

minicoil-v1을 올바르게 사용하려면 희소 벡터를 Modifier.IDF로 구성해야 합니다.

결과

검증 손실 (Validation Loss)

입력 트랜스포머 jina-embeddings-v2-small-en은 "롤모델" 트랜스포머 mxbai-embed-large-v1의 맥락 관계를 (트리플릿으로 측정해) 83%의 품질로 근사해요. 즉 17%의 경우에서 jina-embeddings-v2-small-enmxbai-embed-large-v1에서 문장 트리플릿을 가져와, mxbai 관점에서 네거티브 예제가 앵커보다 포지티브에 더 가깝게 바뀌는 방식으로 임베딩한다는 뜻이에요.

우리가 얻은 검증 손실은 miniCOIL 벡터 크기(4, 8, 16)에 따라, miniCOIL이 각각 76%(크기 256 배치당 평균 실패 트리플릿 60개)에서 85%(배치당 평균 38개)까지 트리플릿을 올바르게 구분함을 보여 줘요.

Validation loss

벤치마킹

벤치마킹 코드는 이 저장소에 오픈소스로 공개되어 있어요.

4D miniCOIL 버전이 다른 도메인에서 얼마나 잘 동작하는지 확인하려고, 아이러니하게도 많은 희소 신경 리트리버에게 높은 벤치마크 값이 그 자체로 목적이 되어버린 바로 그 BEIR 데이터셋의 부분집합을 골랐어요. 하지만 차이점은 miniCOIL은 BEIR 데이터셋으로 훈련되지 않았고, 그쪽으로 편향되지 않아야 한다는 거예요.

4D miniCOIL 모델을 우리의 BM25 구현과 대조해 테스트하고 있어요. 두 방법 모두에 대해 BEIR 데이터셋을 다음 파라미터로 Qdrant에 인덱스했어요.

  • k = 1.2, b = 0.75 — BM25 스코어링에 권장되는 기본값;
  • avg_len — 각 데이터셋의 50,000개 문서로 추정.

BM25 결과는 스테머, 토크나이저, 불용어 목록 선택 등 구현 세부사항에 따라 달라져요. miniCOIL을 BM25와 비교 가능하게 만들기 위해 우리는 자체 BM25 구현을 사용하고 그 구현 선택을 모두 miniCOIL에 재사용해요.

모델을 NDCG@10 메트릭으로 비교하는데, BM25 대비 miniCOIL의 랭킹 성능이 궁금하기 때문이에요. 둘 다 정확 매칭 기반으로 같은 인덱스 문서 부분집합을 검색하지만, miniCOIL은 그 부분집합을 의미론 이해에 기반해 더 잘 랭크할 수 있어야 해요.

우리가 테스트한 여러 도메인에서의 결과는 다음과 같아요.

Dataset BM25 (NDCG@10) MiniCOIL (NDCG@10)
MS MARCO 0.237 0.244
NQ 0.304 0.319
Quora 0.784 0.802
FiQA-2018 0.252 0.257
HotpotQA 0.634 0.633

miniCOIL이 테스트한 다섯 도메인 중 네 곳에서 BM25보다 약간 더 잘 동작하는 걸 볼 수 있어요. 우리가 올바른 방향으로 가고 있다는 증거예요.

특정 사용 사례에 어떤 모델을 쓰든 항상 직접 벤치마킹하세요!
공개 벤치마크의 성능이 특정 데이터에서의 높은 성능을 보장하지는 않아요.

핵심 요점

이 글은 도메인 밖 데이터로 일반화할 수 있는 가벼운 희소 신경 리트리버를 만들려는 우리의 시도를 설명해요. 희소 신경 검색은 잠재력이 크고, 더 많은 활용이 이뤄지길 바라요.

이 접근이 왜 유용할까?

이런 희소 신경 리트리버 훈련 방식은:

  1. 자기 지도 방식으로 훈련되어 관련성 목적 함수에 의존하지 않으므로, 확장에 라벨링된 데이터셋이 필요 없어요.
  2. 검증된 BM25 공식 위에 구축하며, 거기에 단순히 의미론적 컴포넌트를 더해요.
  3. 표준 역색인에 맞는 가벼운 희소 표현을 만들어요.
  4. 밀집 인코더의 출력을 완전히 재사용해, 다양한 모델에 적응 가능해요. 이는 또한 miniCOIL을 하이브리드 검색 솔루션의 저렴한 업그레이드로 만들어 줘요.
  5. miniCOIL 어휘의 단어마다 훈련 가능한 레이어 하나를 가진 극도로 단순한 모델 아키텍처를 사용해요. 이는 매우 빠른 훈련과 추론으로 이어져요. 또한 이 단어 수준 훈련 덕분에 특정 사용 사례에 맞춰 miniCOIL의 어휘를 쉽게 확장할 수 있어요.

올바른 도구는 올바른 작업에

miniCOIL 리트리버는 언제 적용 가능할까요?

정확한 용어 매칭이 필요하지만 BM25 기반 검색이 요구를 충족하지 못할 때, 즉 형태는 맞지만 의미론적 의미가 틀린 단어를 가진 문서를 더 높게 랭크할 때요.

문서에서 검색을 구현한다고 해 보세요. 이 사용 사례에서는 키워드 기반 검색이 우세하지만, BM25는 이 키워드들의 맥락별 의미를 고려하지 않아요. 예를 들어 우리 문서에서 *"data point"*을 검색한다면, 부동소수점(point) 정밀도보다 *"point는 Qdrant에서 하나의 레코드"*가 더 높게 랭크되길 원할 거예요. 여기서 miniCOIL 기반 검색이 고려할 만한 대안이에요.

또한 miniCOIL은 하이브리드 검색의 일부로 잘 어울려요. 밀집 인코더가 만든 맥락적 단어 표현을 직접 재사용해서, 눈에 띄는 리소스 소비 증가 없이 희소 검색을 향상시키기 때문이에요.

요약하면, miniCOIL은 BM25가 단어의 의미를 이해하고 그 의미론적 지식에 기반해 문서를 랭크하는 것처럼 동작해야 해요. 정확 매칭에서만 동작하므로, 쿼리와 의미론적으로 유사하지만 다른 단어로 표현된 문서를 노린다면 밀집 인코더가 가는 길이에요.

다음은 무엇?

우리는 접근을 계속 개선할 거예요 — 깊이 있게는 모델 품질을 높일 방법을, 넓게는 영어 너머의 다양한 밀집 인코더와 언어로 확장하는 쪽으로요.

그리고 이 실용적인 희소 신경 검색으로 가는 길을 여러분과 공유하게 되어 정말 기뻐요!

더 알아보기 (Learn more)