Embedding 개념

0. 왜 임베딩이 중요한가?

  • 검색(Search): “강원도 캠핑장 추천”을 검색할 때, 의미가 비슷한 문서를 빠르게 찾는다.
  • 추천(Recommender): “이 노래 좋아하면 이런 곡도 좋아할 것”이라는 거리 근접성을 계산한다.
  • RAG(Retrieval-Augmented Generation): LLM이 답변하기 전에 관련 청크를 찾아 프롬프트에 주입한다.

본질적으로 임베딩은 “의미가 비슷하면 벡터(숫자)가 가까워지도록” 학습된 함수이다.


1. 용어 먼저 정리하기

기호 의미 쉬운 비유
V (Vocabulary size) 모델이 직접 구분할 수 있는 서브워드 조각 개수. 일반적으로 30k ~ 50k. 영어 알파벳 26자 + 자주 쓰는 ‘글자 조각’ 목록
D (Embedding dimension) 하나의 토큰을 표현할 숫자 좌표 수. BERT 계열은 768, 1024 등. 단어를 설명할 “색, 크기, 맛 …” 속성 768가지
n 입력 문장이 토큰화돼 나온 토큰 길이. 입·출력마다 달라진다. “안녕하세요” → n=2, “반갑습니다” → n=3
청크(Chunk) 문서 일부(약 200-400토큰)를 의미 보존·LLM 프롬프트에 넣기 적당한 단위. 한 장짜리 챕터 요약본

2. 임베딩의 역사 – “통계 → 문맥 → 다국어”

세대 대표 기법 핵심 아이디어
① 통계 시대 원-핫, TF-IDF 빈도로만 표현, 문맥 無 → 희소·고차원
② 예측 시대 Word2Vec (2013) 주변 단어 예측(CBOW/Skip-gram)으로 의미 좌표 획득
③ 확장 FastText 서브워드 포함 → OOV(Out-Of-Vocab) 완화
④ 문서 단위 Doc2Vec, Siamese 문장·문단 직접 벡터 학습
⑤ 컨텍스트 시대 ELMo (2018) 양방향 LSTM, 다의어 구분
⑥ Transformer BERT (2018~) Self-Attention, Masked LM → 문맥 의존 임베딩
⑦ 응용 Sentence-BERT, LaBSE ‘문장 쌍 유사도’ 태스크 재학습 → RAG 최적

3. 내부 동작

토큰화(Tokenize) → ID 시퀀스 → 임베딩 행렬 조회(E) → (n × D) 행렬 → 풀링 → D차원 벡터

3-1. 토큰화

  1. 문자열을 서브워드로 쪼갠다.
  2. 각 서브워드는 V 크기 어휘집에서 고정 ID를 갖는다.

예) “안녕하세요” → [1542, 2350], n=2.

3-2. 임베딩 행렬 조회

  • 학습 완료된 E ∈ ℝV×D 가 GPU 메모리에 상주한다.
  • ID = 1542 라면 E[1542] 행을 그대로 복사한다.
  • n개 토큰이면 (n × D) 행렬이 쌓인다.

3-3. 시퀀스 압축(Pooling)

방법 직관 파이썬 한 줄
평균(Mean) “모든 토큰 벡터 평균이 문장 의미” vec = emb.mean(0)
최대(Max) “각 차원 중 가장 강한 특징” vec = emb.max(0)
[CLS] Transformer가 문장 대표로 내놓는 첫 토큰 vec = emb[0]

풀링이 n을 지워버리므로 최종 결과는 항상 D차원이다.


4. 예제로 따라가기

가정 : V=50k, D=768, 문장 길이 n=4.

“AI 임베딩 재미있다”
 └▶ [1010, 4123, 9981, 7777]  (n=4)
      ↓
E[1010]…E[7777]   →   (4 × 768) 행렬
      ↓ 평균
하나의 768차원 벡터 완성

이제 이 벡터 한 줄이 “AI 임베딩 재미있다”의 의미 좌표다.


5. 청크가 벡터 하나가 되는 이유

구분 과정 결과 크기
문장 (n≈20) 토큰화 → 조회 → 풀링 1 × 768
청크 (n≈300) 동일 과정 1 × 768
문서(수천) 너무 길어 여러 청크로 나눔 청크 개수 × 768
  • 즉 길이가 다를 뿐 토큰-ID-조회-풀링 공식은 불변이다.
  • RAG는 이렇게 만든 “청크 벡터”끼리 코사인 유사도를 계산해 “관련 청크 k개”를 뽑는다.

