선형 감쇠Compatible with Milvus 2.6.x
선형 감쇠는 검색 결과에서 절대 0점에서 끝나는 직선형 감소를 만듭니다. 다가오는 이벤트 카운트다운에서 이벤트가 지나갈 때까지 관련성이 서서히 사라지는 것처럼, 선형 감쇠는 항목이 이상적인 지점에서 멀어지면서 완전히 사라질 때까지 관련성을 예측 가능하고 꾸준히 감소시킵니다. 이 접근 방식은 특정 경계를 벗어난 항목이 결과에서 완전히 제외되도록 하여 명확한 컷오프가 있는 일관된 감쇠율을 원하는 경우에 이상적입니다.
다른 감쇠 함수와 달리
가우스 감쇠는 점진적으로 접근하지만 0에 도달하지 않는 종 곡선을 따릅니다.
지수 감쇠는 무한히 확장되는 최소한의 관련성을 가진 긴 꼬리를 유지합니다.
선형 감쇠는 명확한 끝점을 고유하게 생성하므로 자연스러운 경계나 기한이 있는 애플리케이션에 특히 효과적입니다.
선형 감쇠를 사용하는 경우
선형 감쇠는 특히 다음과 같은 경우에 효과적입니다:
사용 사례 |
예시 |
선형이 잘 작동하는 이유 |
|---|---|---|
이벤트 목록 |
콘서트 티켓 플랫폼 |
너무 먼 미래의 이벤트에 대한 명확한 컷오프 생성 |
기간 한정 행사 |
플래시 세일, 프로모션 |
만료되었거나 곧 만료될 오퍼가 표시되지 않도록 합니다. |
배달 반경 |
음식 배달, 택배 서비스 |
엄격한 지리적 경계 적용 |
연령 제한 콘텐츠 |
데이트 플랫폼, 미디어 서비스 |
확고한 연령 제한 설정 |
선형 소멸 시기를 선택하세요:
애플리케이션에 자연스러운 경계, 마감일 또는 임계값이 있는 경우
특정 시점을 초과하는 항목은 결과에서 완전히 제외되어야 합니다.
예측 가능하고 일관된 관련성 감소 속도가 필요한 경우
사용자는 관련성 있는 항목과 관련성 없는 항목을 명확하게 구분할 수 있어야 합니다.
꾸준한 감소 원칙
선형 감쇠는 정확히 0에 도달할 때까지 일정한 비율로 감소하는 직선형 하락을 만듭니다. 이 패턴은 카운트다운 타이머, 재고 고갈, 관련성 만료 시점이 명확한 마감일 접근과 같은 많은 일상적인 시나리오에서 나타납니다.
모든 시간 매개변수(origin, offset, scale)는 수집 데이터와 동일한 단위를 사용해야 합니다. 컬렉션에서 타임스탬프를 다른 단위(밀리초, 마이크로초)로 저장하는 경우 모든 매개변수를 그에 맞게 조정하세요.
선형 감쇠
위의 그래프는 선형 감쇠가 티켓팅 플랫폼의 이벤트 목록에 어떤 영향을 미치는지 보여줍니다:
origin(현재 날짜): 관련성이 최대(1.0)인 현재 시점입니다.offset(1일): '즉시 이벤트 기간': 다음 날 이내에 발생하는 모든 이벤트는 관련성 점수가 최대(1.0)로 유지되어 매우 임박한 이벤트가 약간의 시간 차이로 인해 불이익을 받지 않도록 보장합니다.decay(0.5): 스케일 거리의 점수 - 이 매개변수는 관련성 감소 속도를 제어합니다.scale(10일): 관련성이 감쇠 값으로 떨어지는 기간 - 10일이 지난 이벤트의 관련성 점수는 절반(0.5)으로 감소합니다.
직선 곡선에서 볼 수 있듯이, 약 16일이 지난 이벤트는 관련성이 정확히 0이 되며 검색 결과에 전혀 표시되지 않습니다. 이렇게 하면 사용자가 정의된 기간 내에 관련성 있는 예정된 이벤트만 볼 수 있도록 명확한 경계가 만들어집니다.
이 동작은 임박한 이벤트가 가장 관련성이 높고, 앞으로 몇 주 안에 열리는 이벤트는 중요도가 떨어지며, 너무 먼 미래(또는 이미 지난)의 이벤트는 전혀 표시되지 않아야 하는 이벤트 계획의 일반적인 작동 방식을 반영합니다.
공식
선형 감쇠 점수를 계산하는 수학 공식은 다음과 같습니다:
Where:
이를 쉽게 설명하면 다음과 같습니다:
필드 값이 원점으로부터 얼마나 멀리 떨어져 있는지 계산:
오프셋(있는 경우)을 빼되 0 이하로 내려가지 않도록 합니다:
스케일 및 감쇠 값에서 매개변수 s를 결정합니다.
s에서 조정된 거리를 빼고 s로 나눕니다.
0 가 0 이하로 내려가지 않도록 합니다.
s 계산은 척도 및 감쇠 매개변수를 점수가 0에 도달하는 지점으로 변환합니다. 예를 들어, 감쇠가 0.5이고 스케일이 7이면 점수는 거리=14(스케일 값의 두 배)에서 정확히 0에 도달합니다.
선형 감쇠 사용
선형 감쇠는 Milvus의 표준 벡터 검색과 하이브리드 검색 연산 모두에 적용할 수 있습니다. 다음은 이 기능을 구현하는 핵심 코드 스니펫입니다.
감쇠 함수를 사용하기 전에 먼저 감쇠 계산에 사용할 적절한 숫자 필드(타임스탬프, 거리 등)가 있는 컬렉션을 만들어야 합니다. 컬렉션 설정, 스키마 정의, 데이터 삽입을 포함한 전체 작업 예제는 감쇠 순위 자습서를 참조하세요.
감쇠 랭커 생성하기
컬렉션에 숫자 필드(이 예에서는 event_date 를 지금부터 몇 초 후로 설정)를 설정한 후 선형 감쇠 순위자를 만듭니다:
시간 단위 일관성: 시간 기반 감쇠를 사용하는 경우 origin, scale, offset 매개변수가 컬렉션 데이터와 동일한 시간 단위를 사용하는지 확인하세요. 수집에서 타임스탬프를 초 단위로 저장하는 경우 모든 매개변수에 초를 사용합니다. 밀리초를 사용하는 경우 모든 매개변수에 밀리초를 사용합니다.
from pymilvus import Function, FunctionType
import time
# Calculate current time
current_time = int(time.time())
# Create a linear decay ranker for event listings
# Note: All time parameters must use the same unit as your collection data
ranker = Function(
name="event_relevance", # Function identifier
input_field_names=["event_date"], # Numeric field to use
function_type=FunctionType.RERANK, # Function type. Must be RERANK
params={
"reranker": "decay", # Specify decay reranker
"function": "linear", # Choose linear decay
"origin": current_time, # Current time (seconds, matching collection data)
"offset": 12 * 60 * 60, # 12 hour immediate events window (seconds)
"decay": 0.5, # Half score at scale distance
"scale": 7 * 24 * 60 * 60 # 7 days (in seconds, matching collection data)
}
)
import io.milvus.v2.service.vector.request.ranker.DecayRanker;
DecayRanker ranker = DecayRanker.builder()
.name("event_relevance")
.inputFieldNames(Collections.singletonList("event_date"))
.function("linear")
.origin(System.currentTimeMillis())
.offset(12 * 60 * 60)
.decay(0.5)
.scale(7 * 24 * 60 * 60)
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const ranker = {
name: "event_relevance",
input_field_names: ["event_date"],
type: FunctionType.RERANK,
params: {
reranker: "decay",
function: "linear",
origin: new Date(2025, 1, 15).getTime(),
offset: 12 * 60 * 60,
decay: 0.5,
scale: 7 * 24 * 60 * 60,
},
};
// go
# restful
표준 벡터 검색에 적용
감쇠 순위자를 정의한 후 ranker 파라미터에 전달하여 검색 작업 중에 적용할 수 있습니다:
# Apply decay ranker to 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=["title", "venue", "event_date"], # 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.FloatVec;
SearchReq searchReq = SearchReq.builder()
.collectionName(COLLECTION_NAME)
.data(Collections.singletonList(new FloatVec(embedding)))
.annsField("dense")
.limit(10)
.outputFields(Arrays.asList("title", "venue", "event_date"))
.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: ["title", "venue", "event_date"],
rerank: ranker,
consistency_level: "Strong",
});
// go
# restful