LLM Application/LangChain

LangChain – Advanced RAG, Pre-Retrieval

carrotweb 2026. 7. 30. 17:07
728x90
반응형

이전까지 개발한 RAG를 Navie RAG라고 합니다. 지금부터 좀더 업그레이드된 RAG인 Advanced RAG를 개발해보겠습니다.

 

Advanced RAG(Retrieval-Augmented Generation)

Naive RAG의 검색 기능을 개선하고 텍스트 처리 기술을 도입하여 RAG 성능을 향상시킨 모델입니다.

즉, Retrieve(검색) 품질을 개선하는 것입니다. 검색 품질을 개선하기 위해서 검색 전(Pre-Retrieval)과 검색 후(Post-Retrieval)를 최적화하는 것을 의미합니다.

 

 

Pre-Retrieval(사전 검색) 최적화

검색되는 문서(청크)의 질을 높이기 위해 Indexing(인덱싱)를 최적화하고 검색 결과의 질을 높이기 위해 검색 질의(Query)를 재구성(Query Rewrite, Query Expansion)하여 검색을 최적화합니다.

 

Post-Retrieval(사후 검색) 최적화

검색된 문서(청크)의 순서를 재정렬하여 Context를 최적화합니다. 처리 방법은 검색된 문서(청크)에 대해 의미론적 관계를 다시 계산하여 순위를 재정렬(Reranking)하고 추출한 다음 압축하여 최적화합니다.

 

 

“외부 지식”과 “모델 적응” 측면에서 모델 최적화 방법 비교 (https://arxiv.org/pdf/2312.10997)

  • 프롬프트 엔지니어링은 모델과 외부 지식 수정을 최소화하며, LLM 자체의 역량을 활용하는데 중점을 둡니다.
  • 미세 조정은 모델에 대한 추가 학습을 포함합니다.
  • Naive/Advanced RAG는 모델 수정에 대한 요구가 낮으나 연구가 진행됨에 따라 Modular RAG는 미세 조정 기술과 더욱 통합되었습니다.

 

Retrieval and Generation (검색과 생성)

 

 

Advanced RAG – Pre-Retrieval (사전 검색)

정확하지 않은 질문?

질문의 의도가 정확하지 않는 질문으로 인해 정확지 않은 검색 결과가 나오게 됩니다.

 

 

질문이 단순하게 "대출"이라고만 하면 무슨 의도의 질문으로 이해해서 검색을 해야 할까요?

질문이 정확하지 않기 때문에 원하는 결과가 나오지 않을 겁니다.

그렇지만 대부분의 사용자들은 간단한 질문으로 원하는 결과가 나오길 바랍니다.

 

우문현답(愚問賢答)

(어리석은 질문이라도 현명하게 답변한다)

 

"개떡같이 말해도 찰떡같이 알아듣는다.“

(자세히 설명하지 않거나, 잘못된 설명을 하여도 어떤 말인지 알아듣는다.)

 

Query Rewrite (쿼리 재작성)

사용자가 입력한 질문을 바로 임베딩하여 벡터 스토어에 검색하지 않고 질문을 기반으로 다양한 관점으로 질문을 재생성하여 검색하게 합니다.

LLM을 사용하여 여러 개의 유사 질문으로 재생성하여 단일 질문의 한계(부정확한 질문)를 극복하여 더 좋은 검색 결과를 얻을 수 있습니다.

 

 

 

Multi-Query Retriever

MultiQueryRetriever는 LLM을 사용하여 주어진 사용자 입력 쿼리에 대해 다른 관점에서 여러 쿼리를 생성함으로써 프롬프트 튜닝 프로세스를 자동화합니다.
각 쿼리에 대해 관련 있는 문서 집합을 검색하고 모든 쿼리에서 유닉 유니온(UNION과 UNION ALL)을 사용하여 잠재적으로 관련이 있는 더 많이 문서 집합을 얻습니다.
MultiQueryRetriever는 같은 질문에 대해 여러 관점을 생성함으로써 거리 기반 검색의 한계를 완화하고 더욱 풍부한 결과를 얻을 수 있습니다.

 

1. project3에 QnA3.ipynb 파일을 생성하고 벡터 스토어 멀티 검색 코드를 추가합니다.

[Markdown]
벡터 스토어 멀티 검색 (Faiss)

[Code]
import os
from langchain.chat_models import init_chat_model

os.environ["OPENAI_API_KEY"] = "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"

model = init_chat_model("gpt-4o-mini", model_provider="openai")

[Code]
from langchain_huggingface import HuggingFaceEmbeddings

embeddings_model = HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large-instruct")

[Code]
from langchain_community.vectorstores import FAISS

loaded_vector_store = FAISS.load_local(
    folder_path="./faiss_db", # 저장된 디렉토리
    index_name="test_db", # 저장된 인덱스 명
    embeddings=embeddings_model, # 사용할 임베딩 모델
    allow_dangerous_deserialization=True # pickle 파일 역직렬화 허용 
)

[Code]
import logging

logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)

