Cognita RAG 시스템의 구조 및 작동 원리

RAG(Retrieval-Augmented Generation) 애플리케이션 개발에 있어 여러 팀이 동일한 기본 기능을 활용하고, 그 위에 각자의 특화된 애플리케이션을 구축할 수 있는 모듈식 접근 방식이 효과적일 수 있습니다. 이를 위해 다음과 같은 방법들을 고려할 수 있습니다:

  1. 공통 플랫폼 개발: 모든 팀이 사용할 수 있는 공통의 기반 플랫폼을 개발합니다. 이 플랫폼은 데이터 검색, 처리, 학습 모델 등의 기본적인 기능을 제공하여 각 팀이 처음부터 모든 것을 개발할 필요 없이 필요한 부분만 추가 개발하도록 합니다.
  2. API 및 서비스 인터페이스 표준화: 공통 플랫폼과 팀 간의 인터페이스를 표준화하여 각 팀이 개발한 모듈이나 애플리케이션이 서로 호환될 수 있도록 합니다. 이렇게 하면 다른 팀이 개발한 기능을 쉽게 통합하고 확장할 수 있습니다.
  3. 코드 및 자원의 재사용: 공통된 기능을 라이브러리나 서비스로 제공하여, 각 팀이 이를 재사용할 수 있도록 합니다. 이는 개발 시간을 단축하고, 중복 작업을 줄이며, 전체 프로젝트의 유지보수를 용이하게 합니다.
  4. 협업 및 커뮤니케이션 강화: 정기적인 미팅, 공유 문서, 협업 툴을 활용하여 팀 간의 의사소통을 강화합니다. 각 팀의 진행 상황을 공유하고, 필요한 경우 조정을 통해 프로젝트의 일관성을 유지합니다.
  5. 피드백 및 지속적인 개선: 사용자 및 다른 팀의 피드백을 적극적으로 수집하고 반영하여, 애플리케이션의 성능과 사용성을 지속적으로 개선합니다.

이런 접근 방식은 개발 과정을 효율화하고 각 팀의 특성에 맞는 최적화된 솔루션을 제공할 수 있게 하여, 전체적인 프로젝트의 성공률을 높일 수 있습니다.

RAG는 분명 인상적이지만 실제로 기능적인 애플리케이션을 만드는 과정은 쉽지 않을 수 있습니다. 특정 사용 사례에 적합한 AI 모델을 선택하는 것부터 원하는 인사이트를 얻기 위해 데이터를 효과적으로 구성하는 것까지 구현 및 개발 관행과 관련하여 파악해야 할 사항이 상당히 많습니다. LangChain이나 LlamaIndex와 같은 도구가 프로토타입 설계 프로세스를 단순화하기 위해 존재하지만, 모범 사례를 통합하고 모듈식 지원을 제공하여 누구나 빠르고 쉽게 활용할 수 있는 접근 가능하고 사용 준비가 된 오픈 소스 RAG 템플릿은 아직 없었습니다.

Cognita는 이러한 문제를 해결하기 위해 개발된 것으로 보입니다. RAG 애플리케이션 개발을 위한 포괄적인 프레임워크를 제공함으로써 개발자와 팀이 처음부터 시작할 필요 없이 입증된 아키텍처와 모범 사례를 기반으로 구축할 수 있도록 도와줍니다. Cognita의 모듈식 디자인을 통해 사용자는 특정 요구 사항에 맞게 구성 요소를 쉽게 사용자 정의하고 확장할 수 있습니다.

또한 Cognita가 오픈 소스라는 점도 큰 장점입니다. 이를 통해 커뮤니티가 지속적으로 개선 및 기여할 수 있고, 사용자는 내부 동작을 이해하고 필요에 따라 수정할 수 있습니다. 오픈 소스 특성 덕분에 다양한 사용 사례와 도메인에 걸쳐 폭넓게 채택될 가능성도 높아집니다.

종합하면, Cognita는 RAG 애플리케이션 개발을 민주화하고 다양한 팀과 조직이 고급 AI 기능을 자체 솔루션에 통합할 수 있도록 함으로써 접근성 격차를 해소하는 데 도움이 될 것 같습니다. 이는 혁신을 가속화하고 RAG 기술의 광범위한 적용을 가능하게 할 것입니다.

Cognita가 제공하는 이점들은 사용자와 개발자 모두에게 유용한 기능을 제공하여 RAG 애플리케이션의 개발 및 사용을 간소화하고 효율적으로 만들 수 있습니다. 아래는 Cognita의 주요 이점에 대한 자세한 설명입니다:

  1. 중앙 집중식 재사용 가능한 리포지토리:
  • 파서, 로더, 임베더, 리트리버의 중앙 집중식 저장소는 다양한 프로젝트에서 공통적으로 사용될 수 있는 구성 요소들을 제공합니다. 이는 개발 시간을 절약하고, 일관성 있는 결과를 보장하며, 각 팀이 처음부터 모든 것을 개발하지 않도록 도와줍니다.
  1. 비기술 사용자를 위한 UI:
  • 비기술 사용자가 직접 문서를 업로드하고, 개발된 모듈을 사용해 질의응답(QnA)을 수행할 수 있는 사용자 친화적인 인터페이스를 제공합니다. 이는 기술적 배경 지식이 없는 사용자들이 AI 기능을 쉽게 활용할 수 있게 해주어, AI 기술의 접근성을 크게 향상시킵니다.
  1. 완전 API 구동:
  • 시스템이 완전히 API로 구동되므로, 다른 시스템과의 통합이 용이합니다. 이는 Cognita를 기존 IT 인프라나 다른 애플리케이션과 손쉽게 결합할 수 있게 해줍니다. 결과적으로, 기업들은 기존 시스템을 변경하지 않고도 새로운 기능을 통합할 수 있으며, 다양한 시스템 간에 데이터와 기능을 원활하게 교환할 수 있습니다.

