🧠 개념
표준 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