[elasticsearch] dense_vector 타입과 knn query

HI·2024년 10월 24일
0

elasticsearch Query DSL

목록 보기
2/5

elasticsearch에서 VECTOR검색하는 방법 (8버전)

1. dense_vector 타입을 통해 백터 검색필드 생성

  • 옵션 종류
    1. dims
    - 백터 차원 수. 1 ~ 4096 차원 사용 가능함
    2. element_type
    - 백터 encode에 사용될 데이터 타입.
    - float(기본값), byte, bit, similarity
    3. similarity
    - 계산에 사용될 similarity 설정
    - bit 타입은 12_norm만 가능.
    - cosine(기본값), 12_norm, dot_prouct, max_inner_product
    4. index_options
    - knn 색인 알고리즘 선택.
    - hnsw, int8_hnsw, int4_hnsw, flat, int8_flat, int4_flat

index_options로 hnsw, int8_hnsw, int4_hnsw 사용하는 경우
m
- HNSW 그래프에서 연결될 노드의 수
- 기본값 16
ef_construction
- 가까운 이웃 리스트를 수집하는 동안 추적할 후보 수

  • 매핑 예시
  "VECTOR": {
          "type": "dense_vector",
          "dims": 800,
          "index": true,
          "similarity": "cosine",
          "index_options": {
            "type": "int8_hnsw",
            "m": 64,
            "ef_construction": 800
          }
        },

2. knn_search 쿼리로 dense_vector 필드검색하기

  • 옵션 종류
    k
    - 상위 n개 결과
    field
    - 검색 필드명
    query_vector
    - 검색할 백터 값
    num_candidates
    - 최근첩 이웃 후보
    - 기본값은
    k가 설정된 경우는 1.5 * k
    k가 설정되지 않은 경우는 1.5 * size이다. (size는 설정되지 않은 경우 10이다.)
    similarity
    - 문서가 검색되기 위한 최소 유사도 조건
    query_vector_builder
    - 텍스트를 임베딩 모델을 통해 백터 변환
  • 검색 쿼리 예시
GET index/_search
{
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : {
        "knn": {
          "field": "image-vector",
          "query_vector": [-5, 9, -12],
          "k": 3,
          "num_candidates": 100
        }
      }
    }
  }
}

위처럼 검색하면 텍스트를 백터로 변환하여 쿼리에 넣어 검색할 수 있고
옵션중 query_vector_builder 을 사용하면 백터값을 넣지 않고 검색쿼리에서 모델링을 해서 백터검색을 할 수 있다.

GET my_index_name/_search
{
"knn": [
    {
      "field": "chunk-vector",
      "k": 5,
      "num_candidates": 10,
      "similarity": 0.8
      "query_vector_builder": {
        "text_embedding": {
          "model_id": "my_model_id",
          "model_text": "how to semantic search"
        }
} }

위는 model_id에 입력된 my_model_id 모델을 사용해 model_text에 입력된 "how to semantic search"를 백터로 변환하여 검색하는 방법이다.
백터차원이 800 또는 1000과 같이 길어지면 검색쿼리 또한 복잡해지는데,
이때 query_vector_builder를 활용하면 더 간단하고 직관적인 쿼리로 검색할 수 있을꺼 같다.

현재까지 테스트해본 바로는 매핑 설정 시 index_optionsmef_construction 그리고 knn쿼리의 num_candidates 옵션을 통해 결과가 변경되어 적절한 값을 찾는게 중요해 보인다.
https://www.elastic.co/search-labs/blog/elasticsearch-knn-and-num-candidates-strategies
이 블로그에서 "How to choose the best k and num_candidates for kNN search" 라는 주제로 얘기하고 있다.

[참고]
dense_vector : https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html
knn query : https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html

profile
https://github.com/gaeunban

0개의 댓글