부스트 랭커Compatible with Milvus v2.6.2+
부스트 랭커를 사용하면 벡터 거리를 기반으로 계산된 의미적 유사성에만 의존하는 대신 의미 있는 방식으로 검색 결과에 영향을 줄 수 있습니다. 메타데이터 필터링을 사용하여 검색 결과를 빠르게 조정하는 데 이상적입니다.
검색 요청에 부스트 랭커 기능이 포함된 경우, Milvus는 기능 내의 선택적 필터링 조건을 사용하여 검색 결과 후보 중에서 일치하는 항목을 찾고 지정된 가중치를 적용하여 일치하는 항목의 점수를 높여 최종 결과에서 일치하는 항목의 순위를 올리거나 내릴 수 있도록 도와줍니다.
부스트 랭커를 사용하는 경우
크로스 인코더 모델이나 융합 알고리즘에 의존하는 다른 랭커와 달리, 부스트 랭커는 메타데이터 기반 규칙을 직접 랭킹 프로세스에 삽입하므로 다음과 같은 시나리오에 더 적합합니다.
사용 사례 |
예시 |
부스트 랭커가 잘 작동하는 이유 |
|---|---|---|
비즈니스 중심 콘텐츠 우선순위 지정 |
|
인덱스를 재구축하거나 벡터 임베딩 모델을 수정할 필요 없이, 시간이 많이 소요되는 작업인 선택적 메타데이터 필터를 실시간으로 적용하여 검색 결과에서 특정 항목을 즉시 승격하거나 강등할 수 있습니다. 이 메커니즘을 통해 진화하는 비즈니스 요구사항에 쉽게 적응할 수 있는 유연하고 동적인 검색 순위가 가능합니다. |
전략적 콘텐츠 순위 하향 조정 |
|
여러 개의 부스트 랭커를 결합하여 보다 역동적이고 강력한 가중치 기반 순위 전략을 구현할 수도 있습니다.
부스트 랭커의 메커니즘
다음 다이어그램은 부스트 랭커의 주요 워크플로우를 보여줍니다.
부스트 랭커 메커니즘
사용자가 데이터를 입력하면 Milvus는 데이터를 세그먼트에 분산시킵니다. 검색이 진행되는 동안 각 세그먼트는 후보 세트를 반환하고, Milvus는 모든 세그먼트에서 이러한 후보의 순위를 매겨 최종 결과를 생성합니다. 검색 요청에 부스트 랭커가 포함된 경우, Milvus는 각 세그먼트의 후보 결과에 이를 적용하여 잠재적인 정확도 손실을 방지하고 리콜률을 향상시킵니다.
결과를 최종 확정하기 전에 Milvus는 다음과 같이 부스트 랭커로 이러한 후보를 처리합니다:
부스트 랭커에 지정된 선택적 필터링 표현식을 적용하여 표현식과 일치하는 엔티티를 식별합니다.
부스트 랭커에 지정된 가중치를 적용하여 식별된 엔티티의 점수를 부스트합니다.
멀티벡터 하이브리드 검색에서는 부스트 랭커를 순위 결정자로 사용할 수 없습니다. 그러나 하위 요청(AnnSearchRequest)에서 순위 결정자로 사용할 수 있습니다.
부스트 랭커의 예
다음 예는 가장 관련성이 높은 상위 5개 엔티티를 반환하고 추상 문서 유형의 엔티티 점수에 가중치를 추가해야 하는 단일 벡터 검색에서 부스트 랭커를 사용하는 방법을 설명합니다.
검색 결과 후보를 세그먼트 단위로 수집합니다.
다음 표에서는 Milvus가 엔티티를 두 개의 세그먼트(0001 및 0002)로 분배하고 각 세그먼트에서 5개의 후보를 반환한다고 가정합니다.
ID
문서 유형
점수
순위
세그먼트
117
abstract
0.344
1
0001
89
abstract
0.456
2
0001
257
body
0.578
3
0001
358
title
0.788
4
0001
168
body
0.899
5
0001
46
body
0.189
1
0002
48
body
0265
2
0002
561
abstract
0.366
3
0002
344
abstract
0.444
4
0002
276
abstract
0.845
5
0002
부스트 랭커(
doctype='abstract')에 지정된 필터링 표현식을 적용합니다.다음 표의
DocType필드에 표시된 대로 Milvus는 추가 처리를 위해doctype을abstract로 설정한 모든 엔티티를 표시합니다.ID
DocType
Score
Rank
세그먼트
117
abstract
0.344
1
0001
89
abstract
0.456
2
0001
257
body
0.578
3
0001
358
title
0.788
4
0001
168
body
0.899
5
0001
46
body
0.189
1
0002
48
body
0265
2
0002
561
abstract
0.366
3
0002
344
abstract
0.444
4
0002
276
abstract
0.845
5
0002
부스트 랭커(
weight=0.5)에 지정된 가중치를 적용합니다.이전 단계에서 식별된 모든 엔티티에 부스트 랭커에 지정된 가중치가 곱해져 순위가 변경됩니다.
ID
문서 유형
점수
가중 점수
(= 점수 x 가중치)
순위
세그먼트
117
abstract
0.344
0.172
1
0001
89
abstract
0.456
0.228
2
0001
257
body
0.578
0.578
3
0001
358
title
0.788
0.788
4
0001
168
body
0.899
0.899
5
0001
561
abstract
0.366
0.183
1
0002
46
body
0.189
0.189
2
0002
344
abstract
0.444
0.222
3
0002
48
body
0.265
0.265
4
0002
276
abstract
0.845
0.423
5
0002
가중치는 사용자가 선택한 부동 소수점 숫자여야 합니다. 위의 예와 같이 점수가 작을수록 관련성이 높은 경우에는 1보다 작은 가중치를 사용하고, 그렇지 않은 경우에는 1보다 큰 가중치를 사용합니다.
가중치를 적용한 점수를 기준으로 모든 세그먼트의 후보를 집계하여 결과를 최종 확정합니다.
ID
문서 유형
점수
가중 점수
순위
세그먼트
117
abstract
0.344
0.172
1
0001
561
abstract
0.366
0.183
2
0002
46
body
0.189
0.189
3
0002
344
abstract
0.444
0.222
4
0002
89
abstract
0.456
0.228
5
0001
부스트 랭커 사용법
이 섹션에서는 부스트 랭커를 사용하여 단일 벡터 검색 결과에 영향을 미치는 방법에 대한 예시를 보여드립니다.
부스트 랭커 생성하기
부스트 랭커를 검색 요청의 재랭커로 전달하기 전에 다음과 같이 부스트 랭커를 재랭크 함수로 올바르게 정의해야 합니다:
from pymilvus import Function, FunctionType
ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"filter": "doctype == 'abstract'",
"random_score": {
"seed": 126,
"field": "id"
},
"weight": 0.5
}
)
import io.milvus.v2.service.vector.request.ranker.BoostRanker;
BoostRanker ranker = BoostRanker.builder()
.name("boost")
.filter("doctype == \"abstract\"")
.weight(5.0f)
.randomScoreField("id")
.randomScoreSeed(126)
.build();
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
filter: "doctype == 'abstract'",
random_score: {
seed: 126,
field: "id",
},
weight: 0.5,
},
};
# restful
파라미터 |
필수? |
설명 |
값/예시 |
|---|---|---|---|
|
Yes |
이 함수의 고유 식별자 |
|
|
예 |
함수를 적용할 벡터 필드 목록(부스트 랭커의 경우 비워둬야 함) |
|
|
Yes |
호출할 함수의 유형( |
|
|
Yes |
리랭커의 유형을 지정합니다. 부스트 랭커를 사용하려면 |
|
|
Yes |
원시 검색 결과에서 일치하는 엔티티의 점수에 곱할 가중치를 지정합니다. 값은 부동 소수점 숫자여야 합니다.
|
|
|
No |
검색 결과 엔티티 중 엔티티를 일치시키는 데 사용할 필터 표현식을 지정합니다. 필터링 설명에 언급된 모든 유효한 기본 필터 표현식을 사용할 수 있습니다. 참고: |
|
|
No |
|
|
단일 부스트 랭커로 검색하기
부스트 랭커 기능이 준비되면 검색 요청에서 이를 참조할 수 있습니다. 다음 예제에서는 id, 벡터, doctype 필드가 있는 컬렉션을 이미 생성했다고 가정합니다.
from pymilvus import MilvusClient
# Connect to the Milvus server
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Assume you have a collection set up
# Conduct a similarity search using the created ranker
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.functionScore(FunctionScore.builder()
.addFunction(ranker)
.build())
.build());
SearchResp searchResp = client.search(searchReq);
// go
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
// Connect to the Milvus server
const client = new MilvusClient({
address: 'localhost:19530',
token: 'root:Milvus'
});
// Assume you have a collection set up
// Conduct a similarity search
const searchResults = await client.search({
collection_name: 'my_collection',
data: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911],
anns_field: 'vector',
output_fields: ['doctype'],
rerank: ranker,
});
console.log('Search results:', searchResults);
# restful
여러 부스트 랭커로 검색하기
하나의 검색에 여러 부스트 랭커를 결합하여 검색 결과에 영향을 줄 수 있습니다. 이렇게 하려면 여러 개의 부스트 랭커를 생성하고, 이를 FunctionScore 인스턴스에서 참조한 다음, 검색 요청에서 FunctionScore 인스턴스를 랭커로 사용하면 됩니다.
다음 예는 0.8에서 1.2 사이의 가중치를 적용하여 식별된 모든 엔티티의 점수를 수정하는 방법을 보여줍니다.
from pymilvus import MilvusClient, Function, FunctionType, FunctionScore
# Create a Boost Ranker with a fixed weight
fix_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"weight": 0.8
}
)
# Create a Boost Ranker with a randomly generated weight between 0 and 0.4
random_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"random_score": {
"seed": 126,
},
"weight": 0.4
}
)
# Create a Function Score
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)
# Conduct a similarity search using the created Function Score
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function fixWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.8")
.build();
CreateCollectionReq.Function randomWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.4")
.param("random_score", "{\"seed\": 126}")
.build();
Map<String, String> params = new HashMap<>();
params.put("boost_mode","Multiply");
params.put("function_mode","Sum");
FunctionScore ranker = FunctionScore.builder()
.addFunction(fixWeightRanker)
.addFunction(randomWeightRanker)
.params(params)
.build()
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.addFunction(ranker)
.build());
SearchResp searchResp = client.search(searchReq);
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const fix_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
weight: 0.8,
},
};
const random_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
random_score: {
seed: 126,
},
weight: 0.4,
},
};
const ranker = {
functions: [fix_weight_ranker, random_weight_ranker],
params: {
boost_mode: "Multiply",
function_mode: "Sum",
},
};
await client.search({
collection_name: "my_collection",
data: [[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field: "vector",
params: {},
output_field: ["doctype"],
ranker: ranker
});
# restful
구체적으로 두 개의 부스트 랭커가 있는데, 하나는 발견된 모든 엔티티에 고정 가중치를 적용하고 다른 하나는 무작위 가중치를 할당합니다. 그런 다음 이 두 랭커를 FunctionScore에서 참조하여 가중치가 발견된 엔티티의 점수에 영향을 미치는 방식을 정의합니다.
다음 표에는 FunctionScore 인스턴스를 만드는 데 필요한 매개변수가 나열되어 있습니다.
파라미터 |
필수? |
설명 |
값/예시 |
|---|---|---|---|
|
예 |
목록에 있는 대상 랭커의 이름을 지정합니다. |
|
|
아니요 |
지정된 가중치가 일치하는 엔티티의 점수에 영향을 미치는 방식을 지정합니다. 가능한 값은 다음과 같습니다:
|
|
|
아니요 |
다양한 부스트 랭커의 가중치가 처리되는 방식을 지정합니다. 가능한 값은 다음과 같습니다:
|
|