5

임베딩: 텍스트를 숫자로 바꾸는 기술

Day 2: 청킹 & 임베딩

학습 목표
  • 임베딩의 원리와 필요성을 이해한다
  • 주요 임베딩 모델을 비교할 수 있다
  • 제조 한글 문서에 적합한 임베딩 모델을 선택할 수 있다
최종 검수: 2026-07

임베딩이란?

임베딩(Embedding) = 텍스트를 숫자 벡터로 변환하는 기술

"CNC 서보 에러" → [0.23, -0.45, 0.67, ..., 0.12]  (1536차원)

왜 숫자로 바꾸나?
→ 컴퓨터는 텍스트의 "의미"를 이해 못한다.
→ 숫자 벡터로 바꾸면 의미의 유사도를 계산할 수 있다.

핵심 원리: 의미가 비슷하면 벡터도 비슷하다

"CNC 서보 에러"     → [0.23, -0.45, 0.67, ...]
"CNC 서보 알람"     → [0.24, -0.44, 0.66, ...]  ← 매우 유사!
"유압 프레스 사양"  → [0.78, 0.12, -0.34, ...]   ← 완전 다름

코사인 유사도 (아래 값은 원리를 보이기 위한 예시다):
  "서보 에러" vs "서보 알람"    → 높다   (표현이 달라도 같은 것을 가리킨다)
  "서보 에러" vs "유압 사양"    → 낮다   (다른 설비, 다른 주제)
  "서보 에러" vs "서보 모터"    → 중간   (같은 계통, 다른 대상)

이 세 값을 오늘 실습에서 직접 잰다. 모델마다 눈금이 다르므로 "0.97이면 유사"처럼 외울 수 있는 값이 아니다. 자기 모델에서 잰 숫자를 여기에 적어 두고, 그 눈금으로 이후의 판단을 한다.


임베딩 모델 비교: 2024-2025 기준

API 기반 (클라우드)

모델차원최대 토큰가격한글 성능
OpenAI text-embedding-3-small15368191$0.02/1M양호
OpenAI text-embedding-3-large30728191$0.13/1M우수
Voyage-3102432000$0.06/1M우수
Cohere embed-v31024512$0.10/1M양호

오픈소스 (로컬)

모델차원최대 토큰크기한글 성능
BGE-M3102481922.3GB최우수
multilingual-e5-large10245122.2GB우수
gte-multilingual76881921.5GB우수
KoSimCSE768512500MB한국어 특화

제조 한글 문서에 뭘 써야 하나?

결론부터:

[프로토타입 / 빠른 구현]
→ OpenAI text-embedding-3-small
  이유: API 한 줄이면 동작, 한글 성능 충분

[프로덕션 / 비용 절감]
→ BGE-M3
  이유: 무료, 한국어 최강, 로컬 실행

[보안 제약 (공장 내 데이터 반출 불가)]
→ BGE-M3 또는 KoSimCSE
  이유: 완전 로컬 실행, API 호출 없음

임베딩 차원(Dimension)의 의미

차원이 높을수록:
├── 더 정밀한 의미 표현 가능
├── 저장 공간 더 많이 필요
├── 검색 속도 약간 느림
└── 반드시 더 좋은 것은 아님!

OpenAI가 공표한 MTEB 영어 평균 (2024년 발표 기준):
  text-embedding-3-small (1536차원): 62.3점
  text-embedding-3-large (3072차원): 64.6점

→ 차원을 두 배로 늘렸는데 점수 차이는 그만큼 벌어지지 않는다.
   차원 수는 성능의 상한을 조금 넓힐 뿐 성능 자체가 아니다.

여기에 다국어 모델을 같은 표로 세우지 않는 이유가 있다. MTEB 영어 평균은 영어 과제에서 잰 값이라 한국어 성능을 말해 주지 않는다. 한국어 문서로 쓸 모델을 고른다면 MIRACL의 한국어 부분처럼 한국어 검색을 평가한 자료를 보거나, 가장 확실하게는 자기 문서와 자기 질문으로 직접 재야 한다. Day 3 실습에서 같은 문서를 두 모델에 각각 넣어 그 차이를 잰다.


코사인 유사도 직관적 이해

코사인 유사도 = 두 벡터가 같은 방향을 향하는 정도

 1.0: 완전히 같은 방향
 0.0: 직교
-1.0: 정반대 방향

주의할 것은 **눈금이 모델마다 다르다**는 점이다.
어떤 모델은 무관한 문장 쌍도 0.2~0.3에 몰아 놓고 정답 쌍을 0.5 언저리에 두며,
다른 모델은 전체를 더 높은 쪽으로 끌어올린다.
그래서 "0.7 이상이면 관련 문서"처럼 고정된 값은 존재하지 않는다.

임계값은 정하는 것이 아니라 재는 것이다. 절차는 이렇다.

  1. 이 문서 묶음과 관련 없는 질문을 열 개쯤 만든다
  2. 각각 검색해 그때 나오는 최고 유사도를 기록한다
  3. 그 값들의 최댓값보다 조금 위를 기준선으로 잡는다
  4. 모델이나 문서를 바꾸면 1번부터 다시 한다

Day 4 완성 코드의 calibrate_threshold()가 이 네 단계를 그대로 한다.


주의: 임베딩 모델 일관성

인덱싱과 검색에 반드시 같은 모델을 사용해야 한다.

❌ 잘못된 예:
   인덱싱: text-embedding-3-large (3072차원)
   검색:   text-embedding-3-small (1536차원)
   → 차원이 달라서 검색 자체가 불가능!

❌ 미묘한 실수:
   인덱싱: BGE-M3 v1.0
   검색:   BGE-M3 v1.5 (업데이트됨)
   → 같은 모델이지만 벡터 공간이 달라져 정확도 저하

✅ 올바른 방법:
   EMBEDDING_MODEL = "text-embedding-3-small"
   # 인덱싱과 검색 모두 이 변수 참조
AI로 학습하기 — 꿀팁
임베딩 모델 성능 주장 사실 확인AI 학습 팁

임베딩 모델 벤치마크 결과는 자주 오인되거나 최신 정보가 아닐 수 있으므로, 제조 도메인에서의 실제 성능을 비판적으로 검증해야 한다.

임베딩 모델에 대한 다음 주장들을 검증해줘: 1) 'text-embedding-3-large는 항상 text-embedding-ada-002보다 제조 기술문서 검색에서 우수하다', 2) '한국어 제조 문서에는 multilingual 임베딩 모델이 영어 전용 모델보다 반드시 더 나은 성능을 낸다', 3) '임베딩 차원 수가 높을수록 검색 정확도가 항상 높아진다', 4) '코사인 유사도와 내적(dot product)은 정규화된 벡터에서 항상 동일한 순위를 산출한다'. 각 주장에 대해 맞음/틀림/조건부 판정과 함께 제조 도메인 RAG에서 임베딩 모델 선택 시 실제로 중요한 기준 3가지를 알려줘.
이 팁이 도움이 됐나요?
용어