다음을 통해 공유


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

Azure AI Search는 검색 인덱스의 벡터 크기를 줄이기 위해 스칼라 및 이진 양자화를 지원합니다. 퀀타이제이션은 float16 및 float32 임베딩의 메모리와 디스크 저장 공간을 줄이기 때문에 권장됩니다. 손실 압축의 효과를 상쇄하기 위해 오버샘플링 및 리스코링을 추가할 수 있습니다.

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

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

팁 (조언)

Azure AI Search: 새로운 압축 기술을 사용하여 벡터 비용을 최대 92.5% 절감하여 압축 전략을 비교하고 스토리지 및 비용 절감을 설명합니다. 또한 NDCG(정규화된 할인 누적 게인)를 기반으로 관련성을 측정하기 위한 메트릭을 포함하여 검색 품질을 희생하지 않고도 데이터를 압축할 수 있음을 보여 줍니다.

필수 조건

  • HNSW(Hierarchical Navigable Small Worlds) 또는 KNN(전체 K-최근접 이웃 항목) 알고리즘 및 새 벡터 프로필을 지정하는 구성이 있는 vectorSearch입니다.

지원되는 양자화 기술

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

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

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

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

참고

무료 서비스는 양자화를 지원하지만 제한된 스토리지 할당량으로 인해 전체 스토리지 절감액을 보여주지는 않습니다.

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

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

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

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

지원되는 재점수화 기법

재점수화는 벡터 양자화로 인한 정보 손실을 상쇄하기 위해 사용되는 선택적인 기술입니다. 쿼리 실행 중에는 초과 샘플링을 사용하여 추가 벡터를 선택하고 추가 정보를 사용하여 쿼리에서 찾은 초기 결과를 다시 점수로 작성합니다. 추가 정보는 압축되지 않은 원래 전체 정밀도 벡터이거나 이진 정량화에만 해당합니다. 쿼리 벡터에 대해 이진 정량화된 문서 후보를 사용하여 다시 점수할 수 있습니다.

HNSW 그래프만 다시 채점을 허용합니다. 정의에 따라 모든 벡터가 쿼리 시간에 검사되므로 다시 채점 및 오버샘플링이 무관하게 되므로 전체 KNN은 다시 채점을 지원하지 않습니다.

다시 점수 지정 옵션은 인덱스에 지정되지만 오버샘플링 쿼리 매개 변수를 추가하여 쿼리 시간에 다시 점수를 호출할 수 있습니다.

Object 속성
Index RescoringOptions를 벡터 압축 섹션에 추가하십시오. 이 문서의 예제에서는 .를 사용합니다 RescoringOptions.
Query oversampling 또는 RawVectorQuery정의에 VectorizableTextQuery을 추가합니다. oversampling를 추가하면 쿼리 시 다시 점수를 매기게 됩니다.

참고

최근 몇 차례의 릴리스 동안 다시 점수 매기기 매개변수 이름이 변경되었습니다. 이전 미리 보기 API를 사용하는 경우 중대한 변경 사항을 해결하기 위한 업그레이드 지침을 검토하십시오.

재스코어링에 대한 일반화된 프로세스는 다음과 같습니다.

  1. 벡터 쿼리는 압축된 벡터 필드에 대해 실행됩니다.
  2. 벡터 쿼리는 상위 k 오버샘플링된 후보를 반환합니다.
  3. 초과 샘플링된 k 후보는 스칼라 양자화를 위해 압축되지 않은 원래 벡터 또는 이진 양자화의 점 곱을 사용하여 다시 점수가 지정됩니다.
  4. 다시 점수가 매칭되면 관련성이 더 큰 일치 항목이 먼저 표시되도록 결과가 조정됩니다.

스칼라 정량화된 벡터에 대한 오버샘플링에는 원래 전체 정밀도 벡터의 가용성이 필요합니다. 이진 정량화된 벡터에 대한 오버샘플링은 전체 정밀도 벡터() 또는 이진 벡터(preserveOriginalsdiscardOriginals)의 점 곱을 사용할 수 있습니다. 벡터 스토리지를 최적화하는 경우 다시 점수 지정을 위해 필요한 경우 전체 정밀도 벡터를 인덱스에 유지해야 합니다. 자세한 내용은 스토리지에서 선택적 벡터 인스턴스 제거를 참조하세요.

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

