벡터 유사성 검색 수행

이 주제에서는 Milvus를 사용하여 엔터티를 검색하는 방법을 소개합니다.

Milvus에서는 벡터 유사성 검색이 쿼리 벡터와 컬렉션 내의 벡터 간의 거리를 계산하고 (지정된 유사성 측정 방법을 사용하여) 가장 유사한 결과를 반환합니다. 당신은 스칼라 또는 기본 키 필드를 필터링하기 위해 불리언 표현식을 지정하여 혼합 검색을 수행할 수 있습니다.

다음 예제는 북 ID (기본 키), 단어 수 (스칼라 필드) 및 책 개요 (벡터 필드)를 포함하는 2000개의 데이터 행이 포함된 데이터 세트에서 벡터 유사성 검색을 수행하는 방법을 보여줍니다. 이를 통해 벡터화된 설명에 기반하여 특정 책을 검색하는 시뮬레이션이 이루어집니다. Milvus는 쿼리 벡터와 정의한 검색 매개변수를 기반으로 가장 유사한 결과를 반환할 것입니다.

컬렉션 로드

Milvus 내에서의 모든 검색 및 쿼리 작업은 메모리에서 실행됩니다. 벡터 유사성 검색을 수행하기 전에 컬렉션을 메모리에 로드합니다.

from pymilvus import Collection
collection = Collection("book")      # 기존 컬렉션 가져오기
collection.load()

검색 매개변수 준비

검색 시나리오에 해당하는 매개변수를 준비합니다. 다음 예제는 유클리드 거리를 사용하여 거리를 계산하고 IVF_FLAT 인덱스에 의해 구축된 열 개의 가장 가까운 클러스터에서 벡터를 검색하는 데 사용할 매개변수를 정의합니다.

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
매개변수 설명
metric_type 검색 중에 벡터 간의 거리를 측정하는 데 사용되는 방법입니다. 이 값은 인덱스 구축 프로세스 중에 지정된 방법과 동일해야 합니다. 자세한 내용은 유사성 측정을 참조하세요.
offset 검색 중에 건너뛸 엔터티 수입니다. search 메서드의 limit 값과 이 값의 합은 16384보다 작아야 합니다. 예를 들어, 쿼리 벡터의 9번째와 10번째 가장 가까운 이웃을 조회하려면 limit를 2로 설정하고 offset를 8로 설정합니다.
ignore_growing 유사성 검색 중에 성장 중인 세그먼트를 무시할지 여부입니다. 기본값은 False로, 검색에 성장 중인 세그먼트가 포함됨을 나타냅니다.
params 특정한 인덱스 유형에 대한 검색 매개변수입니다. 자세한 내용은 벡터 인덱스를 참조하세요. nprobe는 검색할 클러스터 단위 수를 나타냅니다. 이 매개변수는 index_typeIVF_FLAT, IVF_SQ8, 또는 IVF_PQ로 설정할 때만 사용할 수 있습니다. 값은 인덱스 구축 프로세스 중에 지정된 nlist 값보다 작아야 합니다. ef는 검색 범위를 나타냅니다. 이 매개변수는 index_typeHNSW로 설정할 때만 사용할 수 있습니다. 값은 top_k32768 사이여야 합니다. radius는 가장 낮은 유사성을 갖는 벡터가 위치한 각도를 나타냅니다. range_filter는 쿼리 벡터와 유사도가 특정 범위 내에 있는 벡터 필드 값을 필터링하는 데 사용되는 필터를 나타냅니다.

Vector Search 수행하기

Milvus를 사용하여 벡터 검색을 수행합니다. 특정 파티션 내에서 검색하려면 파티션 이름 목록을 지정하세요.

Milvus는 검색을 위한 일관성 수준을 설정하는 기능을 지원합니다. 이 항목의 예제에서는 일관성 수준을 "강력"으로 설정합니다. 또한 "제한된", "세션", 또는 "최종적으로"와 같은 일관성 수준을 설정할 수 있습니다. Milvus의 네 가지 일관성 수준에 대한 자세한 내용은 일관성을 참조하세요.

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="강력"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
매개변수 설명
data 검색에 사용되는 벡터입니다.
anns_field 검색할 필드의 이름입니다.
param 색인에 특화된 검색 매개변수입니다. 자세한 내용은 벡터 인덱스를 참조하세요.
limit 반환할 결과의 수입니다. 이 값과 paramoffset을 합친 값은 16,384보다 작아야 합니다.
expr 속성을 필터링하는 불리언 표현식입니다. 자세한 내용은 불리언 표현식 규칙을 참조하세요.
output_fields (선택 사항) 반환할 필드의 이름입니다. 현재는 벡터 필드를 지원하지 않습니다.
consistency_level (선택 사항) 검색을 위한 일관성 수준입니다.

가장 유사한 벡터의 주요 키 값과 거리를 확인하세요.

results[0].ids
results[0].distances

검색이 완료되면 Milvus에 로드된 컬렉션을 해제하여 메모리 사용량을 줄입니다.

collection.release()

제한 사항

기능 최대 제한
컬렉션 이름 길이 255 문자
컬렉션 내 파티션 수 4,096
컬렉션 내 필드 수 256
컬렉션 내 샤드 수 256
벡터 차원 32,768
상위 K 16,384
입력 벡터 16,384

혼합 검색 수행하기

혼합 검색은 본질적으로 속성 필터링이 포함된 벡터 검색입니다. 스칼라 필드 또는 주요 키 필드를 필터링하는 데 사용되는 불리언 표현식을 지정함으로써 특정 조건에서 검색을 제한할 수 있습니다.