이러한 이점들은 Cognita를 사용하는 조직이 시장에서 경쟁 우위를 확보하고, 비용과 시간을 절약하며, 다양한 사용자 그룹이 AI 기술을 보다 쉽게 사용할 수 있게 하여, 전체적인 생산성과 효율성을 향상시키는 데 기여할 수 있습니다.

여기 다이어그램을 통해 Cognita의 RAG 프로세스가 어떻게 설계되었는지 그리고 각 단계가 어떻게 서로 상호작용하는지를 더 자세히 이해할 수 있습니다. 이 아키텍처는 크게 두 가지 주요 단계로 나뉩니다: 인덱싱 단계응답 생성 단계입니다.

인덱싱 단계

이 단계에서는 다음과 같은 일련의 과정이 이루어집니다:

  1. 데이터 로더를 통해 다양한 데이터 소스로부터 데이터를 스캔하고 필터링합니다.
  2. 파서를 사용하여 데이터를 파싱하고 적절한 조각으로 나눕니다.
  3. 추가적인 메타데이터를 조각에 부여하여 데이터의 가치를 증대시킵니다.
  4. 임베더를 통해 각 조각을 임베딩하여, 검색 가능한 벡터 형태로 변환합니다.
  5. 이렇게 생성된 데이터는 벡터 데이터베이스(Vector DB)에 저장되어 색인화됩니다.

응답 생성 단계

사용자의 쿼리가 들어오면, 다음과 같은 프로세스를 통해 응답을 생성합니다:

  1. 리트리버가 벡터 데이터베이스에서 관련 문서를 검색합니다.
  2. 선택된 문서들은 LLM(Large Language Model)에 전달되어, 주어진 쿼리에 대한 컨텍스트를 바탕으로 응답을 생성합니다.
  3. 최종적으로, LLM은 사용자의 쿼리에 대한 응답과 함께 원본 문서들을 반환합니다.

이 아키텍처는 특히 모듈식 접근 방식을 채택함으로써 각 기능을 독립적으로 업데이트하거나 교체할 수 있게 해, 시스템의 유지보수가 용이하고 확장성이 뛰어납니다. 또한, 이 구조는 새로운 AI 기술이나 라이브러리와의 호환을 쉽게 할 수 있도록 설계되어, 기술의 발전에 따라 시스템을 지속적으로 업데이트할 수 있습니다. 이러한 특성은 Cognita를 다양한 사용 사례에 적용 가능하게 만들며, 사용자들이 특정 요구 사항에 맞추어 플랫폼을 맞춤화할 수 있게 돕습니다.

Components

Cognita의 7가지 주요 구성 요소에 대해 자세히 살펴보겠습니다. 각 모듈은 서로 다른 요구 사항에 맞게 사용자 정의 및 제어가 가능하도록 설계되었습니다.

  1. 데이터 로더 (Data Loaders):
    데이터 로더는 다양한 소스에서 데이터를 수집하고 Cognita 시스템에 입력하는 역할을 담당합니다. 여기에는 로컬 디렉토리, S3, 데이터베이스 등이 포함될 수 있습니다. 데이터 로더는 각 사용 사례에 적합한 데이터를 유연하게 통합할 수 있도록 해줍니다.
  2. 파서 (Parsers):
    파서는 데이터 로더가 수집한 원시 데이터를 구문 분석하고 처리하여 다음 단계에서 사용할 수 있는 구조화된 형식으로 변환합니다. 파서는 다양한 데이터 형식(예: 텍스트, 이미지, 오디오)을 처리할 수 있으며, 필요에 따라 사용자 지정 파싱 로직을 구현할 수 있습니다.
  3. 임베더 (Embedders):
    임베더는 구조화된 데이터를 벡터 표현으로 변환하는 역할을 합니다. 이 벡터 표현은 유사성 검색, 클러스터링 등의 작업에 사용됩니다. Cognita는 사전 훈련된 임베딩 모델을 사용할 수 있으며, 사용자는 자신의 도메인별 임베딩 모델을 통합할 수도 있습니다.
  4. 리랭커 (Rerankers):
    리랭커는 질의와 관련하여 검색된 문서의 순위를 조정하는 데 사용됩니다. 이는 검색 결과의 관련성과 품질을 개선하는 데 도움이 됩니다. Cognita는 다양한 리랭킹 알고리즘을 지원하며, 사용자는 자신의 리랭킹 전략을 구현할 수 있습니다.
  5. 벡터 데이터베이스 (Vector DBs):
    벡터 데이터베이스는 임베딩된 벡터를 저장하고 효율적으로 검색하는 데 사용됩니다. 이를 통해 대규모 데이터 세트에서 빠르고 정확한 유사성 검색이 가능합니다. Cognita는 다양한 벡터 데이터베이스(예: Faiss, Annoy)와 통합될 수 있습니다.
  6. 메타데이터 스토어 (Metadata Store):
    메타데이터 스토어는 색인된 문서와 관련된 추가 정보를 저장합니다. 여기에는 문서 소스, 작성 날짜, 작성자 등의 메타데이터가 포함될 수 있습니다. 메타데이터 스토어를 통해 사용자는 검색 결과를 필터링하고 문맥에 따라 정보를 제공할 수 있습니다.
  7. 질의 컨트롤러 (Query Controllers):
    질의 컨트롤러는 사용자 질의를 받아 검색, 랭킹, 응답 생성 프로세스를 조정합니다. 여기에는 질의 분석, 검색 매개변수 설정, 결과 후처리 등의 작업이 포함됩니다. 질의 컨트롤러를 사용자 정의하면 특정 사용 사례에 맞는 검색 동작을 구현할 수 있습니다.

