umbertogriffo/rag-chatbot

RAG (Retrieval-augmented generation) ChatBot that provides answers based on contextual information extracted from a collection of Markdown files.

What it solves

이 프로젝트는 특정 Markdown 파일 집합을 기반으로 질문에 답변할 수 있는 로컬, 대화 인식 챗봇을 제공합니다. 사내 문서에서 정확하고 컨텍스트를 고려한 응답을 생성하는 문제를 해결하며, 외부 클라우드 API 없이 모든 작업을 로컬에서 수행합니다.

How it works

시스템은 로컬 LLM 추론을 위한 llama.cpp와 벡터 데이터베이스 역할을 하는 Chroma를 결합한 Retrieval‑Augmented Generation(RAG) 파이프라인을 사용합니다.

  1. Memory Building: Markdown 파일을 리팩터링된 RecursiveCharacterTextSplitter로 청크로 나누고, Sentence Transformers를 통해 수치 임베딩으로 변환한 뒤 Chroma에 저장합니다.
  2. Incremental Indexing: 해시와 SQLite 매핑 테이블을 이용해 문서 버전을 추적함으로써 전체 인덱스를 재구축하지 않고 변경되거나 새로 추가된 문서만 업데이트합니다.
  3. Retrieval: 사용자가 질문을 하면 LLM이 먼저 검색 효율을 높이기 위해 쿼리를 재작성합니다. 이후 시스템은 벡터 스토어에서 가장 관련성 높은 청크를 가져옵니다.
  4. Synthesis: 컨텍스트 오버플로를 방지하기 위해 "Create and Refine"(순차 합성) 또는 "Hierarchical Summarization"(독립 답변 결합) 두 가지 전략을 제공합니다.
  5. Conversation Memory: 챗봇은 대화 기록을 저장하여 여러 상호작용에 걸쳐 컨텍스트를 유지합니다.

Who it’s for

자신만의 프라이빗 AI 어시스턴트를 호스팅하고 싶어하는 사용자들을 위한 것입니다. Markdown 형식의 문서나 개인 노트를 "읽고" 해당 특정 지식 베이스를 기반으로 답변을 제공합니다.

Highlights

  • Local Execution: llama.cpp의 양자화 GGUF 모델을 사용해 CPU 또는 GPU(CUDA/Metal)에서 실행합니다.
  • Incremental Updates: 문서가 변경될 때 전체 재구축 없이 효율적으로 벡터 인덱스를 업데이트합니다.
  • Flexible Synthesis: 대량의 검색된 컨텍스트를 처리하기 위한 여러 전략을 지원합니다.
  • Query Rewriting: 검색 전에 LLM에게 사용자의 질문을 최적화하도록 프롬프트하여 검색 정확도를 향상시킵니다.
  • Full Stack: FastAPI 백엔드와 문서 업로드 기능이 포함된 React/TypeScript 프론트엔드를 포함합니다.