💡 핵심 인사이트 임베딩(Embedding)은 텍스트, 이미지, 오디오 등 비정형 데이터를 **고차원 벡터(숫자 배열)로 변환**하는 과정입니다. "집에 가고 싶다"와 "집으로いたい"는 다른 언어이지만 (뉘앙스가 다름), 컴퓨터는 이를 (원래는) 이해하지 못합니다. 임베딩 모델은 이러한 데이터를 **"의미적 유사성"이 반영된 벡터 공간**에 매핑하여, (비슷한 의미의 데이터가 벡터 공간에서 가깝게 위치)하게 합니다. 이를 통해 컴퓨터는 "비슷한 것을 찾기, 문장의 분류, 감정 분석" 등을 수학적으로 수행할 수 있습니다.
Ⅰ. 임베딩의 기본 개념: 의미를 숫자로
컴퓨터는 숫자만 이해합니다. 그래서 "문장, 이미지, 소리"를 **숫자 배열(벡터)**로 변환해야 합니다.
[텍스트를 벡터로 변환]
입력 텍스트: "강아지와 고양이"
│
│ 임베딩 모델 (예: Word2Vec, BERT)
▼
[ 0.234, -0.891, 0.456, -0.123, 0.789, ... , -0.567 ]
128차원 또는 1536차원의 부동소수점 배열
의미적 관계:
"강아지" → [ 0.2, -0.9, ... ]
"개" → [ 0.25, -0.85, ... ] ← "강아지"와 의미가 가깝다
"고양이" → [-0.7, 0.4, ... ] ← "강아지"와는 거리가 있다
"자동차" → [-0.9, -0.8, ... ] ← "강아지"와는 매우 거리가 있다
단어 vs 문장 vs 문서 임베딩:
-
Word Embedding (Word2Vec, GloVe)
- 단어 하나를 벡터로 변환
- "king - man + woman = queen" (유추(Analogy) 가능)
-
Sentence/Document Embedding
- 문장 또는 문서 전체를 벡터로 변환
- "문장 내 단어들의 맥락을 모두 고려"
- 예: SBERT (Sentence-BERT)
-
Multimodal Embedding
- 텍스트 + 이미지 + 오디오를同一 벡터 공간에 매핑
- 예: CLIP (이미지와 텍스트를同一 공간에)
Ⅱ. 임베딩 모델의 동작 원리: 신경망 기반 변환
임베딩 모델은 **신경망(Neural Network)**을 통해 데이터를 벡터로 변환합니다.
[임베딩 모델 동작 원리]
┌─────────────────────────────────────────────────────────────────┐
│ BERT 임베딩 과정 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 입력: "오늘 날씨가非常好" │
│ │
│ 1. 토큰화 (Tokenization) │
│ ['오늘', '날씨', '가', '非常好'] (Subword 토큰화) │
│ │
│ 2. 토큰 → 벡터 변환 (Embedding Layer) │
│ 각 토큰을 768차원 벡터로 변환 │
│ │
│ 3. 위치 인코딩 (Positional Encoding) │
│ 토큰의 순서 정보 추가 │
│ │
│ 4. 트랜스포머 인코더 (Transformer Encoder) │
│ Self-Attention을 통해 문맥 고려 │
│ "오늘"은 앞뒤 단어와의 관계를 파악 │
│ │
│ 5. 출력: 각 토큰의 임베딩 벡터 │
│ [0.12, -0.34, 0.56, ...] (768차원) │
│ [0.98, -0.12, 0.34, ...] (768차원) │
│ [0.45, -0.67, 0.89, ...] (768차원) │
│ [-0.23, 0.45, -0.67, ...] (768차원) │
│ │
│ ※ 문장 전체의 벡터가 필요하면: │
│ - CLS 토큰의 출력 벡터 사용 │
│ - 또는 모든 토큰 벡터의 평균 (Mean Pooling) │
│ │
└─────────────────────────────────────────────────────────────────┘
Self-Attention의 개념: 각 토큰이 문장 내 다른 토큰들과 **얼마나 관련이 있는지**를 가중치로 계산합니다. "오늘[SEP]날씨가_좋다"에서 "좋"은 "날씨"와 밀접하게 관련됩니다.
Ⅲ. 주요 임베딩 모델
[주요 임베딩 모델 및 특성]
┌─────────────────────────────────────────────────────────────────┐
│ 임베딩 모델 비교 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 텍스트 임베딩: │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ OpenAI Embeddings ││
│ │ - text-embedding-3-small (1536차원, 빠름/저렴) ││
│ │ - text-embedding-3-large (3072차원, 고품질) ││
│ │ - ada-002 (1536차원, 이전 세대) ││
│ └─────────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ Sentence Transformers (SBERT) ││
│ │ - all-MiniLM-L6-v2 (384차원, 빠름) ││
│ │ - all-mpnet-base-v2 (768차원, 고품질) ││
│ │ - 다국어 지원 (paraphrase-multilingual-MiniLM-L12-v2) ││
│ └─────────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ AWS Bedrock / Titan ││
│ │ - amazon-embeddings-v1 ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
│ 다중modal 임베딩: │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ OpenAI CLIP ││
│ │ - 이미지와 텍스트를同一 512차원 벡터 공간에 매핑 ││
│ │ - "이 이미지와匹配的 텍스트를 찾아라" 가능 ││
│ └─────────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ Meta AI ImageBind ││
│ │ - 6가지 modality (이미지, 텍스트, 오디오, 비디오, 깊이, 열) ││
│ │ - 모든 modality를同一 공간에 매핑 ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────┘
Ⅳ. 벡터 간 거리: 유사도를 측정하는 방법
벡터 간 **유사도(Similarity)**를 측정하는 주요 방법입니다.
[유사도 측정 방법]
1. 코사인 유사도 (Cosine Similarity) - 가장 많이 사용
- 두 벡터 간의 각도를 측정
- 범위: -1 ~ 1 (1이면 동일 방향)
- 텍스트 임베딩에 특히 적합
Cosine(A, B) = (A · B) / (|A| × |B|)
= Σ(Aᵢ × Bᵢ) / √(ΣAᵢ²) × √(ΣBᵢ²)
2. 유클리디안 거리 (L2 Distance)
- 두 벡터 간의 직선 거리
- 값이 작을수록相似
- 이미지 임베딩에 적합
L2(A, B) = √(Σ(Aᵢ - Bᵢ)²)
3. 내적 (Dot Product)
- 벡터 성분의 곱의 합
- 값이 클수록相似
- 정규화된 벡터에서 Cosine과 유사
Dot(A, B) = Σ(Aᵢ × Bᵢ)
[예시]
벡터 A: [1, 0, 0] (x축 방향)
벡터 B: [1, 0, 0] (x축 방향, A와 동일)
벡터 C: [0, 1, 0] (y축 방향, A와 수직)
Cosine(A, B) = 1.0 ← 完全 일치
Cosine(A, C) = 0.0 ← 完全 다름
Ⅴ. 임베딩의 실제 적용과 📢 비유
임베딩 활용의 실제 흐름:
[AI 애플리케이션의 임베딩 활용]
1. 데이터 임베딩
┌──────────────────────────────────────────────┐
│ documents = ["문서1 내용...", "문서2 내용...",]│
│ │ │
│ embeddings = embed_model.encode(documents)│ │
│ # 각 문서가 1536차원 벡터로 변환 │ │
└──────────────────────────────────────────────┘
│
▼
2. 벡터 DB 저장
┌──────────────────────────────────────────────┐
│ vector_db.add(embeddings, documents) │
│ # Pinecone, Milvus, PGVector 등 │
└──────────────────────────────────────────────┘
│
▼
3. 검색 시 쿼리 벡터화
┌──────────────────────────────────────────────┐
│ query = "사용자의 질문" │
│ query_vector = embed_model.encode(query) │
└──────────────────────────────────────────────┘
│
▼
4. ANN 검색
┌──────────────────────────────────────────────┐
│ results = vector_db.search(query_vector, k=5) │
│ # Top-5 유사 문서检索 │
└──────────────────────────────────────────────┘
│
▼
5. LLM에 컨텍스트로 제공
→ RAG 파이프라인 완성
임베딩 차원의Trade-off:
- 높은 차원: 더 많은 정보를 담을 수 있지만, 저장/계산 비용 증가, "차원의 저주" 문제
- 낮은 차원: 비용 절약되지만, 정보 손실 가능, 구분 능력 저하
- 실무 선택: OpenAI는 1536차원, SBERT는 384~768차원, CLIP은 512차원
📢 섹션 요약 비유: 임베딩은 **"수천 년의 역사를压缩한 박물관에 비유"**할 수 있습니다. (각 전시품(텍스트/이미지)들이) "유사한 시대, 유사한 문화, 유사한 의미"별로 (연결되게) 진열되어 있어서, (방문객(사용자 질의)이) "_이것과 비슷한 것을 보고 싶다"_고 하면 (바로 옆에서) "유사한 전시품을 찾을 수 있는" 것입니다. 다만 (압축 과정에서) "일부 디테일이 떨어져 나갈" (정보 손실) 수 있고, (부차적으로) "너무 많은 전시품을 한꺼번에 보여주면) (방문객이 혼란)을 느낄 (차원의 저주) 수 있습니다. (적절한 차원 선택과) (임베딩 모델 선택이) (성능을 좌우하는) 핵심입니다.