이러한 모듈식 구성 요소를 통해 Cognita는 높은 수준의 유연성과 사용자 정의 기능을 제공합니다. 사용자는 각 구성 요소를 독립적으로 제어하고 자신의 요구 사항에 맞게 조정할 수 있습니다. 이를 통해 다양한 도메인과 사용 사례에 걸쳐 RAG 워크플로우를 맞춤 설정할 수 있습니다.

Data Loaders

Cognita에서는 데이터 로더를 통해 다양한 소스에서 데이터를 가져오는 기능을 제공합니다. 현재 지원하는 데이터 로더는 다음과 같습니다:

  1. Local dir (로컬 디렉토리): 시스템에 저장된 파일에서 데이터를 직접 로드합니다.
  2. Web: 웹 URL을 통해 인터넷 상의 데이터를 로드합니다.
  3. GitHub: GitHub 저장소에서 데이터를 직접 로드합니다.
  4. True Foundry: True Foundry는 데이터 관리 및 파이프라인 도구를 제공하는 플랫폼으로, 여기서 데이터를 가져올 수 있습니다.

데이터 로더의 확장성

Cognita는 사용자가 새로운 데이터 소스를 쉽게 추가할 수 있도록 설계되었습니다. 새로운 데이터 로더를 추가하는 과정은 다음과 같습니다:

  1. 데이터 로더 클래스 정의: 새 데이터 소스에 맞는 데이터 로더 클래스를 생성합니다.
  2. 데이터 로더 등록: 생성한 데이터 로더 클래스를 시스템에 등록합니다. 이를 위해 backend/modules/dataloaders/__init__.py 파일에 다음과 같은 코드를 추가합니다:
   register_dataloader("MyDataLoader", MyDataLoaderClass)

이 코드는 새로운 데이터 로더 클래스 MyDataLoaderClass"MyDataLoader"라는 이름으로 시스템에 등록합니다.

이러한 방식으로 Cognita의 데이터 로더 모듈은 매우 유연하게 설계되어 있으며, 사용자는 필요에 따라 다양한 데이터 소스를 쉽게 추가하고 활용할 수 있습니다. 이는 다양한 데이터 소스에서 효율적으로 데이터를 수집하고 처리하는 데 중요한 역할을 하며, 사용자의 특정 요구사항을 충족시킬 수 있도록 합니다.

Parsers

Cognita의 파서 모듈은 다양한 형태의 문서를 처리하고, 이를 일관된 형식으로 변환하는 기능을 수행합니다. 현재 지원하는 파서에는 다음과 같은 것들이 있습니다:

  1. Markdown: 마크다운 파일을 분석하여 텍스트 데이터로 변환합니다.
  2. PDF: PDF 문서로부터 텍스트를 추출합니다.
  3. Text: 일반 텍스트 파일을 처리합니다.

파서의 필요성

파서는 데이터를 유용한 형식으로 변환하여 후속 처리가 더 용이하게 할 수 있도록 합니다. 데이터의 다양성을 고려할 때, 각기 다른 소스로부터 오는 데이터를 표준화된 방식으로 처리하는 것은 매우 중요합니다. 이 과정에서 다음과 같은 몇 가지 중요한 작업이 이루어집니다:

  • 통일성: 다양한 형식의 데이터를 표준화된 데이터 형식으로 변환합니다.
  • 청크 나누기: 문서의 텍스트를 작은 단위로 나누어 처리합니다. 이는 데이터의 노이즈를 줄이고, 관련 개념만을 포함시켜 LLM의 처리 효율을 높입니다.

파서의 확장성

Cognita는 사용자가 새로운 파서를 쉽게 추가할 수 있도록 설계되었습니다. 새로운 파서를 추가하는 과정은 다음과 같습니다:

  1. 파서 클래스 정의: 새 데이터 형식을 처리할 파서 클래스를 생성합니다.
  2. 파서 등록: 생성한 파서 클래스를 시스템에 등록합니다. 이를 위해 backend/modules/parsers/__init__.py 파일에 다음과 같은 코드를 추가합니다:
   register_parser("MyParser", MyParserClass)

이 코드는 새로운 파서 클래스 MyParserClass"MyParser"라는 이름으로 시스템에 등록합니다.

이렇게 함으로써, Cognita의 파서 모듈은 다양한 파일 형식과 데이터 소스를 지원하며, 사용자가 특정 요구에 맞는 데이터 처리 파이프라인을 구축할 수 있도록 합니다. 이는 데이터 전처리의 유연성과 효율성을 크게 향상시킵니다.

마크다운(Markdown) 파서

마크다운은 읽기 쉽고 작성하기 쉬운 일반 텍스트 형식의 마크업 언어입니다. 마크다운 파일은 .md 확장자를 가지며, 간단한 문법을 사용하여 문서의 구조와 서식을 지정할 수 있습니다. 마크다운은 개발자와 작가들 사이에서 널리 사용되며, 특히 문서 작성, 블로그 포스팅, 프로젝트 README 파일 등에 자주 활용됩니다.

Cognita는 마크다운 파일을 파싱하여 내용을 추출하고 구조화된 형식으로 변환할 수 있는 마크다운 파서를 제공합니다. 마크다운 파서는 다음과 같은 기능을 수행합니다:

  1. 마크다운 파일 읽기: 마크다운 파일을 읽어들여 내용을 추출합니다.
  2. 마크다운 문법 파싱: 마크다운 문법을 파싱하여 제목, 부제목, 단락, 목록, 코드 블록, 링크, 이미지 등의 요소를 인식합니다.
  3. HTML 변환: 마크다운 문법을 해석하여 해당하는 HTML 태그로 변환합니다. 예를 들어, 제목은 <h1>, <h2> 등의 태그로, 목록은 <ul>, <li> 태그로 변환됩니다.
  4. 메타데이터 추출: 마크다운 파일에 포함된 메타데이터(예: YAML 프론트매터)를 추출하여 문서의 제목, 작성자, 날짜 등의 정보를 얻을 수 있습니다.
  5. 구조화된 데이터 반환: 파싱된 마크다운 내용을 구조화된 형식(예: JSON)으로 변환하여 반환합니다. 이를 통해 다른 모듈에서 파싱된 데이터를 쉽게 사용할 수 있습니다.

