486. 코사인 유사도 (Cosine Similarity) 탐색 엔진
⚠️ 이 문서는 벡터 데이터베이스에 저장된 수억 개의 좌표(데이터)들 중에서, 내 질문과 가장 '거리가 가까운(비슷한)' 데이터를 찾아낼 때, 점과 점 사이의 거리가 아닌 '두 선이 이루는 각도'를 계산하여 문맥적 의미를 파악해 내는 수학적 탐색 기법을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 두 개의 벡터(숫자 배열)가 가리키는 방향이 얼마나 비슷한지를 측정하는 수학 공식이다.
- 계산 원리: 두 선이 이루는 **'각도(Angle)'**의 코사인값을 구한다. 각도가 0도(완벽히 같은 방향)면 유사도가 1(100%), 90도(전혀 다름)면 0, 180도(정반대)면 -1이 된다.
- 가치: 문서의 길이나 단어의 빈도수(크기)에 영향을 받지 않고, 오직 글이 담고 있는 **'주제(방향성)'**가 얼마나 비슷한지만을 순수하게 비교할 수 있어 텍스트 검색 엔진의 표준으로 쓰인다.
Ⅰ. 개요: 유클리디안 거리의 한계 (Context & Necessity)
"사과"라는 단어와 "바나나"라는 단어가 우주 공간에 좌표로 찍혀있다. 두 단어가 얼마나 비슷한지(거리가 가까운지) 계산하려면 어떻게 해야 할까?
초보자들은 가장 직관적인 **유클리디안 거리(L2 Distance)**를 떠올린다. (점과 점 사이를 자로 재는 방법)
- 문제점: A문서는 "사과가 맛있다" (길이가 짧음). B문서는 "사과가 맛있다"를 1,000번 반복한 문서다 (길이가 엄청 긺).
- 유클리디안 거리로 재면, 두 문서의 좌표는 크기 때문에 엄청나게 멀리 떨어져 있다고 계산된다. (내용은 똑같은데도!)
이 문제를 해결하기 위해 등장한 것이 코사인 유사도다. "좌표의 '크기(길이)'는 무시하자! 오직 원점에서 출발한 두 선이 **'어느 방향'**을 가리키고 있는지, 그 두 선이 이루는 **'각도'**만 재서 비슷함을 판단하자!"
📢 섹션 요약 비유: 유클리디안 거리는 **'키와 몸무게'**까지 다 똑같아야 쌍둥이라고 인정하는 깐깐한 방식입니다. 반면 코사인 유사도는 **'얼굴 생김새(방향)'**만 똑같으면, 한 명이 거인이고 한 명이 난쟁이(크기가 다름)여도 완벽한 쌍둥이로 인정해 주는 유연한 방식입니다.
Ⅱ. 코사인 유사도의 작동 원리 ★
코사인 유사도의 결괏값은 무조건 -1에서 1 사이로 나온다.
- +1 (각도 0도)
- 두 벡터가 완벽하게 같은 방향을 가리킨다.
- 예: "아버지가 방에 들어가신다" vs "아버님께서 방에 들어가셨다" (문맥 100% 일치)
- 0 (각도 90도)
- 두 벡터가 직교한다. 서로 아무런 관련이 없다.
- 예: "아버지가 방에 들어가신다" vs "오늘 주식 시장이 폭락했다" (접점 없음)
- -1 (각도 180도)
- 두 벡터가 완벽하게 반대 방향을 가리킨다.
- 예: "이 영화는 내 인생 최고의 명작이다" vs "이 영화는 내 인생 최악의 쓰레기다" (완벽한 반대 의견)
Ⅲ. 실무 활용: 벡터 DB의 검색 엔진망
우리가 챗GPT나 벡터 DB(Pinecone, Milvus - 485번 문서)에 질문을 던질 때, 뒤에서는 코사인 유사도 연산이 맹렬하게 돌아간다.
- 사용자 질문:
[0.1, 0.2, 0.5](AI 모델이 내 질문을 벡터로 변환함) - 벡터 DB: 디스크에 저장된 1억 개의 문서 벡터들과 내 질문 벡터 사이의 코사인 각도를 1억 번 계산한다.
- 결과 리턴: 각도가 0도에 가장 가까운(코사인값이 1에 가장 가까운) 상위 5개의 문서를 뽑아서(Top-K) 사용자에게 보여준다.
┌──────────────────────────────────────────────────────────────┐
│ 유클리디안 거리 vs 코사인 유사도 (Cosine Similarity) 비교 시각화 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [ Y축: 달콤함 ] │
│ │ (문서 B: 사과 엄청 많음) │
│ │ ↗ │
│ │ / │
│ │ / │
│ │ (문서 A: 사과) / │
│ │ ↗ ─(각도:0도) │
│ │ / │
│ │ / │
│ │ / (문서 C: 햄버거) │
│ │ / ↘ │
│ ─────┼───────────────────────────────────▶ [ X축: 과일 ] │
│ │
│ ★ 평가 결과: │
│ - 유클리디안 거리: 문서 A와 문서 B는 길이가 달라서 "멀다(다르다)"고 평가함.│
│ - 코사인 유사도: 문서 A와 문서 B는 각도가 0도라서 "100% 똑같다"고 평가함. │
│ 반면 문서 C는 각도가 크게 벌어져 있어서 "전혀 다르다"고 평가. │
└──────────────────────────────────────────────────────────────┘
Ⅳ. 결론
"길이가 아니라, 방향이 의미를 결정한다." 코사인 유사도는 텍스트 마이닝과 자연어 처리(NLP) 분야를 지배하는 가장 아름다운 수학 공식이다. 문서의 길이가 짧든 길든, 단어가 1번 쓰였든 100번 쓰였든 상관없이 글이 품고 있는 '본질적인 주제'를 꿰뚫어 보기 때문이다. 다만, 1억 개의 데이터와 코사인 각도를 일일이 다 계산하는 것은 CPU를 터뜨리는 짓이므로, 벡터 DB들은 이 각도 계산을 미리 묶어서 대충 빨리 찾아내는 ANN(근사 최근접 이웃 - 487번 문서) 인덱스 기술과 결합하여 경이로운 검색 속도를 만들어내고 있다.
📌 관련 개념 맵
- 기반 시스템: Vector DB (벡터 데이터베이스 - 485번 문서)
- 다른 유사도 측정법: 유클리디안 거리 (L2 Distance), 맨해튼 거리 (L1 Distance), 자카드 유사도
- 가속 기술: ANN (Approximate Nearest Neighbor), HNSW (487번 문서)
- 응용 분야: 추천 시스템 (Collaborative Filtering), 시맨틱 검색
👶 어린이를 위한 3줄 비유 설명
- 유클리디안 거리는 "내 키랑 똑같이 130cm인 친구만 내 쌍둥이야!"라고 깐깐하게 키와 덩치까지 똑같은 사람을 찾는 거예요.
- 코사인 유사도는 "키가 2미터인 어른이든, 1미터인 꼬마든, 걷는 방향(얼굴 생김새)만 똑같으면 다 같은 쌍둥이야!"라고 인정해 주는 거예요.
- 문서의 길이가 길든 짧든, 글이 가리키는 '주제(방향)'만 같으면 비슷한 문서라고 똑똑하게 찾아주는 수학 마법이랍니다!