🤖 AI/ML

임베딩

Embedding

텍스트, 이미지 등을 고차원 벡터로 변환하는 표현. 의미적 유사성을 수치화. RAG의 핵심 요소.

📖 상세 설명

임베딩(Embedding)은 텍스트, 이미지, 오디오 등의 데이터를 수치형 벡터로 변환하는 기술입니다. 이 벡터 공간에서는 의미적으로 유사한 항목들이 서로 가까이 위치하게 됩니다. 예를 들어 "왕"과 "여왕"의 임베딩 벡터는 "사과"와 "바나나"보다 더 가깝게 배치됩니다. 이를 통해 컴퓨터가 의미와 관계를 수학적으로 처리할 수 있게 됩니다.

임베딩의 차원은 표현력과 직결됩니다. OpenAI의 text-embedding-3-large는 3,072차원, Cohere의 embed-english-v3.0은 1,024차원을 사용합니다. 높은 차원은 더 풍부한 의미를 담을 수 있지만 저장 공간과 연산 비용이 증가합니다. 실무에서는 용도에 맞는 적절한 차원의 모델을 선택하는 것이 중요합니다.

임베딩은 RAG(Retrieval-Augmented Generation)의 핵심 구성요소입니다. 문서를 청크로 나누어 임베딩으로 변환하고 벡터 데이터베이스에 저장한 뒤, 사용자 질문도 임베딩으로 변환하여 유사한 문서를 검색합니다. 이렇게 검색된 관련 문서를 LLM에 제공하면 할루시네이션을 줄이고 최신 정보를 반영한 답변을 생성할 수 있습니다.

단어 수준 임베딩(Word2Vec, GloVe)에서 시작하여 문장 임베딩(Sentence-BERT), 멀티모달 임베딩(CLIP)으로 발전해왔습니다. 최근에는 한 모델로 텍스트, 이미지, 코드 등 다양한 형식을 동일한 벡터 공간에 임베딩하는 통합 임베딩 모델도 등장했습니다.

💻 코드 예제

OpenAI와 오픈소스 모델을 사용한 임베딩 생성 및 유사도 계산 예제입니다.

import numpy as np
from openai import OpenAI
from sentence_transformers import SentenceTransformer

# OpenAI 임베딩 생성
client = OpenAI()

def get_openai_embedding(text, model="text-embedding-3-small"):
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

# 텍스트 임베딩
texts = [
    "인공지능은 미래 기술입니다",
    "AI가 세상을 바꾸고 있습니다",
    "오늘 날씨가 좋습니다"
]
embeddings = [get_openai_embedding(t) for t in texts]

# 코사인 유사도 계산
def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

print(f"문장 1-2 유사도: {cosine_similarity(embeddings[0], embeddings[1]):.4f}")  # 높음
print(f"문장 1-3 유사도: {cosine_similarity(embeddings[0], embeddings[2]):.4f}")  # 낮음

# 오픈소스 모델 (Sentence-Transformers)
model = SentenceTransformer('all-MiniLM-L6-v2')  # 384차원, 빠름
embeddings_local = model.encode(texts)
print(f"로컬 모델 차원: {embeddings_local.shape}")

# 한국어 특화 모델
ko_model = SentenceTransformer('jhgan/ko-sroberta-multitask')
ko_embeddings = ko_model.encode(["안녕하세요", "반갑습니다"])
print(f"한국어 유사도: {cosine_similarity(ko_embeddings[0], ko_embeddings[1]):.4f}")

📊 임베딩 모델 비교

모델 차원 가격 (1M 토큰) 특징
text-embedding-3-large 3,072 $0.13 최고 성능, 차원 조절 가능
text-embedding-3-small 1,536 $0.02 비용 효율, 범용
Cohere embed-v3 1,024 $0.10 다국어, 검색 최적화
all-MiniLM-L6-v2 384 무료 (로컬) 오픈소스, 빠름
bge-large-en-v1.5 1,024 무료 (로컬) 오픈소스 최고 성능

🗣️ 실무에서 이렇게 말하세요

RAG 시스템 구축 논의에서

"문서 10만 건을 임베딩해서 Pinecone에 저장하면, 질문과 유사한 문서를 실시간으로 검색해서 LLM에 컨텍스트로 제공할 수 있습니다."

비용 최적화 회의에서

"text-embedding-3-small로 바꾸면 비용이 85% 절감되고, MTEB 벤치마크 기준 성능 차이는 3% 정도입니다."

검색 품질 개선 논의 시

"임베딩만으로 검색하면 키워드 매칭이 약합니다. BM25와 임베딩 점수를 조합하는 하이브리드 검색을 적용해봅시다."

⚠️ 흔한 실수 & 주의사항

📏
청크 크기 부적절

너무 작으면 컨텍스트 손실, 너무 크면 노이즈가 증가합니다. 보통 200-500 토큰이 적정합니다.

🔄
모델 불일치

저장과 검색에 다른 임베딩 모델을 사용하면 유사도 계산이 무의미해집니다. 항상 동일 모델을 사용하세요.

🌐
다국어 모델 미사용

영어 전용 모델로 한국어를 임베딩하면 품질이 급락합니다. 다국어 또는 한국어 특화 모델을 선택하세요.

💰
벡터 DB 비용 과소평가

임베딩 생성보다 벡터 저장/검색 비용이 더 클 수 있습니다. 차원 축소나 양자화를 고려하세요.

🔗 관련 용어

📚 더 배우기