• 밀버스 소개
  • 시작하기
  • 개념
  • 사용자 가이드
  • 데이터 가져오기
  • AI 도구
  • 관리 가이드
  • 도구
  • 통합
  • 튜토리얼
  • 자주 묻는 질문
  • API Reference

부스트 랭커Compatible with Milvus v2.6.2+

부스트 랭커를 사용하면 벡터 거리를 기반으로 계산된 의미적 유사성에만 의존하는 대신 의미 있는 방식으로 검색 결과에 영향을 줄 수 있습니다. 메타데이터 필터링을 사용하여 검색 결과를 빠르게 조정하는 데 이상적입니다.

검색 요청에 부스트 랭커 기능이 포함된 경우, Milvus는 기능 내의 선택적 필터링 조건을 사용하여 검색 결과 후보 중에서 일치하는 항목을 찾고 지정된 가중치를 적용하여 일치하는 항목의 점수를 높여 최종 결과에서 일치하는 항목의 순위를 올리거나 내릴 수 있도록 도와줍니다.

부스트 랭커를 사용하는 경우

크로스 인코더 모델이나 융합 알고리즘에 의존하는 다른 랭커와 달리, 부스트 랭커는 메타데이터 기반 규칙을 직접 랭킹 프로세스에 삽입하므로 다음과 같은 시나리오에 더 적합합니다.

사용 사례

예시

부스트 랭커가 잘 작동하는 이유

비즈니스 중심 콘텐츠 우선순위 지정

  • 이커머스 검색 결과에서 프리미엄 제품 강조 표시

  • 사용자 참여 지표(조회수, 좋아요, 공유 등)가 높은 콘텐츠의 가시성 향상

  • 시간에 민감한 검색 애플리케이션에서 최신 콘텐츠의 우선 순위 높이기

  • 검증되거나 신뢰할 수 있는 출처의 콘텐츠 우선 순위 지정

  • 정확한 구문 또는 관련성이 높은 키워드와 일치하는 결과 향상

인덱스를 재구축하거나 벡터 임베딩 모델을 수정할 필요 없이, 시간이 많이 소요되는 작업인 선택적 메타데이터 필터를 실시간으로 적용하여 검색 결과에서 특정 항목을 즉시 승격하거나 강등할 수 있습니다. 이 메커니즘을 통해 진화하는 비즈니스 요구사항에 쉽게 적응할 수 있는 유연하고 동적인 검색 순위가 가능합니다.

전략적 콘텐츠 순위 하향 조정

  • 인벤토리가 낮은 항목의 순위를 완전히 제거하지 않고 눈에 잘 띄지 않게 하기

  • 검열 없이 불쾌감을 줄 수 있는 용어가 포함된 콘텐츠의 순위를 낮추기

  • 기술 검색에서는 계속 액세스할 수 있도록 하면서 오래된 문서의 등급을 낮추기

  • 마켓플레이스 검색에서 경쟁사 제품의 가시성을 미묘하게 낮추기

  • 품질이 낮은 콘텐츠의 관련성 감소(서식 문제, 짧은 길이 등)

여러 개의 부스트 랭커를 결합하여 보다 역동적이고 강력한 가중치 기반 순위 전략을 구현할 수도 있습니다.

부스트 랭커의 메커니즘

다음 다이어그램은 부스트 랭커의 주요 워크플로우를 보여줍니다.

Boost Ranker Mechanism 부스트 랭커 메커니즘

사용자가 데이터를 입력하면 Milvus는 데이터를 세그먼트에 분산시킵니다. 검색이 진행되는 동안 각 세그먼트는 후보 세트를 반환하고, Milvus는 모든 세그먼트에서 이러한 후보의 순위를 매겨 최종 결과를 생성합니다. 검색 요청에 부스트 랭커가 포함된 경우, Milvus는 각 세그먼트의 후보 결과에 이를 적용하여 잠재적인 정확도 손실을 방지하고 리콜률을 향상시킵니다.

결과를 최종 확정하기 전에 Milvus는 다음과 같이 부스트 랭커로 이러한 후보를 처리합니다:

  1. 부스트 랭커에 지정된 선택적 필터링 표현식을 적용하여 표현식과 일치하는 엔티티를 식별합니다.

  2. 부스트 랭커에 지정된 가중치를 적용하여 식별된 엔티티의 점수를 부스트합니다.

멀티벡터 하이브리드 검색에서는 부스트 랭커를 순위 결정자로 사용할 수 없습니다. 그러나 하위 요청(AnnSearchRequest)에서 순위 결정자로 사용할 수 있습니다.

