Modular RAG
레고와 같이 재구성이 용이하고 보다 유연한 흐름을 만들 수 있는 프레임워크
- 독립적(Independant) - 기능 위주로 세분화
- 유연하고 확장성(flexable & scalable) - 모듈의 추가 및 변경이 쉬움
- 동적(dynamic) - 그래프 형식의 흐름 구성, 상황에 따른 분기 처리
모듈
모듈, 하위 모듈 및 운영자로 구성된 아키텍처 설계를 통해 통합되고 구조화된 방식으로 RAG 시스템을 정의
- 각 단계(Step)를 모듈(Module) 별로 정의
- 각 모듈은 하위 모듈(Sub Module)로 구성
- 하위 모듈은 플러그인 형식의 독립된 구조
- 독립 구조
- 각 모듈은 조립형으로 설계(레고 블록)
- 병렬 구조
- 여러 하위 모듈을 동시실행 후 병합 가능
- 분기 구조
- 상황에 따른 분기 처리가 가능
- 독립 구조
독립적인 모듈 구성
동일한 형태의 입력과 출력을 반환하는 Interface
- 레고 방식의 조립이 가능한 Module 설계
- 내부 구현은 모듈 별 목적에 따라 다르게 구현
예)
def custom_retriever(data: RagData) -> RagData:
# 커스텀 retriever 로직 구현
...
return data
def request_private_api(data: RagData) -> RagData:
# API 호출 로직 구현
...
return data
조립형 모듈
마치 레고 블록처럼 세부 모듈(Sub-Module)을 연결하여 구성
- 모듈의 추가/변경 용이
독립적인 모듈의 장점을 활용
- 각 Sub-Module의 교체가 쉬움
- 단계의 전/후에 Sub-Module을 추가
그래프 형식의 동적 흐름 구성
평가자 -> "문서 검색"에 대한 평가(Score) - 문서에 Query에 대한 답변을 위한 정보가 충분한지 판단
- Success: 답변 생성
- Fail
- 검색된 문서의 정보가 불충분한 경우
- 문서 검색을 위한 Query Rewrite
- 질문이 모호한 경우
- 보다 명확한 질문 or Query Decomposition을 통한 세부 질문으로 구성 후 검색
- 검색된 문서의 정보가 불충분한 경우
Query -> 문서 검색 -> 답변 생성 -> 평가자 -> "답변"에 대한 평가(Score) - Query에 대한 답변이 충분한지 평가
- Success: 답변 생성
- Fail
- 질문이 모호한 경우
- Query Rewrite
- 정보가 불충분한 경우
- 추가 검색 모듈(Web Search)을 활용하여 문맥(Context) 보강
- 질문이 모호한 경우
질문에 문서 검색이 필요한지 판단하여 Routing
- YES: 문서 검색 -> 답변 생성
- NO
- 즉각 답변 생성: 토큰 비용의 절약
- 예) "대한민국의 수도는 어디입니까?" -> 즉각 답변
- 평가자 2는 RAG 답변에 대한 평가
*평가자 : LLM에게 평가 기준을 프롬프트로 제공하여 구현