RAG를 위한 다양한 검색 쿼리 실습
제1편 | Elasticsearch 기본 개념 및 RDB 비교
제2편 | nori 분석기로 한국어 인덱스 구축하기
제3편 | RAG를 위한 다양한 검색 쿼리 실습
제4편 | 임베딩 모델을 활용한 Hybrid Search
제5편 | LangChain으로 RAG 구현하기
이전 2편에서는 한국어 형태소 분석기인 nori를 활용하여 Elasticsearch 인덱스를 구축하고, 한국어 텍스트가 어떻게 토큰 단위로 분석되는지를 살펴보았습니다. 이제 이러한 인덱스를 실제 검색에 활용할 차례입니다. 검색 시스템에서 중요한 것은 단순히 데이터를 저장하는 것이 아니라, 사용자의 의도에 맞는 결과를 얼마나 정확하게 찾아낼 수 있는가에 있습니다.
이번 3편에서는 앞에서 구축한 『무정』 텍스트 인덱스를 기반으로 Elasticsearch의 다양한 검색 쿼리를 실습해 보겠습니다. 가장 기본적인 match 쿼리를 시작으로, 복수 단어 검색, Boolean 조건 검색 등 실제 서비스에서 자주 사용되는 검색 방식들을 단계적으로 살펴봅니다. 또한 Elasticsearch가 검색 결과의 관련도를 계산하는 방식인 BM25 스코어링의 개념을 간단히 이해하고, 검색 결과가 어떤 기준으로 정렬되는지도 함께 확인해 보겠습니다.
이러한 검색 쿼리 활용 방법은 단순한 텍스트 검색을 넘어, 최근 많이 활용되는 RAG(Retrieval-Augmented Generation) 구조에서도 매우 중요한 역할을 합니다. 특히 LLM 기반 서비스에서는 검색 결과 중 관련도가 높은 문장을 선별하여 모델에 전달하는 과정이 핵심이기 때문입니다. 이번 장을 통해 Elasticsearch 검색 쿼리의 기본적인 활용 방법을 익히고, 이를 RAG 시스템에 적용할 수 있는 기초를 마련해 보겠습니다.
이번에 사용하는 구조는 다음과 같습니다.
class MujungLine(Document):
line = Text(analyzer=ko_analyzer) # 소설의 한 줄 텍스트
line_number = Integer() # 원문의 줄 번호
class Index:
name = INDEX_NAME
• line: 소설의 한 줄 텍스트 필드. ko_analyzer에 의해 한국어 형태소 분석이 수행됩니다.
• line_number: 원문의 줄 번호. 검색 결과의 순서 확인 등에 활용할 수 있습니다.
가장 기본적인 전문 검색 예입니다. line 필드에 '사랑'이라는 단어가 포함된 문장을 검색해 봅니다.
from elasticsearch_dsl import Search
지금 바로 작가의 멤버십 구독자가 되어
멤버십 특별 연재 콘텐츠를 모두 만나 보세요.
오직 멤버십 구독자만 볼 수 있는,
이 작가의 특별 연재 콘텐츠