23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요! 데보션 2기 [AI 시대 자동화 시스템과 대화하는 새로운 방법] 스터디원 김지현입니다.
이번 포스팅은 저희 스터디 후기 중 도균님이 작성해 주신 <## OpenLab 2기 - AI 시대 자동화 시스템과 대화하는 새로운 방법 (1) LLM, RAG로 충분하지 아니한가>에 이어
Modular RAG에 관련된 내용을 다루고자 합니다.
OpenLab 2기 - AI 시대 자동화 시스템과 대화하는 새로운 방법 (1) LLM, RAG로 충분하지 아니한가
LLM과 RAG에 대해 생소하신 분들은 먼저 위 링크를 참고하신 후 제 글을 읽으시면 이해하기 더 쉬우실 것 같습니다!
저희는 온톨로지를 활용하여 LLM의 환각 문제를 줄이고, 유저와 음성으로 상호작용하며 두통을 진단하는 AI 모델을 공부하고 있습니다.
많은 LLM 기반 서비스의 공통적인 고민은 '환각' 현상일 것입니다.
그래서 최근에는 다양한 Advanced RAG가 구현되고 제안되고 있습니다.
이제는 이러한 Advanced RAG를 넘어 Modular RAG가 많이 언급되고 있어, 이에 대해 함께 알아보려 합니다.
먼저, Advanced RAG는 기존 Naive RAG 방식이 직면하는 문제를 해결하기 위해 만들어진 방식입니다.
Naive RAG는 단순히 정보를 검색하고 모델에 전달하는 구조인데, 이 과정에서 정보의 부정확성이나 환각 현상이 발생할 수 있습니다.
Advanced RAG는 이러한 문제를 해결하기 위해 더 정교한 단계와 기술을 도입한 것입니다.
출처 : Modular RAG 논문: https://arxiv.org/html/2407.21059v1
Advanced RAG는 크게 세 가지 단계로 나뉘며, 각각의 단계는 정보를 더욱 정밀하게 다듬고 모델에 효과적으로 전달하기 위한 다양한 기법을 포함하고 있습니다.
Pre-Retrieval 단계에서는 검색의 정확도를 높이기 위해 쿼리를 사전에 처리합니다. 이는 검색 성능을 극대화하고, 사용자의 의도를 더 잘 반영하는 데 중요한 역할을 합니다.
쿼리 리포맷팅: 쿼리를 더 효과적으로 검색할 수 있도록 문장의 구조를 재구성함. 예를 들어, 비문이나 비정형 문장을 구조화된 쿼리로 변경하여 검색 성능을 향상시킵니다.
의도 분석: 사용자의 입력 쿼리에서 의도를 파악하여 관련된 검색 키워드를 추가함. 예를 들어, 사용자가 두통의 원인을 물을 때 "두통 원인"과 같은 관련 키워드를 추가합니다.
필터링 및 전처리: 불필요한 단어 제거 및 키워드 강조를 통해 검색의 정확도를 높임. 예를 들어, 의미 없는 연결사나 중복된 단어를 제거하여 검색의 효율성을 높입니다.
쿼리 확장: 동의어 추가나 관련 검색어를 통해 쿼리를 확장하여 포괄적인 검색 가능. 예를 들어, "두통"이라는 쿼리를 "두통, 편두통, 긴장성 두통"으로 확장하여 더 많은 결과를 얻을 수 있습니다.
디버깅 도구: 검색 전 쿼리의 적절성을 점검하고 오류를 수정하는 도구 사용. 이를 통해 검색 전에 발생할 수 있는 잠재적 문제를 미리 해결합니다.
Retrieval 단계에서는 실제로 데이터를 검색하고 가장 관련성 높은 정보를 찾습니다. 이 과정은 다양한 검색 방법을 조합하여 더욱 정확하고 포괄적인 결과를 제공하는 것이 목표입니다.
벡터 검색: 쿼리를 벡터로 변환하고 벡터 데이터베이스에서 가장 유사한 결과를 검색함. 이를 통해 의미 기반 검색이 가능해지며, 문서의 컨텍스트를 더 잘 이해할 수 있습니다.
TF-IDF 또는 BM25 검색: 단순 키워드 기반 검색 기법을 사용하여 문서의 중요도를 평가하고 검색. 예를 들어, 사용자가 특정 키워드를 입력하면 해당 키워드의 빈도를 고려해 문서를 검색합니다.
하이브리드 검색: 키워드 검색과 벡터 검색을 조합하여 검색의 정확도와 포괄성을 높임. 예를 들어, 단순 키워드 검색으로 빠르게 필터링한 후 벡터 검색으로 세밀한 순위를 정합니다.
유사도 필터링: 검색 결과 중 코사인 유사도와 같은 지표를 사용하여 가장 관련성 높은 결과만 반환. 이를 통해 노이즈를 줄이고 원하는 정보에 집중할 수 있습니다.
검색 스코어 조정: 검색된 결과의 스코어를 기준으로 순위를 조정하여 우선순위 부여. 사용자가 가장 필요로 할 가능성이 높은 정보를 상위에 배치합니다.
Post-Retrieval 단계에서는 검색된 정보를 기반으로 최종적인 응답을 생성하는 과정을 다룹니다. 이 단계는 검색된 정보를 정제하고, 모델이 효과적으로 활용할 수 있도록 재구성하는 것이 핵심입니다.
결과 요약: 검색된 정보에서 핵심 내용을 추출하여 요약함. 예를 들어, 긴 문서에서 중요한 문장을 요약해 사용자에게 제공할 수 있습니다.
필터링 및 노이즈 제거: 불필요하거나 관련성 낮은 정보 제거. 예를 들어, 검색된 결과 중 의미 없는 정보나 부정확한 데이터를 필터링합니다.
답변 생성을 위한 재구성: 검색된 데이터를 바탕으로 컨텍스트를 재구성하여 모델에 전달. 예를 들어, 여러 소스에서 검색된 데이터를 연결하여 하나의 완성된 문맥을 만들어냅니다.
정제된 컨텍스트 제공: LLM에 검색 결과를 효율적으로 제공할 수 있도록 최종 정제. 이를 통해 모델이 더욱 정확하고 자연스러운 답변을 생성할 수 있습니다.
생성 모델 통합: 검색된 정보와 모델을 연결하여 보다 자연스러운 응답 생성. 예를 들어, 모델이 특정 사실을 기반으로 응답을 생성할 때 이를 자연스럽게 표현하도록 돕습니다.
후처리 및 품질 검사: 최종 답변의 품질을 점검하고 필요 시 수정. 이를 통해 사용자에게 제공되는 답변의 신뢰성과 품질을 높입니다.
Advanced RAG는 이러한 정교한 단계를 통해 기존의 단순한 RAG보다 더 정확하고 신뢰성 있는 결과를 제공합니다.
이를 통해 LLM의 환각 문제를 줄이고, 더욱 사용자 친화적인 응답을 제공할 수 있습니다.
하지만 매번 프로젝트마다 구조를 다시 처음부터 구상하고 구현하는 것은 복잡하고 비효율적이기 때문에, 효율성을 위해 Modular RAG 방식을 알아보고자 합니다.
Modular RAG는 더 다양하고 유연한 구조를 지향하며, 이러한 구조를 통해 RAG의 전반적인 성능 향상과 효율적인 흐름 구축에 많은 도움이 됩니다.
Modular RAG는 Advanced RAG의 확장된 개념으로, RAG 흐름을 여러 모듈로 나누고 이러한 모듈들을 유연하게 재사용할 수 있도록 설계되었습니다.
이를 통해 특정 데이터, 사용 사례 및 후속 작업에 맞게 조정할 수 있어 시스템의 다양한 요구 사항에 유연하게 대처할 수 있습니다.
개발자는 기존 흐름 아키텍처에서 영감을 받아 다양한 응용 프로그램의 맥락과 도메인에 맞춤화된 새로운 흐름 및 패턴을 정의하여 혁신할 수 있습니다.
이러한 접근 방식은 RAG 시스템의 복잡성을 줄이고, 모듈별로 독립적인 개선과 업데이트가 가능하게 하여, 전체 시스템의 유지보수성과 확장성을 크게 향상시킵니다.
특히, 프로젝트의 규모가 커짐에 따라 구조적인 재사용과 빠른 프로토타이핑이 가능해지는 점에서 큰 장점을 가지고 있습니다.
출처 : Modular RAG 논문: https://arxiv.org/html/2407.21059v1
또한 Modular RAG 시스템을 구축하기 위해 아래와같은 주요 기술스택이 요구됩니다.
FastAPI: API 서버 프레임워크로 사용. 비동기 처리를 지원하며, 고성능 API를 쉽게 구축할 수 있음
Docker: 각 서비스를 독립된 컨테이너로 관리하고, 배포 환경을 쉽게 설정할 수 있도록 사용. 나중에 DB와 Redis 같은 서비스도 Docker Compose를 통해 관리 예정
Poetry: 의존성 관리 및 패키지 관리를 위해 사용. Python 패키지 관리의 안정성과 유연성을 제공
LangGraph: 노드와 엣지를 기반으로 워크플로우를 구성하고, 다양한 모듈을 유연하게 조합하는 데 사용
LLM: GPT, Llama 등 다양한 LLM을 통합하여 여러 상황에 맞는 대화 모델을 제공
Chroma, Faiss, Milvus: 다양한 벡터 스토어로, 검색 성능을 향상시키기 위해 선택적으로 사용
Modular RAG는 RAG 시스템의 구축 및 유지보수를 더 용이하게 하며, 개발자는 이러한 모듈들을 통해 원하는 기능을 유연하게 결합하여 맞춤형 솔루션을 만들 수 있습니다.
이를 통해 기존의 문제들을 해결하는 동시에, 시스템의 발전 가능성을 높일 수 있습니다.
Project 구조
아래에는 간단하게 Modular RAG를 위한 구조입니다.
modular-rag/
│
├── app/ # FastAPI 애플리케이션 코드
│ ├── main.py # FastAPI 메인 엔트리 포인트
│ ├── routers/ # API 경로 관리
│ │ └── core.py # 핵심 API 라우팅
│ ├── middleware/ # 미들웨어 모듈
│ │ └── custom_middleware.py
│ ├── services/ # 서비스 모듈
│ │ ├── retrievals/ # retrieval 관련 로직
│ │ │ ├── pre_retrieval.py
│ │ │ ├── retrieval.py
│ │ │ ├── post_retrieval.py
│ │ ├── vectorstores/ # 벡터 스토어 관련
│ │ │ ├── chroma_store.py
│ │ │ ├── faiss_store.py
│ │ │ └── milvus_store.py
│ │ ├── preprocessing/ # 전처리 관련 로직
│ │ ├── web_search.py # 웹 검색 관련
│ │ ├── llm_handler.py # 다양한 LLM 관리 (GPT, Llama 등)
│ │ ├── prompt_manager.py # 프롬프트 관리
│ │ ├── parsers/ # 파일 파서 모듈
│ │ │ ├── llama_parser.py
│ │ │ ├── web_parser.py
│ │ │ └── generic_parser.py
│ ├── auth/ # 인증 및 보안 관리
│ │ ├── auth_handler.py # 인증 로직
│ │ ├── jwt_utils.py # JWT 관련 유틸리티
│ ├── scheduler/ # 스케줄러 관련 모듈
│ │ └── scheduler.py # 주기적 작업 관리
│ ├── static/ # 정적 파일 (필요시)
│ ├── templates/ # 템플릿 파일 (필요시)
│
├── utils/ # 공통 유틸리티 함수
│ ├── file_utils.py
│ ├── date_utils.py
│ ├── logging_manager.py # 로깅 관리
│ └── error_handler.py # 에러 핸들링 로직
│
├── docker/ # Docker 설정 파일
│ ├── fastapi/ # FastAPI 관련 Docker 설정
│ │ ├── Dockerfile
│ ├── nginx/ # Nginx 관련 설정
│ │ ├── Dockerfile
│ │ ├── nginx.conf
│
├── compose.yaml # Docker Compose 설정 파일 (루트 디렉토리에 위치)
│
├── langgraph/ # LangGraph 관련 로직 폴더
│ ├── node_definitions.py # 노드 정의 (LLM, 리트리버, 벡터 스토어 등)
│ ├── langgraph_handler.py # LangGraph 구성 및 핸들러 (node_definitions 활용)
│
├── config/ # 설정 파일
│ ├── settings.py # LLM, 리트리버, 파서 등 환경설정
│ ├── logging_config.py # 로깅 설정
│ ├── settings_dev.py # 개발 환경 설정
│ ├── settings_prod.py # 프로덕션 환경 설정
│
├── tests/ # 테스트 관련 폴더
│ ├── __init__.py # 테스트 폴더 초기화
│ ├── retrievals/ # retrieval 모듈 테스트
│ ├── vectorstores/ # 벡터 스토어 모듈 테스트
│ ├── routers/ # API 라우터 테스트
│ ├── auth/ # 인증 모듈 테스트
│ └── scheduler/ # 스케줄러 모듈 테스트
│
├── poetry.lock # Poetry 잠금 파일
├── pyproject.toml # Poetry 의존성 및 프로젝트 설정 파일
└── README.md # 프로젝트 설명RAG는 LLM에서 중요한 기술로 부상하고 있습니다. 기술 환경이 계속 발전하고 응용 프로그램의 요구 사항이 점점 더 복잡해짐에 따라,
RAG 시스템도 다양한 기술을 통합하여 더욱 복잡하고 기능적인 시스템으로 진화하고 있습니다.
본 포스팅에서는 Modular RAG라는 접근 방식을 소개했습니다.
이 접근 방식은 RAG 시스템의 복잡한 아키텍처를 체계적으로 분해하여 각 모듈을 독립적이고 명확하게 정의함으로써,
전체 시스템을 하나의 조립 가능한 구조로 만들어 냅니다. 이는 마치 레고 블록처럼 각 모듈을 조합하여 전체 시스템을 구성하는 방식입니다.
Modular RAG는 RAG 시스템의 설계와 응용에 구조적인 프레임워크를 제공하고 특정 도메인에 맞게 시스템을 맞춤화할 수 있도록 합니다.
이 모듈화된 설계는 추적과 디버깅을 용이하게 하며, 유지보수성과 확장성을 크게 향상시킵니다.
또한 Modular RAG는 RAG 기술의 미래 발전을 위한 새로운 가능성을 열어줍니다.
항상 많은 귀감이 되어 주시는 스터디원분들께 감사드립니다.
각자의 도메인과 업무는 다르지만, 시간을 내어 함께 공부하고 참여해 주시는 여러분 덕분에 저 또한 게으르지 않게 공부할 수 있는 동기부여가 됩니다.
남은 기간도 함께 화이팅해서 달려보아요!!
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.