k-NN 벡터

k-NN 벡터 (k-NN vector)

knn_vector 데이터 타입은 벡터를 OpenSearch 인덱스에 수집하고 다양한 종류의 벡터 검색을 수행할 수 있게 해줘요. knn_vector 필드는 매우 설정이 유연하며 다양한 벡터 워크로드를 처리할 수 있어요. 일반적으로 knn_vector 필드는 메서드 정의를 제공하거나 모델 ID를 지정해서 만들 수 있어요.

출처: 문서

본문

예시

my_vector를 knn_vector로 매핑하려면 다음 요청을 사용해요.

PUT /test-index
{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "knn_vector",
        "dimension": 3,
        "space_type": "l2"
      }
    }
  }
}

벡터 저장소 최적화

벡터 저장소를 최적화하려면 벡터 워크로드 모드를 in_memory(가장 낮은 지연 시간에 최적화) 또는 on_disk(가장 낮은 비용에 최적화)로 지정할 수 있어요. on_disk 모드는 메모리 사용을 줄여요. 선택적으로 compression_level을 지정해 벡터 메모리 사용량을 미세 조정할 수 있어요.

PUT test-index
{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "knn_vector",
        "dimension": 3,
        "space_type": "l2",
        "mode": "on_disk",
        "compression_level": "16x"
      }
    }
  }
}

메서드 정의 (Method definitions)

메서드 정의는 기본 근사 k-NN(ANN) 알고리즘이 훈련을 필요로 하지 않을 때 사용돼요. 예를 들어 다음 knn_vector 필드는 ANN 검색에 Faiss 구현의 HNSW가 사용되어야 함을 지정해요. 색인 중에 Faiss는 해당 HNSW 세그먼트 파일을 만들어요.

PUT test-index
{
  "settings": {
    "index": {
      "knn": true,
      "knn.algo_param.ef_search": 100
    }
  },
  "mappings": {
    "properties": {
      "my_vector1": {
        "type": "knn_vector",
        "dimension": 1024,
        "method": {
          "name": "hnsw",
          "space_type": "l2",
          "engine": "faiss",
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}

space_type을 최상위 레벨에서 지정할 수도 있어요.

PUT test-index
{
  "settings": {
    "index": {
      "knn": true,
      "knn.algo_param.ef_search": 100
    }
  },
  "mappings": {
    "properties": {
      "my_vector1": {
        "type": "knn_vector",
        "dimension": 1024,
        "space_type": "l2",
        "method": {
          "name": "hnsw",
          "engine": "faiss",
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}

모델 ID (Model IDs)

모델 ID는 기본 ANN 알고리즘이 훈련 단계를 필요로 할 때 사용돼요. 전제 조건으로, 모델은 Train API를 사용해 만들어져야 해요. 모델에는 네이티브 라이브러리 세그먼트 파일을 초기화하는 데 필요한 정보가 들어 있어요. 벡터 필드에 모델을 구성하려면 model_id를 지정해요.

"my_vector": {
  "type": "knn_vector",
  "model_id": "my-model"
}

하지만 Painless 스크립팅 또는 k-NN 점수 스크립트를 사용하려는 경우에는 차원만 전달하면 돼요.

"my_vector": {
   "type": "knn_vector",
   "dimension": 128
}

자세한 내용은 모델에서 벡터 인덱스 만들기를 참고하세요.

파라미터 (Parameters)

k-NN 벡터 필드 타입이 받는 파라미터는 다음 표와 같아요.

파라미터 데이터 타입 설명
type String 벡터 필드 타입이에요. 반드시 knn_vector여야 해요. 필수예요.
dimension Integer 사용되는 벡터의 크기예요. 유효 값은 [1, 16,000] 범위예요. 필수예요.
data_type String 벡터 요소의 데이터 타입이에요. 유효 값은 binary, byte, float이에요. 선택 사항이며 기본값은 float예요.
space_type String 벡터 사이의 거리를 계산하는 데 사용되는 벡터 공간이에요. 유효 값은 l1, l2, linf, cosinesimil, innerproduct, hamming, hammingbit이에요. 모든 메서드/엔진 조합이 각 space를 지원하는 것은 아니에요. 지원 space 목록은 특정 엔진 섹션을 참고하세요. 참고: 이 값은 method 안에서도 지정할 수 있어요. 선택 사항이에요. 자세한 내용은 Spaces 문서를 참고하세요.
mode String 우선순위(낮은 지연 시간 또는 낮은 비용)에 따라 k-NN 파라미터에 적절한 기본값을 설정해요. 유효 값은 in_memory와 on_disk이에요. 선택 사항이며 기본값은 in_memory예요. 자세한 내용은 Memory-optimized vectors 문서를 참고하세요.
compression_level String 주어진 배수만큼 벡터 메모리 사용을 줄이는 양자화 인코더를 선택해요. 유효 값은 1x, 2x, 4x, 8x, 16x, 32x예요. 선택 사항이에요. 자세한 내용은 Memory-optimized vectors 문서를 참고하세요.
method Object 색인 시 벡터 데이터를 구성하고 검색 시 이를 탐색하는 데 사용되는 알고리즘이에요. ANN 알고리즘이 훈련을 필요로 하지 않을 때 사용돼요. 선택 사항이에요. 자세한 내용은 Methods and engines 문서를 참고하세요.
model_id String 훈련된 모델의 모델 ID예요. ANN 알고리즘이 훈련을 필요로 할 때 사용돼요. Model IDs를 참고하세요. 선택 사항이에요.

다음 단계 (Next steps)

  • Spaces
  • Methods and engines
  • Memory-optimized vectors
  • 벡터 검색
  • k-NN 쿼리
  • Spaces
  • Methods and engines
  • Memory-optimized vectors

더 알아보기 (Learn more)