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

임베딩 contract

임베딩 모델 은 string 받아서 고정 길이 float 리스트, 즉 벡터 를 돌려주는 신경망이야. 학습할 때 비슷한 의미의 텍스트가 가까운 벡터를 만들도록 훈련됨. 각 차원이 뭘 의미하는지는 본인이 못 골라 — 모델이 수십억 문서로 사전학습하면서 알아서 배운 거야.

첫날부터 두 가지 박아둬:

  1. 같은 모델로 query 와 document 둘 다 인코딩. 모델 섞으면 유사도 자체가 무의미해 — 벡터들이 서로 다른 좌표계에 살거든.
  2. 벡터에는 차원이 있어. 흔한 사이즈: 384 (작고 빠름), 768 (중간), 1024–1536 (프로덕션 sweet spot), 3072 (OpenAI / Voyage 최상위). 차원 클수록 미묘한 의미를 더 잡지만 저장도 비교도 비싸져.

로컬에서 임베딩 한번 돌려봐

가장 쉬운 첫걸음은 sentence-transformers 에 작은 모델. CPU 에서 돌고, 가중치는 한 번만 받고, NumPy array 돌려줘서 바로 까볼 수 있어. 벡터 한번 print 해보고 관련된 두 문장이 무관한 두 문장보다 가깝다는 거 눈으로 보면, 이후 코스는 그냥 엔지니어링이야.

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 유사도 매트릭스 print. 무관하다고 판단한 페어를 어느 모델이 더 잘 떼어놓는지 봐.

Progress

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

댓글 0

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

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