huny.log

기술 포스트 · AI·LLM

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

광고 카피·상품·유저를 임베딩으로 다루기 시작하면 첫 달은 잘 되다가 셋째 달부터 어긋납니다. 모델 버전이 바뀌고 도메인이 흔들리고 차원·거리 metric이 안 맞아서. 운영자가 임베딩을 안전하게 굴릴 때 챙겨야 할 자리들을 정리합니다.

광고 카피·상품·유저를 임베딩으로 다루기 시작하면 첫 달은 잘 됩니다. 추천이 그럴듯하고 검색이 깔끔해요. 그런데 셋째 달부터 슬슬 어긋납니다. 같은 카피에 다른 결과, 같은 검색에 다른 추천. 임베딩 운영에서 흔들리는 자리는 모델 버전·도메인 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의 결정이 운영 결과를 통째로 바꾼다.

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 — 가장 흔한 디폴트

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

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

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

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

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

5-3. Euclidean — 직접 거리

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

import numpy as np
from openai import OpenAI
client = OpenAI()
def embed(texts):
r = client.embeddings.create(model='text-embedding-3-small', input=texts, dimensions=1024)
return np.array([d.embedding for d in r.data])
vecs = embed(['광고 카피 A', '광고 카피 B'])
sim = (vecs[0] @ vecs[1]) / (np.linalg.norm(vecs[0]) * np.linalg.norm(vecs[1])) # cosine

이게 본문에 박는 유일한 코드입니다. OpenAI text-3-small에 1024차원 축소 + cosine 한 줄. 운영 환경에서는 이 위에 pgvector·Pinecone·Qdrant 같은 벡터 DB가 같은 metric으로 검색을 처리합니다.

6. 마케팅 실무 케이스 3개

6-1. 광고 카피 중복 검출

LLM이 생성한 카피 100개에서 중복·유사 카피 제거. 임베딩 + cosine threshold(보통 0.92~0.95) 위로 묶음. 같은 메시지의 변형을 자동으로 통합하면서 다양성 유지. huny.log의 LLM 카피 파이프라인 글에서 다룬 운영 자리입니다.

6-2. 상품 cold start 추천

신규 가입자에게 첫 추천을 줘야 하는데 행동 이력이 없음. 가입 시 받은 관심사 키워드의 임베딩과 상품 설명 임베딩의 cosine similarity로 첫 추천. Thompson Sampling 글에서 다룬 cold start 도구의 임베딩 버전.

6-3. FAQ 자동 매칭

고객 문의를 FAQ 매칭으로 자동 분류. 문의 임베딩과 FAQ 임베딩의 top-1 cosine. 0.7 이상이면 자동 응답, 0.5~0.7이면 사람 에이전트 보조, 0.5 미만이면 사람 직접 응답. 이 임계는 도메인마다 다르므로 골든셋으로 사전 설정해야 합니다.

7. 임베딩 운영이 깨질 때 — 흔한 함정 3가지

7-1. 같은 인덱스에 다른 모델 벡터를 섞음

가장 비싼 함정. 옛 벡터와 새 벡터가 한 인덱스에 있으면 검색 결과가 무의미해집니다. 항상 인덱스 = 모델 1대1 관계로.

7-2. drift 측정 없이 운영

매주 같은 쿼리 50개로 top-k 결과를 측정·기록하지 않으면 drift가 일어나도 모릅니다. 비용도 거의 없는 모니터링이니 첫 주부터 깔아두세요.

7-3. 차원 축소를 하지 않고 무조건 큰 차원

8192 차원의 벡터 1,000만 개는 인덱스 30GB·검색 latency 100ms 가 됩니다. text-3-large + 1024차원이 거의 같은 정확도에 1/8 비용. 차원 축소를 검토하지 않으면 비용을 8배 쓰게 됩니다.

8. 마치며 — 임베딩은 인프라

LLM 시대에 임베딩이 마케팅 자리에 들어오는 속도가 빨라졌습니다. 카피·상품·유저·문서 모두 임베딩 위에서 의사결정합니다. 하지만 임베딩은 한 번 만들면 끝나는 게 아니라 분기마다 점검·재계산이 필요한 인프라입니다.

운영자가 챙겨야 할 4가지 — 모델 버전 관리·drift 모니터링·차원 결정·metric 선택 — 을 분기 점검 루틴에 박아두면, 임베딩의 첫 달 좋은 결과가 셋째 달·여섯째 달에도 유지됩니다.

다음 글에서는 RAG 운영의 또 다른 자리, 비용·latency 분리를 다룹니다. RAG가 운영에서 비싼 자리와 그 자리의 최적화 도구를 정리합니다.

참고

AI·LLM 카테고리의 다른 글

전체 보기 →