DEV Community

Cover image for 임베딩 운영 — drift·차원·cosine vs dot, 마케팅 임베딩이 흔들리는 자리
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

임베딩 운영 — drift·차원·cosine vs dot, 마케팅 임베딩이 흔들리는 자리

광고 카피·상품·유저를 임베딩으로 다루기 시작하면 첫 달은 잘 됩니다. 추천이 그럴듯하고 검색이 깔끔해요. 그런데 셋째 달부터 슬슬 어긋납니다. 같은 카피에 다른 결과, 같은 검색에 다른 추천. 임베딩 운영에서 흔들리는 자리는 모델 버전·도메인 drift·차원·거리 metric의 4가지입니다. 마케터·운영자가 임베딩을 안전하게 굴리려면 알아야 할 자리들을 정리합니다.

1. 임베딩이 흔들리는 4가지 자리

마케팅 자리에서 임베딩을 쓰는 가장 흔한 자리는 다음입니다.

  • 광고 카피 유사도 — 중복·표절 검출, 클러스터링
  • 상품 추천 — 유저 행동 → 비슷한 상품
  • 검색 — 자연어 쿼리 → 상품·문서·FAQ
  • 유저 세그먼트 — 행동 임베딩 → k-means·hierarchical 클러스터

처음엔 다 잘 되다가 시간이 지나면서 결과가 흔들립니다. 4가지 원인이 흔들림을 만듭니다.

  • 모델 버전 변경 — OpenAI text-embedding-ada-002 → 3-small. 같은 입력에 다른 벡터
  • 도메인 drift — 신규 카테고리·신규 카피 톤. 임베딩 공간에 새 영역
  • 차원·차원 축소 — 1536·3072·8192 차원의 trade-off
  • 거리 metric 선택 — cosine vs dot vs Euclidean

각각이 운영의 어디서 어떻게 깨지는지 정리합니다.

임베딩 운영의 4가지 흔들림 — 모델 변경·drift·차원·metric 다이어그램
같은 텍스트가 같은 벡터로 평생 가지 않는다. 모델 변경·도메인 drift·차원 trade-off·거리 metric의 결정이 운영 결과를 통째로 바꾼다.

📌 이 글에서 다루는 것

이 글은 임베딩 모델 자체의 학습보다 운영 환경의 의사결정에 집중합니다. 어떤 모델을 고를까, 차원은 몇으로, drift는 어떻게 알아채고 보정할까. 한 번 만들면 끝나는 게 아니라 분기마다 점검해야 하는 인프라로 봐야 합니다.

2. 모델 버전 변경 — 같은 텍스트가 다른 벡터

OpenAI·Cohere·Voyage·BGE의 임베딩 모델은 1년에 1~2번 새 버전이 나옵니다. 새 버전이 더 좋은 게 일반적이지만, 같은 텍스트의 임베딩이 완전히 다른 벡터가 됩니다.

운영 영향:

  • 인덱스 통째 재생성 필요 — 옛 벡터와 새 벡터는 같은 공간이 아님
  • 일부만 새 모델로 재생성하면 검색 결과가 통째로 깨짐
  • A/B 비교가 어려워짐 — 어제의 추천 점수와 오늘의 추천 점수가 다른 척도

운영 패턴은 다음입니다.

  • 모델 버전을 인덱스 이름에 명시 — products_ada_v2, products_3_small
  • 한 인덱스 안의 모든 벡터는 같은 모델로 생성
  • 모델 변경 시 새 인덱스 생성 → 전체 재계산 → 기존 인덱스 1주 병행 → 신 인덱스로 전환

3. 도메인 drift — 새 카테고리가 들어올 때

임베딩 모델은 학습 시점의 도메인 분포에 맞춰져 있습니다. 새 카테고리·신조어·트렌드가 들어오면 임베딩 공간에서 그 영역의 정확도가 떨어집니다.

