본문 바로가기
C.W.K.
Stream
Lesson 02 of 06 · published

임베딩: 텍스트가 숫자로

~24 min · embeddings, models, intuition

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

텍스트를 숫자 좌표로 바꾸는 약속

임베딩 모델은 문자열을 받아 길이가 정해진 실수 목록, 곧 벡터를 내놓는 신경망이야. 학습할 때 뜻이 비슷한 텍스트끼리 가까운 벡터가 되도록 익혀. 각 차원이 무엇을 뜻할지는 우리가 정하지 않아. 모델이 수십억 개 문서를 보며 스스로 좌표계를 만든 거야.

처음부터 두 가지를 단단히 기억해:

  1. 쿼리와 문서는 반드시 같은 모델로 인코딩해. 모델을 섞으면 서로 다른 좌표계의 점을 비교하게 되니 유사도에 의미가 없어.
  2. 벡터에는 차원 수가 있어. 흔히 384차원은 작고 빠르고, 768차원은 중간, 1024–1536차원은 실전에서 많이 쓰며, OpenAI와 Voyage의 최상위 모델은 3072차원까지 가. 차원이 커지면 미묘한 의미를 더 담을 수 있지만 저장과 비교 비용도 늘어.

로컬에서 첫 벡터를 뽑아봐

가장 쉬운 시작은 sentence-transformers와 작은 모델이야. CPU에서도 돌고 가중치는 한 번만 받으면 돼. 결과가 NumPy 배열이라 바로 들여다볼 수도 있지. 직접 벡터를 출력하고, 관련된 두 문장이 무관한 문장보다 더 가깝다는 걸 눈으로 확인해봐. 그 순간부터 나머지는 신비가 아니라 엔지니어링이 돼.

Code

sentence-transformers 로 첫 임베딩·python
from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer('BAAI/bge-small-en-v1.5')   # 384차원, ~30MB
vecs = model.encode([
    'How do I cancel my annual plan?',
    'I want to end my yearly subscription.',
    'What time does the moon rise tonight?',
])
print(vecs.shape)         # (3, 384)
print(np.linalg.norm(vecs, axis=1))   # 정규화 확인
관련 문장이 무관한 문장보다 가까운지 확인·python
from numpy import dot
from numpy.linalg import norm

def cos(a, b):
    return dot(a, b) / (norm(a) * norm(b))

print('related   :', cos(vecs[0], vecs[1]))   # ~0.85+
print('unrelated :', cos(vecs[0], vecs[2]))   # ~0.10–0.20

External links

Exercise

문장 10개를 골라 두 모델로 임베딩해봐. 하나는 384차원, 다른 하나는 1024차원으로 골라. 모델마다 cosine 유사도 행렬을 출력하고, 뜻이 무관한 문장 쌍을 어느 모델이 더 멀리 떼어놓는지 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.