레이블이 Embedding인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Embedding인 게시물을 표시합니다. 모든 게시물 표시

20230624

Embedding 모델 비교 — ada vs E5

ada-002만 쓰다가 비용이 점점 부담되어서 오픈소스로 갈아탈 수 있는지 한번 재봤다. 후보는 intfloat/e5-large-v2, sentence-transformers/all-mpnet-base-v2, 그리고 한글 케이스까지 봐야 해서 BM-K/KoSimCSE-roberta.

세팅

  • 데이터: 한영 혼재 사내 FAQ/문서 1.1만 쌍 (query-passage)
  • 지표: Recall@1, Recall@5, MRR
  • E5는 "query: ..." / "passage: ..." prefix 필수. 이거 안 붙이면 성능 박살남.
모델dimR@1R@5MRR
ada-00215360.7120.8890.788
e5-large-v210240.6940.8820.774
mpnet-base-v27680.6380.8430.729
KoSimCSE-roberta7680.6010.8120.693

ada가 여전히 제일 좋다. 근데 차이가 엄청 크진 않다. 특히 e5-large-v2는 prefix만 제대로 붙이면 2%p 안쪽 차이.

비용 계산: 1.1만 쌍 색인은 ada가 일회성 $0.8 정도인데, 매일 증분 100K 문단 × 30일이면 월 $12. 적은데 문제는 retrieval 시에도 쿼리 embedding이 API 호출이라는 점. 분당 수백 쿼리 들어오면 이게 쌓인다.

E5는 A10G 한 대에 올려놓으면 batch 32 기준 ~250 pairs/s. 셀프 호스팅 비용이 월 $250 언저리. 쿼리가 많으면 금방 break-even.

한글 단일 태스크엔 KoSimCSE도 괜찮지만 영어 섞이면 바로 무너져서 결국 E5로 갈 듯.

20220805

sentence-transformers 한글 검색 임베딩

상품 검색에 한국어 임베딩을 넣어보려고 sentence-transformers 몇 개 시도. 올해 초 Milvus vs Weaviate 비교할 때 임베딩 품질 아쉬웠던 걸 개선하는 작업.

테스트한 모델

  • paraphrase-multilingual-MiniLM-L12-v2 — 다국어, 가벼움(384d)
  • paraphrase-multilingual-mpnet-base-v2 — 다국어, 품질 더 좋은 대신 느림(768d)
  • jhgan/ko-sroberta-multitask — 허깅페이스의 한국어 특화 모델
  • BM-K/KoSimCSE-roberta-multitask — KoSimCSE. 한국어 STS 벤치 높음

평가 기준

사내에서 직접 라벨링한 상품 쿼리→정답 상품 1,200쌍. MRR@10, Recall@10.

from sentence_transformers import SentenceTransformer

m = SentenceTransformer("jhgan/ko-sroberta-multitask")
q_emb = m.encode(queries, batch_size=64, normalize_embeddings=True)
d_emb = m.encode(docs, batch_size=64, normalize_embeddings=True)

결과

모델MRR@10Recall@10인코딩 속도
multilingual-MiniLM0.410.58빠름
multilingual-mpnet0.520.69중간
ko-sroberta0.610.74중간
KoSimCSE-roberta0.630.76중간

한국어 전용 모델들이 확연히 좋다. 특히 상품명의 축약/약어("삼디충", "갤S22" 등)에서 차이가 큼. 다국어 mpnet도 나쁘진 않아서 영문 혼합 도메인이면 괜찮은 선택.

실운영 적용

KoSimCSE 기반으로 벡터 인덱싱. Weaviate에 올리고 BM25와 하이브리드 검색(70:30 가중). BM25 단독 대비 Recall@10이 0.55 → 0.78로 개선.

임베딩 모델도 주기적으로 재학습해야 함. 신규 카테고리 상품 들어오면 cold start 발생. 사내 쿼리 로그를 모아서 파인튜닝(contrastive loss) 하는 파이프라인을 분기별로 돌리는 걸로.

토막

  • 임베딩 차원 768 → 256으로 줄일 때 Matryoshka 방식 잘 안 맞는 모델도 있음. PCA로 줄이는 게 차라리 안정적이었다.
  • CPU 인코딩이 느려서 대량 색인은 GPU 필수. 100만 건 mpnet 기준 T4 GPU에서 약 20분.