모델 랭커 개요Compatible with Milvus 2.6.x
기존의 벡터 검색은 순전히 수학적 유사성, 즉 고차원 공간에서 벡터가 얼마나 가깝게 일치하는지에 따라 결과의 순위를 매깁니다. 이 접근 방식은 효율적이기는 하지만 진정한 의미적 관련성을 놓치는 경우가 많습니다. '데이터베이스 최적화를 위한 모범 사례'를 검색한다고 생각해 보세요. 이러한 용어가 자주 언급되는 벡터 유사도가 높은 문서가 있지만 실제로 실행 가능한 최적화 전략을 제공하지는 않을 수 있습니다.
모델 랭커는 쿼리와 문서 간의 의미 관계를 이해하는 고급 언어 모델을 통합하여 Milvus 검색을 혁신합니다. 벡터 유사도에만 의존하는 대신 콘텐츠의 의미와 문맥을 평가하여 보다 지능적이고 관련성 높은 결과를 제공합니다.
제한 사항
모델 랭커는 그룹화 검색에는 사용할 수 없습니다.
모델 재랭크에 사용되는 필드는 텍스트 유형이어야 합니다(
VARCHAR).각 모델 랭커는 한 번에 하나의
VARCHAR필드만 평가에 사용할 수 있습니다.
작동 방식
모델 랭커는 잘 정의된 워크플로우를 통해 언어 모델 이해 기능을 Milvus 검색 프로세스에 통합합니다:
모델 랭커 개요
초기 쿼리: 애플리케이션이 Milvus에 쿼리를 보냅니다.
벡터 검색: Milvus는 표준 벡터 검색을 수행하여 후보 문서를 식별합니다.
후보 검색: 시스템이 벡터 유사성을 기반으로 초기 후보 문서 세트를 식별합니다.
모델 평가: 모델 랭커 함수는 쿼리-문서 쌍을 처리합니다:
원본 쿼리와 후보 문서를 외부 모델 서비스로 전송합니다.
언어 모델은 쿼리와 각 문서 간의 의미적 관련성을 평가합니다.
각 문서는 의미적 이해도를 기반으로 관련성 점수를 받습니다.
지능형 순위 재조정: 모델에서 생성된 관련성 점수를 기반으로 문서 순서가 재조정됩니다.
향상된 결과: 애플리케이션이 벡터 유사도가 아닌 의미론적 관련성에 따라 순위가 매겨진 결과를 받습니다.
필요에 맞는 모델 제공업체 선택
Milvus는 재랭킹을 위해 다음과 같은 모델 서비스 제공업체를 지원하며, 각각 고유한 특성을 가지고 있습니다:
제공자 |
최상의 대상 |
특성 |
사용 사례 예시 |
|---|---|---|---|
vLLM |
심층적인 의미론적 이해와 사용자 정의가 필요한 복잡한 애플리케이션 |
|
법률 용어와 판례 관계를 이해하는 도메인별 모델을 배포하는 법률 연구 플랫폼 |
TEI |
효율적인 리소스 사용으로 빠른 구현 |
|
표준 요구 사항을 충족하는 효율적인 리랭킹 기능이 필요한 콘텐츠 관리 시스템 |
Cohere |
안정성과 통합 용이성을 우선시하는 엔터프라이즈 애플리케이션 |
|
일관된 API 성능과 다국어 제품 카탈로그를 갖춘 고가용성 검색이 필요한 이커머스 플랫폼 |
Voyage AI |
특정 성능 및 컨텍스트 요구 사항이 있는 RAG 애플리케이션 |
|
미세 조정된 성능 제어와 전문화된 의미론적 이해가 필요한 다양한 문서 길이의 연구 데이터베이스 |
SiliconFlow |
비용 효율성에 우선순위를 두고 긴 문서를 처리하는 애플리케이션 |
|
지능적인 세분화 및 중복 제어가 필요한 긴 매뉴얼과 문서를 처리하는 기술 문서 검색 시스템 |
각 모델 서비스 구현에 대한 자세한 내용은 전용 설명서를 참조하세요:
구현
모델 랭커를 구현하기 전에 다음이 필요한지 확인하세요:
재랭크할 텍스트가 포함된
VARCHAR필드가 있는 Milvus 컬렉션Milvus 인스턴스에서 액세스할 수 있는 실행 중인 외부 모델 서비스
Milvus와 선택한 모델 서비스 간의 적절한 네트워크 연결
모델 랭커는 표준 벡터 검색 및 하이브리드 검색 작업 모두와 원활하게 통합됩니다. 구현에는 재랭크 구성을 정의하는 함수 객체를 생성하고 이를 검색 작업에 전달하는 작업이 포함됩니다.
모델 랭커 만들기
모델 재랭킹을 구현하려면 먼저 적절한 구성으로 함수 객체를 정의합니다. 이 예에서는 서비스 제공자로 TEI를 사용합니다:
from pymilvus import MilvusClient, Function, FunctionType
# Connect to your Milvus server
client = MilvusClient(
uri="http://localhost:19530" # Replace with your Milvus server URI
)
# Create a model ranker function
model_ranker = Function(
name="semantic_ranker", # Function identifier
input_field_names=["document"], # VARCHAR field to use for reranking
function_type=FunctionType.RERANK, # Must be set to RERANK
params={
"reranker": "model", # Specify model reranker. Must be "model"
"provider": "tei", # Choose provider: "tei", "vllm", etc.
"queries": ["machine learning for time series"], # Query text
"endpoint": "http://model-service:8080", # Model service endpoint
# "maxBatch": 32 # Optional: batch size for processing
}
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.ranker.ModelRanker;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
ModelRanker ranker = ModelRanker.builder()
.name("semantic_ranker")
.inputFieldNames(Collections.singletonList("document"))
.provider("tei")
.queries(Collections.singletonList("machine learning for time series"))
.endpoint("http://model-service:8080")
.build();
// nodejs
// go
# restful
파라미터 |
필수? |
설명 |
값/예시 |
|---|---|---|---|
|
예 |
검색을 실행할 때 사용되는 함수의 식별자입니다. |
|
|
예 |
순위 재지정에 사용할 텍스트 필드의 이름입니다.
|
|
|
예 |
생성 중인 함수의 유형을 지정합니다. 모든 모델 랭커에 대해 |
|
|
예 |
모델 기반 재랭킹 함수에 대한 구성이 포함된 딕셔너리입니다. 사용 가능한 매개 변수(키)는 서비스 제공업체에 따라 다릅니다. |
|
|
예 |
모델 재랭킹을 사용하려면 |
|
|
예 |
재랭크에 사용할 모델 서비스 제공업체입니다. |
|
|
예 |
재랭크 모델에서 관련성 점수를 계산하는 데 사용하는 쿼리 문자열의 목록입니다. 쿼리 문자열의 수는 검색 작업의 쿼리 수와 정확히 일치해야 하며(텍스트 대신 쿼리 벡터를 사용하는 경우에도 마찬가지), 그렇지 않으면 오류가 보고됩니다. |
|
|
예 |
모델 서비스의 URL입니다. |
|
|
No |
단일 배치에서 처리할 최대 문서 수입니다. 값이 클수록 처리량은 증가하지만 더 많은 메모리가 필요합니다. |
|
표준 벡터 검색에 적용
모델 랭킹러를 정의한 후 이를 랭킹러 매개변수에 전달하여 검색 작업 중에 적용할 수 있습니다:
# Use the model ranker in standard vector search
results = client.search(
collection_name,
data=[your_query_vector], # Number of query vectors must match that specified in model_ranker.params["queries"]
anns_field="vector_field",
limit=10,
output_fields=["document"], # Include the text field in outputs
ranker=model_ranker, # Apply the model ranker here
consistency_level="Bounded"
)
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;
SearchReq searchReq = SearchReq.builder()
.collectionName(COLLECTION_NAME)
.data(Collections.singletonList(new EmbeddedText("machine learning for time series")))
.annsField("vector_field")
.limit(10)
.outputFields(Collections.singletonList(document))
.functionScore(FunctionScore.builder()
.addFunction(ranker)
.build())
.consistencyLevel(ConsistencyLevel.BOUNDED)
.build();
SearchResp searchResp = client.search(searchReq);
// nodejs
// go
# restful