부스트 랭커의 예

다음 예는 가장 관련성이 높은 상위 5개 엔티티를 반환하고 추상 문서 유형의 엔티티 점수에 가중치를 추가해야 하는 단일 벡터 검색에서 부스트 랭커를 사용하는 방법을 설명합니다.

  1. 검색 결과 후보를 세그먼트 단위로 수집합니다.

    다음 표에서는 Milvus가 엔티티를 두 개의 세그먼트(00010002)로 분배하고 각 세그먼트에서 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

  2. 부스트 랭커(doctype='abstract')에 지정된 필터링 표현식을 적용합니다.

    다음 표의 DocType 필드에 표시된 대로 Milvus는 추가 처리를 위해 doctypeabstract 로 설정한 모든 엔티티를 표시합니다.

    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

  3. 부스트 랭커(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보다 큰 가중치를 사용합니다.

  4. 가중치를 적용한 점수를 기준으로 모든 세그먼트의 후보를 집계하여 결과를 최종 확정합니다.

    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

파라미터

필수?

설명

값/예시

name

Yes

이 함수의 고유 식별자

"boost"

input_field_names

함수를 적용할 벡터 필드 목록(부스트 랭커의 경우 비워둬야 함)

[]

function_type

Yes

호출할 함수의 유형( RERANK 을 사용하여 재랭크 전략을 지정합니다.

FunctionType.RERANK

params.reranker

Yes

리랭커의 유형을 지정합니다.

부스트 랭커를 사용하려면 boost 로 설정해야 합니다.

"boost"

params.weight

Yes

원시 검색 결과에서 일치하는 엔티티의 점수에 곱할 가중치를 지정합니다.

값은 부동 소수점 숫자여야 합니다.

  • 일치하는 엔티티의 중요성을 강조하려면 점수를 높이는 값으로 설정하세요.

  • 일치하는 엔티티의 점수를 낮추려면 이 매개변수에 점수를 낮추는 값을 지정합니다.

1

params.filter

No

검색 결과 엔티티 중 엔티티를 일치시키는 데 사용할 필터 표현식을 지정합니다. 필터링 설명에 언급된 모든 유효한 기본 필터 표현식을 사용할 수 있습니다.

참고: ==, > 또는 < 과 같은 기본 연산자만 사용하세요. text_match 또는 phrase_match 과 같은 고급 연산자를 사용하면 검색 성능이 저하됩니다.

"doctype == 'abstract'"

params.random_score

No

0 ~ 1 사이의 값을 임의로 생성하는 임의 함수를 지정합니다. 다음 두 가지 선택적 인수가 있습니다:

  • seed (숫자) 의사 난수 생성기(PRNG)를 시작하는 데 사용되는 초기 값을 지정합니다.

  • field (문자열) 난수를 생성할 때 임의의 요소로 사용될 값의 필드 이름을 지정합니다. 고유한 값을 가진 필드로 충분합니다.

    동일한 시드 및 필드 값을 사용하여 여러 세대에 걸쳐 일관성을 유지하려면 seedfield 을 모두 설정하는 것이 좋습니다.

{"seed": 126, "field": "id"}

단일 부스트 랭커로 검색하기

부스트 랭커 기능이 준비되면 검색 요청에서 이를 참조할 수 있습니다. 다음 예제에서는 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 인스턴스를 만드는 데 필요한 매개변수가 나열되어 있습니다.

파라미터

필수?

설명

값/예시

functions

목록에 있는 대상 랭커의 이름을 지정합니다.

["fix_weight_ranker", "random_weight_ranker"]

params.boost_mode

아니요

지정된 가중치가 일치하는 엔티티의 점수에 영향을 미치는 방식을 지정합니다.

가능한 값은 다음과 같습니다:

  • Multiply

    가중치 값이 일치하는 엔티티의 원래 점수에 지정된 가중치를 곱한 값과 같음을 나타냅니다.

    이것이 기본값입니다.

  • Sum

    가중값이 일치하는 엔티티의 원래 점수와 지정된 가중치의 합과 같음을 나타냅니다.

"Sum"

params.function_mode

아니요

다양한 부스트 랭커의 가중치가 처리되는 방식을 지정합니다.

가능한 값은 다음과 같습니다:

  • Multiply

    일치하는 엔티티의 최종 점수가 모든 부스트 랭커의 가중치를 곱한 값과 같음을 나타냅니다.

    이것이 기본값입니다.

  • Sum

    일치하는 엔티티의 최종 점수가 모든 부스트 랭커의 가중치 합과 같음을 나타냅니다.

"Sum"