벡터 검색

원본 보기

벡터 검색

시맨틱 검색이 처음이신가요? 관리형 semantic_text 워크플로를 사용하는 시맨틱 검색 빠른 시작부터 시작하세요.

일반적인 벡터 검색 활용 사례와 적용 방법은 벡터 검색 활용 사례를 참조하세요.

벡터 검색은 임베딩을 저장하고 쿼리와 가장 유사한 벡터를 검색합니다. Elasticsearch는 벡터 데이터베이스로 동작합니다. 즉, 임베딩 저장과 유사도 검색을 확장 가능한 형태로 제공하면서 전문 검색, 필터, 집계를 하나의 엔진에서 함께 결합합니다. 이 페이지에서는 Elasticsearch에서 벡터 검색을 다루기 전에 알아야 할 핵심 개념과 용어를 설명합니다.

벡터 데이터베이스
벡터 임베딩을 대규모로 저장하고, 일반적으로 근사 또는 정확 k-최근접 이웃(kNN) 검색을 사용해 쿼리 임베딩과 가장 유사한 벡터를 검색하도록 설계된 시스템입니다. dense_vector 또는 sparse_vector 필드에 임베딩을 저장하고 유사도를 기준으로 쿼리하면 Elasticsearch가 벡터 데이터베이스로 동작합니다. Elasticsearch는 벡터 검색을 전문 검색, 구조화된 필터, 집계, 하이브리드 검색과 하나의 엔진에서 결합할 수 있으므로, 어휘 기반·시맨틱·운영 쿼리를 동일한 데이터와 인프라 위에서 함께 유지할 수 있습니다.
벡터 임베딩

데이터를 다차원 공간에 표현하는 순서가 있는 숫자 목록입니다. 각 숫자는 한 차원의 좌표입니다. 검색의 맥락에서 벡터 임베딩은 일반적으로 의미를 포착하기 위해 머신러닝 모델이 생성합니다. 의미가 비슷한 콘텐츠는 이 공간에서 서로 가까운 지점에 매핑되므로, 벡터 사이의 근접성이 유사도를 나타냅니다. 예를 들어 "budget hotels"와 "affordable places to stay"라는 문구는 공통된 단어가 없어도 서로 가까운 임베딩을 갖습니다.

Elasticsearch에서 임베딩은 dense_vector 또는 sparse_vector 필드에 저장됩니다. 밀집 벡터 예시(8차원):

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]
		
차원
벡터에 포함된 요소의 개수입니다. 각 차원은 벡터 공간의 좌표 하나에 대응합니다. 밀집 임베딩 모델은 보통 수백에서 수천 차원의 벡터를 생성합니다(예: 384, 768, 1536). 차원이 높을수록 더 미묘한 의미를 담을 수 있지만 메모리와 연산을 더 많이 사용합니다. 차원 수는 모델에 의해 고정되며, 저장된 벡터와 쿼리 벡터 간에 일치해야 합니다.
밀집 벡터

모든 요소에 값이 들어 있는 고정 길이 배열입니다. 콘텐츠를 연속 공간에 매핑하도록 학습된 신경망 임베딩 모델이 생성합니다. 밀집 벡터는 전반적인 의미를 포착하며 자연어 이해, 다국어 콘텐츠, 풍부한 시맨틱 매칭에 적합합니다. 일반적으로 수백에서 수천 차원을 가집니다.

Elasticsearch에서 밀집 벡터는 dense_vector 필드 타입을 사용하며 knn 쿼리로 조회합니다. 외부 또는 호스팅형 임베딩 모델을 배포하거나, 직접 사전 계산한 벡터를 가져올 수도 있습니다.

희소 벡터

대부분의 요소가 0인 배열입니다. 소수의 차원만 의미 있는 값을 가지며, 각 차원은 특정 용어나 개념에 대응합니다. 희소 벡터는 시맨틱 확장을 곁들인 어휘 기반 매칭에 자주 사용됩니다. 콘텐츠가 관련 개념을 포착하는 가중치 있는 용어들로 확장되는 방식입니다. 어떤 용어가 매칭에 기여했는지 확인할 수 있어 결과를 설명하기가 더 쉬운 편입니다.

Elasticsearch에서 희소 벡터는 ELSER(Elastic Learned Sparse Encoder) 모델이 생성하며 sparse_vector 필드 타입을 사용합니다. ELSER는 기본 내장되어 있어 외부 모델 배포가 필요하지 않습니다.

