vLLM 랭커Compatible with Milvus 2.6.x
vLLM Ranker는 시맨틱 재랭킹을 통해 검색 관련성을 향상시키기 위해 vLLM 추론 프레임워크를 활용합니다. 이는 기존의 벡터 유사성을 뛰어넘는 검색 결과 순서에 대한 고급 접근 방식을 나타냅니다.
특히 다음과 같이 정밀도와 컨텍스트가 중요한 애플리케이션에 vLLM Ranker가 유용합니다:
개념에 대한 깊은 이해가 필요한 기술 문서 검색
의미론적 관계가 키워드 매칭보다 중요한 연구 데이터베이스
사용자 문제를 관련 솔루션과 일치시켜야 하는 고객 지원 시스템
제품 속성과 사용자 의도를 이해해야 하는 이커머스 검색
전제 조건
Milvus에서 vLLM Ranker를 구현하기 전에 다음 사항을 충족해야 합니다:
재랭크할 텍스트가 포함된
VARCHAR필드가 있는 Milvus 컬렉션순위 재조정 기능이 있는 실행 중인 vLLM 서비스. vLLM 서비스 설정에 대한 자세한 지침은 공식 vLLM 설명서를 참조하세요. vLLM 서비스 가용성을 확인하려면:
# Replace YOUR_VLLM_ENDPOINT_URL with the actual URL (e.g., http://<service-ip>:<port>/v1/rerank) # Replace 'BAAI/bge-reranker-base' if you deployed a different model curl -X 'POST' \ 'YOUR_VLLM_ENDPOINT_URL' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "model": "BAAI/bge-reranker-base", "query": "What is the capital of France?", "documents": [ "The capital of Brazil is Brasilia.", "The capital of France is Paris.", "Horses and cows are both animals" ] }'성공적인 응답은 OpenAI 재랭크 API 응답과 유사하게 관련성 점수에 따라 순위가 매겨진 문서를 반환해야 합니다.
자세한 서버 인수 및 옵션은 vLLM OpenAI 호환 서버 설명서를 참조하세요.
vLLM 랭커 함수 만들기
Milvus 애플리케이션에서 vLLM 랭커를 사용하려면 재랭크 작동 방식을 지정하는 함수 객체를 생성합니다. 이 함수는 Milvus 검색 작업에 전달되어 결과 순위를 향상시킵니다.
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 vLLM Ranker function
vllm_ranker = Function(
name="vllm_semantic_ranker", # Choose a descriptive name
input_field_names=["document"], # Field containing text to rerank
function_type=FunctionType.RERANK, # Must be RERANK
params={
"reranker": "model", # Specifies model-based reranking
"provider": "vllm", # Specifies vLLM service
"queries": ["renewable energy developments"], # Query text
"endpoint": "http://localhost:8080", # vLLM service address
"max_client_batch_size": 32, # Optional: batch size
"truncate_prompt_tokens": 256, # Optional: Use last 256 tokens
}
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq.Function ranker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("vllm_semantic_ranker")
.inputFieldNames(Collections.singletonList("document"))
.param("reranker", "model")
.param("provider", "vllm")
.param("queries", "[\"renewable energy developments\"]")
.param("endpoint", "http://localhost:8080")
.param("max_client_batch_size", "32")
.param("truncate_prompt_tokens", "256")
.build();
// nodejs
// go
# restful
vLLM 랭커별 파라미터
다음 파라미터는 vLLM 랭커에만 해당되는 파라미터입니다:
파라미터 |
필수? |
설명 |
값/예시 |
|---|---|---|---|
|
예 |
모델 순위 재지정을 사용하려면 |
|
|
예 |
재랭크에 사용할 모델 서비스 제공업체입니다. |
|
|
예 |
재랭크 모델에서 관련성 점수를 계산하는 데 사용하는 쿼리 문자열의 목록입니다. 쿼리 문자열의 수는 검색 작업의 쿼리 수와 정확히 일치해야 하며(텍스트 대신 쿼리 벡터를 사용하는 경우에도 마찬가지), 그렇지 않으면 오류가 보고됩니다. |
["검색 쿼리"] |
|
예 |
vLLM 서비스 주소입니다. |
|
|
No |
모델 서비스가 모든 데이터를 한 번에 처리하지 못할 수 있으므로 여러 요청에서 모델 서비스에 액세스하기 위한 배치 크기를 설정합니다. |
|
|
No |
정수 k로 설정하면 프롬프트에서 마지막 k 토큰만 사용합니다(즉, 왼쪽 잘림). 기본값은 없음(즉, 잘림 없음)입니다. |
|
모든 모델 랭커에서 공유되는 일반 매개변수(예: provider, queries)는 모델 랭커 만들기를 참조하세요.
표준 벡터 검색에 적용
표준 벡터 검색에 vLLM 랭커를 적용하려면 다음과 같이 하세요:
# Execute search with vLLM reranking
results = client.search(
collection_name="your_collection",
data=[your_query_vector], # Replace with your query vector
anns_field="dense_vector", # Vector field to search
limit=5, # Number of results to return
output_fields=["document"], # Include text field for reranking
ranker=vllm_ranker, # Apply vLLM reranking
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("your_collection")
.data(Arrays.asList(new EmbeddedText("AI Research Progress"), new EmbeddedText("What is AI")))
.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