AI 기반 검색
원본 보기AI 기반 검색
시맨틱 검색이 처음이라면 관리형 semantic_text 워크플로를 사용하는 시맨틱 검색 빠른 시작부터 시작하세요.
일반적인 벡터 검색 활용 사례와 적용 방법은 벡터 검색 활용 사례를 참조하세요.
벡터 검색은 임베딩을 저장하고 쿼리와 가장 유사한 벡터를 검색합니다. Elasticsearch는 벡터 데이터베이스로 동작합니다. 임베딩 저장과 유사도 검색을 확장 가능하게 처리하는 동시에, 전문 검색·필터·집계를 하나의 엔진에서 함께 제공합니다. 이 페이지에서는 Elasticsearch에서 벡터 검색을 사용하기 전에 알아야 할 핵심 개념과 용어를 설명합니다.
- 벡터 데이터베이스
- 대규모로 벡터 임베딩을 저장하고, 일반적으로 근사 또는 정확 k-최근접 이웃(kNN) 검색을 사용해 쿼리 임베딩과 가장 유사한 벡터를 검색하도록 설계된 시스템입니다. Elasticsearch는
dense_vector또는sparse_vector필드에 임베딩을 저장하고 유사도로 쿼리할 때 벡터 데이터베이스로 동작합니다. 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는 벡터 검색을 시맨틱 검색과 멀티모달 검색의 기반으로 사용합니다. 이 기술은 여러 방식으로 활용할 수 있습니다.
- 텍스트 시맨틱 검색은 의미 기반 텍스트 검색을 위한 관리형 워크플로를 제공합니다.
semantic_text필드 타입은 임베딩 자동 생성과 모델 관리를 제공하는 가장 간단한 방법입니다- 더 복잡한 요구사항을 위한 추가 구현 옵션도 제공됩니다
- 멀티모달 검색은 벡터 검색을 텍스트, 이미지, 오디오, 비디오, 문서까지 확장합니다.
- 멀티모달
embedding엔드포인트와 함께semantic필드 타입을 사용하세요 - Jina 멀티모달 모델이 시작하기에 권장되는 모델입니다
- 멀티모달
- 벡터 검색은 기반 기술에 직접 접근할 수 있게 해줍니다.
- 밀집 또는 희소 벡터의 수동 구성
- 직접 만든 임베딩을 가져올 수 있는 유연성
- 벡터 유사도 매칭의 직접 구현
이러한 접근 방식 중 하나를 구현한 뒤에는 전문 검색과 결합해 의미 기반 매칭과 키워드 기반 매칭을 모두 활용하는 하이브리드 검색 솔루션을 만들 수 있습니다.
각 검색 방식이 어떤 목표에 적합한지 폭넓게 살펴보려면 검색 접근 방식을 참조하세요. 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 제한 사항에서 확인하세요.
하나의 검색 방식만 사용해야 하는 것은 아닙니다. 검색 애플리케이션은 전통적인 키워드 검색, 최근접 이웃 벡터 검색, 희소 학습 검색, 리랭킹을 동일한 워크플로 안에서 결합할 수 있습니다.
이러한 조합은 다음 두 가지 방법 중 하나로 구현할 수 있습니다.
- retriever를 사용해 단일
_search호출 안에서 다단계 검색 파이프라인을 구성합니다. - ES|QL 쿼리에서
FORK로 검색 분기를 병렬 실행하고FUSE로 RRF 또는 선형 결합 알고리즘을 사용해 결과를 합칩니다.
retriever를 사용해 단일 _search 요청에서 여러 검색 전략을 결합하세요.
예를 들어 다음과 같이 할 수 있습니다.
- retriever로 키워드 검색과
knn또는sparse_vector검색 결합하기 rrfretriever로 reciprocal rank fusion을 사용해 랭킹 병합하기linearretriever로 사용자 지정 가중치를 적용해 점수 결합하기
지원되는 retriever 타입과 요청 구문은 retriever 레퍼런스를 참조하세요. 어휘 기반 검색과 시맨틱 검색을 결합하는 전체 과정은 하이브리드 검색을 참조하세요.
ES|QL 명령을 사용해 단일 쿼리에서 여러 검색 전략을 결합하세요.
예를 들어 다음과 같이 할 수 있습니다.
FORK로 어휘 기반 검색과 시맨틱 검색 병렬 실행하기fuse_method를RRF로 설정한FUSE로 reciprocal rank fusion을 사용해 랭킹 병합하기fuse_method를LINEAR로 설정한FUSE로 사용자 지정 가중치를 적용해 점수 결합하기RERANK로 결합된 상위 검색 결과에 시맨틱 리랭킹 적용하기
FORK와 FUSE 사용 예시는 검색을 위한 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는 기본 내장 임베딩 모델과 관리형 호스팅을 제공합니다.
ELSER(Elastic Learned Sparse Encoder): 설명 가능한 용어 기반 시맨틱 검색을 위한 희소 벡터 모델
E5: Elasticsearch에 배포할 수 있는 다국어 밀집 임베딩 모델
Jina 모델: Elastic Inference Service(EIS)를 통해 제공되는 텍스트 및 멀티모달 검색용 밀집 임베딩 모델(예:
jina-embeddings-v5-text-small,jina-embeddings-v5-omni-small)inference API는 서드파티 임베딩 서비스와 연동됩니다. Cohere, OpenAI, Hugging Face, Amazon Bedrock, Azure OpenAI, Google Vertex AI 등이 있습니다.
청킹은 임베딩을 생성하기 전에 큰 문서를 더 작은 조각으로 나누는 작업입니다. 쿼리를 문서에서 가장 관련성 높은 부분과 매칭시켜 검색 품질을 높이는 데 도움이 됩니다.
semantic_text 필드 타입의 청킹 구성 방법은 inference API 청킹 구성을 참조하세요. 직접 만든 임베딩을 사용한다면 색인 전에 데이터를 청킹하는 것은 사용자의 책임입니다. 관련 안내는 직접 만든 밀집 벡터 사용하기를 참조하세요.
Elasticsearch는 임베딩 생성과 검색을 얼마나 세밀하게 제어해야 하는지에 따라 벡터·시맨틱·멀티모달 검색을 구현하는 여러 방법을 제공합니다.
텍스트 시맨틱 검색 섹션은 내부적으로 벡터 검색을 사용하는 관리형 워크플로를 제공합니다. 이러한 방식은 임베딩 생성, 청킹, 모델 관리를 대신 처리해 주므로 텍스트로 시작하기에 가장 간단합니다.
semantic_text를 사용한 시맨틱 검색: 청킹과 모델 관리를 위한 기본값이 내장된semantic_text필드 타입으로 임베딩을 생성합니다.semantic_text를 사용한 하이브리드 검색: 실제 애플리케이션에서 더 나은 관련성을 얻기 위해 의미 이해와 키워드 검색을 결합합니다.- Inference API를 사용한 시맨틱 검색: 사용자 지정 또는 외부 임베딩 모델을 사용하고 임베딩 생성 방식을 제어합니다.
멀티모달 검색 섹션은 텍스트, 이미지, 오디오, 비디오, 문서 전반의 의미 기반 검색을 다룹니다.
- 멀티모달 검색: 개념, 배포 옵션(EIS, 외부 추론, 온프레미스), 그리고
semantic필드 타입과 함께 권장되는 Jina 모델을 다룹니다. - 튜토리얼:
semantic필드로 멀티모달 검색 구축하기: 이미지를 색인하고 텍스트, 이미지, PDF 입력으로 검색합니다.
다음 가이드는 벡터 검색을 더 직접적이거나 맞춤형으로 다루는 방법을 제공합니다.
- Elasticsearch의 kNN 검색:
dense_vector필드 타입과 k-최근접 이웃 쿼리로 벡터 유사도 검색을 수행합니다. - 직접 만든 밀집 벡터 사용하기: 이미 임베딩이 있고 이를 Elasticsearch에서 색인하고 검색하려는 경우 사용하세요.
- Elasticsearch의 희소 벡터 검색: ELSER 모델과
sparse_vector필드 타입으로 희소 벡터를 사용해 시맨틱 검색을 수행합니다.