Elasticsearch는 시맨틱 검색과 멀티모달 검색의 기반으로 벡터 검색을 사용합니다. 이 기술은 다음과 같은 여러 방식으로 활용할 수 있습니다.

  1. 텍스트 시맨틱 검색은 의미 기반 텍스트 검색을 위한 관리형 워크플로를 제공합니다.
    • semantic_text 필드 타입은 임베딩 생성과 모델 관리를 자동화해 가장 간단한 경로를 제공합니다
    • 더 복잡한 요구 사항을 위한 추가 구현 옵션도 있습니다
  2. 멀티모달 검색은 벡터 검색을 텍스트, 이미지, 오디오, 비디오, 문서로 확장합니다.
    • 멀티모달 embedding 엔드포인트와 함께 semantic 필드 타입을 사용하세요
    • Jina 멀티모달 모델이 시작하기에 권장되는 모델입니다
  3. 벡터 검색은 기반 기술에 직접 접근할 수 있게 해줍니다.
    • 밀집 또는 희소 벡터의 수동 구성
    • 직접 만든 임베딩을 가져올 수 있는 유연성
    • 벡터 유사도 매칭의 직접 구현

이러한 방식 중 어느 것을 구현하든, 전문 검색과 결합해 의미 기반 매칭과 키워드 기반 매칭을 모두 활용하는 하이브리드 검색 솔루션을 만들 수 있습니다.

각 검색 방식이 어떤 목표에 적합한지 폭넓게 살펴보려면 검색 접근 방식을 참조하세요. AI Assistant와 Elastic Agent Builder를 포함해 Elastic Stack 전반의 AI 기반 기능을 살펴보려면 AI 기반 기능을 참조하세요.

벡터 필드는 Query DSL 또는 ES|QL 구문으로 쿼리할 수 있습니다. 다음 표는 각 언어에서 필드 타입별로 작업하는 방법을 설명합니다.

Query DSL은 _search API 및 관련 검색 엔드포인트에 사용하는 JSON 요청 본문입니다. 중첩된 객체 안에 매치 절, 필터, 스코어링, 벡터 쿼리를 기술합니다.

ES|QL은 Elasticsearch의 파이프 기반 쿼리 언어입니다. 데이터를 읽고 필터링하고 스코어링하는 명령과 함수를 선형 파이프라인으로 작성합니다. 검색을 위한 ES|QL 사용법을 알아보세요.

필드 타입 벡터 타입 Query DSL 쿼리 ES|QL (검색 관련 함수)
dense_vector 밀집 벡터 knn - KNN으로 유사한 문서 찾기
- 쿼리에 이미 가지고 있는 두 벡터를 V_COSINE, V_DOT_PRODUCT, V_HAMMING, V_L1_NORM, V_L2_NORM으로 비교하기
sparse_vector 희소 벡터 sparse_vector 이 필드를 대상으로 하는 ES|QL 검색 함수는 없습니다.
semantic_text 희소 또는 밀집 match, knn, sparse_vector, semantic - KNN, MATCH, 매치 연산자(:)로 유사한 문서 찾기
- 쿼리에서 양쪽 모두 dense_vector 값인 경우 V_COSINE, V_DOT_PRODUCT, V_HAMMING, V_L1_NORM, V_L2_NORM으로 비교하기

이전 버전에서는 모든 ES|QL 벡터 함수가 모든 필드 타입에 제공되지는 않습니다. 사용 중인 버전의 지원 여부는 ES|QL 제한 사항에서 확인하세요.

하나의 검색 방식만 사용해야 하는 것은 아닙니다. 검색 애플리케이션은 전통적인 키워드 검색, 최근접 이웃 벡터 검색, 희소 학습 기반 검색, 리랭킹을 동일한 워크플로 안에서 결합할 수 있습니다.

이러한 조합은 두 가지 방법 중 하나로 구현할 수 있습니다.

  • 리트리버를 사용해 단일 _search 호출 안에서 다단계 검색 파이프라인을 구성합니다.
  • ES|QL 쿼리에서 FORK로 검색 분기를 병렬 실행하고 FUSE로 RRF 또는 선형 결합 알고리즘을 사용해 결과를 합칩니다.

리트리버를 사용하면 단일 _search 요청에서 여러 검색 전략을 결합할 수 있습니다.

예를 들어 다음과 같이 할 수 있습니다.

  • 리트리버로 키워드 검색을 knn 또는 sparse_vector 검색과 결합하기
  • rrf 리트리버로 reciprocal rank fusion을 사용해 순위 병합하기
  • linear 리트리버로 사용자 지정 가중치를 적용해 점수 결합하기

지원되는 리트리버 타입과 요청 구문은 리트리버 레퍼런스를 참조하세요. 어휘 검색과 시맨틱 검색을 결합하는 전체 과정 가이드는 하이브리드 검색을 참조하세요.

ES|QL 명령을 사용하면 단일 쿼리에서 여러 검색 전략을 결합할 수 있습니다.

