의미 유사도 (Semantic Similarity)
의미 유사도(Semantic Similarity)는 두 텍스트가 의미적으로 얼마나 유사한지를 수치로 측정하는 태스크입니다. 단순한 단어 겹침이 아니라 문장의 뜻을 비교하며, 검색 엔진, 중복 문서 탐지, 추천 시스템, 그리고 **RAG(Retrieval-Augmented Generation)**의 검색(Retrieval) 단계에서 핵심적으로 사용됩니다.학습 목표
이 문서를 완료하면 다음을 수행할 수 있습니다.- 어휘 기반 유사도와 의미 기반 유사도의 차이를 설명할 수 있습니다
- Sentence-BERT의 Siamese Network 구조를 이해합니다
- 코사인 유사도로 문장 간 유사도를 계산할 수 있습니다
sentence-transformers라이브러리로 시맨틱 서치를 구현할 수 있습니다- 임베딩 모델 선택 기준과 벤치마크를 이해합니다
왜 중요한가
의미 유사도는 현대 NLP 애플리케이션의 근간입니다.| 활용 분야 | 설명 | 관련 탭 |
|---|---|---|
| RAG 검색 | 사용자 질문과 유사한 문서 검색 | RAG 탭 |
| 시맨틱 서치 | 키워드가 아닌 의미로 검색 | - |
| 중복 탐지 | 유사 질문/문서 감지 | - |
| 클러스터링 | 유사 문서 그룹화 | - |
| 추천 시스템 | 콘텐츠 기반 유사 항목 추천 | - |
핵심 개념
어휘 유사도 vs 의미 유사도
Sentence-BERT: Siamese Network
일반 BERT로 문장 유사도를 계산하려면 두 문장을 하나의 입력으로 결합해야 합니다. N개 문장에 대해 의 비교가 필요하여 10,000개 문장이면 약 5,000만 번의 추론이 필요합니다. **Sentence-BERT(SBERT)**는 Siamese Network 구조로 이 문제를 해결합니다. 각 문장을 독립적으로 고정 크기 벡터로 인코딩하고, 벡터 간 유사도를 계산합니다. 핵심 아이디어:- 두 BERT는 동일한 가중치를 공유 (Siamese = “쌍둥이”)
- Mean Pooling으로 토큰 임베딩을 하나의 문장 벡터로 압축
- 인코딩은 한 번만 수행하고, 유사도 계산은 벡터 연산으로 수행
- 10,000개 문장 비교: BERT 10,000번 인코딩 + 벡터 비교 → 수 초 완료
코사인 유사도 (Cosine Similarity)
두 벡터 사이의 각도를 측정합니다. 벡터의 크기(길이)가 아닌 방향이 얼마나 유사한지를 나타냅니다.- 1.0: 완전히 같은 방향 (매우 유사)
- 0.0: 직교 (관련 없음)
- -1.0: 정반대 방향 (반대 의미)
sentence-transformers로 실습
기본 사용법
시맨틱 서치 구현
임베딩 모델 비교
| 모델 | 차원 | 한국어 | 속도 | STS 성능 |
|---|---|---|---|---|
paraphrase-multilingual-MiniLM-L12-v2 | 384 | 지원 | 빠름 | 중간 |
distiluse-base-multilingual-cased-v2 | 512 | 지원 | 빠름 | 중간 |
intfloat/multilingual-e5-large | 1024 | 지원 | 느림 | 높음 |
BAAI/bge-m3 | 1024 | 지원 | 느림 | 매우 높음 |
jhgan/ko-sbert-sts | 768 | 전용 | 중간 | 높음 (한국어) |
snunlp/KR-SBERT-V40K-klueNLI-augSTS | 768 | 전용 | 중간 | 높음 (한국어) |
AI/ML 활용 사례
중복 질문 탐지
문서 클러스터링
어떤 Pooling 전략을 사용해야 하나요?
어떤 Pooling 전략을 사용해야 하나요?
Mean Pooling: 모든 토큰 임베딩의 평균. 가장 일반적이고 안정적. CLS Pooling: [CLS] 토큰만 사용. BERT 원래 설계 의도이지만 SBERT에서는 Mean보다 성능이 낮은 경우가 많음. Max Pooling: 각 차원별 최댓값. 특정 태스크에서 효과적. 대부분의 경우 Mean Pooling이 권장됩니다.
임베딩 차원이 높을수록 좋은가요?
임베딩 차원이 높을수록 좋은가요?
꼭 그렇지는 않습니다. 384차원 MiniLM이 768차원 BERT-base보다 STS 태스크에서 높은 성능을 보이는 경우도 있습니다. 차원이 높으면 더 많은 정보를 담을 수 있지만, 저장 공간과 검색 속도 비용이 증가합니다. 벡터 DB에서 수백만 건을 다룬다면 384~512차원이 실용적입니다.
코사인 유사도 외에 다른 유사도 메트릭은 없나요?
코사인 유사도 외에 다른 유사도 메트릭은 없나요?
유클리드 거리: 벡터 간 직선 거리. 정규화되지 않은 임베딩에서 사용. 내적(Dot Product): 정규화된 벡터에서는 코사인 유사도와 동일. 정규화되지 않으면 벡터 크기도 반영. 맨해튼 거리: L1 노름 기반. 고차원에서 유클리드보다 안정적. 대부분의 문장 임베딩 모델은 코사인 유사도에 최적화되어 학습됩니다.
체크리스트
학습을 마치기 전에 아래 항목을 확인하세요.- 어휘 기반 유사도와 의미 기반 유사도의 차이를 설명할 수 있는가?
- Sentence-BERT의 Siamese Network 구조와 장점을 이해하는가?
- 코사인 유사도의 수식과 의미를 설명할 수 있는가?
-
sentence-transformers로 시맨틱 서치를 구현할 수 있는가? - 임베딩 모델 선택 시 고려해야 할 요소를 알고 있는가?

