Foundation Model Engineering

14.1 어휘 검색에서 시맨틱 검색으로

13장에서는 양자화와 압축을 통해 대규모 언어 모델을 더 작고 빠르게 만드는 방법을 탐구했습니다. 이러한 기술을 통해 제한된 하드웨어에서 강력한 모델을 실행할 수 있지만, 모든 파운데이션 모델의 근본적인 한계인 정적 파라미터 지식 (static parametric knowledge) 은 해결하지 못합니다.

모델의 지식은 훈련이 끝나는 시점에 고정됩니다. 그 날짜 이후의 이벤트에 대한 질문에 답할 수 없으며, 사용자의 개인 데이터나 비공개 문서에도 접근할 수 없습니다.

이 격차를 메우기 위해 우리는 검색 증강 생성 (Retrieval-Augmented Generation, RAG) 이 필요합니다. 세상의 모든 지식을 모델의 파라미터에 밀어 넣으려는 대신(이는 비용이 많이 들고 환각 현상을 유발합니다), RAG는 모델이 질의 시점에 외부 데이터베이스에서 관련 정보를 동적으로 검색할 수 있도록 합니다.

이 장은 모델 자체를 최적화하는 것에서 그 주변에 검색 인프라 를 구축하는 것으로의 전환을 의미합니다. 우리는 키워드 매칭에서 의미 매칭으로의 근본적인 전환을 이해하는 것부터 시작합니다.

정보 검색의 초기 시절에는 관련 문서를 찾는 것이 거의 전적으로 Lexical Search (키워드 검색) 에 의존했습니다. 이 접근 방식은 1세대 검색 엔진과 데이터베이스 쿼리의 기반이 되었지만, 현대의 RAG 시스템에 적용할 때는 근본적인 한계가 있습니다. 사용자의 의도를 진정으로 이해하는 시스템을 구축하기 위해서는 단어 를 검색하는 것에서 의미 를 검색하는 것으로 전환해야 합니다.

이 서브 챕터에서는 왜 벡터 임베딩이 필요한지 설명하고, 키워드 검색과 시맨틱 검색을 인터랙티브 데모와 함께 비교하며, 검색을 위해 데이터를 준비하는 고급 청킹(Chunking) 전략을 탐구합니다.


1. 키워드 검색의 한계

Lexical search 는 정확한 문자열 매칭 또는 퍼지(fuzzy) 문자열 매칭의 원칙에 따라 작동합니다. TF-IDF 나 BM25 와 같은 알고리즘은 용어 빈도(term frequency)와 역문서 빈도(inverse document frequency)를 계산하여 문서의 순위를 매깁니다. 이러한 방식은 매우 최적화되어 있고 빠르지만, 다음과 같은 몇 가지 중요한 시나리오에서는 실패합니다.

A. 동의어 문제 (Vocabulary Mismatch)

사용자가 “automobile”을 검색했지만 소스 문서에는 “car”라는 단어가 사용된 경우, 엄격한 lexical search 는 두 단어의 의미가 동일함에도 불구하고 이들을 연결하지 못합니다. 이를 어휘 불일치(vocabulary mismatch)라고 합니다.

B. 다의어 (Context Blindness)

“bank”라는 단어는 금융 기관을 의미할 수도 있고 강둑을 의미할 수도 있습니다. Lexical search 는 추가적인 문맥 단어 없이는 이러한 의미를 구별할 수 없으므로 종종 관련 없는 결과를 반환합니다.

C. 교차 언어(Cross-Lingual)의 한계

키워드 검색은 엄격하게 쿼리의 언어에 종속됩니다. 영어로 검색하면 내용이 사용자가 정확히 필요로 하는 것일지라도 한국어나 스페인어로 작성된 관련 문서를 검색할 수 없습니다.

D. 해결책: Vector Embeddings

이러한 한계를 극복하기 위해 우리는 텍스트를 기하학적 거리가 의미적 유사성에 대응하는 고차원 벡터로 표현합니다. 임베딩 모델(예: 미세 조정된 BERT 또는 현대의 대조 학습 모델)은 “automobile”과 “car”의 개념을 벡터 공간에서 가까운 점으로 매핑하여 동의어 문제를 해결하고 교차 언어 검색을 가능하게 합니다.


이러한 트레이드오프를 이해하기 위해 개념도를 살펴보고 아래의 시각화 도구와 상호작용해 보세요. 다양한 주제를 다루는 작은 문서 데이터베이스가 있습니다.

Lexical vs Semantic Search Diagram