마크다운 파서를 사용하면 마크다운으로 작성된 문서를 Cognita에서 손쉽게 처리할 수 있습니다. 이는 특히 개발 문서, 블로그 포스트, 프로젝트 문서 등을 다룰 때 유용합니다.

마크다운 파서는 backend/modules/parsers/ 디렉토리에 위치하며, 다른 파서와 마찬가지로 backend/modules/parsers/__init__.py에서 등록해야 합니다. 등록 방법은 다음과 같습니다:

register_parser("MarkdownParser", MarkdownParserClass)

위 코드에서 “MarkdownParser”는 등록할 마크다운 파서의 이름이고, MarkdownParserClass는 구현한 마크다운 파서 클래스를 나타냅니다.

마크다운 파서를 등록하면 Cognita의 RAG 애플리케이션에서 마크다운 파일을 직접 사용할 수 있게 됩니다. 이를 통해 마크다운 형식의 데이터를 쉽게 통합하고 처리할 수 있습니다.

Embedders

Embedders는 Cognita의 RAG 파이프라인에서 중요한 역할을 합니다. 데이터를 작은 청크로 분할한 후, 특정 질문과 가장 관련성이 높은 청크를 찾아야 합니다. 이를 위해 사전 훈련된 임베딩 모델을 사용하여 데이터와 질문을 임베딩이라는 특수한 코드로 변환합니다. 그런 다음 각 데이터 청크의 임베딩과 질문의 임베딩 사이의 cosine 유사도를 측정하여 질문과 가장 밀접한 관련이 있는 청크를 파악할 수 있습니다.

Cognita의 임베더(embedder) 모듈은 데이터와 질문을 특수 코드인 임베딩으로 변환하여, 데이터의 중요한 조각을 신속하고 효과적으로 찾을 수 있도록 합니다. 이 모듈을 통해 데이터를 처리하고, 쿼리에 가장 관련 있는 조각을 식별할 수 있습니다. 다음은 현재 Cognita가 지원하는 임베더에 대한 설명입니다:

  1. Mixedbread: 최신 상태(state-of-the-art, SOTA) 임베딩 모델을 제공합니다.
  2. OpenAI: OpenAI에서 개발한 다양한 임베딩 모델을 지원합니다.
  3. TF (TensorFlow): TensorFlow를 사용하여 커스텀 임베딩 모델을 구축하고 적용할 수 있습니다.

임베딩의 역할

임베딩은 텍스트 데이터를 고차원 벡터 공간에 표현하여, 텍스트 간의 의미적 유사성을 수치적으로 계산할 수 있게 합니다. 이 과정은 다음과 같은 방식으로 이루어집니다:

  • 데이터 전처리: 데이터를 적절한 크기의 조각으로 나눕니다.
  • 임베딩 생성: 각 조각을 임베딩 벡터로 변환합니다.
  • 유사성 측정: 질문의 임베딩과 각 데이터 조각의 임베딩 간의 코사인 유사도를 계산하여 관련성이 높은 조각을 식별합니다.

임베더의 확장성

Cognita는 사용자가 새로운 임베더를 쉽게 추가할 수 있도록 설계되었습니다. 새로운 임베더를 추가하는 과정은 다음과 같습니다:

  1. 임베더 클래스 정의: 새로운 임베딩 방법을 처리할 수 있는 클래스를 생성합니다.
  2. 임베더 등록: 생성한 임베더 클래스를 시스템에 등록합니다. 이를 위해 backend/modules/embedders/__init__.py 파일에 다음과 같은 코드를 추가합니다:
   register_embedder("MyEmbedder", MyEmbedderClass)

이 코드는 새로운 임베더 클래스 MyEmbedderClass"MyEmbedder"라는 이름으로 시스템에 등록합니다.

이렇게 함으로써, 사용자는 다양한 소스의 데이터를 효과적으로 처리하고, 새로운 임베딩 기술을 쉽게 통합할 수 있습니다. Cognita의 임베더 모듈은 유연성과 확장성을 제공하여, 다양한 요구사항을 충족시킬 수 있도록 돕습니다.

Rerankers

Cognita의 리랭커(reranker) 모듈은 임베딩 과정을 통해 식별된 잠재적인 문서 매치들을 재평가하고 순위를 재조정하여, 가장 관련성 높은 결과를 상위에 배치하는 역할을 합니다. 이 과정은 결과의 정확성을 높이고, 사용자가 질문에 가장 적합한 문서를 빠르고 정확하게 찾을 수 있도록 돕습니다.

리랭커의 역할

리랭커는 다음과 같은 중요한 기능을 수행합니다:

  1. 최적화된 결과 선별: 임베딩을 통해 생성된 문서들의 리스트에서 가장 정확하고 관련성 높은 문서를 상위에 배치합니다. 이는 종종 대량의 데이터에서 중요한 정보를 빠르게 추출해야 하는 경우에 특히 중요합니다.
  2. 쿼리 최적화: 결과의 정확성을 향상시키기 위해, 최종 사용자 쿼리에 대한 문맥을 더 잘 반영하는 문서를 선택합니다. 이는 사용자의 질문에 대한 더 정확하고 유용한 답변을 제공하는 데 도움이 됩니다.
  3. 효율성 증대: 가장 관련성 높은 문서만을 선택함으로써 처리해야 할 데이터의 양을 줄이고, 시스템의 전반적인 처리 속도를 개선합니다.

