다음을 통해 공유


스칼라 또는 이진 양자화를 사용하여 벡터 압축

Azure AI Search는 검색 인덱스의 벡터 크기를 줄이기 위해 스칼라 및 이진 양자화를 지원합니다. 벡터 크기를 줄이는 데는 float16 및 float32 포함에 대한 메모리 및 디스크 스토리지 사용량이 모두 감소하므로 양자화가 권장됩니다. 손실 압축의 효과를 상쇄하기 위해 압축되지 않은 벡터에 대해 오버샘플링 및 다시 점수를 추가할 수 있습니다.

기본 제공 양자화를 사용하려면 다음 단계를 수행합니다.

  • 벡터 필드 및 vectorSearch 인덱스 구성으로 시작
  • vectorSearch.compressions 추가
  • scalarQuantization 또는 binaryQuantization 구성을 추가하고 이름을 지정합니다.
  • 선택적 속성을 설정하여 손실 인덱싱의 영향을 완화합니다.
  • 명명된 구성을 사용하는 새 벡터 프로필을 만듭니다.
  • 새 벡터 프로필이 있는 새 벡터 필드를 만듭니다.
  • 정의한 구성을 사용하여 인덱싱하는 동안 양자화된 float32 또는 float16 데이터를 사용하여 인덱스를 로드합니다.
  • 필요에 따라 기본값을 재정의하려는 경우 과다 샘플링 매개 변수를 사용하여 양자화된 데이터를 쿼리합니다.

필수 조건

지원되는 양자화 기술

양자화는 부동 형식 벡터를 수신하는 벡터 필드에 적용됩니다. 이 문서의 예제에서 필드의 데이터 형식은 들어오는 float32 임베딩의 경우 Collection(Edm.Single)이지만 float16도 지원됩니다. 압축이 구성된 필드에서 벡터를 수신하면 엔진은 자동으로 양자화를 수행하여 메모리 및 디스크에서 벡터 데이터의 공간을 줄입니다.

다음과 같은 두 가지 유형의 양자화가 지원됩니다.

  • 스칼라 양자화는 부동 소수 자릿수 값을 더 좁은 데이터 형식으로 압축합니다. AI 검색은 현재 8비트인 int8을 지원하여 벡터 인덱스 크기를 4분의 1로 줄입니다.

  • 이진 양자화는 부동 소수를 1비트를 차지하는 이진 비트로 변환합니다. 이에 따라 벡터 인덱스 크기가 최대 28분의 1로 감소합니다.

검색 인덱스에 "압축" 추가

다음 예제에서는 벡터 필드 및 vectorSearch.compressions 섹션을 포함하는 필드 컬렉션이 있는 부분 인덱스 정의를 보여 줍니다.

여기에는 둘 다 scalarQuantization 또는 binaryQuantization.가 포함됩니다. 필요한 만큼 압축 구성을 지정한 다음 원하는 구성을 벡터 프로필에 할당할 수 있습니다.

안정적인 REST API와 미리 보기 REST API에 따라 vectorSearch.Compressions 구문이 다르며, 미리 보기에서는 스토리지 최적화를 위한 새로운 옵션과 기존 구문의 변경 내용을 추가합니다. 이전 버전과의 호환성은 내부 API 매핑을 통해 유지되지만 2024-11-01-preview 및 이후 버전을 대상으로 하는 코드에서 새 구문을 채택해야 합니다.

인덱스 만들기 또는 인덱스 만들기 또는 업데이트 REST API를 사용하여 압축 설정을 구성합니다.

POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01