텍스트에 명시적으로 언급되지 않은 개념을 검색하여(예: 텍스트에는 “young dog”라고 되어 있을 때 “puppy” 검색) semantic search 가 어떻게 빛을 발하는지 확인해 보세요. 또한 특정 제품 코드와 같이 키워드 검색이 여전히 필요할 수 있는 부분도 관찰해 보세요.

Semantic vs. Keyword Search

Try the preset queries to see the difference in behavior.

💡 Observations
  • Search for "flat tire": Keyword search fails (vocabulary mismatch), but Semantic search finds both English and Korean documents (cross-lingual).
  • Search for "XJ-992-B": Keyword search finds it perfectly. Semantic search gives low scores because it struggles with specific rare tokens like product codes.

키워드의 보루: 특정 정보에 대한 정밀도

위에서 보여주듯이, semantic search 는만병통치약이 아닙니다. 일련번호, 부품 코드 또는 희귀한 고유 명사와 같이 매우 구체적인 토큰을 일반적인 범주로 “흐리게(blur)” 만드는 경향이 있습니다. 예를 들어, Err-404를 검색하면 해당 정확한 문자열이 포함된 특정 로그 항목을 검색하는 대신 일반적인 “웹 오류”에 대한 문서를 검색할 수 있습니다.

이것이 엔터프라이즈 RAG 시스템이 거의 항상 Hybrid Search (두 방법을 모두 결합)를 사용하는 이유이며, 이는 14.3절에서 다룰 예정입니다.


3. 고급 청킹(Chunking) 전략

텍스트를 임베딩하고 벡터 데이터베이스에 저장하기 전에, 우리는 큰 문서를 Chunks 라고 하는 작고 일관된 조각으로 나누어야 합니다. 데이터를 청킹하는 방식은 검색 품질에 극적인 영향을 미칩니다.

A. 단순 (Fixed-Size) Chunking

가장 단순한 접근 방식은 텍스트를 고정된 수의 토큰(예: 256 토큰)으로 나누고, 문장이 중간에 잘리는 것을 방지하기 위해 작은 겹침(overlap)(예: 20 토큰)을 두는 것입니다.

  • 장점: 구현이 간단하고 컴퓨팅 비용을 예측할 수 있습니다.
  • 단점: 종종 의미적 일관성을 깨뜨려 단락이나 목록이 두 개의 청크로 나뉘어져 문맥을 잃게 만듭니다.

B. 계층적 (Hierarchical) Chunking

모든 청크를 동등하게 취급하는 대신, 계층적 청킹은 문서 구조를 유지합니다.

  1. Summary Chunk: 큰 섹션(예: 전체 장)의 상위 수준 요약.
  2. Detail Chunks: 해당 섹션의 실제 텍스트를 포함하는 더 작은 청크.
  • 검색 시 먼저 요약 청크를 검색하여 관련 섹션을 식별한 다음 세부 청크로 좁혀갈 수 있으므로 검색 공간을 줄이고 정밀도를 높일 수 있습니다.

C. 부모-자식 (Parent-Child / Small-to-Large) Chunking

이것은 RAG에서 가장 효과적인 전략 중 하나입니다.

  • 문제: 작은 청크는 정밀한 벡터 검색(노이즈가 적음)에 더 좋지만, 큰 청크는 LLM이 답변을 생성하는 데 더 좋은 문맥을 제공합니다.
  • 해결책: 문서를 검색을 위한 작은 자식 청크 (예: 50 토큰)로 나눕니다. 각 자식 청크는 더 큰 부모 청크 (예: 500 토큰)에 연결됩니다. 시스템이 매우 관련성 높은 자식 청크를 검색하면, 실제로는 해당 부모 청크를 LLM에 제공합니다.

4. 의미 공간의 수학 (InfoNCE 및 Matryoshka)

모델이 이러한 의미 공간을 어떻게 생성하는지 이해하려면 모델이 어떻게 훈련되는지 살펴봐야 합니다. 현대의 밀집 검색기(dense retriever)는 일반적으로 대조 학습(Contrastive Learning) 을 사용하여 훈련됩니다.

대조 학습과 InfoNCE 손실

대조 학습의 목표는 유사한 항목은 가까이 있고 유사하지 않은 항목은 멀리 떨어져 있는 임베딩 공간을 학습하는 것입니다. RAG에서 이는 쿼리 qiq_i 가 관련 문서 di+d_i^+ (긍정 샘플)와는 가깝고, 다른 관련 없는 문서 djd_j (부정 샘플)와는 멀어져야 함을 의미합니다.

이를 위한 표준 손실 함수는 InfoNCE (Information Noise Contrastive Estimation) 입니다.

