다음을 통해 공유


벡터 쿼리의 필터

벡터 쿼리에서 벡터 필터 모드를 설정 하여 쿼리 실행 전후에 필터링할지 여부를 지정할 수 있습니다.

필터는 벡터 쿼리의 범위를 결정합니다. 필터는 인덱스에 있는 것처럼 filterable 비벡터 문자열 및 숫자 필드에 대해 설정되고 반복되지만 필터의 용도에 따라 벡터 쿼리가 실행되는 항목(전체 검색 가능한 공간 또는 검색 결과의 내용)이 결정됩니다.

이 문서에서는 각 필터 모드를 설명하고 각 필터 모드를 사용하는 시기에 대한 지침을 제공합니다.

프리필터 모드

사전 필터링은 쿼리 실행 전에 필터를 적용하여 벡터 검색 알고리즘이 유사한 콘텐츠를 찾는 검색 노출 영역을 줄입니다. 벡터 쿼리 preFilter 에서 기본값입니다.

Diagram of prefilters.

사후 필터 모드

사후 필터링은 쿼리 실행 후 필터를 적용하여 검색 결과의 범위를 좁혀줍니다.

Diagram of post-filters.

벡터 필터 모드의 벤치마크 테스트

한 필터 모드가 다른 필터 모드보다 더 잘 수행되는 조건을 이해하기 위해 일련의 테스트를 실행하여 소형, 중간 및 대형 인덱스에 대한 쿼리 결과를 평가했습니다.

  • 작음(문서 100,000개, 2.5GB 인덱스, 1536차원)
  • 중간(문서 100만 개, 25GB 인덱스, 1536차원)
  • 대형(문서 10억 개, 1.9TB 인덱스, 96차원)

중소 규모의 워크로드의 경우 파티션 1개와 복제본(replica) 하나씩 있는 Standard 2(S2) 서비스를 사용했습니다. 대규모 워크로드의 경우 12개의 파티션과 1개의 복제본(replica) 있는 표준 3(S3) 서비스를 사용했습니다.

인덱스에는 키 필드 1개, 벡터 필드 1개, 텍스트 필드 1개, 필터링 가능한 숫자 필드 1개 등 동일한 구조가 있습니다. 다음 인덱스는 2023-07-01-preview 구문을 사용하여 정의됩니다.

def get_index_schema(self, index_name, dimensions):
    return {
        "name": index_name,
        "fields": [
            {"name": "id", "type": "Edm.String", "key": True, "searchable": True},
            {"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
              "searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
              "vectorSearchConfiguration": "defaulthnsw"},
            {"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
              "sortable": False, "facetable": False},
            {"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
              "retrievable": True, "sortable": True, "facetable": True}
        ],
        "vectorSearch":
        {
            "algorithmConfigurations": [
                {"name": "defaulthnsw", "kind": "hnsw", "hnswParameters": {"metric": "euclidean"}}
            ]
        }
    }

쿼리에서는 프리필터 및 사후 필터 작업 모두에 동일한 필터를 사용했습니다. 간단한 필터를 사용하여 필터 복잡성이 아니라 필터링 모드로 인해 성능이 변형되었는지 확인했습니다.

결과는 QPS(초당 쿼리 수)로 측정되었습니다.

핵심 내용

  • 성능이 거의 같은 작은 인덱스를 제외하고, 사전 필터링은 거의 항상 사후 필터링보다 느립니다.

  • 더 큰 데이터 세트의 경우 사전 필터링은 크기가 더 느린 순서입니다.

  • 그렇다면 거의 항상 느린 경우 프리필터가 기본값인 이유는 무엇일까요? 미리 필터링하면 결과가 인덱스에 k 있는 경우 반환됩니다. 여기서 바이어스는 속도보다 재현율과 정밀도를 선호합니다.

  • 사후 필터링은 다음을 수행할 고객을 위한 것입니다.

    • 선택 영역의 값 속도(사후 필터링은 결과보다 k 적게 반환할 수 있습니다.)
    • 지나치게 선택적이지 않은 필터 사용
    • 사전 필터링 성능이 허용되지 않는 충분한 크기의 인덱스가 있습니다.

세부 정보

  • 1536차원에서 100,000개의 벡터가 있는 데이터 세트를 지정합니다.

    • 데이터 세트의 30% 이상을 필터링할 때는 프리필터링 및 사후 필터링을 비교할 수 있었습니다.
    • 데이터 세트의 0.1% 미만을 필터링할 때 사전 필터링은 사후 필터링보다 약 50% 느렸습니다.
  • 1,536차원에서 100만 개의 벡터가 있는 데이터 세트를 지정합니다.

    • 데이터 세트의 30% 이상을 필터링할 때 사전 필터링 속도가 약 30% 느렸습니다.
    • 데이터 세트의 2% 미만을 필터링할 때 사전 필터링은 약 7배 느렸습니다.
  • 96차원에서 10억 개의 벡터가 있는 데이터 세트를 지정합니다.

    • 데이터 세트의 5% 이상을 필터링할 때 사전 필터링 속도가 약 50% 느렸습니다.
    • 데이터 세트의 10% 미만을 필터링할 때 사전 필터링은 약 7배 느렸습니다.

다음 그래프는 사후 필터 QPS로 나눈 프리필터 QPS로 계산된 미리 필터 상대 QPS를 보여줍니다.

Chart showing QPS performance for small, medium, and large indexes for relative QPS.

세로 축은 사후 필터링의 QPS를 통해 미리 필터링하는 QPS입니다. 예를 들어 값이 0.0이면 사전 필터링이 100% 느리고 세로 축에서 0.5는 프리필터링이 50% 느리고 1.0은 사전 필터링 및 사후 필터링이 동일하다는 것을 의미합니다.

가로 축은 필터를 적용한 후 필터링 속도 또는 후보 문서의 백분율을 나타냅니다. 예를 들어 1.00% 검색 모음의 1%가 필터 조건에 의해 선택되었음을 의미합니다.