6. RAG 파이프라인 속 임베딩

flowchart LR
    A[문서 PDF] -->|청크 분할| B[청크 리스트]
    B --> C[SBERT 임베딩] --> D[(FAISS 인덱스)]
    U[사용자 질문] --> Cq[질문 임베딩] --> D
    D -->|Top-k ID| E{청크 원문}
    E -->|컨텍스트| L[LLM 생성] --> O[답변]
  1. 오프라인: 문서 → 청크 → 벡터 .npy + id_map 저장 후 인덱싱.
  2. 온라인: 질문 벡터 ↔ 인덱스 → 관련 청크 → LLM 프롬프트 주입.

7. 메타데이터 주입과 하이브리드 검색

기법 한 줄 요약 장점
벡터+메타 Concatenate [텍스트 벡터 ‖ 날짜 벡터] 시간·카테고리 필터링까지 한 방에
Sparse+Dense Hybrid BM25 1차 후보 → 임베딩 재랭크 키워드·의미 둘 다 잡는다
재랭킹 가중치 최종 점수 = cosSim × (1+신뢰도) 구조화 점수(저자, 권위 등) 반영

8. 실전 엔지니어링 팁

체크포인트 이유·팁
청크 크기 200~400 토큰. 너무 작으면 맥락 손실, 너무 크면 LLM 입력 초과.
.npy np.save()로 (N,768) 한 번 저장 → 모델 재실행 無.
id_map np.save("id_map.npy", np.array(pks)) → 검색 결과 해석용.
인덱스 선택 IndexFlatIP: 소규모 디버그 / HNSW, IVF: 대용량 운영
8-bit 양자화 메모리 4×↓, 속도 ↑. 검색 정확도 1~2% 감소 수준.
GPU-FAISS 수억 벡터도 ms 단위 검색. Docker로 쉽게 배포 가능.

9. 최신 트렌드

  1. 경량화 모델: DistilBERT, TinyBERT, MiniLM → 모바일 온-디바이스 임베딩.
  2. LoRA·QLoRA 파인튜닝: 수 MB 추가 파라미터만으로 도메인 적응.
  3. 멀티모달 벡터: CLIP, Gemini Vision으로 텍스트+이미지 검색.
  4. pgvector v4: Postgres에서도 Dense+Sparse 동시 질의.
  5. RAFT + GPU-FAISS: 대용량 인덱스 장애 복구·마이그레이션 자동화.

10. 한계와 주의점

영역 제약·위험
다의어 완전 해결 X BERT도 극단적 문맥은 오해할 수 있다.
OOV 특수문자 OCR 오류·이모지 등은 서브워드 분해로 의미 희석.
데이터 편향 훈련 코퍼스 쏠림 → 벡터 편향 → 추천·검색 편향.
운영 비용 대형 Transformer 100 ms↑ → Distillation·캐싱 필수.

11. 치트시트 (요약표)

질문 3초 답
임베딩이란? 텍스트 ➜ 고정 차원 벡터 변환 함수
V, D? V = 어휘집 크기, D = 벡터 차원
문장·청크 차이? 길이만 다름. 과정은 동일 → 둘 다 벡터 하나
RAG 흐름? 질문 벡터 ↔ 인덱스 ↔ 관련 청크 ↔ LLM
필수 파일? .npy 벡터, id_map 매핑
좋은 청크 크기? 200 ~ 400 토큰

12. 마무리

임베딩은 “텍스트를 숫자로 번역” 하는 인공지능의 관문이다.

Word2Vec에서 BERT·SBERT까지 진화하며 검색, 추천, RAG의 필수 모듈이 되었고,

메타데이터 주입·하이브리드 검색·경량화로 서비스 품질운영 효율을 동시에 잡는다.


참고 자료

  • Mikolov et al., Efficient Estimation of Word Representations in Vector Space (2013)
  • Reimers & Gurevych, Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (2019)
  • Facebook Research, FAISS: https://github.com/facebookresearch/faiss
  • Sentence-Transformers: https://sbert.net
  • OpenAI text-embedding-ada-002 API: https://platform.openai.com/docs/api-reference/embeddings
위로 스크롤