Milvus 하이브리드 검색 시작하기
Milvus 2.4](https://milvus.io/blog/milvus-2-4-nvidia-cagra-gpu-index-multivector-search-sparse-vector-support.md)의 출시와 함께 멀티 벡터 검색과 하이브리드 검색(멀티 벡터 검색) 기능을 도입했습니다. 이 새로운 기능은 사용자가 하이브리드 검색을 수행하여 여러 벡터 필드에서 동시에 쿼리를 수행하고 그 결과를 재순위 전략과 통합함으로써 데이터를 검색하고 분석하는 방법을 향상시킵니다.
흔히 다중 벡터 검색이라고도 하는 하이브리드 검색은 동일한 데이터 세트 내에서 다양한 벡터 필드에 걸쳐 검색을 수행하는 프로세스입니다. 이러한 벡터는 데이터의 다양한 측면을 나타내거나, 다양한 임베딩 모델을 활용하거나, 서로 다른 데이터 처리 방법을 사용하고 리랭커를 사용하여 결과를 결합할 수 있습니다.
이 튜토리얼에서는 Milvus 2.4의 하이브리드 검색 기능을 활용하여 검색을 향상시키는 방법을 배웁니다. 다뤄보겠습니다:
[스파스 임베딩] 만들기(https://zilliz.com/learn/enhancing-information-retrieval-learned-sparse-embeddings)
고밀도 임베딩 생성하기
Milvus에서 데이터 색인 생성
동일한 컬렉션을 사용하여 다중 벡터 검색을 수행합니다.
이 튜토리얼에서는 Amazon의 포괄적인 상품 검색 데이터 세트인 eSci 데이터 세트를 활용합니다. 또한, Milvus 내에서 직접 임베딩을 쉽게 생성할 수 있는 pymilvus[models] 라이브러리를 통해 BGE-M3 모델을 사용할 것입니다.
하이브리드 검색 소개
하이브리드 검색은 검색 결과를 향상시키기 위해 희소 검색과 밀도 검색의 강점을 결합한 강력한 기술입니다. 기존의 희소 검색 방식은 특정 시나리오에서는 효과적이지만, 표현력이 제한적이고 유연성이 부족하다는 단점이 있습니다. 하이브리드 검색은 희소 검색과 고밀도 검색 방법을 병합하여 이러한 한계를 해결함으로써 보다 정확하고 효율적인 검색 결과를 얻을 수 있습니다.
하이브리드 검색은 희소 검색과 밀도 벡터의 상호 보완적인 강점을 활용하여 데이터의 정확한 일치와 시맨틱 뉘앙스를 모두 포착할 수 있습니다. 그 결과, 보다 포괄적이고 정확한 검색 환경을 제공합니다. 텍스트, 이미지 또는 다른 유형의 데이터를 다루든 하이브리드 검색은 검색 결과의 관련성과 품질을 크게 향상시킬 수 있습니다.
벡터 검색 이해하기
벡터 검색은 데이터를 표현하기 위해 벡터를 사용하는 검색 유형입니다. 벡터는 데이터 포인트의 본질을 포착하여 데이터 포인트 간의 유사성을 계산할 수 있는 수학적 표현입니다. 벡터 검색에서는 데이터와 검색 쿼리가 모두 벡터로 변환됩니다. 그런 다음 쿼리 벡터와 데이터 벡터 사이의 유사도가 계산되고 가장 유사한 데이터 포인트가 검색 결과로 반환됩니다.
이 접근 방식은 관련 정보를 효율적이고 확장 가능하게 검색할 수 있기 때문에 대규모 데이터 세트를 검색할 때 특히 유용합니다. 벡터 검색은 이미지와 텍스트 검색 등 다양한 영역에 적용할 수 있으며, 의미론적으로 유사한 항목을 찾는 데 탁월합니다. 벡터의 힘을 활용하면 보다 정확하고 의미 있는 검색 결과를 얻을 수 있습니다.
필요한 라이브러리 설치 및 가져오기, 인덱스 생성하기
파이프 설치 파이밀버스[모델] 데이터 세트
pd로 팬더를 가져옵니다.
데이터 세트에서 load_dataset를 가져옵니다.
에서 가져 오기 (
FieldSchema,
CollectionSchema,
DataType,
Collection,
AnnSearchRequest,
RRFRanker,
연결,
)
pymilvus.model.hybrid에서 BGEM3EmbeddingFunction을 가져옵니다.
데이터 세트 준비
ESCI 데이터 세트는 쿼리와 제품의 시맨틱 매칭을 위해 설계되었습니다. 이 섹션에서는 ESCI 데이터셋을 준비하겠습니다. 데이터의 하위 집합을 선택하고 깨끗하고 처리할 준비가 되었는지 확인하는 데 중점을 두겠습니다.
하위 집합 다운로드 및 선택
dataset = load_dataset("tasksource/esci", split="train")
dataset = dataset.select(range(500))
dataset = dataset.filter(lambda x: x["product_locale"] == "us")
dataset
데이터 정리
중복 또는 누락된 정보로 인한 잘못된 검색 결과를 방지하려면 데이터 집합을 정리하는 것이 중요합니다.
source_df = dataset.to_pandas()
df = source_df.drop_duplicates(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"]
)
# 누락된 값이 있는 행 삭제
df = df.dropna(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"]
)
df.head()
다음은 데이터에 포함된 내용을 간략히 살펴봅니다:
예제_id 쿼리 쿼리_id 제품_id 제품_로컬 ESCI_라벨 작은_버전 큰_버전 제품_title 제품_description 제품_불릿_포인트 제품_브랜드 제품_컬러 제품_text
0 0 revent 80 cfm 0 B000MOO21W us 관련 없음 0 1 Panasonic FV-20VQ3 WhisperCeiling 190 CFM 천장 ... 없음 WhisperCeiling 팬은 완전히 밀폐 된 ... 파나소닉 화이트 파나소닉 FV-20VQ3 WhisperCeiling 190 CFM 천장 ...
2 1 리벤트 80 CFM 0 B07X3Y6B1V 우리 정확한 0 1 홈웍스 7141-80 욕실 팬 통합 LED ... 없음 뛰어난 성능 :이 Homewerk의 목욕 ... 홈웍스 80 CFM 홈웍스 7141-80 욕실 팬 통합 LED ...
3 2 revent 80 cfm 0 B07WDM7MQQ 우리 정확한 0 1 Homewerks 7140-80 욕실 팬 천장 장착 E ... 없음 뛰어난 성능 :이 Homewerk의 목욕 ... 홈웍스 화이트 홈웍스 7140-80 욕실 팬 천장 마운트 E ...
4 3 revent 80 cfm 0 B07RH6Z8KW 미국 정확한 0 1 Delta Electronics RAD80L BreezRadiance 80 CFM ... 이 중고 또는 리퍼브 제품은 ... 1.5 톤의 조용한 작동 \ n보온병 내장 ... 델타 일렉트로닉스 (미국) LTD. 화이트 델타 일렉트로닉스 RAD80L 브리즈 래디언스 80 CFM ...
5 4 revent 80 CFM 0 B07QJ7WYFQ 우리 정확한 0 1 파나소닉 FV-08VRE2 환기 팬 with Reces ... 없음 팬 / 조명 조합을위한 설계 솔루션 ... 파나소닉 화이트 파나소닉 FV-08VRE2 환기 팬 (Reces ...
이제 데이터 세트가 준비되고 정리되었으므로 하이브리드 검색을 위해 벡터 임베딩을 생성하고 Milvus에서 색인할 수 있습니다.
BGE-M3로 벡터 임베딩 생성하기
데이터가 깨끗하고 준비되면 다음 단계는 벡터 임베딩을 생성하는 것입니다. BGE-M3](https://zilliz.com/learn/Exploring-BGE-M3-the-future-of-information-retrieval-with-milvus) 임베딩 모델을 사용해 원시 텍스트 데이터를 Milvus 벡터 데이터베이스가 효과적으로 색인하고 검색할 수 있는 숫자 벡터로 변환합니다.
텍스트 데이터 병합
먼저, 각 상품과 관련된 다양한 텍스트 필드를 연결하여 통합된 텍스트 벡터 표현을 형성합니다. 이렇게 하면 제품에 대한 모든 관련 정보를 단일 벡터로 캡처하는 데 도움이 됩니다:
df["merged_text"] = df["product_title"] + "\n" + df["product_text"] + "\n" + df["product_bullet_point"]
docs = df["merged_text"].to_list()
임베딩 생성
ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]
문서 임베딩 = ef(문서)
query = "파나소닉 제품의 예가 있나요?"
쿼리_임베딩 = ef([쿼리])
Milvus 컬렉션 설정하기
임베딩을 생성한 다음 단계는 스파스 벡터와 밀도 벡터를 모두 처리할 수 있는 컬렉션을 생성하여 이러한 벡터를 Milvus에 저장하는 것입니다.
Milvus에 연결하기
Milvus](https://zilliz.com/blog/getting-started-with-a-milvus-connection) 서버에 [연결]을 설정하는 것으로 시작하세요:
파이밀버스에서 연결 가져오기
connect()
컬렉션 스키마 정의
fields = [
# 자동 생성된 ID를 기본 키로 사용
필드 스키마(
name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=8192),
FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
]
schema = CollectionSchema(fields, "")
col = Collection("sparse_dense_demo", schema)
벡터에 대한 인덱스 생성
SPARSE_INDEX = {"INDEX_TYPE": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
dense_index = {"index_type": "FLAT", "metric_type": "COSINE"}
col.create_index("스파스_벡터", 스파스_인덱스)
col.create_index("dense_vector", dense_index)
컬렉션에 데이터 삽입하기
엔티티 = [
docs,
docs_embedings["sparse"],
docs_embedings["dense"],
]
col.insert(entities)
밀버스에서 하이브리드 검색 실행하기
필요한 데이터와 인덱스로 Milvus 컬렉션이 준비되면 하이브리드 검색을 수행할 수 있습니다. 이 단계에서는 희소 벡터와 밀도 벡터를 모두 사용하여 컬렉션을 쿼리하고 재랭커를 사용하여 결과를 구체화합니다.
def query_hybrid_search(query: str):
query_embeddings = ef([query])
sparse_req = AnnSearchRequest(
쿼리_임베딩["sparse"], "sparse_vector", {"metric_type": "IP"}, limit=2
)
dense_req = AnnSearchRequest(
query_embedings["dense"], "dense_vector", {"metric_type": "COSINE"}, limit=2
)
res = col.hybrid_search(
[sparse_req, dense_req], rerank=RRFRanker(), limit=2, output_fields=["text"])
)
반환 res
이 함수는 입력 쿼리에 대한 임베딩을 생성합니다. 그런 다음 사용할 유사도 메트릭의 유형을 지정하여 희소 벡터와 밀도 벡터에 대한 두 개의 AnnSearchRequest 객체를 구성합니다(내부 곱의 경우 IP, 코사인 유사도의 경우 COSINE). 하이브리드 검색`` 방법은 RRFRanker를 사용하여 두 벡터의 결과를 결합하고, 결합된 결과의 순위를 다시 매겨 가장 관련성이 높은 일치 항목의 우선순위를 지정합니다.
벡터 검색 예시
이 기능이 실제로 어떻게 작동하는지 알아보기 위해 실제 쿼리로 하이브리드 검색을 수행해 보겠습니다:
query_hybrid_search("홈웍스 제품이 있나요?")[0]
출력
['id: 449353344520491318, 거리: 0.032786883413791656, entity: {\'text\': "Homewerks 7141-80 욕실 팬 통합형 LED 조명 천장 장착 배기 환기, 1.1 소음, 80 CFM\\nHomewerks 7141-80 욕실 팬 통합형 LED 조명 천장 장착 배기 환기, 1.1 소음, 80 CFM\\nHomewerks\\n80 CFM\\n없음\\n놀라운 성능 :이 Homewerk의 목욕 팬은 욕실의 수분과 습기를 조용히 제거하여 집안의 쾌적함을 보장합니다. 이 배기 팬은 80 CFM에서 1.1 톤으로 최대 80 평방 피트의 공간을 관리 할 수 있으며 매우 조용합니다.\\n욕실 팬은 심한 냄새를 제거합니다 : 욕실이나 화장실을 청소할 때 독한 화학 물질이 사용되어 불쾌한 냄새를 남길 수 있습니다. 홈워크의 욕실 선풍기는 강력한 환기 기능으로 이 냄새를 제거하는 데 도움이 될 수 있습니다\\n ...]
하이브리드 검색과 단순 벡터 유사도 검색 비교
희소 임베딩과 고밀도 임베딩을 혼합하지 않고 고밀도 임베딩만 사용하면 정확한 키워드 일치 또는 범주 데이터 구분을 기반으로 하는 쿼리에서 문제가 발생할 수 있지만, 희소 임베딩은 이를 잘 처리할 수 있습니다.
예를 들어 "배송비 포함"과 같이 매우 구체적인 속성을 찾고 있는 경우입니다. 조밀 임베딩은 제품 유형이나 브랜드와 같은 주요 키워드와 관련된 광범위한 항목을 검색할 수 있지만 중요한 '배송비 포함' 측면을 놓칠 수 있습니다.
하이브리드 벡터 검색 엔진을 사용하는 경우와 고밀도 임베딩이 포함된 단순 벡터 검색만 사용하는 경우를 비교해 보겠습니다:
def query_dense_search(query: str):
query_embeddings = ef([query])
search_param = {
"데이터": 쿼리_임베딩["밀도"],
"anns_field": "dense_vector",
"param": {"metric_type": "COSINE"},
"limit": 2,
"output_fields": ["text"],
}
res_dense = col.search(**search_param)
반환 res_dense
> 쿼리_밀도_검색("배송비 포함")
[
{
"id": "449353344520491390",
"거리": 0.5341320037841797,
"엔티티": {
"text": "BAZIC 자동 봉인 흰색 봉투 3 5/8" x 6 1/2" #6, 창 없는 우편 봉투, 비즈니스 송장 수표용 필 앤 실 우편물 봉함기(100/팩), 1팩nBAZIC 자동 봉인 흰색 봉투 3 5/8" x 6 1/2" #6, 창 없는 우편물 봉함기, 비즈니스 송장 수표용 필 앤 씰 우편물 봉함기(100/팩), 1팩nBAZIC 제품n#6 3/4 (100매)n<p><strong>BACK TO BAZIC</strong></p> <p>우리의 목표는 각 고객에게 합리적인 비용으로 오래 지속되는 용품을 제공하는 것입니다. 1998년 이래로 우리는 이 약속을 지켜왔으며 앞으로도 매년 개선해 나갈 것입니다. 우리는 무결성과 품질을 바탕으로 브랜드를 구축해 왔기 때문에 고객은 무엇을 기대해야 하는지 정확히 알고 있습니다.</p> <p><strong>가치에 대한 헌신</strong></p> <p>우리는 가치 중심의 회사로, 저렴한 비용으로 강력한 제품 디자인을 통해 우수성을 추구하는 원칙에 따라 운영됩니다. 이러한 가치에 대한 우리의 헌신은 기존 제품을 개선하고 소비자를 위한 새롭고 흥미로운 제품을 개발하는 데 헌신하는 데 반영됩니다. 우리는 상상력, 열정, 리더십을 바탕으로 성장합니다. 우리는 훌륭한 제품을 보유하고 있으며 고객의 기대에 부응하기 위해 계속 노력할 것입니다.</p> <p><strong>성공을 기반으로 한 만족</strong></p> <p>미국 캘리포니아주 로스앤젤레스에 본사를 두고 있습니다. 우리는 모든 제품에 대해 100% 고객 만족을 기대합니다. 우리의 성공은 소비자 개개인의 만족에서 비롯됩니다. 우리는 사람들이 다른 사람에게 추천하고 싶은 제품을 만듭니다.</p>n#6-3/4 셀프-씰 흰색 봉투. 이 3 5/8" x 6 1/2" 인치 자동 밀봉 봉투는 시간과 비용을 절약할 수 있도록 설계되었습니다. 빠른 시간 내에 우편물을 처리할 수 있도록 도와줍니다.nSECURE. 껍질을 벗기고 밀봉하기만 하면 핥거나 적실 필요 없이 강력하고 오래 지속되는 밀봉이 가능합니다. 셀프 봉인 디자인은 빠르고 간편하며 테이프나 접착제 스틱 없이도 봉인 상태를 유지할 수 있습니다.n윈도우리스 디자인. 인쇄, 라벨링 또는 수기 주소 지정이 용이하도록 전면 패널이 창이 없는 봉투로 제작되어 신속한 대량 비즈니스 우편 발송에 적합합니다.nWHITE 20LB 재고. 일상적인 비즈니스용으로 적합한 이 표준 흰색 봉투는 무겁고 내구성이 뛰어난 20파운드 용지로 제작되어 운송 중에 무거운 파일을 안전하게 보관할 수 있습니다.n다목적. 이 봉투는 청구서, 편지, 수표, 기프트 카드 등을 쉽게 넣을 수 있습니다. 이 봉투는 필요한 거의 모든 용도에 사용할 수 있습니다!"
}
},
하이브리드 검색도 마찬가지입니다.
> 쿼리_하이브리드_검색("배송비 포함")
[
{
"id": "449353344520491358",
"거리": 0.016393441706895828,
"엔티티": {
"text": "ASURION 4년 주택 개선 보호 플랜 $20-29.99nASURION 4년 주택 개선 보호 플랜 $20-29.99nASURIONnNonen아수리온은 고객의 필요에 맞는 제품 보호 플랜을 찾는 데 있어 추측을 배제합니다. 제품은 종종 가장 불편한 순간에 고장납니다. 다른 어떤 플랜도 아수리온 보호 플랜만큼 고객의 물건을 보호할 수 없기 때문에 아수리온 보호 플랜에 가입한 것은 다행스러운 일입니다. 간단히 말해, 아수리온 보호 플랜은 빠르고 간편한 청구 절차를 통해 가장 필요할 때 제품을 보호합니다. 잘 알고 신뢰할 수 있는 회사에서 보호 플랜을 구입하세요. 지금 바로 아수리온 보호 플랜을 장바구니에 추가하세요! 이 플랜과 관련된 자세한 이용 약관은 아래의 "사용자 가이드 [PDF]"를 참조하세요.n 추가 비용 없음: 수리 비용 $0 - 부품, 인건비 및 배송비 포함.n
}
}
]
여기서 하이브리드 검색은 '배송'이 포함된 제품을 찾을 수 있는 반면, 고밀도 임베딩은 배송이 가능한 결과를 더 많이 찾을 수 있음을 알 수 있습니다.
결론
이 튜토리얼에서는 다양한 유형의 데이터 임베딩에서 벡터 검색을 가능하게 하는 하이브리드 검색을 중심으로 Milvus 2.4의 새로운 기능에 대해 살펴보았습니다.
Milvus](https://github.com/milvus-io/milvus)와 Github에서 코드를 확인하고, Discord에 가입하여 커뮤니티와 경험을 공유해 주세요.
하이브리드 검색 수행하기
하이브리드 검색을 수행하려면 검색 결과를 개선하기 위해 희소 검색과 밀도 검색 방법을 결합해야 합니다. 이 과정은 일반적으로 다음 단계로 이루어집니다:
데이터 준비: 데이터를 벡터로 변환하여 데이터를 준비합니다. 텍스트 데이터의 경우 단어 임베딩, 이미지 데이터의 경우 이미지 임베딩 등 다양한 기법을 사용해 이 작업을 수행할 수 있습니다. 원시 데이터를 숫자 벡터로 변환하면 효율적인 인덱싱과 검색이 가능합니다.
인덱스 생성: 데이터 벡터에 대한 인덱스를 생성합니다. 인덱스는 데이터를 빠르게 조회하고 검색할 수 있는 데이터 구조입니다. 밀버스에서는 희소 벡터와 고밀도 벡터 모두에 대한 인덱스를 생성할 수 있어 검색 쿼리를 빠르고 정확하게 처리할 수 있습니다.
하이브리드 검색 수행: 희소 검색과 고밀도 검색 방법을 결합하여 하이브리드 검색을 수행합니다. 상호 순위 융합과 같은 기술을 사용해 두 검색 방법의 결과를 병합하여 정확도와 회수율의 균형을 맞춘 최종 순위를 생성할 수 있습니다. 이 단계는 희소 벡터와 고밀도 벡터의 강점을 모두 활용하기 위해 매우 중요합니다.
결과 검색: 최종 순위에 따라 검색 결과를 검색합니다. 검색 결과는 속성 필터링과 같은 다양한 기법을 사용해 추가로 필터링하고 세분화할 수 있습니다. 이를 통해 사용자에게 가장 관련성이 높고 품질이 높은 결과를 제공합니다.
하이브리드 검색은 검색 결과 개선, 효율성 증대, 유연성 향상 등 여러 가지 이점을 제공합니다. 이미지 및 텍스트 검색과 같은 다양한 애플리케이션에 사용할 수 있으며, 상호 순위 융합 및 벡터 기반 방법 등 다양한 기법을 사용하여 구현할 수 있습니다. 하이브리드 검색을 수행하면 애플리케이션의 특정 요구사항에 맞춰 보다 포괄적이고 정확한 검색 환경을 구현할 수 있습니다.
계속 읽기

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.

How to Use Anthropic MCP Server with Milvus
Discover how Model Context Protocol (MCP) pairs with Milvus to eliminate AI integration hassles, enabling smarter agents with seamless data access and flexibility.

Zilliz Cloud BYOC Upgrades: Bring Enterprise-Grade Security, Networking Isolation, and More
Discover how Zilliz Cloud BYOC brings enterprise-grade security, networking isolation, and infrastructure automation to vector database deployments in AWS