SOTA 리랭커

현재 Cognita는 2024년 4월 기준으로 mixedbread-ai에서 제공하는 최신 상태의 리랭커를 지원합니다. 이 리랭커는 다음과 같은 특징을 갖습니다:

  • 고급 알고리즘 적용: 최신 연구에서 얻은 인사이트와 기술을 활용하여, 더 정밀하고 효과적인 결과 재조정을 실현합니다.
  • 다양한 데이터 유형 지원: 텍스트, 이미지, 비디오 등 다양한 형태의 데이터에 대한 리랭킹을 지원하여, 범용성을 제공합니다.

리랭커의 확장성

Cognita는 사용자가 새로운 리랭커를 쉽게 추가할 수 있도록 설계되었습니다. 새로운 리랭커를 추가하는 과정은 다음과 같습니다:

  1. 리랭커 클래스 정의: 새로운 리랭킹 방법을 처리할 수 있는 클래스를 생성합니다.
  2. 리랭커 등록: 생성한 리랭커 클래스를 시스템에 등록합니다. 이를 위해 backend/modules/reranker/__init__.py 파일에 다음과 같은 코드를 추가합니다:
   register_reranker("MyReranker", MyRerankerClass)

이 코드는 새로운 리랭커 클래스 MyRerankerClass"MyReranker"라는 이름으로 시스템에 등록합니다.

이러한 접근 방식은 사용자가 다양한 요구사항에 맞춰 시스템을 맞춤화하고, 새로운 리랭킹 기술을 쉽게 통합할 수 있도록 해, 결과의 정확성과 시스템의 유연성을 크게 향상시킵니다.

VectorDB

Cognita의 벡터 데이터베이스(Vector DB) 모듈은 텍스트 또는 기타 데이터를 벡터 형식으로 저장하고 검색하는 역할을 수행합니다. 이 데이터베이스는 전통적인 데이터베이스와 달리 데이터를 벡터 공간에 매핑하여 효율적으로 검색할 수 있는 구조를 가지고 있습니다. 이는 이미지 인식, 언어 이해, 추천 시스템 등 다양한 AI 기능에서 매우 중요한 역할을 합니다.

벡터 데이터베이스의 주요 기능

  1. create_collection: 새로운 컬렉션(프로젝트 또는 테이블)을 데이터베이스에 초기화합니다.
  2. upsert_documents: 문서를 데이터베이스에 삽입하거나 업데이트합니다.
  3. get_collections: 데이터베이스에 존재하는 모든 컬렉션을 검색합니다.
  4. delete_collection: 특정 컬렉션을 데이터베이스에서 삭제합니다.
  5. get_vector_store: 주어진 컬렉션의 벡터 스토어를 반환합니다.
  6. get_vector_client: 컬렉션에 대한 벡터 클라이언트를 가져옵니다(해당하는 경우).
  7. list_data_point_vectors: 데이터베이스에 이미 존재하는 벡터를 나열하여 삽입되는 문서와 유사한 벡터를 찾습니다.
  8. delete_data_point_vectors: 데이터베이스에서 벡터를 삭제합니다. 이는 문서가 업데이트 될 때 이전 벡터를 제거하는 데 사용됩니다.

벡터 데이터베이스 지원 추가하기

Cognita에서 새로운 벡터 데이터베이스를 추가하기 위한 과정은 다음과 같습니다:

  1. BaseVectorDB 상속 클래스 생성: backend/modules/vector_db/base에 정의된 BaseVectorDB를 상속받는 새 클래스를 생성합니다.
  2. VectorDBConfig 초기화: backend/types에서 정의된 VectorDBConfig를 이용하여 벡터 데이터베이스를 초기화합니다.
  3. 필수 메서드 구현: 위에서 언급한 메서드들을 구현하여 벡터 데이터베이스의 기능을 완성합니다.
  4. 벡터 데이터베이스 등록: backend/modules/vector_db/__init__.py에 새로운 벡터 데이터베이스 클래스를 등록합니다.

예시: Qdrant 및 SingleStore 벡터 데이터베이스

현재 Cognita는 Qdrant와 SingleStore 벡터 데이터베이스를 지원합니다. 각각의 클래스는 backend/modules/vector_db 폴더 내에 위치해 있으며, 이를 통해 사용자는 벡터 데이터베이스의 강력한 검색 및 관리 기능을 활용할 수 있습니다. 이러한 시스템은 사용자 쿼리에 가장 관련성 높은 벡터를 신속하게 찾아내는 데 중요한 역할을 합니다.

이 모듈의 확장성은 사용자가 다양한 벡터 데이터베이스 옵션을 탐색하고, Cognita 시스템에 쉽게 통합할 수 있도록 해, 유연하고 맞춤화된 데이터 관리 솔루션을 제공합니다.

Qdrant

Cognita에서 Qdrant 벡터 데이터베이스를 RAG 시스템에 통합하는 과정은 벡터 데이터를 효율적으로 관리하고 검색하는 데 중요한 여러 단계를 포함합니다. 이러한 통합은 문서 검색, 추천 시스템 또는 벡터 유사성 검색을 활용하는 다른 기계 학습 모델에 특히 유용합니다.

소스 코드

초기화 및 설정

  • 설정 설정: 먼저 .env 파일에서 Qdrant에 대한 연결 파라미터를 설정합니다. 이 설정은 원격 서버나 로컬 인스턴스를 가리킬 수 있습니다.
  • 클래스 정의: BaseVectorDB를 상속받는 QdrantVectorDB 클래스를 정의합니다. 이 클래스는 Qdrant 데이터베이스와의 모든 상호 작용을 처리합니다.

