Self Querying Retrieval
요약
Self-Querying Retrieval은 기존 RAG(검색 증강 생성) 시스템의 '둔감함'을 개선한 고급 검색 기법입니다. 이 방식은 LLM이 사용자 쿼리를 분석하여 단순한 벡터 검색어뿐만 아니라, 날짜, 부서, 평점 등 구조화된 메타데이터 필터까지 추출해냅니다. 이를 통해 일반적인 키워드 기반의 '흐릿한' 검색 대신, 정확하고 정밀하게 필터링된 정보를 가져와 답변의 신뢰성과 정확도를 크게 높일 수 있습니다.
핵심 포인트
- Self-Querying Retrieval은 LLM을 활용하여 사용자 쿼리를 분석(Analysis)하고 의미론적 사실(Translation)을 분리하는 과정이 핵심입니다.
- 단순 벡터 검색에 의존하는 표준 RAG의 한계를 극복하며, 메타데이터 필터링을 통해 검색 정확도를 높일 수 있습니다.
- 구현을 위해서는 메타데이터 필터링 기능을 지원하는 Vector Store와 자연어를 구조화된 필터로 변환할 수 있는 LLM이 필요합니다.
🧠 개념
표준 RAG(검색 증강 생성) 시스템은 다소 "둔감"합니다. "90 년대의 로맨스 영화"를 요청하면, 표준 벡터 검색은 단순히 "Romantic", "movies", "90s"라는 단어만 찾습니다. 실제로 "90s"가 날짜 범위나 카테고리임을 이해하지 못합니다. Self-Querying Retrieval 는 LLM(대형 언어 모델) 에 "검색창"과 "필터"를 제공함으로써 이를 변경합니다.
- 분석 (The Analysis): LLM 은 먼저 사용자의 쿼리를 살펴봅니다.
- 번역 (The Translation): 쿼리의 의미론적 의미에서 사실 (날짜, 평점, 카테고리 등) 을 분리합니다.
- 구조화된 검색 (The Structured Search): 벡터 검색을 수행하기 전에 결과를 필터링하기 위해 공식 데이터베이스 쿼리를 작성합니다.
📝 예제 기반 설명:
귀하의 회사가 Vector DB(벡터 데이터베이스) 에 수천 개의 정책 문서를 저장하고 있다고 상상해 보세요. 각 문서에는 다음 메타데이터가 첨부되어 있습니다:
- Department: (Sales, Engineering, HR)
- Year: (2022, 2023, 2024)
- Type: (Benefit, Conduct, Salary)
사용자 쿼리: "2023 년 Engineering 직원의 산전 휴가 혜택은 무엇이었습니까?"
표준 RAG(기본 방식):
이 문장은 전체를 검색합니다. 단어 "maternity" 가 자주 등장했기 때문에 Sales 부서의 2024 년 정책을 찾아낼 수도 있습니다. 이는 "흐릿한" (blurry) 검색입니다.
Self-Querying RAG:
LLM 은 먼저 번역기로 작동합니다. 두 부분을 생성합니다:
- Semantic Query: "maternity leave benefits"
- Filter: Department == 'Engineering' AND Year == 2023
⚙️ 실용적인 구현:
Self-Querying Retrieval 을 구현하려면 다음 두 가지가 필요합니다.
- 메타데이터 필터링을 지원하는 Vector Store(예: Chroma)
- 자연어를 구조화된 필터로 번역하는 방법을 이해하는 LLM
다음 코드는 더 쉬운 실행을 위해 langchain 의 내장 라이브러리를 사용합니다:
from pydantic import BaseModel , Field
from langchain.chat_models import init_chat_model
from langchain_huggingface import HuggingFaceEndpointEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_classic.retrievers import SelfQueryRetriever
from langchain_classic.chains.query_constructor.schema import AttributeInfo
LLM 이 이해할 수 있는 메타데이터 스키마
from dotenv import load_dotenv
load_dotenv ()
llm_groq = init_chat_model ( " openai/gpt-oss-120b " , model_provider = ' groq ' , temperature = 0 )
--- STEP 1: Document Loading ---
'products.txt' 에 다양한 전자 제품에 대한 원본 단락이 있다고 상상해 보세요
with open ( " ./RAG/Retrieval_techniques/products.txt " , " w " ) as f :
f . write ( """ The HP ProBook 15 is a professional laptop priced at 1200 dollars. It has a stellar 4.5 rating. The Acer Aspire is a basic student laptop. It is very affordable at 400 dollars but has a 3.8 rating. The Razer Blade is a high-end gaming laptop for 2500 dollars, boasting a near-perfect 4.9 rating. The LG UltraWide is a 4K monitor. It costs 600 dollars and is rated 4.2 by experts. """)
loader = TextLoader ( " ./RAG/Retrieval_techniques/products.txt " )
raw_documents = loader . load ()
--- STEP 2: Chu
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기