가우시안 감쇠Compatible with Milvus 2.6.x

일반 감쇠라고도 하는 가우시안 감쇠는 검색 결과를 가장 자연스러운 느낌으로 조정합니다. 가우시안 감쇠는 거리에 따라 점차 흐려지는 사람의 시각처럼 부드러운 종 모양의 곡선을 만들어 항목이 이상적인 지점에서 멀어질수록 관련성을 부드럽게 감소시킵니다. 이 접근 방식은 원하는 범위를 벗어난 아이템에 가혹한 불이익을 주지 않으면서도 멀리 떨어진 아이템의 관련성을 크게 낮추는 균형 잡힌 감쇠를 원할 때 이상적입니다.

다른 붕괴 랭커와 달리

  • 지수 감쇠는 처음에 급격하게 감소하여 초기 페널티가 더 강합니다.

  • 선형 감쇠는 0에 도달할 때까지 일정한 비율로 감소하여 명확한 컷오프를 생성합니다.

가우스 감쇠는 사용자에게 자연스럽게 느껴지는 균형 잡힌 직관적인 접근 방식을 제공합니다.

가우스 감쇠를 사용하는 경우

가우시안 감쇠는 특히 다음과 같은 경우에 효과적입니다:

사용 사례

예시

가우시안 감쇠가 효과적인 이유

위치 기반 검색

식당 찾기, 매장 찾기

거리 관련성에 대한 인간의 자연스러운 인식 모방

콘텐츠 추천

게시일을 기준으로 한 기사 추천

콘텐츠가 오래됨에 따라 관련성 점진적 감소

제품 목록

목표 근처에 가격이 책정된 품목

가격이 목표에서 벗어남에 따라 관련성 점진적 감소

전문가 매칭

관련 경험이 있는 전문가 찾기

경험 관련성에 대한 균형 잡힌 평가

가혹한 페널티나 엄격한 컷오프 없이 자연스럽게 관련성이 감소하는 느낌이 필요한 애플리케이션이라면 가우스 감쇠가 최선의 선택일 수 있습니다.

벨 커브 원리

가우시안 감쇠는 이상적인 지점에서 거리가 멀어질수록 관련성이 점차 감소하는 부드러운 종 모양의 곡선을 만듭니다. 수학자 칼 프리드리히 가우스의 이름을 딴 이 분포는 자연과 통계에서 자주 나타나기 때문에 인간의 지각에 매우 직관적으로 느껴집니다.

Gaussian Decay 가우스 붕괴

위 그래프는 가우스 붕괴가 모바일 검색 앱에서 레스토랑 순위에 어떤 영향을 미치는지 보여줍니다:

  • origin (0km): 관련성이 최대(1.0)인 현재 위치.

  • offset (±300 m): 사용자 주변의 '만점 영역'으로, 300m 이내의 모든 레스토랑이 관련성 점수 최대치(1.0)를 유지하여 아주 가까운 옵션이 작은 거리 차이로 인해 불필요하게 불이익을 받지 않도록 합니다.

  • scale (±2km): 정확히 2km 떨어진 레스토랑의 관련성 점수가 절반(0.5)으로 떨어지는 거리로, 관련성이 감쇠 값으로 떨어집니다.

  • decay (0.5): 척도 거리에서의 점수 - 이 매개변수는 기본적으로 거리에 따라 점수가 얼마나 빨리 감소하는지를 제어합니다.

곡선에서 볼 수 있듯이 2km를 초과하는 레스토랑은 관련성이 계속 감소하지만 0에 도달하지는 않습니다. 4~5km 떨어진 레스토랑도 최소한의 관련성은 유지되므로, 비록 순위는 낮지만 훌륭하지만 멀리 떨어져 있는 레스토랑도 여전히 결과에 표시될 수 있습니다.

이 동작은 사람들이 자연스럽게 거리 관련성에 대해 생각하는 방식, 즉 가까운 곳을 선호하지만 예외적인 옵션을 위해 더 먼 곳도 기꺼이 여행하는 방식을 모방합니다.

공식

가우스 붕괴 점수를 계산하는 수학 공식은 다음과 같습니다:

S(doc)=exp((max(0,fieldvaluedocoriginoffset))22σ2)S(doc) = \exp\left( -\frac{\left( \max\left(0, \left|fieldvalue_{doc} - origin\right| - offset \right) \right)^2}{2\sigma^2} \right)

Where:

σ2=scale22ln(decay)\sigma^2 = -\frac{scale^2}{2 \cdot \ln(decay)}

