임베딩이란 무엇인가 — 단어를 좌표로 바꾸는 마법
한줄 요약
임베딩은 텍스트를 고차원 공간의 좌표로 변환해서, 의미가 비슷한 텍스트끼리 좌표가 가깝도록 만드는 기술이다.
본문
왜 텍스트를 숫자로 바꾸는가
컴퓨터는 텍스트를 이해하지 못한다. 정확히는, “이해”라는 게 없다. 계산할 뿐이다.
“심근경색”과 “급성 MI”가 같은 뜻이라는 걸 컴퓨터가 어떻게 알 수 있을까? 키워드 검색은 이걸 모른다. “심근경색”으로 검색하면 “급성 MI 프로토콜”이 안 나온다.
임베딩은 이 문제를 해결한다. 텍스트를 숫자 벡터로 변환하는데, 의미가 비슷할수록 벡터가 가깝게 배치된다.
직관적인 이해: 지도 위의 좌표
쉽게 이해하려면 2D 지도를 상상하면 된다.
의학 용어
심근경색 • • 급성 MI
• 협심증 • 흉통
당뇨 •
• 혈당 조절 • 인슐린
“심근경색”과 “급성 MI”는 지도에서 가깝다. 둘 다 심장 관련이고 긴급 상황이라는 의미를 공유하기 때문이다. “당뇨”와 “인슐린”도 가깝다. “심근경색”과 “당뇨”는 멀다.
실제 임베딩은 2D가 아니라 1,536차원(OpenAI 기준) 또는 그 이상의 고차원 공간이다. 사람이 시각화할 수 없지만, 수학적으로 같은 원리가 작동한다.
임베딩이 만들어지는 과정
텍스트: "당뇨 환자의 혈당 조절 방법"
임베딩 모델 처리
↓
[0.234, -0.891, 0.445, 0.123, -0.567, ...]
← 1,536개의 숫자로 이루어진 벡터 →
이 숫자들은 각각 어떤 의미인지 사람이 해석할 수 없다. 모델이 수십억 개의 텍스트를 학습하면서 스스로 찾아낸 표현이다. 중요한 건 비슷한 텍스트는 비슷한 숫자 패턴을 갖는다는 것이다.
유사도 계산: 코사인 유사도
두 벡터가 얼마나 가까운지는 코사인 유사도로 측정한다.
값이 1에 가까울수록 의미가 비슷하고, 0에 가까울수록 관계가 없고, -1에 가까울수록 반대 의미다.
실제 예시 (근사값):
| 텍스트 쌍 | 코사인 유사도 |
|---|---|
| ”심근경색” vs “급성 MI” | 0.94 |
| ”심근경색” vs “흉통” | 0.78 |
| ”심근경색” vs “당뇨” | 0.41 |
| ”심근경색” vs “파스타 요리법” | 0.08 |
RAG에서 임베딩의 역할
[문서 저장 단계 - 사전 처리]
병원 문서 1000개
↓ 임베딩 모델 처리
각 문서 → 벡터로 변환
↓
벡터 DB에 저장
(Pinecone, Weaviate, pgvector 등)
[검색 단계 - 실시간]
사용자 질문: "당뇨 입원 기준이 뭔가요?"
↓ 임베딩 모델 처리
질문 벡터: [0.123, -0.456, ...]
↓
DB에서 코사인 유사도 계산
↓
가장 가까운 문서 Top 5 반환
→ "당뇨 입원 지침", "혈당 관리 프로토콜", ...
키워드 “당뇨”가 없는 문서도, 의미상 관련 있으면 검색된다. 이게 의미 기반 검색(Semantic Search)이다.
임베딩 모델 선택
| 모델 | 제공사 | 차원 | 특징 |
|---|---|---|---|
| text-embedding-3-large | OpenAI | 3,072 | 높은 품질, 비용 있음 |
| text-embedding-3-small | OpenAI | 1,536 | 비용 효율적 |
| embed-english-v3 | Cohere | 1,024 | 영어 특화 |
| BGE-M3 | BAAI | 1,024 | 오픈소스, 다국어 |
| KoSimCSE | 한국어 특화 | 768 | 한국어 성능 우수 |
의료 한국어 문서를 다룬다면 한국어 특화 모델을 고려해야 한다. 영어 임베딩 모델로 한국어를 처리하면 품질이 떨어진다.
임베딩의 한계
정보 손실: 긴 문서를 벡터 하나로 압축하면 세부 내용이 사라진다. 20쪽짜리 가이드라인을 벡터 하나로 만들면 특정 조항을 찾기 어렵다.
→ 해결책: 청킹(Chunking) — 문서를 작은 조각으로 나눠서 각각 벡터화 (다음 글에서 다룸)
도메인 불일치: 일반 텍스트로 학습된 임베딩 모델은 의료 전문 용어를 제대로 이해 못할 수 있다. “MI”가 “myocardial infarction”인지 “Michigan”인지 혼동할 수 있다.
→ 해결책: 의료 텍스트로 파인튜닝된 임베딩 모델 사용
임베딩을 이해하면 RAG의 작동 원리가 보인다. 다음은 이 벡터들을 저장하고 빠르게 검색하는 벡터 데이터베이스다.