하이브리드 검색 재랭킹을 통한 다국어 임베딩 모델 관련성 향상
Elasticsearch에서 Cohere의 재랭커와 하이브리드 검색을 사용해 E5 다국어 임베딩 모델 검색 결과의 정확도를 개선하는 방법을 알아보세요.
소개
이 시리즈의 마지막 파트에서는 Elastic의 사전 학습된 E5 모델(그리고 Hugging Face의 다른 다국어 텍스트 임베딩 모델)을 배포하는 과정을 살펴보고, Elasticsearch와 Kibana를 사용해 텍스트 데이터에서 고밀도 벡터 임베딩을 생성하는 방법에 대해 알아보았습니다. 이 블로그에서는 이러한 임베딩의 결과를 살펴보고 다국어 모델을 활용할 때 얻을 수 있는 중요한 이점을 강조합니다.
이제 색인 coco_multilingual 을 만들었으므로 검색을 수행하면 참조할 수 있도록 'en' 필드가 있는 여러 언어로 된 문서가 표시됩니다:
# GET coco_multilingual/_search
{
"_index": "coco_multilingual",
"_id": "WAiXQJYBgf6odR9bLohZ",
"_score": 1,
"_source": {
"description": "Ein Parkmeßgerät auf einer Straße mit Autos",
"en": "A row of parked cars sitting next to parking meters.",
"language": "de",
"vector_description": {...}
}
},
. . .영어로 검색 수행하기
영어로 검색을 수행해보고 얼마나 잘 검색되는지 확인해 보겠습니다:
GET coco_multi/_search
{
"size": 10,
"_source": [
"description", "language", "en"
],
"knn": {
"field": "vector_description.predicted_value",
"k": 10,
"num_candidates": 100,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64_search",
"model_text": "query: kitty"
}
}
}
}{
"_index": "coco_multi",
"_id": "JQiXQJYBgf6odR9b6Yz0",
"_score": 0.9334303,
"_source": {
"description": "Eine Katze, die in einem kleinen, gepackten Koffer sitzt.",
"en": "A brown and white cat is in a suitcase.",
"language": "de"
}
},
{
"_index": "coco_multi",
"_id": "3AiXQJYBgf6odR9bFod6",
"_score": 0.9281012,
"_source": {
"description": "Una bambina che tiene un gattino vicino a una recinzione blu.",
"en": "A little girl holding a kitten next to a blue fence.",
"language": "it"
}
},
. . .이 쿼리는 놀라울 정도로 단순해 보이지만, 내부적으로는 모든 언어의 모든 문서에서 'kitty'라는 단어가 포함된 숫자를 검색하고 있습니다. 그리고 벡터 검색을 수행하기 때문에 'kitty'와 관련이 있을 수 있는 모든 단어를 의미론적으로 검색할 수 있습니다: "고양이", "새끼 고양이", "고양이", "가토"(이탈리아어), "메오"(베트남어), 고양이(한국어), 猫(중국어) 등이 있습니다. 그 결과, 검색어가 영어로 되어 있어도 다른 모든 언어로 된 콘텐츠도 검색할 수 있습니다. 예를 들어, 고양이(ying on something )를 검색하면 이탈리아어, 네덜란드어 또는 베트남어로 된 문서도 표시됩니다. 효율성에 대해 이야기해 보세요!
다른 언어로 된 콘텐츠 검색 수행하기
GET coco_multi/_search
{
"size": 100,
"_source": [
"description", "language", "en"
],
"knn": {
"field": "vector_description.predicted_value",
"k": 50,
"num_candidates": 1000,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64_search",
"model_text": "query: kitty lying on something"
}
}
}
}{
"description": "A black kitten lays on her side beside remote controls.",
"en": "A black kitten lays on her side beside remote controls.",
"language": "en"
},
{
"description": "un gattino sdraiato su un letto accanto ad alcuni telefoni ",
"en": "A black kitten lays on her side beside remote controls.",
"language": "it"
},
{
"description": "eine Katze legt sich auf ein ausgestopftes Tier",
"en": "a cat lays down on a stuffed animal",
"language": "de"
},
{
"description": "Một chú mèo con màu đen nằm nghiêng bên cạnh điều khiển từ xa.",
"en": "A black kitten lays on her side beside remote controls.",
"language": "vi"
}
. . .마찬가지로 한국어로 '고양이'로 키워드 검색을 수행하면 의미 있는 결과를 얻을 수 있습니다. 여기서 놀라운 점은 이 색인에는 한국어로 된 문서가 하나도 없다는 것입니다!
GET coco_multi/_search
{
"size": 100,
"_source": [
"description", "language", "en"
],
"knn": {
"field": "vector_description.predicted_value",
"k": 50,
"num_candidates": 1000,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64_search",
"model_text": "query: 고양이"
}
}
}
} {
{
"description": "eine Katze legt sich auf ein ausgestopftes Tier",
"en": "a cat lays down on a stuffed animal",
"language": "de"
}
},
{
{
"description": "Một con chó và con mèo đang ngủ với nhau trên một chiếc ghế dài màu cam.",
"en": "A dog and cat lying together on an orange couch. ",
"language": "vi"
}
},임베딩 모델은 공유 의미 공간에서 의미를 나타내므로 색인된 캡션과 다른 언어로 쿼리해도 관련 이미지를 검색할 수 있습니다.
하이브리드 검색 및 재랭킹으로 관련성 높은 검색 결과 얻기
예상대로 관련 결과가 나타나서 기쁘게 생각합니다. 하지만 이커머스나 가장 적합한 상위 5~10개의 결과로 범위를 좁혀야 하는 RAG 애플리케이션과 같은 실제 환경에서는 재랭크 모델을 사용하여 가장 관련성이 높은 결과의 우선 순위를 지정할 수 있습니다.
여기서 베트남어로 "고양이는 무슨 색인가요?"라고 묻는 쿼리를 수행하면 많은 결과가 나오지만 상위 1, 2위가 가장 관련성이 높지 않을 수 있습니다.
GET coco_multi/_search
{
"size": 20,
"_source": [
"description",
"language",
"en"
],
"knn": {
"field": "vector_description.predicted_value",
"k": 20,
"num_candidates": 1000,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64_search",
"model_text": "query: con mèo màu gì?"
}
}
}
}결과에는 모두 고양이 또는 어떤 형태의 색상이 언급되어 있습니다:

