임베딩(Embedding)이란 - 텍스트를 벡터로 바꾸는 원리
지난 글에서 RAG의 전체 구조를 살펴보면서 "텍스트를 벡터로 변환해서 저장한다"는 과정이 나왔습니다. 이번 글에서는 RAG의 첫 단추가 되는 임베딩(Embedding)이 정확히 무엇이고, 왜 텍스트를 굳이 숫자로 바꿔야 하는지 정리합니다.
1. 임베딩이란 무엇인가
임베딩은 텍스트(단어, 문장, 문단)를 컴퓨터가 의미 단위로 비교할 수 있는 숫자 배열(벡터)로 변환하는 작업입니다.
"오늘 날씨가 좋다" → [0.021, -0.184, 0.093, ..., 0.077] (예: 1536차원)
"today's weather is nice" → [0.019, -0.176, 0.088, ..., 0.081]
여기서 중요한 건 단순히 숫자로 바꾸는 게 목적이 아니라는 점입니다. 의미가 비슷한 텍스트는 벡터 공간에서 가까운 위치에 놓이도록 변환하는 것이 임베딩의 핵심입니다. 위 예시처럼 한국어와 영어로 표현이 달라도 의미가 같으면 벡터값이 비슷하게 나옵니다.
2. 컴퓨터는 왜 텍스트를 그대로 비교하지 못하는가
컴퓨터 입장에서 "강아지"와 "개"는 그냥 서로 다른 문자열일 뿐입니다. 글자 하나하나를 비교하면 완전히 다른 단어이기 때문에, 문자열 비교만으로는 두 단어가 비슷한 의미라는 걸 알아낼 방법이 없습니다.
문자열 비교: "강아지" vs "개" → 일치하는 글자 없음 → 완전히 다른 단어로 판단
임베딩 비교: "강아지" → [0.12, 0.87, ...]
"개" → [0.14, 0.85, ...]
→ 벡터 거리가 가까움 → 의미상 유사하다고 판단 가능
이 문제를 해결하기 위해, 텍스트를 의미 정보가 담긴 숫자 좌표로 옮겨서 "거리"라는 수학적 개념으로 유사도를 계산할 수 있게 만든 것이 임베딩입니다.
3. 임베딩 벡터는 어떻게 만들어지는가
임베딩은 임베딩 모델(Embedding Model)이라는 별도의 딥러닝 모델을 통해 생성됩니다. 이 모델도 LLM과 마찬가지로 방대한 텍스트를 학습하는데, 목표가 다릅니다. LLM이 "다음 단어를 예측"하도록 학습된다면, 임베딩 모델은 "의미가 비슷한 텍스트를 가까운 벡터로 매핑"하도록 학습됩니다.
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-small",
input="RAG는 검색 증강 생성 기법이다"
)
vector = response.data[0].embedding
print(len(vector)) # 1536
print(vector[:5]) # [0.0023, -0.0187, 0.0341, ...]
실무에서는 이런 임베딩 모델을 직접 만들 필요 없이, OpenAI, Cohere 같은 API나 오픈소스 모델(BGE, KoSimCSE 등)을 그대로 가져다 씁니다.
4. 벡터 간 유사도는 어떻게 계산하는가
임베딩으로 변환된 두 벡터가 얼마나 가까운지는 보통 코사인 유사도(Cosine Similarity)로 계산합니다. 두 벡터가 이루는 각도가 얼마나 작은지를 보는 방식으로, 값이 1에 가까울수록 의미가 비슷하다는 뜻입니다.
cosine_similarity("강아지가 좋아요", "저는 개를 좋아합니다") → 0.89 (매우 유사)
cosine_similarity("강아지가 좋아요", "오늘 주식이 폭락했다") → 0.12 (관련 없음)
RAG에서 사용자의 질문을 검색할 때도 이 원리를 그대로 사용합니다. 질문을 임베딩한 벡터와, 미리 저장해둔 문서 조각들의 벡터를 하나씩 비교해서 코사인 유사도가 가장 높은 문서를 찾아내는 것입니다.
5. 임베딩 차원(Dimension)이란
임베딩 벡터의 길이를 차원이라고 부릅니다. 예를 들어 text-embedding-3-small 모델은 1536차원 벡터를 만들어냅니다. 숫자가 클수록 더 정교하게 의미를 표현할 수 있지만, 그만큼 저장 공간과 연산 비용이 늘어납니다.
| 모델 | 차원 | 특징 |
|---|---|---|
| text-embedding-3-small | 1536 | 비용 효율적, 대부분의 서비스에 충분 |
| text-embedding-3-large | 3072 | 정확도 높지만 비용·저장공간 증가 |
| BGE-M3 (오픈소스) | 1024 | 다국어 지원, 셀프 호스팅 가능 |
서비스 규모나 정확도 요구 수준에 따라 적절한 모델을 선택하면 됩니다. 초기 구축 단계에서는 비용이 낮은 모델로 시작해서, 검색 품질이 부족하면 상위 모델로 바꾸는 방식이 일반적입니다.
6. 정리
- 임베딩은 텍스트를 의미 정보가 담긴 벡터로 변환하는 작업으로, RAG에서 검색을 가능하게 하는 핵심 기술입니다.
- 의미가 비슷한 텍스트는 벡터 공간에서 가까운 위치에 놓이며, 이 거리는 코사인 유사도로 계산합니다.
- 임베딩 모델은 LLM과 별개의 모델이며, OpenAI·Cohere 같은 API나 오픈소스 모델을 가져다 사용하는 것이 일반적입니다.
이렇게 만들어진 임베딩 벡터는 결국 어딘가에 저장하고 검색할 수 있어야 합니다. 다음 글에서는 이 벡터들을 저장하고 빠르게 유사도 검색을 수행하는 벡터 DB(Vector Database)의 개념과 검색 방식을 다뤄보겠습니다.
'RAG를 활용한 LLM 서비스 구축' 카테고리의 다른 글
| STEP 6 - 벡터 DB 선택하기 (0) | 2026.07.06 |
|---|---|
| STEP 5 - 벡터 DB의 필요성 (0) | 2026.07.06 |
| STEP 3 - RAG란 무엇인가 (0) | 2026.07.03 |
| STEP 2 - LLM의 한계, Hallucination과 Knowledge Cutoff (0) | 2026.07.03 |
| STEP 1 - LLM이란, 무엇인가 (0) | 2026.07.03 |