주요 메소드 구현

  • create_collection: Qdrant에서 새 컬렉션을 초기화하는 데 필요한 메소드로, 벡터의 크기와 사용할 거리 메트릭(예: 코사인 유사도)을 정의합니다. 이는 나중에 유사성 검색에 사용될 벡터를 저장하기 위한 환경을 설정합니다.
  • upsert_documents: 새 문서를 벡터 데이터베이스에 삽입하고 기존 문서를 업데이트하는 작업을 처리합니다. 최신 버전의 각 문서의 벡터 표현이 저장되고 필요한 경우 이전 버전이 제거되도록 합니다.
  • delete_collection: 데이터베이스에서 컬렉션을 정리하는 데 사용되며, 시스템 업데이트 중이거나 사용하지 않는 데이터를 정리할 때 특히 유용합니다.
  • get_collections: 데이터베이스에 현재 저장된 모든 컬렉션 목록을 검색하는 데 유용한 메소드입니다. 관리 및 유지보수 작업에 도움이 됩니다.
  • get_vector_storeget_vector_client: 필요에 따라 벡터 저장소와 Qdrant 서버에 대한 클라이언트 연결과 직접 상호 작용할 수 있는 인터페이스를 제공합니다.

점진적 인덱싱 및 벡터 관리

  • 벡터 업데이트 처리: 시스템은 점진적 업데이트를 효율적으로 처리하도록 설계되었습니다. 문서가 업데이트될 때, 새로운 벡터 표현이 이전 것을 대체해야 검색 결과가 계속 관련성을 유지하고 최신 상태를 유지할 수 있습니다.
  • 배치 처리: 벡터 데이터를 삭제하거나 업데이트하는 등의 작업은 성능을 최적화하고 네트워크 및 데이터베이스 서버에 대한 부하를 줄이기 위해 배치로 처리됩니다.

사용 사례 및 응용 프로그램

  • 문서 검색: 문서를 벡터 표현으로 변환하여, Qdrant는 쿼리 벡터와 가장 유사한 문서를 빠르게 찾을 수 있어 애플리케이션의 검색 기능을 향상시킵니다.
  • 추천 시스템: 사용자 프로필을 잠재적 관심사나 제품과 매치하기 위해 사용자 벡터와 아이템 벡터 간의 유사성을 계산하는 데 Qdrant를 사용할 수 있습니다.
  • 일반 기계 학습 모델 통합: 벡터 유사성에 기초한 분류, 클러스터링 또는 기타 작업을 수행하는 기계 학습 시스템은 Qdrant의 효율적이고 확장 가능한 벡터 처리 기능을 활용할 수 있습니다.

Qdrant를 통합함으로써 Cognita는 대규모 벡터 데이터 작업을 효과적으로 처리할 수 있는 강력한 도구를 개발자 및 기업에 제공하며, 의미 있는 검색 및 기계 학습의 강력한 기능을 활용할 수 있게 합니다.

SingleStore

설정 소스 코드

SingleStore는 AI 기반 애플리케이션, 챗봇, 이미지 인식 등에 적합한 강력한 벡터 데이터베이스 기능을 제공합니다. 이는 벡터 작업을 위해 특수한 벡터 데이터베이스를 별도로 운영할 필요가 없게 만들어 줍니다. 전통적인 벡터 데이터베이스와 달리 SingleStore는 벡터 데이터를 관계형 테이블에 다른 유형의 데이터와 함께 저장합니다. 벡터 데이터를 관련 데이터와 함께 위치시킴으로써, 사용자는 SQL의 전체 기능을 활용하여 벡터 데이터의 확장된 메타데이터 및 기타 속성을 쉽게 쿼리할 수 있습니다.

SingleStore의 주요 특징 및 이점

  1. 통합 데이터 관리: SingleStore는 벡터 데이터를 기존의 관계형 데이터와 함께 하나의 데이터베이스에서 관리할 수 있게 해줍니다. 이는 데이터 관리를 단순화하고, 다양한 데이터 유형 간의 관계를 보다 효율적으로 활용할 수 있게 합니다.
  2. SQL 지원: 벡터 데이터에 대한 쿼리를 SQL을 통해 실행할 수 있습니다. 이는 개발자에게 친숙한 환경을 제공하며, 복잡한 쿼리를 쉽게 작성하고 실행할 수 있게 해줍니다.
  3. 성능 및 확장성: SingleStore는 높은 성능을 제공하며, 대규모 벡터 데이터 작업을 처리할 수 있는 확장성을 갖추고 있습니다. 이는 대용량 데이터 처리가 필요한 AI 애플리케이션에 이상적입니다.
  4. 다목적 데이터베이스 사용: 벡터 데이터뿐만 아니라, 텍스트, 숫자, 시간 등 다양한 형태의 데이터를 함께 처리할 수 있습니다. 이는 다양한 애플리케이션에서 유연하게 사용할 수 있게 해줍니다.

사용 사례

  • AI 기반 애플리케이션: SingleStore의 벡터 데이터베이스 기능은 머신 러닝 모델의 트레이닝 데이터 관리에 유용합니다.
  • 챗봇: 사용자의 질문과 가장 관련성 높은 답변을 매칭하기 위해 벡터 유사성 검색을 활용할 수 있습니다.
  • 이미지 인식: 이미지의 벡터 표현을 데이터베이스에 저장하고, 유사한 이미지를 신속하게 검색할 수 있습니다.

