VectorStoreRetriever로 시작하고,Kiwi-BM25와 Ensemble,MultiQuery,ParentDocument,ContextualCompression(+ 필요시 LongContextReorder),SelfQuery,TimeWeighted,MultiVector.k(상위 반환 개수), 임베딩 모델, 토크나이저(한국어)는 성능에 큰 영향을 준다.아이디어
동작 흐름
1. embed(query) → 쿼리 벡터 q
2. 벡터DB에서 q와 가까운 k개 검색
3. 그대로 반환
언제 쓰나 (장단/주의)
코드 스니펫
from langchain_community.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
vs = FAISS.from_texts(texts, HuggingFaceEmbeddings())
retriever = vs.as_retriever(search_kwargs={"k": 5})
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. 기본 리트리버로 Top-k(다소 크게) 수집
2. 압축기(LLM 기반/키워드 필터 등)로 문서 단위 축약/필터링
3. 압축된 컨텍스트만 반환
언제 쓰나
코드
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
base = vs.as_retriever(k=20)
retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=base)
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. 여러 리트리버로 각각 Top-k
2. 점수 정규화 & 가중합
3. 통합 랭크 상위 반환
언제 쓰나
코드
from langchain.retrievers import EnsembleRetriever
retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.5, 0.5]
)
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. Top-k 후보 수집
2. 인접 스팬이 묻히지 않도록 재배치
3. 재배열된 순서로 프롬프트에 삽입
언제 쓰나
코드
from langchain.retrievers.document_compressors import LongContextReorder
reorder = LongContextReorder()
docs = base_retriever.get_relevant_documents("질문")
docs = reorder.compress_documents(docs, query="질문")
아이디어
동작 흐름
1. 인덱싱: 문서를 작은 청크로 분할(자식) + 부모 매핑 유지
2. 검색: 자식 청크 매치
3. 반환: 해당 부모 문서를 통째로/큰 단위로 재조립
언제 쓰나
코드
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
from langchain.text_splitter import RecursiveCharacterTextSplitter
docstore = InMemoryStore()
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
retriever = ParentDocumentRetriever(
vectorstore=vs, docstore=docstore, child_splitter=child_splitter
)
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. LLM이 원쿼리 → q1, q2, q3 … 확장
2. 각 쿼리로 검색 후 병합/중복 제거
3. 통합 랭크 반환
언제 쓰나
코드
from langchain.retrievers.multi_query import MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(retriever=vs.as_retriever(k=5), llm=llm)
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. 각 문서에 대해 (원문 임베딩 + 요약 임베딩 + 표제어 임베딩 …) 저장
2. 검색 시 다양한 표현에도 매칭될 확률↑
3. 매칭된 대표 문서(원문) 반환
언제 쓰나
코드
from langchain.retrievers.multi_vector import MultiVectorRetriever
retriever = MultiVectorRetriever(vectorstore=vs, id_key="doc_id")
# 인덱싱 시: retriever.add_texts([원문, 요약, 키워드], metadata={"doc_id": same_id})
docs = retriever.get_relevant_documents("질문")
아이디어
동작 흐름
1. 스키마(메타데이터 필드) 정의
2. LLM이 “2023 이후, 저자=Kim” 같은 필터와 검색어를 추출
3. 벡터 검색 + 메타 필터로 후보 반환
언제 쓰나
코드
from langchain.retrievers import SelfQueryRetriever
from langchain.chains.query_constructor.schema import AttributeInfo
metadata_field_info = [
AttributeInfo(name="author", description="문서 저자", type="string"),
AttributeInfo(name="year", description="발행 연도", type="integer"),
]
retriever = SelfQueryRetriever.from_llm(
llm, vs, document_contents="논문 요약",
metadata_field_info=metadata_field_info, verbose=True
)
docs = retriever.get_relevant_documents("김 저자의 2023년 이후 논문 알려줘")
아이디어
동작 흐름
1. 벡터 유사도 점수 계산
2. score = sim - λ * decay(age) 형태로 가중
3. 높은 최신성/유사도 균형 상위 반환
언제 쓰나
코드
from langchain.retrievers import TimeWeightedVectorStoreRetriever
retriever = TimeWeightedVectorStoreRetriever(
vectorstore=vs, decay_rate=0.01, k=6
)
docs = retriever.get_relevant_documents("지금 이슈 상황 요약")
아이디어
동작 흐름
1. Kiwi로 문서/질의 형태소 분석 → 토큰화
2. 역색인 생성
3. BM25 점수로 상위 문서 반환
언제 쓰나
코드 (아이디어 예시)
from langchain_community.retrievers import BM25Retriever # 구현체별 Kiwi 토크나이저 연동 필요
def kiwi_tokenize(text: str) -> list[str]:
# Kiwi 형태소 분석 결과를 토큰 리스트로 변환하는 사용자 정의 함수
...
retriever = BM25Retriever.from_texts(texts, preprocess=kiwi_tokenize)
docs = retriever.get_relevant_documents("전력 소비량 이상치 처리 방법")
아이디어
BM25(키워드) + Vector(의미)를 가중 결합해 잘 찾고, 동작 흐름
1. BM25 리트리버와 벡터 리트리버 각각 준비
2. EnsembleRetriever로 Top-k 후보 통합 랭킹
3. LLM 기반 압축기(예: LLMChainExtractor) 설정
4. ContextualCompressionRetriever로 후보 문서 요약/필터링
5. 최종 컨텍스트만 LLM 프롬프트에 투입
언제 쓰나