벡터 임베딩
벡터 임베딩 (Vector Embeddings)
OpenAI의 텍스트 임베딩은 텍스트 문자열 간의 연관성을 수치로 측정해요. 검색, 군집화, 추천, 이상 탐지, 분류 등 다양한 작업의 기반이 되는 기술이죠. 임베딩은 부동소수점 숫자의 벡터(리스트)이고, 두 벡터 사이의 거리가 연관성을 나타내요. 거리가 작을수록 연관성이 높다는 뜻이에요.
무엇에 쓰이나
텍스트 임베딩은 주로 이런 곳에 쓰여요.
- 검색: 질의 문자열과의 연관성 순으로 결과 정렬
- 군집화: 유사도 기준으로 텍스트 묶기
- 추천: 연관된 텍스트를 가진 항목 추천
- 이상 탐지: 연관성이 낮은 이상치 식별
- 다양성 측정: 유사도 분포 분석
- 분류: 가장 유사한 레이블로 텍스트 분류
임베딩 얻기
임베딩을 얻으려면 embeddings API 엔드포인트에 텍스트 문자열과 임베딩 모델 이름을 함께 보내요.
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
input="Your text string goes here", model="text-embedding-3-small"
)
print(response.data[0].embedding)
curl https://api.openai.com/v1/embeddings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"input": "Your text string goes here",
"model": "text-embedding-3-small"
}'
응답에는 임베딩 벡터와 일부 메타데이터가 함께 들어 있어요. 벡터를 뽑아 벡터 데이터베이스에 저장하고 여러 사용 사례에 활용할 수 있어요. 기본적으로 text-embedding-3-small은 벡터 길이가 1536, text-embedding-3-large는 3072예요. 개념 표현 속성을 잃지 않으면서 차원을 줄이려면 dimensions 파라미터를 넘기면 돼요.
임베딩 모델
OpenAI는 두 개의 3세대 임베딩 모델(모델 ID의 -3이 그 표시)을 제공해요. 가격은 input 토큰당 부과돼요. 대표 값은 이래요(대략 페이지당 800토큰 기준).
| Model | 달러당 페이지 수(약) | MTEB 성능 | Max input |
|---|---|---|---|
| text-embedding-3-small | 62,500 | 62.3% | 8192 |
| text-embedding-3-large | 9,615 | 64.6% | 8192 |
| text-embedding-ada-002 | 12,500 | 61.0% | 8192 |
임베딩 차원 줄이기
큰 임베딩은 보관·검색에 더 많은 비용·컴퓨팅·메모리·저장 공간이 들어요. 두 신형 임베딩 모델은 개발자가 성능과 비용을 맞바꿀 수 있게 훈련됐어요. dimensions API 파라미터로 시퀀스 끝의 숫자를 일부 잘라도 개념 표현 속성이 유지돼요. 예를 들어 MTEB 기준에서 text-embedding-3-large를 256 크기로 줄여도, 잘리지 않은 text-embedding-ada-002(1536)보다 성능이 좋아요.
일반적으로 임베딩 생성 시 dimensions를 쓰는 게 권장돼요. 다만 어떤 경우엔 생성 후 차원을 바꿔야 할 수도 있는데, 수동으로 바꿀 땐 정규화하는 걸 잊지 마세요.
만약 벡터 저장소가 1024차원까지만 지원한다면, 최고 모델인 text-embedding-3-large를 쓰면서 dimensions를 1024로 지정해 3072차원을 줄일 수 있어요. 약간의 정확도를 맞바꾸는 대신 벡터 크기를 줄이는 거죠.
사용 사례
대표 사용 사례는 다음과 같아요.
- 임베딩 기반 검색을 통한 질의응답: 학습 데이터에 없는 핵심 사실을 모델의 컨텍스트 윈도우에 넣는 방식. 효과적이지만 토큰 비용이 높아져요. 임베딩 기반 검색과 트레이드오프를 비교해요.
- 임베딩을 이용한 텍스트 검색: 쿼리와 각 문서의 임베딩 벡터 사이의 코사인 유사도로 가장 관련 높은 문서를 찾아요.
- 임베딩을 이용한 코드 검색: 텍스트 검색과 유사하게, 저장소의 파이썬 함수를 임베딩으로 인덱싱하고 자연어 쿼리와 코사인 유사도를 계산해요.
- 임베딩을 이용한 추천: 벡터 간 거리가 짧을수록 유사하므로 추천에 유용해요. 문자열 목록과 하나의 소스 문자열을 임베딩해 유사도 순으로 정렬하면 기본 recommender가 돼요.
- 2D 데이터 시각화: 고차원 임베딩을 t-SNE 알고리즘으로 2차원에 투영해 살펴봐요.
- ML 알고리즘의 텍스트 특성 인코더: 임베딩을 자유 텍스트 특성 인코더로 쓰면 입력에 자유 텍스트가 있을 때 ML 모델 성능이 개선돼요. SVD·PCA로 차원을 10%만 줄여도 다운스트림 성능이 나빠지는 걸 보면 임베딩 표현이 매우 풍부하다는 걸 알 수 있어요.
- 회귀·분류: 임베딩 특성으로 리뷰 평점 같은 수치를 예측하고, 실제 점수와의 평균 절대 오차를 줄이도록 학습해요.
- 제로샷 분류: 레이블링된 학습 데이터 없이, 각 클래스 이름·설명을 임베딩해 새 텍스트와 가장 유사한 클래스를 예측해요.
negative/positive같은 레이블 임베딩과 비교하는 방식이죠. - 콜드스타트 추천: 사용자 임베딩은 그 리뷰들의 평균, 제품 임베딩은 그 제품 리뷰들의 평균으로 얻을 수 있어요.
- 군집화: 텍스트를 의미 있는 벡터 표현으로 만들어 비지도 방식으로 숨은 그룹을 찾아요. KMeans 등으로 클러스터를 발견해요.
FAQ
문자열의 토큰 수를 어떻게 알까요? Python에선 OpenAI 토크나이저 tiktoken으로 셀 수 있어요. text-embedding-3-small 같은 3세대 모델은 cl100k_base 인코딩을 사용해요.
K개의 가장 가까운 벡터를 빠르게 찾으려면? 많은 벡터를 빠르게 검색하려면 벡터 데이터베이스를 권장해요.
어떤 거리 함수를 써야 하나요? 코사인 유사도를 권장해요. 거리 함수 선택은 보통 크게 중요하지 않아요. OpenAI 임베딩은 길이 1로 정규화돼 있어서, 코사인 유사도를 내적만으로 조금 더 빠르게 계산할 수 있고 코사인 유사도와 유클리드 거리의 정렬 결과는 같아요.
임베딩을 온라인에 공유해도 되나요? 네. 고객은 모델의 입력·출력을 소유하며 임베딩도 포함돼요. 다만 API에 넣는 콘텐츠가 법률이나 이용 약관을 위반하지 않도록 책임져야 해요.
V3 임베딩 모델은 최근 사건을 아나요? 아니요. text-embedding-3-large와 text-embedding-3-small은 2021년 9월 이후 사건을 모르지만, 텍스트 생성 모델만큼 제약이 크지는 않아요.