{
  "name": "my-index",
  "fields": [
    { "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
    { "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
    { "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
  ],
  "vectorSearch": {
        "profiles": [ ],
        "algorithms": [ ],
        "compressions": [
          {
            "name": "use-scalar",
            "kind": "scalarQuantization",
            "scalarQuantizationParameters": {
              "quantizedDataType": "int8"
            },
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          },
          {
            "name": "use-binary",
            "kind": "binaryQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          }
        ]
    }
}

주요 정보:

  • kind 은 (을)로 scalarQuantization 설정해야 binaryQuantization합니다.

  • rerankWithOriginalVectors 는 원래의 압축되지 않은 벡터를 사용하여 유사성을 다시 계산하고 초기 검색 쿼리에서 반환된 상위 결과를 다시 확인합니다. 압축되지 않은 벡터는 stored가 false인 경우에도 검색 인덱스에 존재합니다. 이 속성은 선택 사항입니다. 기본값은 true입니다.

  • defaultOversampling은 양자화로 인한 정보 감소를 상쇄하기 위해 더 광범위한 잠재적 결과 집합을 고려합니다. 잠재적 결과에 대한 수식은 오버샘플링 승수와 함께 쿼리의 k로 구성됩니다. 예를 들어 쿼리에서 k를 5로 지정하고 오버샘플링이 20인 경우 쿼리는 해당 목적으로 압축되지 않은 원래 벡터를 사용하여 순위 재지정에 사용할 문서 100개를 효과적으로 요청합니다. 상위 k개의 순위 변경 결과만 반환됩니다. 이 속성은 선택 사항입니다. 기본값은 4입니다.

  • quantizedDataType은 선택 사항이며 스칼라 양자화에만 적용됩니다. 추가하는 경우 int8로 설정해야 합니다. 현재 스칼라 양자화에 지원되는 유일한 기본 데이터 형식입니다. 기본값은 int8입니다.

벡터 검색 알고리즘 추가

2024-11-01-preview REST API에서 HNSW 알고리즘 또는 철저한 KNN을 사용할 수 있습니다. 안정적인 버전의 경우 HNSW만 사용합니다.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

새 벡터 프로필 만들기 및 할당

새 양자화 구성을 사용하려면 벡터 프로필을 만들어야 합니다. 메모리에 압축된 인덱스를 작성하려면 새 벡터 프로필을 만들어야 합니다. 새 프로필은 HNSW를 사용합니다.

  1. 동일한 인덱스 정의에서 새 벡터 프로필을 만들고 압축 속성과 알고리즘을 추가합니다. 다음은 각 양자화 접근 방식에 해당하는 두 개의 프로필입니다.

    "vectorSearch": {
        "profiles": [
           {
              "name": "vector-profile-hnsw-scalar",
              "compression": "use-scalar", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           },
           {
              "name": "vector-profile-hnsw-binary",
              "compression": "use-binary", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           }
         ],
         "algorithms": [  <see previous section> ],
         "compressions": [ <see previous section> ] 
    }
    
  2. 벡터 필드에 벡터 프로필을 할당합니다. 필드의 데이터 형식은 float32 또는 float16입니다.

    Azure AI 검색에서 float32 및 float16 형식에 해당하는 EDM(엔터티 데이터 모델)은 각각 Collection(Edm.Single)Collection(Edm.Half)입니다.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. 풀 모델 인덱싱에 인덱서를 사용하거나 푸시 모델 인덱싱에 API를 사용하여 인덱스를 로드합니다.

스칼라 양자화는 각 벡터 포함 내 각 숫자의 해상도를 줄입니다. 각 숫자를 16비트 또는 32비트 부동 소수점 숫자로 표현하는 대신 8비트 정수를 사용합니다. 숫자 범위(일반적으로 99번째 백분위수 최소값 및 최대값)를 식별하고 유한한 수의 수준 또는 계급구간(bin)으로 나누어 각 계급구간에 식별자를 할당합니다. 8비트 스칼라 양자화에는 2^8, 즉 256개의 가능한 계급구간이 있습니다.

벡터의 각 구성 요소는 실수를 가장 가까운 정수로 반올림하는 것과 유사한 프로세스에서 이 양자화 수준 집합 내에서 가장 가까운 대표값에 매핑됩니다. 양자화된 8비트 벡터에서는 원래 값 대신 식별자 번호가 사용됩니다. 양자화 후 각 벡터는 해당 구성 요소가 속한 계급구간에 대한 식별자 배열로 표시됩니다. 이러한 양자화된 벡터는 원래 벡터에 비해 저장해야 하는 비트가 훨씬 적기 때문에 스토리지 요구 사항과 메모리 공간이 줄어듭니다.

이진 양자화는 각 구성 요소를 단일 비트(0 또는 1)로 표시하여 고차원 벡터를 압축합니다. 이 메서드는 메모리 공간을 크게 줄이고 검색 및 검색 작업에 중요한 벡터 비교 작업을 가속화합니다. 벤치마크 테스트 결과 벡터 인덱스 크기가 최대 96% 감소하는 것으로 나타났습니다.

1,024보다 큰 규모의 임베딩에 특히 효과적입니다. 더 작은 규모의 경우 이진 양자화의 품질을 테스트하거나 대신 스칼라를 시도하는 것이 좋습니다. 또한 임베딩이 0을 중심으로 이루어질 때 BQ가 매우 잘 수행된다는 점을 확인했습니다. OpenAI, Cohere 및 Mistral과 같은 인기 있는 임베딩 모델은 0을 중심으로 합니다.

오버샘플링을 사용하여 양자화된 벡터 필드 쿼리

압축되거나 정량화된 벡터 필드에 대한 쿼리 구문은 원래 벡터로 오버샘플링 또는 다시 점수 지정과 관련된 매개 변수를 재정의하려는 경우가 아니면 압축되지 않은 벡터 필드의 경우와 동일합니다.

인덱스의 벡터 압축 정의에는 손실 압축의 영향을 완화하기 위한 defaultOversampling rerankWithOriginalVectors 설정이 있습니다. 기본값을 재정의하여 쿼리 시 동작을 변경할 수 있습니다. 예를 들어 defaultOversampling이 10.0인 경우 쿼리 요청에서 다르게 변경할 수 있습니다.

인덱스에 명시적인 rerankWithOriginalVectors 또는 defaultOversampling 정의가 없더라도 오버샘플링 매개 변수를 설정할 수 있습니다. 쿼리 시 oversampling을 제공하면 해당 쿼리에 대한 인덱스 설정이 재정의되고 유효한 rerankWithOriginalVectors가 true로 설정된 쿼리가 실행됩니다.

POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01

{    
    "vectorQueries": [
        {    
            "kind": "vector",    
            "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
            "fields": "myvector",
            "oversampling": 12.0,
            "k": 5   
        }
  ]    
}

주요 정보:

  • 벡터 프로필 할당에 따라 벡터 압축을 거치는 벡터 필드에 적용됩니다.

  • 인덱스의 압축 구성에서 오버샘플링 또는 순위 재지정 옵션을 지정하지 않은 경우에도 쿼리 시 defaultOversampling 값을 재정의하거나 오버샘플링을 도입합니다.