✨✨✨✨ RAG는 구현은 쉽다 ➡️ 잘하는게 중요하다!!!! ✨✨✨✨
Naive RAG의 문제점 : 답변 품질이 안좋다😓
- 검색이 "비슷한 것"은 찾는데 "정답 근거"를 제대로 못하는 경우
- Generate : 근거가 있어도 LLM이 "hallucination(환각)" 현상이 있는 경우
- DB 구축 단계에서 split : 검색한 문서가 너무 길고 복잡해서 정답에 필요한 chunk를 LLM이 찾지 못하는 경우
단순 검색 질문이 아닌 비교/조건/절차/근거 요구가 많은 질문인 경우, 최신성/정확성 중요한 경우, 근거가 확실한 결과여야하는 경우
+ 문서가 많고 구조가 복잡하면 Adcanced RAG (고도화 설계)가 필요하다.
1. DB구축 단계 고도화
ParentDocumentRetriever
저장할 때부터 "작은 조각(Child)"과 "큰 조각(Parent)"의 ID를 연결해서 저장한다.
Parent : 원본 문서를 적당히 큰 단위로 나눈다.
Child : 각 부모 문서를 아주 작은 단위로 쪼갠다.
-> 벡터 DB에는 Child만 벡터로 저장되고, Child는 부모 ID를 가지고 있어 Parent를 찾을 수 있다.
작은 조각은 구체적이라 검색 결과의 정확도는 올리고 실제 답변은 큰 조각을 통해 앞 뒤 맥락을 파악한 후 답변하므로 답변 품질을 높인다. 정보 부족으로 인한 할루시네이션(환각)도 방지된다.
MultiVectorRetriever
원본 문서에서 추출한 요약본이나 가상 질문을 '미리 생성'해서 벡터 DB에 원본 문서와 함께 넣어, 검색한다.
원본 문서 외에 생성된 벡터들이 저장되어야하므로, 벡터 DB 공간은 더 많이 사용하지만 검색의 정확도가 올라간다.
Vector Store Retriever (기존)
단순히 텍스트를 잘라 임베딩하여 저장하는 가장 기본 구조입니다.
2. 검색 전단계 고도화
질문을 가지고 결과를 잘 도출할 수 있도록 품질 올리는 Retrieval
MultiQueryRetriever
질문 하나를 LLM이 3~5개로 확장하여 여러 번 검색을 수행합니다.
from langchain_classic.retrievers.multi_query import MultiQueryRetriever
mqr = MultiQueryRetriever.from_llm(
retriever=retriever, # 질문들을 생성 후, 문서를 검색할 retriever
llm=gpt_llm, # 질문들을 생성할 LLM 모델
# prompt="" # 질문을 만들 때 사용할 PromptTempate
)
SelfQueryRetriever (메타데이터 필터링)
질문 속에 포함된 조건(예: "2023년 이후 데이터만 찾아줘")을 해석해 벡터 DB의 필터를 자동으로 적용합니다.
HyDE (Hypothetical Document Embedding)
질문을 통해 LLM 가상 답변을 추출해내고,
추출한 가상 답변을 가지고 벡터 DB에서 유사도 높은 문서를 결정한다.
# HyDE chain(pipeline) 구성
model = ChatOpenAI(model="gpt-5-mini")
# 가상 답변을 생성하기 위한 prompt
hyde_prompt = ChatPromptTemplate.from_template(
template="""
# Instruction 다음 질문에 대한 상세한 답변을 사실에 기반해서 작성해주세요.
# 질문 {query}
"""
)
hyde_chain = hyde_prompt | model | StrOutputParser()
dummy_result = hyde_chain.invoke({"query":query})
EnsembleRetriever (검색 시작, 하이브리드 검색)
키워드(BM25) 검색과 벡터(임베딩) 검색을 동시에 시작합니다.
Re-ranking
후보 문서 n개를 가져와서 정답과 가까운 n개의 문서로 정렬을 한다. n개 기반으로 진행되는 단계이므로, n개 문서의 품질이 낮으면 효과 없다.
- BI Embedding (기존) : 후보 문서 n개의 벡터와 질문과 유사도가 높은 k개를 정한다.
- Cross-Encoder (Reranker) : 질문과 문서를 한꺼번에(질문+문서) 모델에 입력값으로 넣어 두 텍스트가 얼마나 관련 있는지 Attention 매커니즘을 통해 비교하여 k개의 문서를 정한다.
-> Cross-Encoder는 시간이 너무 오래걸려서 검색 단계에서는 한계가 있다.
그래서 검색단계에선 BI Embedding으로 후보를 추출한 후 Cross-Encoder를 적용해서 문서의 순위를 재정렬한다.
- LLM Generation : 가장 정확한 k개 문서를 LLM에게 보내고 LLM이 보고 판단해서 답변 생성. 성능은 좋지만 비싸고 느리다.
한국어 Reranker를 활용한 검색 증강 생성(RAG) 성능 올리기 | Amazon Web Services
검색 증강 생성 (Retrieval-Augmented Generation, RAG)은 효율적인 데이터 검색과 대규모 언어 모델 (Large Language Model, LLM) 을 결합하여 정확하고 관련성 높은 응답을 생성하는 AI 기술로 부상했습니다. 특히
aws.amazon.com
Reranker 모델 : 수업시간 실습때는 Huggingface > model > Text Classification > "BAAI/bge-reranker-v2-m3" 모델 사용

