Cognita, RAG 애플리케이션 구축을 위한 모듈 기반 오픈소스 Framework
소개
Cognita는 프로덕션 환경에서 RAG(Retrieval Augmented Generation) 애플리케이션을 구축하기 위한 모듈러 오픈 소스 프레임워크입니다. 여러 팀이 서로 다른 유스 케이스에 대한 RAG 애플리케이션을 개발할 때, 각 팀이 처음부터 시작하지 않고도 기존의 기능을 활용하여 자체 앱을 효과적으로 개발할 수 있는 모듈식 방법을 제공합니다. Cognita는 이러한 요구 사항을 충족시키는 동시에 로컬 환경과 프로덕션 환경 모두에서 쉽게 사용할 수 있는 프레임워크를 제공합니다.
Cognita는 데이터 로더, 파서, 임베더, 리랭커, 벡터 DB, 메타데이터 저장소 및 쿼리 컨트롤러 등 일곱 가지 다른 모듈로 설계되었습니다. 이러한 각 모듈은 사용자의 요구에 맞게 사용자화 및 제어가 가능합니다. Cognita는 이 모듈들을 통해 사용자가 자신의 특정 요구 사항에 맞춰 플랫폼을 맞춤 설정할 수 있도록 지원하며, 기술의 진화와 함께 성장할 수 있도록 설계되었습니다.
주요 특징: 모듈식 설계
다른 RAG 프레임워크들의 구현과 비교했을 때, Cognita는 모듈식 구성, 다양한 데이터 소스 지원, 고급 파싱 및 임베딩 기능을 통해 더욱 효율적이고 유연한 솔루션을 제공합니다. 각각의 모듈들을 살펴보면 다음과 같습니다:
데이터 로더(Data Loaders)
Cognita의 데이터 로더는 다양한 소스에서 데이터를 로드하는 역할을 합니다. 로컬 디렉토리, S3 버킷, 데이터베이스, GitHub 리포지토리 및 Truefoundry 아티팩트와 같은 다양한 소스를 지원합니다. 사용자는 필요에 따라 새로운 데이터 로더를 추가하고 등록하여 RAG 애플리케이션에서 사용할 수 있습니다.
# 데이터 로더 등록 예제
register_dataloader("MyDataLoader", MyDataLoaderClass)
파서(Parsers)
파서는 다양한 형태의 데이터를 통일된 형식으로 변환하는 작업을 담당합니다. 이 과정에서 텍스트 파일, PDF, 마크다운 파일 등을 처리하며, 데이터를 일관된 청크로 분할하여 추후 처리가 용이하도록 합니다. 파서는 효과적인 데이터 파이프라인 관리를 지원하며, 새로운 파서를 추가하고 등록할 수 있습니다.
# 파서 등록 예제
register_parser("MyParser", MyParserClass)
임베더(Embedders)
임베더는 데이터 청크와 질문을 특별한 코드인 임베딩으로 변환하여, 각 데이터 청크와 질문 사이의 유사도를 계산하는 역할을 합니다. 이 과정은 문제에 가장 관련 있는 청크를 신속하게 찾는 데 도움을 줍니다. Cognita는 OpenAI, Cohere 등 다양한 사전 훈련된 모델을 지원합니다.
# 임베더 등록 예제
register_embedder("MyEmbedder", MyEmbedderClass)
리랭커(Rerankers)
리랭커는 임베딩 단계에서 발견된 잠재적인 매치들 중에서 최상의 결과를 상위에 배치하여, 문맥을 더욱 간결하게 하고 질의 응답을 최적화합니다. Cognita는 mixedbread-ai
의 최신 리랭커를 포함하여 다양한 리랭커를 지원합니다.
벡터 데이터베이스(Vector DBs)
벡터 DB는 텍스트의 벡터를 저장하고, 사용자 쿼리와 가장 유사한 벡터를 빠르게 찾아내는 데 사용됩니다. Cognita는 Qdrant
, SingleStore
등 여러 벡터 데이터베이스를 지원하며, 새로운 벡터 DB를 추가할 수 있습니다.
# 벡터 DB 등록 예제
register_vector_db("MyVectorDB", MyVectorDBClass)
메타데이터 저장소(Metadata Store)
메타데이터 저장소는 프로젝트 또는 RAG 애플리케이션을 고유하게 정의하는 필요한 설정을 저장합니다. 각각의 RAG 사용 사례에 대한 컬렉션 이름, 사용된 벡터 DB의 이름, 연결된 데이터 소스 등의 정보를 포함합니다.
쿼리 컨트롤러(Query Controllers)
쿼리 컨트롤러는 벡터 DB에 저장된 데이터를 사용하여 사용자의 쿼리에 대응하는 답변을 검색하고 생성하는 역할을 합니다. 각 RAG 사용 사례는 일반적으로 쿼리 컨트롤러를 통해 API로 직접 노출되며, 사용자 정의 쿼리 컨트롤러를 추가하고 등록할 수 있습니다.
# 쿼리 컨트롤러 등록 예제
@query_controller("/my-controller")
class MyCustomController():
@post("/answer")
def answer(query: str):
# 로직 구현
pass
Cognita의 프로세스 흐름
Cognita의 일반적인 프로세스는 데이터 색인(Data Indexing) 과 응답 생성(Response Generation) 의 두 가지 주요 단계로 구성됩니다. 이 두 단계는 데이터를 처리하고 사용자 질의에 대응하는 데 필요한 모든 과정을 포함하며, Cognita가 데이터를 효과적으로 관리하고, 사용자 질의에 신속하고 정확하게 응답할 수 있는 기반을 제공합니다. 각 단계는 사용자화가 가능하며, 다양한 사용 사례에 맞춰 조정될 수 있어, 다양한 유형의 RAG 애플리케이션 개발을 지원합니다.
데이터 색인(Data Indexing) 단계
데이터 색인 단계는 데이터 소스에서 문서를 로드하고, 이를 적절히 파싱하여 처리할 수 있는 형식으로 변환하는 과정을 포함합니다. 이 단계의 주요 목표는 대량의 문서 데이터를 효과적으로 관리하고, 새로 추가되거나 업데이트된 문서만을 색인하여 시스템의 효율성을 극대화하는 것입니다.
이러한 데이터 색인 단계를 살펴보면 다음과 같습니다:
- 데이터 로드: 다양한 데이터 소스로부터 문서를 로드합니다.
- 파싱: 로드된 데이터를 처리 가능한 형식으로 파싱합니다. 이 과정에서 데이터는 일관된 청크로 분할됩니다.
- 임베딩: 파싱된 청크를 임베딩하여, 나중에 쿼리에 의해 검색될 수 있도록 벡터 형태로 저장합니다.
- 벡터 DB 저장: 임베딩된 데이터를 벡터 데이터베이스에 저장합니다. 이 데이터베이스는 후속 쿼리 처리 시 빠른 검색을 가능하게 합니다.
- 메타데이터 관리: 각 문서와 데이터 청크에 대한 메타데이터를 관리하여, 효율적인 데이터 관리와 검색을 지원합니다.
응답 생성(Response Generation) 단계
응답 생성 단계는 사용자의 질의를 받아 적절한 응답을 생성하는 과정입니다. 이 단계는 색인된 데이터를 활용하여 사용자의 요구에 맞는 정보를 검색하고, 필요한 답변을 구성합니다.
이러한 응답 생성 단계를 살펴보면 다음과 같습니다:
- 질의 수신: 사용자로부터 질의를 받습니다.
- 문서 검색: 벡터 데이터베이스에서 사용자 질의와 가장 관련성이 높은 문서를 검색합니다.
- LLM 활용: 선택된 문서 청크를 바탕으로 대규모 언어 모델(LLM)을 사용하여 정교한 답변을 생성합니다.
- 응답 반환: 생성된 답변을 사용자에게 반환합니다. 필요에 따라 응답 과정에서 여러 단계의 처리가 포함될 수 있으며, 사용자의 요구에 맞춰 추가적인 정보 제공이 가능합니다.
라이선스
Cognita는 Apache 2.0 라이선스로 배포되는 오픈소스 소프트웨어입니다.
더 읽어보기
Cognita 소개 글
Cognita GitHub 저장소
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~