다음 예제는 일반 벡터 검색을 기반으로 혼합 검색을 수행하는 방법을 보여줍니다. 벡터화된 요약을 기반으로 특정 도서를 검색하고자 하지만 특정 단어 수 범위 내에서만 검색하려면, 검색 매개변수에 불리언 표현식을 지정하여 word_count 필드를 필터링할 수 있습니다. Milvus는 표현식과 일치하는 엔티티 내에서만 유사한 벡터를 검색합니다.

불리언 표현식을 지정함으로써 벡터 검색 중에 엔티티의 스칼라 필드를 필터링할 수 있습니다. 다음 예제는 검색 범위를 지정된 word_count 값 범위 내의 벡터로 제한합니다.

필터링 표현식에 동적 필드를 사용하고 검색 요청에 출력 필드를 사용할 수도 있습니다. 예를 들어, 동적 패턴을 참조하세요.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

반환된 결과를 확인하세요.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- 총 히트 수: {len(hits)}, 히트 ID: {hits.ids} ")
print(f"- 최상위 히트 ID: {hits[0].id}, 거리: {hits[0].distance}, 스코어: {hits[0].score} ")

범위 검색 수행하기

범위 검색은 쿼리 벡터와 벡터 필드 값 사이의 거리를 기반으로 검색 결과를 필터링하는 방법입니다. 다양한 거리 측정 항목을 사용하여 거리를 측정할 수 있습니다.

범위 검색을 수행할 때, Milvus는 먼저 벡터 유사성 검색을 수행한 다음, 지정된 거리 조건에 따라 벡터 필터링을 실행하고 해당 거리 범위 내에 있는 벡터를 반환합니다.

다음 예제는 일반적인 벡터 검색을 기반으로 범위 검색을 수행하는 방법을 보여줍니다.

컬렉션 로드하기

Milvus에서의 모든 검색 및 쿼리 작업은 메모리에서 실행됩니다. 벡터 유사성 검색을 수행하기 전에 컬렉션을 메모리로 로드해야 합니다.

from pymilvus import Collection
collection = Collection("book")      # 기존 컬렉션 가져오기
collection.load()

벡터 필터링 범위 구성

Milvus의 범위 검색은 일반적인 벡터 검색과 비교하여 특정 검색 범위 내에서 원하는 검색 결과를 얻기 위해 radiusrange_filter라는 두 개의 새로운 매개변수를 도입하여 제어됩니다.

radius는 벡터가 유사하다고 간주되는 최소 각도를 지정합니다. 선택 사항인 range_filterradius와 함께 사용되어 쿼리 벡터와의 유사성을 기반으로 벡터 필드 값을 특정 범위 내에서 필터링하는 데 사용될 수 있습니다. radiusrange_filter 매개변수는 모두 FLOAT 데이터 유형을 가지고 있습니다. 이 두 매개변수를 설정하여 검색의 정확성과 효율성을 효과적으로 균형을 맞출 수 있습니다.

보통 유사성은 벡터 필드 값과 쿼리 벡터 간의 거리로 측정됩니다. 서로 다른 거리 측정 방법의 선택은 radiusrange_filter의 구성에 significant한 영향을 미칠 것입니다.

예를 들어, L2 거리의 경우, 검색 결과는 radius보다 작은 거리를 가진 벡터 필드 값에 기반하여 필터링되어야 합니다. 이는 L2 거리에서 더 작은 거리가 더 큰 유사성을 나타내기 때문입니다. 이러한 지식을 바탕으로 가장 유사한 벡터 중 일부를 필터링하고 싶다면, range_filter 값이 radius보다 작은 효과적인 값을 지정할 수 있습니다.

search_params = {
    "metric_type": "L2",
    "params": {
        "radius": 10.0,
        "range_filter" : 5.0
    }
}

반면, IP 거리의 경우 상황은 다릅니다. IP 거리에서는 더 큰 거리가 더 큰 유사성을 나타내기 때문에, L2 거리와는 반대로, IP 거리에서의 radiusrange_filter 값은 반대입니다. 다시 말하면, IP 거리를 기반으로 가장 유사한 벡터 중 일부를 range_filter로 필터링하려면, 효과적인 range_filter 값은 radius보다 크고, 결과 벡터의 거리는 radius보다 크지만 range_filter와 같거나 작아야 합니다.

search_params = {
    "metric_type": "IP",
    "params": {
        "radius": 0.8,
        "range_filter" : 1.0
    }
}

범위 검색 수행

거리 측정 유형에 따라 radiusrange_filter를 지정하여 반환할 결과 벡터의 범위를 정의할 수 있습니다.

L2 거리에 기반하여 5.010.0 범위 내에서 유사성에 대한 범위 검색 수행:

search_param = {
  "data": [[0.1, 0.2]], # 쿼리 벡터
  "anns_field": "book_intro", # 검색할 필드
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # 반환할 필드
}

res = collection.search(**search_param)

IP 거리에 기반하여 1.00.8 범위 내에서 유사성에 대한 범위 검색 수행:

search_param = {
  "data": [[0.1, 0.2]], # 쿼리 벡터
  "anns_field": "book_intro", # 검색할 필드
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # 반환할 필드
}

res = collection.search(**search_param)

요약

Milvus에서 범위 검색은 특정 거리 범위 내에서 유사한 벡터 결과를 반환할 수 있습니다. 이 기능은 검색 매개변수에서 radiusrange_filter를 지정함으로써 활성화됩니다. 아래 표는 서로 다른 거리 측정 유형에 대한 이 두 매개변수의 구성을 요약한 것입니다.

거리 측정 유형 구성
L2 및 기타 거리 range_filter <= 거리 < radius
IP 및 코사인 거리 radius < 거리 <= range_filter