아마존 서비스의 K-최근접이웃 (k-nn) 검색 OpenSearch - 아마존 OpenSearch 서비스

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

아마존 서비스의 K-최근접이웃 (k-nn) 검색 OpenSearch

관련 k-최근접이웃 알고리즘의 줄임말인 k-NN for Amazon OpenSearch Service를 사용하면 벡터 공간에서 점을 검색하고 유클리드 거리 또는 코사인 유사성을 기준으로 해당 점의 “가장 가까운 이웃”을 찾을 수 있습니다. 사용 사례에는 권장 사항(예: 음악 애플리케이션의 “좋아하는 다른 노래” 기능), 이미지 인식 및 사기 탐지가 포함됩니다.

참고

이 문서에서는 Service와 다양한 k-NN 플러그인 버전 간의 버전 호환성과 관리형 OpenSearch 서비스와 함께 플러그인을 사용할 때의 제한 사항에 대해 설명합니다. OpenSearch 단순하고 복잡한 예제, 파라미터 참조, 플러그인에 대한 전체 API 참조 등 k-NN 플러그인에 대한 포괄적인 설명서는 오픈 소스 설명서를 참조하십시오. OpenSearch 오픈소스 설명서에는 성능 조정 및 K-NN 전용 클러스터 설정도 포함됩니다.

다음 표를 사용하여 Amazon OpenSearch Service 도메인에서 실행 중인 k-NN 플러그인 버전을 확인할 수 있습니다. 각 k-NN 플러그인 버전은 또는 Elasticsearch 버전에 해당합니다. OpenSearch

OpenSearch
OpenSearch 버전 k-NN 플러그인 버전 주목할 만한 기능
2.13 2.13.0.0

2.11 2.11.0.0

k-NN 쿼리에서 ignore_unmapped에 대한 지원 추가

2.9 2.9.0.0 Faiss 엔진으로 k-NN 바이트 벡터 및 효율적인 필터링 구현
2.7 2.7.0.0
2.5 2.5.0.0 k-NN 모델 시스템 SystemIndexPlugin 인덱스용으로 확장, 코어 HybridFS에 Lucene 전용 파일 확장명 추가
2.3 2.3.0.0
1.3 1.3.0.0
1.2 1.2.0.0 Faiss 라이브러리에 대한 지원 추가
1.1 1.1.0.0
1.0

1.0.0.0

이전 버전과의 호환성을 지원하면서 REST API의 이름이 바뀌었습니다. 네임스페이스 이름이 opendistro에서 opensearch로 바뀌었습니다.
Elasticsearch
Elasticsearch 버전 k-NN 플러그인 버전 주목할 만한 기능
7.1

1.3.0.0

유클리드 거리
7.4

1.4.0.0

7.7

1.8.0.0

코사인 유사성
7.8

1.9.0.0

7.9

1.11.0.0

웜업 API, 사용자 지정 점수

7.10

1.13.0.0

Hamming 거리, L1 표준 거리, Painless 스크립팅

k-NN 시작하기

k-NN을 사용하려면 index.knn 설정으로 인덱스를 만들고 knn_vector 데이터 유형의 필드를 하나 이상 추가해야 합니다.

PUT my-index { "settings": { "index.knn": true }, "mappings": { "properties": { "my_vector1": { "type": "knn_vector", "dimension": 2 }, "my_vector2": { "type": "knn_vector", "dimension": 4 } } } }

knn_vector 데이터 유형은 필수 dimension 파라미터로 정의된 부동 소수점 수를 사용하여 최대 10,000개의 부동 소수점으로 구성된 단일 목록을 지원합니다. 인덱스를 생성한 후 일부 데이터를 추가합니다.

POST _bulk { "index": { "_index": "my-index", "_id": "1" } } { "my_vector1": [1.5, 2.5], "price": 12.2 } { "index": { "_index": "my-index", "_id": "2" } } { "my_vector1": [2.5, 3.5], "price": 7.1 } { "index": { "_index": "my-index", "_id": "3" } } { "my_vector1": [3.5, 4.5], "price": 12.9 } { "index": { "_index": "my-index", "_id": "4" } } { "my_vector1": [5.5, 6.5], "price": 1.2 } { "index": { "_index": "my-index", "_id": "5" } } { "my_vector1": [4.5, 5.5], "price": 3.7 } { "index": { "_index": "my-index", "_id": "6" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 } { "index": { "_index": "my-index", "_id": "7" } } { "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 } { "index": { "_index": "my-index", "_id": "8" } } { "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 } { "index": { "_index": "my-index", "_id": "9" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }

그런 다음 knn 쿼리 유형을 사용하여 데이터를 검색할 수 있습니다.

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } } }

이 경우 k는 쿼리를 반환하려는 이웃 수입니다. 하지만 size 옵션도 포함해야 합니다. 그렇지 않으면 전체 쿼리에 대한 k 결과가 아닌 각 샤드(및 각 세그먼트)에 대한 k 결과를 얻습니다. k-NN은 최대 k 값인 10,000을 지원합니다.

knn 쿼리를 다른 절과 혼합하면 k 결과보다 적게 수신할 수 있습니다. 이 예제에서 post_filter 절은 결과 수를 2에서 1로 줄입니다.

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } }, "post_filter": { "range": { "price": { "gte": 6, "lte": 10 } } } }

최적의 성능을 유지하면서 대량의 쿼리를 처리해야 하는 경우 _msearch API를 사용하여 JSON으로 대량 검색을 구성하고 단일 요청을 전송하여 여러 검색을 수행할 수 있습니다.

GET _msearch { "index": "my-index"} { "query": { "knn": {"my_vector2":{"vector": [2, 3, 5, 6],"k":2 }} } } { "index": "my-index", "search_type": "dfs_query_then_fetch"} { "query": { "knn": {"my_vector1":{"vector": [2, 3],"k":2 }} } }

다음 동영상은 K-NN 쿼리에 대한 대량 벡터 검색을 설정하는 방법을 보여줍니다.

k-NN의 차이점, 조정, 제한 사항

OpenSearch API를 사용하여 모든 k-NN 설정을 수정할 수 있습니다. _cluster/settings OpenSearch 서비스에서는 knn.memory.circuit_breaker.enabled 및 를 제외한 모든 설정을 변경할 수 있습니다knn.circuit_breaker.triggered. k-NN 통계는 Amazon CloudWatch 지표로 포함됩니다.

특히 각 데이터 노드의 KNNGraphMemoryUsage 측정치를 knn.memory.circuit_breaker.limit 통계 및 인스턴스 유형에 사용할 수 있는 RAM과 비교하여 확인하십시오. OpenSearch 서비스는 인스턴스 RAM의 절반을 Java 힙에 사용합니다 (힙 크기 최대 32GiB). 기본적으로 k-NN은 나머지 절반의 최대 50%를 사용하므로 RAM이 32GiB인 인스턴스 유형에서는 그래프 8GiB(32 * 0.5 * 0.5)를 수용할 수 있습니다. 그래프 메모리 사용량이 이 값을 초과하면 성능이 저하될 수 있습니다.

인덱스에서 대략적인 k-NN () 을 사용하는 경우 k-NN 인덱스를 콜드 스토리지로 마이그레이션할 UltraWarm수 없습니다. "index.knn": true index.knnfalse(정확한 k-NN)로 설정된 경우 인덱스를 다른 스토리지 계층으로 이동할 수 있습니다.