LInfoNCE=1Ni=1Nlogexp(sim(qi,di+)/τ)j=1Nexp(sim(qi,dj)/τ)\mathcal{L}_{InfoNCE} = -\frac{1}{N} \sum_{i=1}^{N} \log \frac{\exp(\text{sim}(q_i, d_i^+) / \tau)}{\sum_{j=1}^{N} \exp(\text{sim}(q_i, d_j) / \tau)}

여기서:

  • sim(a,b)\text{sim}(a, b) 는 유사도 측정 기준으로, 일반적으로 내적(dot product) 또는 코사인 유사도입니다.
  • τ\tau 는 분포의 크기를 조절하는 온도(temperature) 파라미터입니다.
  • 이 공식은 본질적으로 다중 클래스 분류 문제로 프레임화되어, 부정적인 문서 세트 중에서 긍정적인 문서가 올바르게 식별될 확률을 계산합니다.

Matryoshka Representation Learning (MRL)

대규모 시스템에서 수십억 개의 문서에 대해 고차원 벡터(예: 768 또는 1536 차원)를 저장하는 것은 메모리 및 검색 지연 시간 측면에서 매우 비용이 많이 듭니다.

Matryoshka Representation Learning (MRL) [1] 은 모델이 벡터의 앞쪽 차원에 정보를 채우도록 훈련함으로써 이 문제를 해결합니다. 러시아 인형(마트료시카)에서 영감을 받은 MRL은 첫 KK 차원(예: 64, 128, 256)만으로도 독립적으로 고품질 검색이 가능하도록 보장합니다.

개발자는 768차원 벡터를 단 128차원으로 잘라낼 수 있습니다. 이를 통해 원본 검색 성능의 최대 95%를 유지하면서 저장 공간과 컴퓨팅 비용을 6×6\times 줄일 수 있습니다. 이러한 “탄력적인” 임베딩 기능은 프로덕션 RAG 파이프라인에서 비용 대비 성능 트레이드오프를 최적화하는 데 매우 중요합니다.


Quizzes

Quiz 1: 사용자가 엄격한 lexical search를 사용하는 시스템에서 “How to fix a punctured tire?”를 검색합니다. 데이터베이스에는 “Repairing a flat tire”라는 제목의 문서가 있습니다. Lexical search가 이 문서를 찾을 수 있을까요? 왜 그럴까요? 퍼지 매칭이나 어간 추출(stemming)이 적극적으로 적용되지 않는 한 높은 순위에 오르기 어렵습니다. “Punctured”와 “flat”은 동의어이지만 공통된 문자가 없으며, “tire”만이 유일하게 일치하는 키워드입니다. Semantic search는 공유된 의도를 쉽게 식별할 수 있습니다.

Quiz 2: 부모-자식(Parent-Child) 청킹이 검색에는 작은 청크를 사용하고 생성에는 큰 청크를 사용하는 이유는 무엇인가요? 작은 청크는 벡터 임베딩에 대한 신호 대 잡음비(signal-to-noise ratio)가 더 높아 검색이 더 정확해집니다. 그러나 LLM은 일관되고 정확한 답변을 생성하기 위해 주변 문맥이 필요하며, 이는 더 큰 부모 청크가 제공합니다.

Quiz 3: BM25 어휘 검색 점수와 DPR(Dense Passage Retrieval)의 내적(Dot-product) 유사도를 명시적으로 결합하는 하이브리드 유사도 점수 Shybrid(q,d)S_{hybrid}(q, d)를 수식으로 표현하고, 정규화가 필수적인 이유를 설명하시오. 하이브리드 점수는 정규화된 두 점수의 볼록 결합(Convex combination)으로 정식화됩니다: Shybrid(q,d)=αNorm(SBM25(q,d))+(1α)Norm(EQ(q)TED(d))S_{hybrid}(q, d) = \alpha \cdot \text{Norm}(S_{BM25}(q, d)) + (1 - \alpha) \cdot \text{Norm}(E_Q(q)^T E_D(d)). 여기서 α[0,1]\alpha \in [0, 1]은 균형 하이퍼파라미터입니다. BM25 점수는 상한이 없는 영역([0,)[0, \infty))인 반면 임베딩 내적 점수는 벡터 크기에 따라 상한이 결정되므로, 특정 풀 경계(예: Min-Max 스케일링)로 점수를 정규화하지 않으면 한쪽 점수 분포가 최종 결합 순위를 장악하여 왜곡을 유발할 수 있습니다.


References

  1. Kusupati, A., et al. (2022). Matryoshka Representation Learning. arXiv:2205.13147.