

하이퍼클로바 X의 임베딩 v2 모델을 사용중인데, 이 부분이 궁금해서 찾아봤다.
bge-m3 모델은 BAAI(Beijing Academy of Artificial Intelligence)에서 개발한 최신 임베딩 모델이다. 다국어 지원과 뛰어난 성능으로 주목받고 있다. bge-m3는 이전 버전인 bge-large-en과 비교하여 더 넓은 언어 지원과 향상된 성능을 제공하고, 특히 검색, 분류, 클러스터링 등 다양한 NLP 태스크에서 우수한 성능을 보인다.
Sparse:
키워드 빈도나 문서 내 단어의 중요도를 기반으로 하는 전통적인 벡터 표현이다. TF-IDF나 BM25 같은 계산을 통해 생성될 수 있으며, 전통적인 정보검색 시스템에서 널리 사용된다.
Dense Output:
D모든 문서나 쿼리를 고정된 크기의 밀집 벡터로 변환한다. 일반적으로 딥러닝 모델을 사용하여 학습되며, 문맥적 의미를 포착하는 데 효과적이다. 최근의 많은 검색 시스템에서 기본적으로 사용된다.
Multi-Dense (ColBERT) Output:
각 문서나 쿼리를 여러 개의 Dense 벡터로 표현하며, 각 벡터는 문서의 다른 단어나 구를 나타낸다. ColBERT 검색 시스템에서 사용되며, 단어 수준에서의 미묘한 의미 차이를 포착하여 더 정밀한 검색 결과를 제공할 수 있다.
bge-m3 모델은 효율적인 연산과 메모리 사용을 위해 FP16 포맷을 지원한다. 또한, 임베딩 벡터의 정규화를 적용하여 더 안정적인 결과를 제공한다.
하이퍼클로바 임베딩v2 모델의 출력에 fp16 및 벡터 정규화 적용
# 임베딩 벡터(res['result']['embedding']) 정규화 및 FP16 변환
# -> 오픈소스 임베딩 모델은 코사인 유사도 거리 사용함
# -> milvus 는 코사인 유사도 지원하지 않지만, 벡터 정규화한 경우 IP로 코사인 유사도 근사 가능
embedding = np.array(res['result']['embedding'], dtype=np.float32)
norm = np.linalg.norm(embedding) # 벡터의 L2 norm (유클리드 norm) 계산
normalized_embedding = embedding / norm
fp16_embedding = normalized_embedding.astype(np.float16)