이를 쉽게 설명하면 다음과 같습니다:

  1. 필드 값이 원점으로부터 얼마나 멀리 떨어져 있는지 계산: ∣fieldvaluedoc-origin∣|fieldvalue_{doc} - origin|

  2. 오프셋(있는 경우)을 빼되 0 이하로 내려가지 않도록 합니다: max(0,거리오프셋)\max(0, 거리 - 오프셋)

  3. 이 조정된 거리를 제곱합니다: (조정된_거리)2(조정된\_거리)^2 2

  4. 2σ22\sigma^2 2로 나누고, 이는 스케일 및 감쇠 매개변수에서 계산됩니다.

  5. 음의 지수를 취하여 0과 1 사이의 값을 얻습니다: exp(-값)\exp(-값)

σ2\sigma^{2} 2 계산은 스케일과 감쇠 매개변수를 가우스 분포의 표준편차 제곱으로 변환합니다. 이것이 함수에 특징적인 종 모양을 부여합니다.

가우스 감쇠 사용

가우스 감쇠는 Milvus의 표준 벡터 검색과 하이브리드 검색 연산 모두에 적용할 수 있습니다. 다음은 이 기능을 구현하는 핵심 코드 스니펫입니다.

감쇠 함수를 사용하기 전에 먼저 감쇠 계산에 사용할 적절한 숫자 필드(타임스탬프, 거리 등)가 포함된 컬렉션을 만들어야 합니다. 컬렉션 설정, 스키마 정의 및 데이터 삽입을 포함한 전체 작업 예제는 튜토리얼을 참조하세요: 밀버스에서 시간 기반 랭킹 구현하기를 참조하세요.

감쇠 순위 생성하기

숫자 필드(이 예에서는 사용자로부터 미터 단위의 distance )로 컬렉션을 설정한 후, 가우스 감쇠 순위자를 만듭니다:

from pymilvus import Function, FunctionType

# Create a Gaussian decay ranker for location-based restaurant search
ranker = Function(
    name="restaurant_distance_decay",     # Function identifier
    input_field_names=["distance"],       # Numeric field for distance in meters
    function_type=FunctionType.RERANK,    # Function type. Must be RERANK
    params={
        "reranker": "decay",              # Specify decay reranker
        "function": "gauss",              # Choose Gaussian decay
        "origin": 0,                      # Your current location (0 meters)
        "offset": 300,                    # 300m no-decay zone
        "decay": 0.5,                     # Half score at scale distance
        "scale": 2000                     # 2 km scale (2000 meters)
    }
)
import io.milvus.v2.service.vector.request.ranker.DecayRanker;

DecayRanker ranker = DecayRanker.builder()
        .name("restaurant_distance_decay")
        .inputFieldNames(Collections.singletonList("distance"))
        .function("gauss")
        .origin(0)
        .offset(300)
        .decay(0.5)
        .scale(2000)
        .build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";

const ranker = {
  name: "restaurant_distance_decay",
  input_field_names: ["distance"],
  function_type: FunctionType.RERANK,
  params: {
    reranker: "decay",
    function: "gauss",
    origin: 0,
    offset: 300,
    decay: 0.5,
    scale: 2000,
  },
};

// go
# restful

감쇠 순위자를 정의한 후 ranker 파라미터에 전달하여 검색 작업 중에 적용할 수 있습니다:

# Apply decay ranker to restaurant vector search
result = milvus_client.search(
    collection_name,
    data=[your_query_vector],         # Replace with your query vector
    anns_field="dense",                   # Vector field to search
    limit=10,                             # Number of results
    output_fields=["name", "cuisine", "distance"],  # Fields to return
    ranker=ranker,                        # Apply the decay ranker
    consistency_level="Strong"
)
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("italian restaurants")))
        .annsField("vector_field")
        .limit(10)
        .outputFields(Arrays.asList("name", "cuisine", "distance"))
        .functionScore(FunctionScore.builder()
                .addFunction(ranker)
                .build())
        .consistencyLevel(ConsistencyLevel.STRONG)
        .build();
SearchResp searchResp = client.search(searchReq);
const result = await milvusClient.search({
  collection_name: "collection_name",
  data: [your_query_vector], // Replace with your query vector
  anns_field: "dense",
  limit: 10,
  output_fields: ["name", "cuisine", "distance"],
  rerank: ranker,
  consistency_level: "Strong",
});
// go
# restful

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?