이제 개선해 봅시다! Cohere의다국어 재랭크 모델을 통합하여 질문에 해당하는 추론을 개선해 보겠습니다.
PUT _inference/rerank/cohere_rerank
{
"service": "cohere",
"service_settings": {
"api_key": "your_api_key",
"model_id": "rerank-v3.5"
},
"task_settings": {
"top_n": 10,
"return_documents": true
}
}
GET coco_multi/_search
{
"size": 10,
"_source": [
"description",
"language",
"en"
],
"retriever": {
"text_similarity_reranker": {
"retriever": {
"rrf": {
"retrievers": [
{
"knn": {
"field": "vector_description.predicted_value",
"k": 50,
"num_candidates": 100,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64_search",
"model_text": "query: con mèo màu gì?" // English: What color is the cat?
}
}
}
}
],
"rank_window_size": 100,
"rank_constant": 0
}
},
"field": "description",
"inference_id": "cohere_rerank",
"inference_text": "con mèo màu gì?"
}
}
} {
"_index": "coco_multi",
"_id": "rQiYQJYBgf6odR9bBYyH",
"_score": 1.5501487,
"_source": {
"description": "Hai cái điện thoại được đặt trên một cái chăn cạnh một con mèo con màu đen.",
"en": "A black kitten lays on her side beside remote controls.",
"language": "vi"
}
},
{
"_index": "coco_multi",
"_id": "swiXQJYBgf6odR9b04uf",
"_score": 1.5427427,
"_source": {
"description": "Một con mèo sọc nâu nhìn vào máy quay.", // Real translation: A brown striped cat looks at the camera
"en": "This cat is sitting on a porch near a tire.",
"language": "vi"
}
},이제 최고의 결과를 통해 저희 애플리케이션은 새끼 고양이의 색이 검은색 또는 줄무늬가 있는 갈색이라고 자신 있게 대답할 수 있습니다. 여기서 더욱 흥미로운 점은 벡터 검색이 실제로 원본 데이터 세트의 영어 캡션에서 누락된 부분을 찾아냈다는 점입니다. 참조 영어 번역에서 갈색 줄무늬 고양이를 놓쳤음에도 불구하고 이를 찾아낼 수 있습니다. 이것이 바로 벡터 검색의 힘입니다.
결론
이 블로그에서는 다국어 임베딩 모델의 유용성과 Elasticsearch를 활용하여 모델을 통합하여 임베딩을 생성하고 하이브리드 검색 및 재랭커로 관련성과 정확도를 효과적으로 개선하는 방법을 살펴봤습니다. 원하는 언어와 데이터 세트에 대해 즉시 사용 가능한 E5 모델을 사용하여 자체 클라우드 클러스터를 생성하여 다국어 의미론적 검색을 사용해 볼 수 있습니다.




