본 포스팅은 2024년 01월 01일을 기준으로 작성되었습니다.
Vector Search는 데이터를 벡터화한 후 유사성 또는 거리를 측정하여 검색하는 방법으로 "지능형 검색"이라고도 불립니다.
이전의 검색엔진은 단순히 텍스트 기반의 키워드 매칭에 초점을 두어 상대적으로 검색의 정확성이나 유연성에서 한계를 보였습니다. 그러나 Vector Search는 단순히 텍스트 기반의 키워드 매칭을 넘어서, 이미지, 오디오 등 다양한 비정형 데이터를 다룰 뿐 아니라 문맥을 파악하기 때문에 보다 유의미한 검색 결과를 제공합니다.
검색 엔진에 'how to set up elastic ml?'이라고 입력하면, 기존의 키워드 매칭을 기반으로 하는 검색 엔진은 'elastic', 'ml'과 같은 쿼리에서 추출한 키워드와 관련된 내용이 주된 검색 결과로 반환됩니다.
반면 Vector Search는 맥락을 고려하여 사용자의 의도를 파악하기 때문에 'getting started', 'install', 'anomaly detecting', 'machine learning settings'와 같이 문맥을 고려하여 추출된 키워드와 관련된 내용이 검색 결과로 나오게 됩니다.
Vector Search는 다음과 같은 단계로 진행됩니다.
먼저 데이터를 고차원 공간에 매핑하여 각 데이터를 벡터로 표현하는 단계인 임베딩이 선행되어야 합니다.
텍스트 데이터의 경우 Word2Vec, GloVe, FastText 알고리즘이 사용되며 비슷한 의미를 갖거나 비슷한 맥락에서 사용되는 텍스트들은 비슷한 벡터를 할당 받아 임베딩 공간에서 서로 가까이 위치하게 됩니다. 예를 들어, 'tea'와 'coffee'는 비슷한 단어라서 서로 가까이 위치하는 반면에 'tea'와 'sea'는 철자가 비슷하더라도 의미가 다르고 함께 사용되지 않기 때문에 더 멀리 떨어져 있습니다.
Elasticsearch의 경우 'dense_vector' 필드에 벡터화 된 값들이 저장됩니다.
데이터가 벡터로 표현되면 유사도 점수를 계산하여 두 벡터 간의 유사도를 정량화합니다.
유사도 계산에는 유클리드, 맨하탄, 코사인과 같은 여러 가지 메트릭 기준이 있으며, 이러한 기준은 데이터의 특성과 사용하는 애플리케이션에 따라 달라집니다. 유클리드 거리는 공간 내의 두 점 간의 거리를 측정하며, 맨하탄 거리는 각 차원의 차이의 절대값의 합을 계산합니다. 코사인 유사도는 두 벡터 각도 차이의 코사인 값을 계산하여 유사도를 측정합니다.
대규모 유사도 측정 작업을 위해 Elastic Search는 kNN(근사 최근접 이웃 알고리즘)을 채택하였습니다. 이를 통해 사용자는 Vector Search를 통해 빠른 검색 속도를 보장받을 수 있습니다.
Elasticsearch에서의 vector searh는 KNN(k-nearest neighbor ) 시스템을 사용합니다. k-근접 이웃(kNN) 검색은 유사성 메트릭으로 측정한 쿼리 벡터에 가장 가까운 k개의 벡터를 찾습니다.
현재 ES에서의 vector search는 aggregations(집계)와 sorting(정렬) 기능은 제공하지 않습니다.
ES는 2가지 kNN search를 지원합니다.
Approximate kNN : 속도가 느리고 정확도가 불안정하나 검색 속도가 빠릅니다.
Exact kNN : 높은 정확도를 가졌지만, 확장성이 낮고, 검색 속도가 느립니다.
verctor search의 기본 setting입니다.
field type을 "dense_vector"로 설정하고, dims로 vector의 차원 수를 설정합니다. (예를 들어, [-0.5, 10, 10])
similarity: 쿼리와 문서 벡터 간의 유사성을 기반으로 점수를 매기는 기준입니다.
similarity 파라미터 값은 similarity 을 참고하세요.
아래의 예시의 "12_norm"은 벡터 사이의 L2 거리(유클리드 거리)를 기준으로 유사도를 계산합니다.
num_candidates: kNN 검색시 각 샤드에서 대략적인 가장 가까운 이웃 후보의 개수
k: 이러한 후보 벡터와 쿼리 벡터의 유사도를 계산하여 각 샤드에서 가장 유사한 결과 k개를 선택하는데, 이때 k의 값
boost: _score 계산시 kNN에 대한 부스팅 값
"boost": 0.1이면 [ score = 0.9 * match_score + 0.1 * knn_score ]로 계산된다.
기존에 배포된 텍스트 임베딩 모델을 사용하여 Semantic search를 수행할 수 있습니다.
해당 모델에 기존의 kNN 파라미터 설정이 더해져 검색이 진행됩니다.
query_vector_builder: 수행 할 자연어 처리 작업의 모델을 설정하며, 반드시 text_embedding 타입이어야 합니다.