텍스트 임베딩(Text Embedding)은 문장이나 문단을 고정 길이의 숫자 배열(벡터)로 바꾸는 것이다. 잘 학습된 임베딩 모델은 뜻이 비슷한 글을 가까운 좌표에 놓는다. "같은 클래스 안에서 부르면 트랜잭션이 안 먹는 이유"와 자기 호출 문제 노트는 겹치는 단어가 거의 없어도 가깝게 놓인다. 그래서 키워드 검색이 놓치는 글도 찾을 수 있다. RAG (검색 증강 생성)의 검색 단계가 이 원리를 쓴다.
가까움을 재는 법
- 보통 코사인 유사도(Cosine Similarity)로 잰다. 두 벡터가 같은 방향이면 1, 직각이면 0, 반대 방향이면 -1이다
- 벡터 길이를 1로 맞춰 두면(L2 정규화) 코사인 유사도는 내적(같은 자리끼리 곱해 더한 값)과 같다. 그래서 검색은 곱셈과 덧셈의 반복이 된다
- 점수는 상대적이다. 모델에 따라 관련 없는 글도 0.5~0.6이 나오므로 "0.7 이상이면 관련 있음" 같은 고정 기준보다 순위로 쓴다
지켜야 할 것
- 문서와 질문은 같은 모델, 같은 버전으로 임베딩한다. 모델마다 좌표계가 달라서 섞으면 오류 없이 엉뚱한 결과만 나온다. 문서 벡터를 저장해 둔다면 모델 버전도 함께 고정한다
- 여러 모델이 용도를 알려 주는 접두사(prefix)를 붙이도록 학습된다. EmbeddingGemma 2는 검색 질문에
task: search result | query:, 문서에title: … | text:를 붙인다(제목이 없으면title: none). 접두사를 빼도 동작은 하지만 품질이 떨어지므로 모델 카드의 형식을 따른다 - 임베딩 모델은 문장을 만들지 못한다. 텍스트를 넣으면 숫자가 나올 뿐이다. 답을 문장으로 쓰려면 생성 모델이 따로 필요하다
차원 줄이기 (MRL)
MRL(Matryoshka Representation Learning)로 학습한 모델은 벡터의 앞쪽 일부만 잘라 써도 품질이 크게 떨어지지 않는다. 러시아 인형처럼 큰 벡터 안에 작은 벡터가 들어 있는 셈이다. EmbeddingGemma 2는 768차원 벡터를 낸다. 모델 카드에 따르면 256차원으로 잘라도 MTEB(Massive Text Embedding Benchmark) 다국어 점수는 61.36에서 60.41로 1점 가까이 떨어진다(코드 점수는 약 2.5점). 저장 공간은 3분의 1이 된다.
잘라 낸 벡터는 길이가 1이 아니므로 다시 정규화해야 한다. 이를 빠뜨리면 에러 없이 순위만 틀어진다. 숫자 하나하나를 더 작은 타입으로 줄이는 방법은 모델 양자화에서 다룬다.
직접 구현한 사례는 브라우저 안에서 도는 RAG 구현기에 있다.
출처: Matryoshka Representation Learning Kusupati et al.(2022) · EmbeddingGemma 2 모델 카드 Google DeepMind