SingleStore는 벡터 데이터를 처리하는 동시에 기존 데이터베이스 기능을 효율적으로 사용할 수 있게 해, 개발자와 기업이 AI 기반 기능을 더 쉽고 효과적으로 구현할 수 있도록 지원합니다. 이로 인해, AI 기반 프로젝트의 개발 속도와 효율이 크게 향상될 수 있습니다.

Metadata Store

메타데이터 저장소는 RAG 애플리케이션 또는 프로젝트를 고유하게 정의하는 데 필요한 구성들을 포함하고 있습니다. RAG 애플리케이션은 하나 이상의 데이터 소스에서 결합된 문서 집합, 즉 컬렉션을 포함할 수 있습니다. 이 데이터 소스의 문서들은 데이터 로딩, 파싱, 임베딩 방법을 사용하여 벡터 데이터베이스에 색인됩니다. 각 RAG 사용 사례에 대해 메타데이터 저장소는 다음 정보를 포함합니다:

  1. 컬렉션 이름: 특정 RAG 애플리케이션에 속하는 문서 집합의 이름입니다.
  2. 사용된 벡터 데이터베이스의 이름: 해당 컬렉션을 관리하는데 사용된 벡터 DB의 이름입니다.
  3. 연결된 데이터 소스: 해당 컬렉션에 포함된 데이터 소스의 목록입니다.
  4. 각 데이터 소스에 대한 파싱 설정: 데이터를 어떻게 구조화하고 파싱할지에 대한 구성입니다.
  5. 사용될 임베딩 모델 및 설정: 문서를 벡터로 변환하는 데 사용되는 임베딩 모델과 그 설정입니다.

메타데이터 저장 방식

현재 두 가지 방식으로 이 데이터를 저장할 수 있습니다. 하나는 로컬에서, 다른 하나는 Truefoundry를 사용하여 저장하는 방법입니다. 이러한 저장소는 backend/modules/metadata_store/ 아래에 정의됩니다.

메타데이터 저장소의 중요성

  • 프로젝트 정의: 메타데이터 저장소는 각 RAG 애플리케이션의 구조와 사용된 자원들을 명확히 정의합니다. 이 정보는 프로젝트 관리와 유지보수에 중요한 역할을 합니다.
  • 설정 관리: 다양한 데이터 소스와 임베딩 설정을 중앙에서 관리할 수 있어, 변경 사항이 생겼을 때 쉽게 업데이트하고 반영할 수 있습니다.
  • 통합 접근: 연결된 데이터 소스와 벡터 데이터베이스, 파싱 및 임베딩 구성을 하나의 인터페이스에서 관리할 수 있어, 시스템의 효율성을 높일 수 있습니다.

메타데이터 저장소는 RAG 애플리케이션을 구성하는 핵심 요소 중 하나로, 데이터의 정의, 접근 및 관리를 용이하게 하여, 애플리케이션의 성능과 관리 효율성을 극대화합니다. 이를 통해 개발자와 기업은 AI 기반의 프로젝트를 보다 효과적으로 구현하고 운영할 수 있습니다.

Query Controllers

쿼리 컨트롤러는 데이터가 벡터 데이터베이스에 인덱싱되고 저장된 후, 사용자의 앱을 사용할 수 있도록 모든 부분을 결합하는 역할을 합니다. 쿼리 컨트롤러는 사용자의 쿼리에 대한 답변을 검색하는 데 도움을 주는 컴포넌트입니다. 일반적인 쿼리 컨트롤러의 작업 단계는 다음과 같습니다:

  1. 사용자 요청 처리: 사용자는 쿼리, 컬렉션 이름, LLM 구성, 프롬프트, 리트리버 및 해당 설정을 포함하는 요청 페이로드를 보냅니다.
  2. 벡터 데이터베이스 검색: 컬렉션 이름에 따라 관련 벡터 데이터베이스 및 그 설정(사용된 임베더, 벡터 DB 유형 등)이 검색됩니다.
  3. 문서 검색: 벡터 데이터베이스에서 리트리버를 사용하여 관련 문서를 검색합니다.
  4. LLM을 이용한 답변 생성: 검색된 문서들은 컨텍스트를 형성하고, 이 컨텍스트와 쿼리(질문)는 LLM에 제공되어 답변을 생성합니다. 이 단계에서는 필요에 따라 프롬프트 튜닝도 포함될 수 있습니다.
  5. 답변 및 관련 문서 반환: 필요한 경우 생성된 답변과 관련된 문서 조각들도 응답으로 반환됩니다.

쿼리 컨트롤러를 API로 노출

쿼리 컨트롤러 메서드는 API로 직접 노출될 수 있으며, 각 함수에 HTTP 데코레이터를 추가하여 이를 설정할 수 있습니다.

쿼리 컨트롤러 추가 방법

  1. 쿼리 컨트롤러 폴더 생성: 각 RAG 사용 사례는 쿼리 컨트롤러를 포함하는 별도의 폴더를 갖습니다. 예를 들어, 폴더가 app-2라고 가정하면, 컨트롤러를 /backend/modules/query_controller/app-2/controller.py에 작성합니다.
  2. 쿼리 컨트롤러 데코레이터 추가: 클래스에 query_controller 데코레이터를 추가하고 사용자 정의 컨트롤러의 이름을 인자로 전달합니다.
  3. 메서드 추가 및 HTTP 데코레이터 사용: 필요에 따라 이 컨트롤러에 메서드를 추가하고 post, get, delete 등의 HTTP 데코레이터를 사용하여 메서드를 API로 만듭니다.
   from backend.server.decorator import post

   @query_controller("/app-2")
   class MyCustomController():
       ...
       @post("/answer")
       def answer(query: str):
           # 로직을 표현하는 코드 작성
           # 이 API는 POST /my-controller/answer로 노출됩니다
           ...
  1. 커스텀 컨트롤러 클래스 가져오기: backend/modules/query_controllers/__init__.py에서 커스텀 컨트롤러 클래스를 가져옵니다.
   from backend.modules.query_controllers.sample_controller.controller import MyCustomController