[Code]
from langchain.retrievers.multi_query import MultiQueryRetriever

multi_query_retriever = MultiQueryRetriever.from_llm(
    retriever=loaded_vector_store.as_retriever(search_kwargs={"k": 5}),
    llm=model
)

question = "중학생의 수학 기초학력 미달률은?"

result_texts = multi_query_retriever.invoke(input=question)
result_texts

 

Python 표준 라이브러인 logging 모듈은 프로그램 실행 중 발생하는 이벤트들을 추적(기록)할 수 있도록 해줍니다.

[Code]
import logging

logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)

 

로깅 모듈의 basicConfig() 함수는 루트 로거를 빠르고 편리하게 구성하는 방법을 제공합니다. 애플리케이션의 기본 로깅 기능 설정을 간소화합니다.

로그를 파일에 기록하려면 basicConfig() 함수에 filename 파라미터를 사용하여 로그 파일의 경로를 지정하면 됩니다.

basicConfig()의 기본값 Log Level(로그 레벨)은 logging.WARN 입니다.

 

Logger(로거)는 직접 인스턴스화해서는 안 되고 함수인 logging.getLogger(name)을 통해 인스턴스화해야 합니다.

name 파라미터에 설정된 네임스페이스(패키지(모듈) 계층 구조)에서 발생하는 이벤트들을 추적합니다.

 

Log Level(로그 레벨)은 로깅 메시지의 중요도나 심각도를 나타냅니다.

DEBUG(디버그 정보) > INFO(일반 정보) > WARNING(경고 메시지) > ERROR(에러 메시지) > CRITICAL(심각한 오류 메시지)

 

2. 벡터 스토어 멀티 검색 코드를 실행합니다.

 

멀티 쿼리 리트리버가 생성한 질문 결과입니다.

INFO:langchain.retrievers.multi_query:Generated queries: ['중학생들의 수학 기초 학력이 부족한 비율은 어떻게 되나요?  ', '중학생을 대상으로 한 수학 기초학력 미달률에 대한 통계는 무엇이 있나요?  ', '우리나라 중학생 수학 기초학력 미달률에 관한 정보는 무엇인가요?']

 

벡터 스토어 검색 결과입니다.

[Document(id='fb8315b4-483c-4763-b361-af94b8e80ce0', metadata={'source': 'data/test.txt'}, page_content='교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학'),
 Document(id='6dcbfe08-1013-45d4-8d20-fcdbaae62393', metadata={'source': 'data/test.txt'}, page_content='8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다.'),
 Document(id='babccbd5-7557-4c20-85ff-46534ad2b69b', metadata={'source': 'data/test.txt'}, page_content='기초 학력 향상에 특화된 에듀테크 솔루션을 특별 할인가로 제공한다.'),
 Document(id='241efdba-09b4-4e44-a74b-bcbd645eeb1e', metadata={'source': 'data/test.txt'}, page_content='테크빌교육 체더스, 기초학력 부진 해결을 위한 코스웨어 기획전 진행'),
 Document(id='32fd32b1-b92d-4dd3-b03a-87d4015ab911', metadata={'source': 'data/test.txt'}, page_content='솔루션을 활용해 학생들 간의 학습 격차를 해소하는 데 도움이 되길 바란다”고 말했다.')]

 

728x90
반응형