마케팅에서 자주 보이는 drift 자리:

  • 새 카테고리 출시 — "전기차 충전기" 카테고리. 모델 학습 시점엔 약했음
  • 신조어·외래어 — 신규 브랜드명, MZ 세대 표현
  • 시즌 표현 — 매년 바뀌는 시즌 카피의 톤
  • 도메인 전문 용어 — 광고 입찰·DSP·CDP 같은 업계 용어

drift 측정의 운영 도구는 다음입니다.

  • 샘플 쿼리에 대한 top-k 결과의 안정성 — 매주 같은 쿼리 50개를 돌려 결과 변화 측정
  • 임베딩 평균 거리의 시계열 — 매주 신규 데이터의 평균 임베딩 거리. 갑자기 멀어지면 drift 신호
  • downstream 메트릭의 추세 — 추천 CTR·검색 click-through의 시계열

drift가 감지되면 보정 방법:

  • 도메인 데이터로 fine-tuning (SBERT·BGE 같은 오픈소스 모델 위에)
  • 새 카테고리 데이터를 hard negative로 추가해 contrastive learning
  • 단순 룰 — 새 카테고리는 별도 인덱스로 분리

4. 차원의 trade-off — 1536·3072·8192

임베딩 차원은 정확도와 비용의 trade-off입니다.

차원 정확도 인덱스 크기 검색 latency 비용 (per query)
384 (BGE-small) 보통 작음 매우 빠름 매우 저렴
1024 (text-3-small) 좋음 중간 빠름 저렴
1536 (ada-002) 우수 중간 빠름 중간
3072 (text-3-large) 매우 우수 보통 중간
8192 (Voyage 3) 최고 매우 큼 느림 비쌈

운영 결정의 핵심은 다음입니다.

  • 데이터 적음(< 100만 건), 정확도 중요 → 3072~8192
  • 데이터 많음(> 1,000만 건), 비용 중요 → 384~1024
  • 일반 마케팅 운영 → 1024~1536이 표준

OpenAI text-3-small·text-3-large는 차원 축소(Matryoshka Representation Learning)를 지원합니다. 같은 모델로 1536 → 512로 줄여도 정확도가 5%p 이내로만 떨어집니다. 비용 최적화의 핵심 도구입니다.

5. cosine vs dot vs Euclidean — 거리 metric의 선택

임베딩 검색의 거리 metric은 한 가지 결정이 운영 결과를 통째로 바꿉니다.

5-1. Cosine similarity — 가장 흔한 디폴트

cos(u,v)=uvuv \text{cos}(u, v) = \frac{u \cdot v}{|u| \cdot |v|}

벡터의 방향만 본다. 길이는 무시. 의미적 유사도가 자연스러운 자리에 적합:

  • 광고 카피 유사도
  • 일반 텍스트 검색
  • 상품 설명 매칭

5-2. Dot product — 길이까지 본다

uv=iuivi u \cdot v = \sum_i u_i v_i

방향 + 길이를 같이 본다. 임베딩의 길이가 신뢰도·중요도를 담고 있을 때 적합:

  • L2 normalize 안 한 임베딩(추천 시스템의 일부)
  • "더 강한 신호의 벡터를 선호" 자리

5-3. Euclidean — 직접 거리

d(u,v)=i(uivi)2 d(u, v) = \sqrt{\sum_i (u_i - v_i)^2}

벡터 공간의 직접 거리. 임베딩 모델 대부분이 cosine·dot에 최적화되어 있어 운영에서는 잘 안 씀.

💡 모델이 권장하는 metric을 그대로 따르라

OpenAI·Cohere·Voyage 모델은 보통 cosine을 권장합니다. SBERT·BGE 일부는 dot을 권장. 모델 문서의 권장 metric을 그대로 따르는 게 가장 안전합니다. 직접 다른 metric으로 굴리면 정확도가 5~15%p 떨어질 수 있습니다.


python
Enter fullscreen mode Exit fullscreen mode

Top comments (0)