JUST WRITE

[Embedding] Sparse vs Dense 임베딩 본문

AI

[Embedding] Sparse vs Dense 임베딩

천재보단범재 2025. 7. 2. 13:23

RAG 구성 시 임베딩 선택

Sparse vs Dense 임베딩

프로젝트에 투입해서 RAG와 LLM을 활용한 자동 분류 서비스를 개발하였습니다.

처음에는 다국어를 지원하는 paraphrase-multilingual-mpnet-base-v2 임베딩 모델로 임베딩을 생성해서

Milvus에 해당 임베딩을 저장하여 RAG를 구성하였습니다.

 

[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기

VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도

developnote-blog.tistory.com

RAG만 구성하면 다 될 줄 알았지만 생각보다 검색 성능이 좋지 않았습니다.

유사 문서의 검색 성능을 높이려면 어떻게 해야 할지 고민하였습니다.

그러던 중 Sparse와 Dense를 알게 되고 Hybrid Search를 알게되었습니다.

Sparse와 Dense 임베딩을 서비스에 도입하여 유사 문서 검색 성능을 높이려고 합니다.

이번 포스팅에서는 Sparse와 Dense 임베딩을 비교해 보겠습니다.

Embedding

임베딩은 텍스트를 숫자 벡터, 숫자 배열로 변환하는 기술입니다.

텍스트끼리는 단순 비교가 힘들지만 벡터로 변환하면 의미적 유사도를 계산해서 비교할 수 있습니다.

벡터로 바꾸면 코사인 유사도, 유클리드 거리 같은 수학 공식으로 계산할 수 있습니다.

코사인 유사도
유클리드 거리

임베딩하는 방식은 여러 가지가 있는데

이번 포스팅에서는 Sparse와 Dense 2가지를 비교해보려고 합니다. 

Sparse 임베딩

Sparse는 영어 뜻대로 하면 '드문드문 난'이란 뜻입니다.

Sparse 임베딩 모델로 나온 벡터는 대부분 0 값이 들어 있습니다.

단어의 인덱스 값만 1이고 나머지는 0으로 들어가 있기 때문입니다.

대신 Sparse 임베딩으로 나온 벡터는 수천에서 수백만 개의 차원을 가지게 됩니다.

1000개 단어로 구성된 것이면 1000개 차원을 가지는 벡터를 만듭니다.

대표적으로 원핫인코딩 방법이 있습니다.

아래는 pandas Dataframe에서 get_dummies를 통해 원핫인코딩을 한 것입니다.

import pandas as pd
import numpy as np

# 문서 데이터 예시
documents = [
    "자동차 구매 가이드",
    "구매 방법 추천", 
    "자동차 최고 추천",
    "가이드 방법"
]
all_words = []
for doc in documents:
    all_words.extend(doc.split())

# DataFrame 생성
df = pd.DataFrame({'words': all_words})

# One-Hot Encoding 적용
onehot_df = pd.get_dummies(df['words'])

 

 

  • 고차원성 (High Dimensionality)
    • 수천에서 수백만 차원의 벡터 사용
    • 예: 1,000개 어휘 → 1,000차원 벡터
  • 지역성 (Locality)
    • 각 단어를 독립적으로 표현
    • 단어 간 공유 정보나 겹치는 부분이 거의 없음
    • "자동차"와 "차량"을 완전히 다른 차원으로 처리
  • 해석 가능성 (Interpretability)
    • 각 차원이 명확한 의미를 가짐 (특정 단어의 존재/부재)
    • 어떤 단어가 문서 검색에 기여했는지 쉽게 파악 가능
  • 주요 기법
    • One-Hot Encoding (원핫인코딩)
    • Bag-of-Words (BoW)
    • TF-IDF (Term Frequency-Inverse Document Frequency)

이러한 특징들이 있지만 단점이 있습니다.

단어에 대해서는 파악하기 좋지만 의미적인 정보는 알기가 쉽지 않습니다.

문맥에 대한 정보를 파악하기 힘듭니다.

이런 단점을 보완할 Dense 임베딩이 있습니다.

Dense 임베딩

Dense는 영어 뜻대로 하면 '밀집된'이란 뜻입니다.

뜻만 봐도 Sparse와 상반된 의미라는 것을 알 수 있습니다.

Sparse와는 다르게 벡터가 0이 아닌 실수로 이루어져 있습니다.

데이터 포인트 간의 의미적인 관계를 알 수 있도록 벡터를 만듭니다.

  • 저차원성 (Low Dimensionality)
    • 보통 256 ~ 1024개 차원
  • 분산 표현 (Distributed Representations)
    • 각 차원이 특정 의미가 아닌 전체적으로 의미를 분산 저장
  • 의미적 관계 (Semantic Relationships)
    • 데이터 포인트 간의 의미적 관계를 포착
  • 주요 기법
    • Word2Vec
    • GloVe (Global Vectors for Word Representation)
    • BERT (Bidirectional Encoder Representations from Transformers)

paraphrase-multilingual-mpnet-base-v2도 BERT 기반 Dense 임베딩 모델입니다.

2가지를 비교해보자면 아래와 같이 정리해볼 수 있습니다.

특징 Sparse 임베딩 Dense 임베딩
차원 수 높음 (수만~수십만 차원) 낮음 (50~1,000 차원)
벡터 표현 대부분 값이 0 대부분 실수, non-zero
의미 정보 제한적, 관계 포착 어려움 풍부, 의미적·문법적 관계 인코딩
해석 가능성 높음 (각 차원이 특정 단어) 낮음 (추상적 표현)
계산 효율성 고차원으로 인해 비효율적 효율적, 컴팩트한 표현

주요 모델

Sparse 모델

# 방식 임베딩 모델
1 BM25 rank-bm25
2 TF-IDF scikit-learn
3 SPLADE naver/splade-cocondenser-ensembledistil

Dense 모델

# 임베딩 모델 특징
1 sentence-transformers/all-MiniLM-L6-v2 가장 많이 사용, 384차원
2 sentence-transformers/paraphrase-multilingual-mpnet-base-v2 다국어 지원
3 BAAI/bge-large-en-v1.5 최고 성능

정리

Sparse와 Dense 임베딩 방식을 정리해보았습니다.

2가지 임베딩 방식 모두 특징을 가지고 있어 용도에 맞게 사용할 수 있습니다.

챗봇이나 Q&A에서는 의미 파악을 위해 Dense가 좋을 수가 있고

문적인 용어를 많이 사용한는 곳이라면 단어 기반의 Sparse가 나을 수도 있습니다.

다음 포스팅에서는 Dense로만 구성했던 것을 Sparse와 Dense 2가지 임베딩을 hybrid할지 정리해보겠습니다.

[참고사이트]

728x90
반응형
Comments