예를 들어 다음과 같이 할 수 있습니다.

  • FORK로 어휘 검색과 시맨틱 검색을 병렬 실행하기
  • fuse_methodRRF로 설정한 FUSEreciprocal rank fusion을 사용해 순위 병합하기
  • fuse_methodLINEAR로 설정한 FUSE로 사용자 지정 가중치를 적용해 점수 결합하기
  • RERANK로 결합된 상위 검색 결과에 시맨틱 리랭킹 적용하기

FORKFUSE를 사용하는 예시는 검색을 위한 ES|QL을 참조하세요. fuse_method, weights, rank_constant 같은 FUSE 매개변수는 FUSE 명령 레퍼런스를 참조하세요.

전체 과정을 다루는 하이브리드 검색 튜토리얼은 semantic_text를 사용한 하이브리드 검색ES|QL로 검색하고 필터링하기를 참조하세요.

임베딩 모델은 보통 부동소수점 벡터를 출력합니다(예: 차원당 32비트). 규모가 커지면 이러한 벡터는 상당한 메모리를 소비하고 검색 속도를 떨어뜨릴 수 있습니다. 양자화는 벡터 값의 정밀도를 낮추는 손실 압축 방식입니다. 약간의 정확도를 내주는 대신 메모리 사용량을 줄이고 유사도 계산을 빠르게 합니다. 수백만에서 수십억 개의 벡터를 다루는 프로덕션 워크로드에서는 지연 시간과 비용을 관리 가능한 수준으로 유지하기 위해 양자화가 필수인 경우가 많습니다.

Elasticsearch는 dense_vector 필드에 대해 여러 양자화 옵션을 제공합니다. BBQ(Better Binary Quantization), int8, int4가 있습니다. 전체 목록과 구성 세부 사항, 장단점은 kNN 검색을 위한 벡터 자동 양자화를 참조하세요.

벡터 인덱스 모드(index.mode: vectordb_document)는 벡터 검색 워크로드에 맞게 조정된 기본값을 적용하는 인덱스 수준 설정입니다. 스토리지, 인덱싱, 병합 동작을 직접 구성하는 대신, 인덱스를 생성할 때 인덱스 모드를 지정하면 Elasticsearch가 최적화 묶음을 자동으로 적용합니다.

인덱스를 주로 밀집 벡터의 유사도 검색에 사용하고 별도 설정 없이 효율적인 스토리지와 인덱싱을 원한다면 벡터 인덱스 모드를 사용하세요.

인덱스를 생성할 때 명시적으로 설정할 수 있습니다.

				PUT my-vector-index
					{
  "settings": {
    "index": {
      "mode": "vectordb_document"
    }
  }
}
		

인덱스 모드가 하는 일과 사용 가능한 옵션은 일반 인덱스 설정에서 알아보세요. 벡터 인덱스 모드가 사용하는 기본값은 벡터 검색용 인덱스 모드를 참조하세요.

vectordb_document 모드에서는 근사 kNN 검색이 기본적으로 near_real_time: false로 동작합니다. 자세한 내용과 이 기본값을 재정의하는 방법은 준실시간 kNN을 참조하세요.

소스 데이터를 벡터 임베딩으로 변환하는 머신러닝 모델입니다. 선택한 모델이 결과 벡터의 차원 수와 품질을 결정합니다. 또한 시스템이 어떤 유형의 콘텐츠를 잘 이해하는지도 제약합니다. 유사도 비교가 의미를 가지려면 인덱스의 벡터와 쿼리 벡터가 동일한 모델로 생성되어야 합니다.

Elasticsearch는 내장 임베딩 모델과 관리형 호스팅을 제공합니다.

청킹은 임베딩을 생성하기 전에 큰 문서를 더 작은 조각으로 나누는 작업입니다. 쿼리를 문서에서 가장 관련성 높은 부분과 매칭할 수 있어 검색 품질 향상에 도움이 됩니다.

semantic_text 필드 타입의 청킹 구성 방법은 inference API 청킹 구성을 참조하세요. 직접 만든 임베딩을 사용하는 경우 인덱싱 전에 데이터를 청킹하는 것은 사용자의 책임입니다. 관련 안내는 직접 만든 밀집 벡터 가져오기를 참조하세요.

Elasticsearch는 임베딩 생성과 검색을 얼마나 세밀하게 제어해야 하는지에 따라 벡터·시맨틱·멀티모달 검색을 구현하는 여러 방법을 제공합니다.

텍스트 시맨틱 검색 섹션은 내부적으로 벡터 검색을 사용하는 관리형 워크플로를 제공합니다. 이 방식들은 임베딩 생성, 청킹, 모델 관리를 대신 처리해 주므로 텍스트 검색을 가장 간단하게 시작할 수 있는 방법입니다.

멀티모달 검색 섹션은 텍스트, 이미지, 오디오, 비디오, 문서 전반에 걸친 의미 기반 검색을 다룹니다.

다음 가이드는 벡터 검색을 다루는 더 직접적이거나 사용자 정의가 가능한 방식을 제공합니다.