3. 검색 후 결과에대한 고도화 (검색 결과의 "정제/조립" 단계 추가)
질문, 결과를 가지고 정답을 잘 도출했는지 확인하고, 해당 결과를 LLM에 전달해서 '필터링/재정리'하는 단계
MapReduce 방식 프로세스
Map (문서 검색) - Reduce (문서 선변 및 요약) - Generate (최종 답변 생성)
검색 결과 n개 문서를 가지고 질문과 각 문서를 LLM 모델을 통해 관련도가 있는지 없는지 유사도를 확인하여 관련 높은 문서들을 추출한다.
ContextualCompressionRetriever (압축기)
노이즈 제거 + 검색된 결과물들 중에서 질문과 상관없는 문장은 쳐내고 핵심만 압축합니다.
-> 검색된 500자 문장 중 질문과 상관없는 400자 버리고, 핵심 100자만 추출한다.
-> LLM이 읽어야할 문장이 줄어들어 답변 속도가 빨라지고 정확도가 올라간다.
4. 생성 단계의 신뢰성 강화
Prompt Engineering
- 근거 기반 답변 강제성 부여 : 답변의 근거가 없으면 "답을 모른다."라고 답변하도록 한다.
- 인용 / 근거 스니펫 포함 요구 : 답변의 근거를 보여주도록 하여 답변의 신뢰성을 높인다.
- 불확실성 처리 : 애매하면 역질문해서 질문의 의도를 추가적으로 파악한다.
"""
# 지시 (Instruction)
당신은 AI 전문가입니다.
제공된 Context를 바탕으로 질문에 답변을 합니다.
만약 Content에 질문과 관련된 내용이 없으면 "정확한 정보가 없어서 답을 할 수 없습니다"라고 답변합니다.
# 문맥 (Context)
{context}
# 입력 데이터 (Input Data)
# 출력 지시자 (Output Indicator)
- 답변을 만들 때 참조한 context의 내용을 같이 출력합니다.
- 참조 내용은 각주 형식으로 작성합니다.
## 출력 예 :
답변 내용[1] 답변 내용[2]
[1] 참조 내용1
[2] 참조 내용2
"""
출력 지시자 > Chain of Thought (사고 연쇄-CoT) : AI가 답을 도출하는 과정을 차근차근 설명하는 기법
- Zero-shot Chain of Thought
프롬프트에 "단계적으로 풀어보자", "차근 차근 생각해보자", "Think step by step" 같은 말을 입력해 모델이 스스로 단계를 밟아가며 추론하도록 한다. - Few-shot Chain of Thought
직접 문답 형식의 예를 작성해서 프롬프트에 넣는다.
Self-RAG (자기검증, Verification)
생성된 답변과 근거에 모순이 없는지 스스로 검토한다.
(예 : "이 답변이 정말 검색된 문서에 있는가? (Faithfulness)", "질문에 대한 직접적인 답인가? (Relevance)")
'AI > AI TECH' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI 캠프 21기] 1월 2주차 회고 - 3차 프로젝트 (1) | 2026.01.19 |
|---|---|
| [LLM] Finetuning 양자화와 PEFT (1) | 2026.01.10 |
| [플레이데이터 SK네트웍스 Family AI 캠프 21기] 12월 1주차 회고 (0) | 2025.12.08 |
| [플레이데이터 SK네트웍스 Family AI 캠프 21기] 11월 4주차 회고 - 2차 단위프로젝트 (0) | 2025.12.01 |
| [sklearn.metrics] 분류형 평가지표 자세히 분석하기 (0) | 2025.11.23 |
