고급 RAG(Retrieval-Augmented Generation) 기반 AI 챗봇 시스템
- 다중 파일 형식 지원: PDF, DOCX, TXT, MD 파일 업로드 및 처리
- 지능형 청크 분할: 파일 타입별 최적화된 청크 크기 (PDF: 페이지별, DOCX: 500자, TXT/MD: 1000자)
- ChromaDB 영구 저장: 문서 벡터를 ChromaDB에 영구 저장하여 재시작 시에도 유지
- 중복 방지: 파일 해시를 이용한 중복 업로드 자동 감지
- 상세한 메타데이터: 파일명, 페이지/청크 번호, 파일 타입 등 정확한 출처 추적
- 실시간 로그: 문서 처리 과정을 실시간으로 확인 가능
- Ollama Llama3 연동: 로컬 Llama3 모델을 사용한 고품질 답변 생성
- 스트리밍 답변: ChatGPT처럼 텍스트가 실시간으로 타이핑되어 표시
- 문맥 기반 답변: 업로드된 문서 내용을 바탕으로 정확한 답변 생성
- 세션별 히스토리: 각 사용자별로 독립적인 대화 세션 관리
- RAG 대화 검색: 과거 대화 중 현재 질문과 관련된 대화를 유사도 검색으로 자동 선별
- 효율적 저장: 5번째 대화마다 ChromaDB에 영구 저장 (성능 최적화)
- 지능적 히스토리: 관련 대화 3개 + 최근 대화 3개를 조합하여 맥락 제공
- 반응형 웹 UI: 모던하고 직관적인 채팅 인터페이스
- 파일 드래그 앤 드롭: 간편한 문서 업로드
- 세션 관리: 새 대화 시작 버튼으로 언제든 새로운 세션 생성
- 실시간 타이핑 효과: AI 답변이 실시간으로 표시
app/
├── main.py # FastAPI 애플리케이션 진입점
├── config.py # 설정 관리 (파일 크기, 확장자 등)
├── models/
│ └── schemas.py # Pydantic 모델 정의
├── routers/
│ ├── chat.py # 채팅 API (일반/스트리밍)
│ ├── documents.py # 문서 업로드/관리 API
│ └── ui.py # 웹 UI 제공
└── services/
├── ai_service.py # AI 답변 생성 및 대화 관리
└── document_store.py # 문서 벡터 저장 관리
chroma_db/ # 문서 벡터 저장소
conversation_db/ # 세션별 대화 저장소
├── session_{id}/ # 각 세션별 ChromaDB
- Python 3.10+
- Ollama (Llama3 모델)
- ChromaDB
pip install -r requirements.txt# Ollama 설치 후
ollama pull llama3
ollama serve # 백그라운드에서 실행python main.py브라우저에서 http://localhost:8000 접속
fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
pydantic==2.5.0
pydantic-settings==2.1.0
numpy
scikit-learn
python-dotenv==1.0.0
langchain-community
langchain-core
langchain-ollama
pypdf
langchain-chroma
python-docx
markdown
# 파일 업로드 설정
allowed_extensions = [".txt", ".md", ".pdf", ".docx"]
max_file_size = 10 * 1024 * 1024 # 10MB
# RAG 설정
max_results = 3
similarity_threshold = 0.1
# 대화 히스토리 설정
max_recent_conversations = 10 # RAG 대화가 없을 때 최근 대화 개수
max_recent_with_rag = 3 # RAG 관련 대화가 있을 때 최근 대화 개수
max_related_conversations = 3 # 검색된 관련 대화 최대 개수POST /chat- 일반 채팅 (JSON 응답)POST /chat/stream- 스트리밍 채팅 (실시간 텍스트)
POST /documents/upload- 문서 업로드GET /documents- 업로드된 문서 목록DELETE /documents- 모든 문서 삭제
GET /- 웹 채팅 인터페이스
- 벡터 검색: Ollama 임베딩 기반 의미적 유사도 검색 (70% 가중치)
- 키워드 검색: TF-IDF 기반 정확한 용어 매칭 (30% 가중치)
- 리랭킹 시스템: 5가지 요소를 고려한 결과 재순위 매기기
- 정확한 구문 일치 보너스 (50% 보너스)
- 쿼리 단어 근접성 점수 (거리 기반)
- 문서 시작 부분 일치 보너스 (20% 보너스)
- 문서 길이 정규화 (품질 최적화)
- 파일 타입별 가중치 (PDF 11%, DOCX 5% 보너스)
- 관련 대화 검색: 과거 대화 중 현재 질문과 관련된 대화 자동 검색
- 히스토리 최적화: 5개 이상의 대화가 있을 때 활성화
- 동적 컨텍스트: 관련 대화 3개 + 최근 대화를 조합하여 맥락 제공
- RAG 활성화시: 최근 대화 3개 (설정 가능)
- RAG 비활성화시: 최근 대화 10개 (설정 가능)
- 세션 독립성: 각 사용자 세션별 독립적인 대화 히스토리 관리
대화 1-4: 메모리에만 저장
대화 5: ChromaDB에 영구 저장 ✅
대화 6-9: 메모리에만 저장
대화 10: ChromaDB에 영구 저장 ✅
- 배치 저장: 5번째 대화마다 ChromaDB에 영구 저장
- 성능 최적화: 메모리와 영구 저장의 균형
- 검색 가능: 저장된 대화는 향후 유사 질문 시 자동 검색
- 다양한 문서 업로드: PDF, DOCX, TXT, MD 파일을 업로드하여 지식베이스 구성
- 고정밀 검색: 하이브리드 검색으로 의미적 검색과 키워드 검색을 동시 활용
- 정확한 출처 표시: 답변과 함께 파일명, 페이지/청크 번호, 파일 타입 정보 제공
- 지능형 대화: AI가 이전 대화 맥락을 기억하여 연속적인 대화 가능
- 관련 대화 자동 참조: 과거의 유사한 질문과 답변을 자동으로 검색하여 활용
- 다단계 검색: 벡터 검색 → 키워드 검색 → 하이브리드 스코어링 → 리랭킹
- 지능형 가중치: 의미적 유사성(70%) + 정확한 매칭(30%)
- 관련성 최적화: 구문 일치, 단어 근접성, 문서 품질 등 종합 고려
- PDF: 페이지별 분할 및 페이지 번호 추적
- DOCX: 500자 단위 청크 분할 및 단락 구조 유지
- TXT/MD: 1000자 단위 최적 청크 분할 및 마크다운 처리
- 메타데이터: 파일 해시, 타입, 위치 정보로 정확한 출처 추적
- 실시간 텍스트 생성으로 사용자 경험 향상
- Server-Sent Events 방식 구현
- 타이핑 인디케이터 및 자동 스크롤
- localStorage 기반 세션 ID 자동 생성
- 세션별 독립적인 대화 히스토리
- 새 대화 시작 기능
- 문서 벡터 영구 저장으로 재처리 방지
- 대화 저장 주기 최적화 (5번째마다)
- 임베딩 모델 재사용으로 초기화 시간 단축
- 설정 기반 히스토리 크기 조절
- 이 저장소를 포크하세요
- 새로운 기능 브랜치를 만드세요
- 변경사항을 커밋하세요
- 브랜치에 푸시하세요
- Pull Request를 생성하세요
이 프로젝트는 MIT 라이선스 하에 있습니다.