339 lines
12 KiB
Markdown
339 lines
12 KiB
Markdown
# 연구QA Chatbot
|
|
|
|
AI 기반 연구 문서 분석 도우미 챗봇입니다. PDF 문서를 업로드하고 AI와 대화하여 문서 내용에 대해 질문할 수 있습니다. 최신 Context Retrieval 시스템을 통해 67% 향상된 검색 정확도를 제공합니다.
|
|
|
|
## 🚀 설치 및 실행
|
|
|
|
### 1. postgreSQL 설치
|
|
|
|
* localhost에 설치를 한다.
|
|
* 사용자 설정은 다음과 같다.
|
|
* 사용자명: woonglab
|
|
* 비밀번호: !@#woonglab
|
|
* 데이터베이스: researchqa
|
|
* 호스트: localhost
|
|
* 포트: 5432
|
|
* 필요한 테이블
|
|
* database.sql을 찹고한다. (create 구문으로 실행하면 필요 테이블 생성시킬 수 있음)
|
|
|
|
|
|
### 2. 백엔드 설정 및 실행
|
|
```bash
|
|
# 먼저 ollama를 설치하고 qwen3:8b (5.2GB)를 다운받는다
|
|
|
|
cd backend
|
|
pip install -r requirements.txt
|
|
|
|
# 기존 프로세스 제거
|
|
#pkill -f "python main.py" && sleep 2
|
|
|
|
python main.py
|
|
```
|
|
백엔드 서버가 `http://localhost:8000`에서 실행됩니다.
|
|
|
|
**주의**: Context Retrieval 시스템을 위해 추가 라이브러리가 필요합니다:
|
|
- `rank-bm25`: Context BM25 검색
|
|
- `scikit-learn`: 머신러닝 유틸리티
|
|
- `transformers`: 한국어 임베딩 모델
|
|
- `torch`: 딥러닝 프레임워크
|
|
|
|
### 3. 프론트 실행 과정
|
|
```bash
|
|
cd frontend
|
|
rm -rf node_modules package-lock.json
|
|
npm install
|
|
|
|
# 기존 프로스세 제거
|
|
#pkill -f "react-scripts"
|
|
|
|
npm start
|
|
```
|
|
프론트엔드가 `http://localhost:3000`에서 실행됩니다.
|
|
|
|
|
|
|
|
|
|
## 📖 사용법
|
|
|
|
1. **로그인**: 파일 업로드 버튼(📁)을 클릭하여 로그인
|
|
- 아이디: `admin`
|
|
- 비밀번호: `researchqa`
|
|
|
|
2. **PDF 업로드**: 로그인 후 "PDF 업로드" 메뉴에서 파일 업로드
|
|
- 최대 5개 파일까지 업로드 가능
|
|
- PDF 파일만 업로드 가능
|
|
|
|
3. **챗봇 대화**: 메인 화면에서 업로드된 문서에 대해 질문
|
|
- Context Retrieval 시스템으로 67% 향상된 검색 정확도
|
|
- 참조 문서 클릭 시 PDF 뷰어에서 해당 페이지 표시
|
|
- 키보드 네비게이션 지원 (화살표키, Home, End)
|
|
- 마크다운 형식의 구조화된 답변 제공
|
|
|
|
4. **PDF 뷰어**: Adobe Reader 스타일의 고급 뷰어
|
|
- 연속 페이지 모드 지원
|
|
- 줌 인/아웃, 회전 기능
|
|
- 키보드 네비게이션
|
|
|
|
## 🚀 주요 기능
|
|
|
|
- **📄 PDF 문서 업로드**: PDF 파일을 드래그 앤 드롭 또는 클릭으로 업로드
|
|
- **🤖 AI 챗봇**: 업로드된 문서를 기반으로 한 질문 답변
|
|
- **📚 문서 관리**: 업로드된 문서 목록 조회, 검색, 삭제
|
|
- **🔒 보안 로그인**: 관리자 인증 시스템
|
|
- **👁️ PDF 뷰어**: Adobe Reader 스타일의 고급 PDF 뷰어
|
|
- **🔍 고급 검색**: Context Retrieval 시스템 (Context Embedding + Context BM25 + Reranker)
|
|
- **📝 마크다운 렌더링**: 구조화된 답변을 위한 마크다운 지원
|
|
- **🎯 정확한 검색**: 67% 향상된 검색 정확도
|
|
|
|
## 🛠️ 기술 스택
|
|
|
|
### 백엔드
|
|
- **FastAPI**: 고성능 Python 웹 프레임워크
|
|
- **LangChain v0.3**: AI 프레임워크 (RAG, 체인, 에이전트)
|
|
- **Context Retrieval**: 고급 검색 시스템 (Context Embedding + Context BM25 + Reranker)
|
|
- **KoE5**: 한국어 임베딩 모델 (jhgan/ko-sroberta-multitask)
|
|
- **ChromaDB**: 벡터 데이터베이스 (LangChain 통합)
|
|
- **Ollama**: LLM 모델 서빙 (LangChain 통합)
|
|
- **Docling**: 최신 PDF 파싱 라이브러리
|
|
- **PostgreSQL**: 메타데이터 저장소
|
|
- **PyTorch**: 딥러닝 프레임워크 (Context Embedding)
|
|
- **scikit-learn**: 머신러닝 유틸리티 (Reranker)
|
|
|
|
### 프론트엔드
|
|
- **React 18**: 최신 React 버전
|
|
- **TypeScript**: 타입 안전성
|
|
- **Tailwind CSS**: 유틸리티 기반 CSS 프레임워크
|
|
- **Framer Motion**: 애니메이션 라이브러리
|
|
- **Lucide React**: 아이콘 라이브러리
|
|
- **React PDF**: PDF 뷰어 컴포넌트
|
|
- **React Markdown**: 마크다운 렌더링
|
|
- **remark-gfm**: GitHub Flavored Markdown 지원
|
|
|
|
## 📦 패키지 구조
|
|
|
|
### 백엔드 패키지 (backend/requirements.txt)
|
|
```
|
|
# Core Web Framework
|
|
fastapi>=0.104.1
|
|
uvicorn>=0.24.0
|
|
python-multipart>=0.0.6
|
|
pydantic>=2.7.4
|
|
|
|
# LangChain v0.3 AI Framework
|
|
langchain>=0.3.0
|
|
langchain-community>=0.3.0
|
|
langchain-core>=0.3.0
|
|
langchain-experimental>=0.3.0
|
|
|
|
# LLM Integration
|
|
ollama>=0.6.0
|
|
|
|
# Vector Database & Embeddings
|
|
chromadb>=0.4.22
|
|
sentence-transformers>=2.2.2
|
|
|
|
# PDF Processing
|
|
docling>=2.55.0
|
|
docling-core>=2.48.0
|
|
|
|
# Database
|
|
psycopg2-binary>=2.9.9
|
|
|
|
# Context Retrieval & RAG Enhancement
|
|
rank-bm25>=0.2.2
|
|
scikit-learn>=1.3.0
|
|
transformers>=4.35.0
|
|
torch>=2.0.0
|
|
|
|
# Utilities
|
|
python-dotenv>=1.0.0
|
|
numpy>=1.26.4
|
|
```
|
|
|
|
### 프론트엔드 패키지 (frontend/package.json)
|
|
```
|
|
# Core React
|
|
react: ^18.2.0
|
|
react-dom: ^18.2.0
|
|
react-scripts: 5.0.1
|
|
typescript: ^4.9.5
|
|
|
|
# UI & Styling
|
|
framer-motion: ^10.16.0
|
|
lucide-react: ^0.294.0
|
|
tailwindcss: ^3.3.0
|
|
autoprefixer: ^10.4.0
|
|
postcss: ^8.4.0
|
|
|
|
# PDF Viewer
|
|
react-pdf: ^10.1.0
|
|
pdfjs-dist: ^5.3.93
|
|
|
|
# Markdown Rendering
|
|
react-markdown: ^9.0.1
|
|
remark-gfm: ^4.0.0
|
|
|
|
# TypeScript Types
|
|
@types/react: ^18.2.0
|
|
@types/react-dom: ^18.2.0
|
|
@types/node: ^20.0.0
|
|
```
|
|
|
|
## 🔌 API 엔드포인트 (LangChain 기반)
|
|
|
|
- `GET /`: 루트 엔드포인트
|
|
- `GET /health`: 헬스 체크 (LangChain 서비스 상태 포함)
|
|
- `POST /chat`: LangChain RAG 기반 챗봇 대화
|
|
- `POST /upload`: PDF 파일 업로드 및 LangChain 처리
|
|
- `GET /files`: 파일 목록 조회
|
|
- `DELETE /files/{file_id}`: 파일 삭제 (LangChain 벡터스토어 포함)
|
|
- `GET /pdf/{file_id}/view`: PDF 파일 조회
|
|
- `GET /search`: LangChain 유사 문서 검색
|
|
- `GET /stats`: 시스템 통계 (LangChain 컬렉션 정보 포함)
|
|
|
|
## 📁 프로젝트 구조
|
|
|
|
```
|
|
researchqa/
|
|
├── backend/ # 백엔드 서버 (LangChain 기반)
|
|
│ ├── main.py # FastAPI 메인 애플리케이션 (LangChain)
|
|
│ ├── main_legacy.py # 기존 직접 구현 버전 (백업)
|
|
│ ├── requirements.txt # Python 의존성 (LangChain 포함)
|
|
│ ├── services/ # LangChain 서비스 모듈
|
|
│ │ ├── __init__.py # 서비스 패키지 초기화
|
|
│ │ ├── langchain_service.py # LangChain RAG 서비스
|
|
│ │ └── context_retrieval.py # Context Retrieval 시스템
|
|
│ ├── uploads/ # 업로드된 파일 저장소
|
|
│ ├── vectordb/ # ChromaDB 벡터 데이터베이스
|
|
│ └── parser/ # 문서 파서 모듈
|
|
│ ├── pdf/ # PDF 파서
|
|
│ │ ├── MainParser.py # 메인 PDF 파서
|
|
│ │ └── Parser1.py # 확장 PDF 파서
|
|
│ └── ocr/ # OCR 파서
|
|
│ ├── MainParser.py # 메인 OCR 파서
|
|
│ └── Parser1.py # 확장 OCR 파서
|
|
├── frontend/ # 프론트엔드 애플리케이션
|
|
│ ├── src/
|
|
│ │ ├── components/ # React 컴포넌트
|
|
│ │ │ ├── ChatInterface.tsx # 채팅 인터페이스
|
|
│ │ │ ├── FileUploadModal.tsx # 파일 업로드 모달
|
|
│ │ │ ├── LoginModal.tsx # 로그인 모달
|
|
│ │ │ ├── MessageBubble.tsx # 메시지 버블
|
|
│ │ │ ├── PDFViewer.tsx # PDF 뷰어
|
|
│ │ │ ├── SimpleMarkdownRenderer.tsx # 마크다운 렌더러
|
|
│ │ │ └── TypingIndicator.tsx # 타이핑 인디케이터
|
|
│ │ ├── contexts/ # React 컨텍스트
|
|
│ │ │ ├── AuthContext.tsx # 인증 컨텍스트
|
|
│ │ │ ├── ChatContext.tsx # 채팅 컨텍스트
|
|
│ │ │ └── FileContext.tsx # 파일 컨텍스트
|
|
│ │ ├── App.tsx # 메인 앱 컴포넌트
|
|
│ │ ├── index.tsx # 엔트리 포인트
|
|
│ │ └── index.css # 글로벌 스타일
|
|
│ ├── public/ # 정적 파일
|
|
│ │ ├── images/ # 이미지 파일
|
|
│ │ ├── pdf.worker.min.js # PDF.js 워커
|
|
│ │ ├── AnnotationLayer.css # PDF 주석 레이어
|
|
│ │ └── TextLayer.css # PDF 텍스트 레이어
|
|
│ ├── package.json # Node.js 의존성
|
|
│ ├── tailwind.config.js # Tailwind 설정
|
|
│ ├── postcss.config.js # PostCSS 설정
|
|
│ └── tsconfig.json # TypeScript 설정
|
|
├── start_backend.sh # 백엔드 시작 스크립트
|
|
├── start_frontend.sh # 프론트엔드 시작 스크립트
|
|
├── package.json # 루트 패키지 설정
|
|
└── README.md # 프로젝트 문서
|
|
```
|
|
|
|
## ✨ 주요 특징
|
|
|
|
- **🔍 최신 PDF 파싱**: Docling을 사용한 고성능 PDF 텍스트 추출
|
|
- **🇰🇷 한국어 최적화**: KoE5 임베딩 모델로 한국어 문서 처리
|
|
- **📱 반응형 UI**: 모바일과 데스크톱 모두 지원
|
|
- **💬 실시간 채팅**: REST API 기반 실시간 대화
|
|
- **🎯 고급 검색**: Context Retrieval 시스템으로 67% 향상된 검색 정확도
|
|
- **👁️ 고급 PDF 뷰어**: Adobe Reader 스타일의 뷰어
|
|
- **📝 마크다운 지원**: 구조화된 답변을 위한 마크다운 렌더링
|
|
- **🔒 보안**: JWT 기반 인증 시스템
|
|
- **⚡ 고성능**: FastAPI와 LangChain으로 최적화된 성능
|
|
- **🚀 확장성**: LangChain v0.3 기반 향후 고도화 가능
|
|
- **🔗 체인 기반**: RAG, 에이전트, 메모리 등 다양한 AI 패턴 지원
|
|
- **🧠 하이브리드 검색**: Context Embedding + Context BM25 + Reranker 통합
|
|
|
|
## 🗄️ 데이터베이스
|
|
|
|
- **ChromaDB**: 벡터 임베딩 저장 및 유사도 검색 (LangChain 통합)
|
|
- **PostgreSQL**: 파일 메타데이터 및 사용자 정보 저장
|
|
- **LangChain VectorStore**: 확장 가능한 벡터 검색 인터페이스
|
|
- **Context Retrieval Index**: Context Embedding과 Context BM25를 위한 인덱스
|
|
|
|
## 🧠 Context Retrieval 시스템
|
|
|
|
연구QA 챗봇은 최신 Context Retrieval 시스템을 통해 기존 RAG 대비 **67% 향상된 검색 정확도**를 제공합니다.
|
|
|
|
### 🔍 검색 시스템 구성
|
|
|
|
1. **Context Embedding**
|
|
- 한국어 특화 Sentence Transformer 모델 사용
|
|
- 질문과 문서를 함께 임베딩하여 컨텍스트 인식
|
|
- 의미적 유사도 기반 검색
|
|
|
|
2. **Context BM25**
|
|
- 한국어 텍스트에 최적화된 키워드 검색
|
|
- TF-IDF 기반 토큰화 및 BM25 스코어링
|
|
- 정확한 키워드 매칭
|
|
|
|
3. **Reranker**
|
|
- Embedding과 BM25 점수를 가중치로 결합
|
|
- 최종 검색 결과 재순위화
|
|
- 검색 실패율 최소화
|
|
|
|
### 📊 성능 개선
|
|
|
|
- **검색 정확도**: 67% 향상
|
|
- **검색 실패율**: 대폭 감소
|
|
- **응답 품질**: 더 정확하고 관련성 높은 답변
|
|
- **Fallback 시스템**: Context Retrieval 실패 시 기존 하이브리드 검색으로 자동 전환
|
|
|
|
## 🔧 개발 환경
|
|
|
|
- **Python**: 3.8+
|
|
- **Node.js**: 16+
|
|
- **PostgreSQL**: 12+
|
|
- **Ollama**: 최신 버전
|
|
- **PyTorch**: 2.0+ (Context Embedding용)
|
|
- **CUDA/MPS**: GPU 가속 지원 (선택사항)
|
|
|
|
## 📝 라이선스
|
|
|
|
MIT License
|
|
|
|
## 🤝 기여하기
|
|
|
|
1. Fork the Project
|
|
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
|
|
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
|
|
4. Push to the Branch (`git push origin feature/AmazingFeature`)
|
|
5. Open a Pull Request
|
|
|
|
## 📈 최근 업데이트 (v2.0)
|
|
|
|
### 🚀 주요 개선사항
|
|
- **Context Retrieval 시스템 도입**: 67% 향상된 검색 정확도
|
|
- **마크다운 렌더링 개선**: 구조화된 답변을 위한 완전한 마크다운 지원
|
|
- **링크 처리 시스템 단순화**: 복잡한 인라인 링크 시스템 제거
|
|
- **성능 최적화**: 하이브리드 검색과 Fallback 시스템 구현
|
|
|
|
### 🔧 기술적 변경사항
|
|
- `context_retrieval.py`: 새로운 Context Retrieval 시스템 추가
|
|
- `SimpleMarkdownRenderer.tsx`: 마크다운 렌더링 컴포넌트 개선
|
|
- 새로운 라이브러리: `rank-bm25`, `scikit-learn`, `transformers`, `torch`
|
|
- 프론트엔드: `react-markdown`, `remark-gfm` 추가
|
|
|
|
### 📊 성능 지표
|
|
- 검색 정확도: **67% 향상**
|
|
- 검색 실패율: **대폭 감소**
|
|
- 응답 품질: **더 정확하고 관련성 높은 답변**
|
|
|
|
## 📞 지원
|
|
|
|
프로젝트에 대한 질문이나 지원이 필요하시면 이슈를 생성해 주세요. |