💡 핵심 인사이트 임베딩(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 문서 임베딩:

  1. Word Embedding (Word2Vec, GloVe)

    • 단어 하나를 벡터로 변환
    • "king - man + woman = queen" (유추(Analogy) 가능)
  2. Sentence/Document Embedding

    • 문장 또는 문서 전체를 벡터로 변환
    • "문장 내 단어들의 맥락을 모두 고려"
    • 예: SBERT (Sentence-BERT)
  3. 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차원

📢 섹션 요약 비유: 임베딩은 **"수천 년의 역사를压缩한 박물관에 비유"**할 수 있습니다. (각 전시품(텍스트/이미지)들이) "유사한 시대, 유사한 문화, 유사한 의미"별로 (연결되게) 진열되어 있어서, (방문객(사용자 질의)이) "_이것과 비슷한 것을 보고 싶다"_고 하면 (바로 옆에서) "유사한 전시품을 찾을 수 있는" 것입니다. 다만 (압축 과정에서) "일부 디테일이 떨어져 나갈" (정보 손실) 수 있고, (부차적으로) "너무 많은 전시품을 한꺼번에 보여주면) (방문객이 혼란)을 느낄 (차원의 저주) 수 있습니다. (적절한 차원 선택과) (임베딩 모델 선택이) (성능을 좌우하는) 핵심입니다.