아빠는 개발자

[es8] similarity Search 본문

ES8/elasticsearch8

[es8] similarity Search

father6019 2024. 8. 4. 00:40
728x90
반응형

텍스트, 이미지, 이벤트 등 모든 종류의 콘텐츠를 벡터로 나타낼 수 있는 차세대 기계 학습 모델 덕분에 벡터 검색에 대한 관심이 급증했습니다. 종종 "임베딩 모델"이라고 하는 이러한 강력한 표현은 표면 수준 특성을 넘어서는 방식으로 두 콘텐츠 간의 유사성을 포착 할 수 있습니다.

 

뭐 이렇다고 한다. 

7버전에서도 dense_vector 타입으로 색인하고 cosine similarity 등 kNN 검색이 가능한데.. 8의 특징이 ANN 검색이라고 하니 

얼마나 좋아졌는지 테스트 해봐야겠다

 

k-nearest neighbor (kNN) search algorithms 은 쿼리 벡터와 가장 유사한 데이터세트에서 벡터를 찾습니다. 이러한 벡터 표현과 함께 kNN 검색은 검색에 대한 흥미로운 가능성을 열어준다고 한다 

  • 질문에 대한 답을 포함할 가능성이 있는 구절 찾기
  • 대규모 데이터 세트에서 중복에 가까운 이미지 감지
  • 주어진 노래와 비슷하게 들리는 노래 찾기

ANN 검색을 테스트 해보자

dense_vector 타입에서 index: true 유사성을 추가한다. 

 

sample

PUT index
{
 "mappings": {
   "properties": {
     "image-vector": {
       "type": "dense_vector",
       "dims": 128,
       "index": true,
       "similarity": "l2_norm"
     }
   }
 }
}

PUT index/_doc
{
 "image-vector": [0.12, 1.34, ...]
}

ANN 검색을 위한 _knn_search  Endpoint 를 제공한다. 

GET index/_knn_search
{
 "knn": {
   "field": "image-vector",
   "query_vector": [-0.5, 9.4, ...],
   "k": 10,
   "num_candidates": 100
 }
}

이 예에서 ANN 검색은 정확한 접근 방식보다 훨씬 빠릅니다. 회수율은 약 95%이므로 평균적으로 가장 가까운 이웃 10개 중 9개 이상을 찾습니다.

 

기존에 만들어 놓은 dense_vector 검색을 128 차원 백터로 만들고 테스트

 

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>

 

터미널에서

pip install --upgrade certifi 

가 안되면

pip3 install --upgrade certifi

 

 

Finder

파인더에서 Applications(응용프로그램)> Python3.7 폴더 (또는 사용중인 Python 버전)로 이동하여 "Install Certificates.command"파일을 더블 클릭

 

 

 

GET ann-test/_mapping

{
  "ann-test": {
    "mappings": {
      "dynamic": "true",
      "properties": {
        "category": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "id": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "name_vector": {
          "type": "dense_vector",
          "dims": 512,
          "index": true,
          "similarity": "l2_norm"
        },
        "price": {
          "type": "keyword"
        }
      }
    }
  }
}

Test

GET ann-test/_knn_search
{
 "knn": {
   "field": "name_vector",
   "query_vector": [
            -0.03491777554154396,
            -0.021893702447414398,
            -0.05286424607038498,
            ...
            0.043530356138944626,
            0.0038510074373334646,
            0.007266352418810129
          ],
   "k": 10,
   "num_candidates": 100
 }
}

#! The kNN search API has been replaced by the `knn` option in the search API.

#! The kNN search API has been replaced by the `knn` option in the search API.
{
  "took": 62,
  "timed_out": false,
  "_shards": {
    "total": 2,
    "successful": 2,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 200,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "ann-test",
        "_id": "4MORA4MBk5ELlvhG3ghJ",
        "_score": 1,
        "_source": {
          "price": 277000,
          "name": "아크네스튜디오 애드 남성 반팔 티셔츠 Evert Tshirt In Cotton BL0176 9001",
          "id": 301,
          "category": "패션의류 남성의류 티셔츠",
          "name_vector": [
            -0.03491777554154396,
            -0.021893702447414398,
            -0.05286424607038498,
            0.023670518770813942,
            -0.021262001246213913,
            0.04230502247810364,
            0.03469358757138252,
            0.01770828105509281,
            -0.06424234807491302,
            0.048049405217170715,
            -0.011201688088476658,
            -0.0019089147681370378,

 

_knn_search Endpoint 가 아닌 search api 의 knn option 을 사용해야 하나 보다 

 

 

이거

POST image-index/_search
{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, -2],
    "k": 5,
    "num_candidates": 50,
    "filter": {
      "term": {
        "file-type": "png"
      }
    }
  },
  "fields": ["title"],
  "_source": false
}

아님 이거 

POST image-index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "mountain lake",
        "boost": 0.9
      }
    }
  },
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, -2],
    "k": 5,
    "num_candidates": 50,
    "boost": 0.1
  },
  "size": 10
}

후자로 만들

 

input : 루이 비똥

 

와오..이거 잘나오네 

 

728x90
반응형

'ES8 > elasticsearch8' 카테고리의 다른 글

[es8] Top hits aggregation - 이론편  (5) 2024.10.20
[ES8] elasticsearch-head  (0) 2024.02.03
[ES8] ES|QL  (1) 2023.12.23