이러한 과정을 통해 쿼리 컨트롤러는 RAG 시스템의 중요한 부분을 담당하며, 사용자의 요청에 따라 적절한 벡터 데이터베이스에서 문서를 검색하고 LLM을 통해 관련 답변을 생성하는

역할을 합니다. 이를 통해 AI 기반의 응용 프로그램이 보다 효과적으로 사용자의 요구에 응답할 수 있습니다.

Cognita – Process Flow

A typical Cognita process consists of two phases:

  1. Data indexing
  2. Response Generation

Data Indexing

이 다이어그램은 Cognita 시스템의 데이터 인덱싱 단계를 설명하고 있습니다. 이 과정은 크게 데이터 로드, 문서 파싱, 그리고 벡터 데이터베이스에의 인덱싱으로 구성됩니다. Cognita는 대규모 문서 처리를 효율적으로 관리하기 위해 몇 가지 전략을 사용하고 있습니다.

데이터 인덱싱 단계의 주요 구성요소 및 과정

  1. 데이터 소스:
  • 데이터는 로컬 디렉토리, S3, 데이터베이스, TensorFlow 아티팩트 등 다양한 소스에서 로드됩니다.
  1. 데이터 로더:
  • 데이터 로더는 이러한 소스로부터 데이터를 스캔하고 필터링하여 필요한 정보만 추출합니다.
  1. 파서:
  • 추출된 데이터는 파서를 통해 구조화되며, 문서는 적절한 메타데이터와 함께 조각으로 분리됩니다. 이는 검색과 인덱싱 효율을 높이기 위해 필요합니다.
  1. 임베더:
  • 파싱된 문서 조각은 임베더를 통해 벡터로 변환되며, 이 벡터들은 벡터 데이터베이스(Vector DB)에 저장됩니다.

배치 처리 및 증분 인덱싱

  • 배치 처리: Cognita는 문서를 한꺼번에 인덱싱하지 않고 배치로 그룹화하여 처리합니다. 이는 메모리 사용을 최적화하고, 처리 속도를 개선합니다.
  • 증분 인덱싱(INCREMENTAL indexing):
  • 새로운 문서가 데이터 소스에 추가될 때, Cognita는 해당 문서의 해시를 계산하고 추적합니다. 이를 통해 이미 인덱싱된 데이터를 다시 처리하지 않고 새로운 문서만을 인덱싱합니다. 이 방법은 계산 자원과 시간을 절약할 수 있습니다.
  • 전체 인덱싱(FULL indexing):
  • 필요에 따라 Cognita는 전체 인덱싱 모드를 지원하여, 주어진 컬렉션에 대한 모든 벡터 데이터를 무시하고 데이터를 벡터 데이터베이스에 새로 입력합니다. 이는 데이터 소스에 중대한 변경이 있을 때 유용합니다.

이러한 고급 인덱싱 기능은 Cognita를 대규모 데이터를 효율적으로 처리할 수 있는 강력한 도구로 만들어 줍니다. 이를 통해 사용자는 보다 빠르고 정확한 데이터 검색 및 처리를 수행할 수 있습니다.

Response Generation

이 다이어그램은 Cognita 시스템에서 사용자의 쿼리에 대한 응답을 생성하는 과정을 나타냅니다. 이 과정은 메타데이터 저장소에서 관련 정보를 검색하고, 벡터 데이터베이스에서 관련 문서를 추출하여 대규모 언어 모델(LLM)을 사용하여 최종 응답을 생성하는 여러 단계를 포함합니다.

응답 생성 과정의 주요 단계

  1. 사용자 쿼리 페이로드:
  • 사용자는 쿼리와 함께 컬렉션 이름과 다른 필요한 정보를 포함하는 페이로드를 보냅니다.
  1. 메타데이터 저장소:
  • 쿼리에 대한 컬렉션 이름과 연결된 벡터 데이터베이스 정보, 파싱 및 임베딩 설정 등을 메타데이터 저장소에서 검색합니다.
  1. 벡터 데이터베이스:
  • 쿼리에 맞는 문서를 벡터 데이터베이스에서 검색합니다. 이 과정은 리트리버를 통해 이루어지며, 가장 관련성 높은 문서를 선택합니다.
  1. 리트리버:
  • 벡터 데이터베이스에서 검색된 문서를 기반으로 쿼리에 대한 컨텍스트를 형성합니다.
  1. LLM (Large Language Model):
  • 리트리버로부터 제공된 컨텍스트와 사용자의 질문을 바탕으로 LLM이 답변을 생성합니다.
  1. 응답 및 원본 문서:
  • 최종적으로, 사용자에게는 LLM에 의해 생성된 응답과 함께 관련 원본 문서가 제공됩니다.

QueryController의 역할

  • 응답 API: 응답 생성 과정은 사용자 정의된 QueryController의 /answer 엔드포인트를 호출하여 이루어집니다. 이 컨트롤러는 전체 응답 생성 파이프라인을 관리하며, 사용자의 요청에 따라 적절한 응답을 생성하고 반환합니다.

이러한 과정은 사용자의 쿼리에 신속하고 정확하게 응답할 수 있도록 설계되었으며, AI 기반의 질의응답 시스템에서 핵심적인 역할을 수행합니다. 이 시스템을 통해 사용자는 복잡한 쿼리에 대한 정확한 정보를 신속하게 얻을 수 있습니다, 이는 고객 서비스, 정보 검색, 교육적 상황 등 다양한 환경에서 유용하게 활용될 수 있습니다.

Using Cognita UI

로그인하여 댓글을 작성해주세요