이 섹션에서는 인덱스에 섹션을 지정하는 vectorsSearch.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=2025-09-01

{
  "name": "my-index",
  "description": "This is a description of this 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": [ 
      {
          "name": "vector-profile-1",
          "algorithm": "use-hnsw",
          "compression": "use-scalar"
      }
    ],
    "algorithms": [ 
      {
        "name": "use-hnsw",
        "kind": "hnsw",
        "hnswParameters": { },
        "exhaustiveKnnParameters": null
      }
    ],
    "compressions": [
      {
        "scalarQuantizationParameters": {
          "quantizedDataType": "int8"
        },
        "name": "mySQ8",
        "kind": "scalarQuantization",
        "rescoringOptions": {
            "enableRescoring": true,
            "defaultOversampling": 10,
            "rescoreStorageMethod": "preserveOriginals"
        },
        "truncationDimension": 2
      },
      {
        "name": "myBQC",
        "kind": "binaryQuantization",
        "rescoringOptions": {
            "enableRescoring": true,
            "defaultOversampling": 10,
            "rescoreStorageMethod": "discardOriginals"
        },
        "truncationDimension": 2
      }
    ]
  },
}

주요 정보:

  • kindscalarQuantization 또는 binaryQuantization로 설정해야 합니다.

  • rescoringOptions 는 정량화 전에 존재하는 원래 전체 정밀도 벡터를 사용하여 쿼리 결과를 다시 점수 지정하여 손실 압축을 상쇄하는 데 사용되는 속성의 컬렉션입니다. 다시 채점이 작동하려면 해당 콘텐츠를 제공하는 벡터 인스턴스가 있어야 합니다. rescoreStorageMethoddiscardOriginals로 설정하면 enableRescoring 또는 defaultOversampling을 사용하지 못하도록 합니다. 벡터 스토리지에 대한 자세한 내용은 스토리지에서 선택적 벡터 인스턴스 제거를 참조하세요.

  • "rescoreStorageMethod": "preserveOriginals": 원래 전체 정밀도 벡터를 사용하여 벡터 검색 결과를 다시 점수 매기기하면 검색 점수 및 순위가 조정되어 다시 점수 매기기 단계에 따라 좀 더 관련성이 높은 일치 항목이 승격될 수 있습니다. 이진 양자화의 경우, 품질을 저하시키지 않으면서 스토리지를 더 줄이기 위해 rescoreStorageMethoddiscardOriginals로 설정할 수 있습니다. 이진 양자화에는 원래 벡터가 필요하지 않습니다.

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

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

  • truncationDimension 는 text-embedding-3 모델의 고유 기능을 탭하여 "다양한 세분성으로 정보를 인코딩하고 단일 포함이 다운스트림 작업의 계산 제약 조건에 적응할 수 있도록 합니다"( Matryoshka 표현 학습 참조). 잘린 차원을 다시 채점 옵션과 함께 사용할 수도 있고, 그렇지 않은 경우도 있습니다. 이 기능이 Azure AI Search에서 구현되는 방법에 대한 자세한 내용은 MRL 압축을 사용하여 차원 자르기를 참조 하세요.

벡터 검색 알고리즘 추가

2024-11-01-preview REST API 이상에서 HNSW 또는 eKNN 알고리즘을 사용할 수 있습니다. 안정적인 버전의 경우 HNSW만 사용합니다. 다시 채점을 원하시면 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를 사용하여 인덱스를 로드합니다.

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

압축 또는 정량화된 벡터 필드에 대한 쿼리 구문은 오버샘플링 및 다시 점수 지정과 관련된 매개 변수를 재정의하려는 경우가 아니면 압축되지 않은 벡터 필드의 경우와 동일합니다. 쿼리 시간에 오버샘플링 및 다시 점수를 호출하는 매개 변수를 추가할 oversampling 수 있습니다.

요청에 대해 검색 문서를 사용합니다.

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

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

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

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

주요 정보:

  • 오버샘플링은 벡터 프로필 할당에 따라 벡터 압축을 받는 벡터 필드에 적용됩니다.

  • 쿼리의 오버샘플링은 인덱스의 defaultOversampling 값을 재정의하거나, 인덱스의 압축 구성에서 오버샘플링 또는 재랜킹 옵션을 지정하지 않은 경우에도 쿼리 시간에 오버샘플링 및 다시 점수를 호출합니다.