119_ChatBot / README.md
김무영
Improve defaults, security, and index rebuild
cb2a4bd
---
title: 소방 복무관리 RAG 챗봇
emoji: 🚒
colorFrom: red
colorTo: yellow
sdk: gradio
sdk_version: "5.0.0"
app_file: app.py
pinned: false
---
# 🚒 소방 복무관리 RAG 챗봇
소방공무원 복무관리 규정 및 절차에 대한 질문에 답변해 드리는 RAG(Retrieval-Augmented Generation) 기반 챗봇입니다.
## 📋 프로젝트 개요
- **목적**: 소방업무 복무관리 관련 문서들을 활용한 지능형 질의응답 시스템
- **기술**: RAG, OpenAI GPT, Supabase pgvector, Sentence-BERT, Gradio
- **문서 유형**: PDF, Word, TXT, Excel, CSV
- **특징**: 한국어 최적화, 실시간 검색, 클라우드 벡터 DB, 웹 인터페이스
## 🎯 주요 기능
### ✅ RAG 검색 시스템
- 문서 내용 자동 청킹
- 의미 기반 검색
- 유사도 측정
- 다중 문서 검색
### ✅ 인터페이스
- Gradio 기반 웹 채팅
- 실시간 응답
- 출처 정보 표시
- 신뢰도 점수 제공
### ✅ 문서 처리
- 다양한 파일 형식 지원 (PDF, DOCX, TXT, XLSX, CSV)
- 한국어 텍스트 전처리
- 소방 용어 최적화
- 동적 문서 추가
## 🏗️ 시스템 아키텍처
```
📂 문서 폴더
📄 문서 처리기 (DocumentProcessor)
🧠 임베딩 모델 (Sentence-BERT)
🔍 벡터 DB (FAISS)
💬 RAG 챗봇 (Chatbot)
🌐 웹 인터페이스 (Gradio)
```
## 🚀 시작하기
### 1. 환경 설정
```bash
# 1. 저장소 복제
git clone <repository-url>
cd 119_chatbot
# 2. Python 가상환경 생성
python -m venv venv
# 3. 가상환경 활성화
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
# 4. 라이브러리 설치
pip install -r requirements.txt
```
### 2. OpenAI API 설정 (권장)
```bash
# OpenAI API Key 발급: https://platform.openai.com/api-keys
# .env 파일에 설정
echo "OPENAI_API_KEY=sk-your-api-key-here" >> .env
```
### 3. Supabase 설정 (권장 - 클라우드 벡터 DB)
```bash
# 1. Supabase 프로젝트 생성: https://supabase.com
# 2. SQL Editor에서 supabase_setup.sql 실행
# 3. Settings > API에서 URL과 Key 확인
# .env 파일에 Supabase 설정 추가
echo "SUPABASE_URL=https://your-project.supabase.co" >> .env
echo "SUPABASE_KEY=your-supabase-anon-key" >> .env
echo "VECTOR_DB_TYPE=supabase" >> .env
```
### 4. 문서 준비
```bash
# documents 폴더 생성
mkdir documents
# 복무관리 관련 문서 추가
# 지원 형식: .pdf, .docx, .txt, .xlsx, .csv
```
### 3. 로컬 실행
```bash
# 방법 1: 간단한 테스트
python document_processor.py
# 방법 2: 챗봇 테스트
python rag_chatbot.py
# 방법 3: 웹 인터페이스 실행
python gradio_interface.py
# 방법 4: 허깅페이스 배포용 실행
python app.py
```
## 📁 프로젝트 구조
```
119_chatbot/
├── app.py # 허깅페이스 배포용 메인 파일
├── config.py # 시스템 설정
├── requirements.txt # 라이브러리 목록
├── README.md # 프로젝트 설명서
├── .env.example # 환경 변수 템플릿
├── supabase_setup.sql # Supabase 설정 SQL
├── document_processor.py # 문서 처리 모듈
├── vector_store.py # FAISS 벡터 데이터베이스
├── supabase_vector_store.py # Supabase 벡터 데이터베이스
├── rag_chatbot.py # 기존 RAG 챗봇
├── openai_chatbot.py # OpenAI 기반 RAG 챗봇
├── gradio_interface.py # Gradio 웹 인터페이스
├── documents/ # 문서 폴더
│ ├── 복무관리규정.txt
│ ├── 인사평가규정.txt
│ └── ...
└── faiss_index/ # 벡터 인덱스 캐시 (FAISS 사용시)
```
## ⚙️ 설정 옵션
### 환경 변수 설정 (.env 파일)
```bash
# OpenAI API (필수)
OPENAI_API_KEY=sk-your-openai-api-key
OPENAI_MODEL=gpt-4o-mini
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
# Supabase (클라우드 벡터 DB 사용시 필수)
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=your-supabase-anon-key
# 벡터 DB 타입 선택
VECTOR_DB_TYPE=supabase # "supabase" 또는 "faiss"
# 관리자 보안 (필수)
ADMIN_PASSWORD=strong-password-here
```
### config.py 주요 설정
```python
# RAG 파라미터
CHUNK_SIZE = 500 # 문서 청크 크기
CHUNK_OVERLAP = 50 # 청크 중복 크기
MAX_RETRIEVE_DOCS = 3 # 검색할 문서 수
# 기존 로컬 모델 설정 (FAISS 사용시)
EMBEDDING_MODEL = "jhgan/ko-sbert-nli" # 한국어 임베딩 모델
LLM_MODEL = "beomi/Llama-3-Open-Ko-8B" # 한국어 LLM
# 경로 설정
DOCS_FOLDER = "documents" # 문서 폴더
VECTOR_DB_PATH = "faiss_index" # 벡터 DB 경로
```
### 🔄 벡터 DB 옵션
#### 1. Supabase (권장) - 클라우드 벡터 DB
- **장점**: 클라우드 저장, 확장성, 동시성, 실시간 동기화
- **필요사항**: OpenAI API Key, Supabase 프로젝트
- **설정**: `VECTOR_DB_TYPE=supabase`
#### 2. FAISS (로컬) - 오프라인 벡터 DB
- **장점**: 로컬 실행, 무료, 빠른 초기 설정
- **단점**: 로컬 저장 공간 필요, 확장성 제한
- **설정**: `VECTOR_DB_TYPE=faiss`
## 🧪 사용 예시
### 기본 질문
```
Q: 연차휴가 사용 방법을 알려주세요
A: 연차휴가는 1년간 정상 근무한 자에게 15일을 부여합니다.
사용 시 3일 전까지 신청서를 제출하고 부서장의 승인을 받아야 합니다.
📚 출처: 복무관리규정.txt (신뢰도: 92%)
```
### 고급 기능
```python
# 직접 코드로 사용
from rag_chatbot import RAGChatbot
# 챗봇 초기화
chatbot = RAGChatbot()
chatbot.initialize()
# 질문하고 답변 받기
response = chatbot.generate_answer("연차휴가 절차를 알려주세요")
print(response.answer)
```
## 🌐 배포 방법
### 1. 허깅페이스 Spaces
```bash
# 1. 허깅페이스 계정으로 로그인
huggingface-cli login
# 2. 새로운 Space 생성
# - Space 이름: fire-service-rag-chatbot
# - SDK: Gradio
# - Hardware: CPU Basic (무료)
# 3. 파일 업로드
git add .
git commit -m "초기 버전 배포"
git push origin main
```
### 2. 로컬 서버
```bash
# 포트 7860으로 실행
python app.py --port 7860
# 공유 링크 생성
python app.py --share
```
## 📊 성능 최적화
### 🔍 검색 성능 향상
- **Chunk 크기**: 500-1000 토큰으로 최적화
- **검색 문서 수**: 3-5개로 설정하여 속도와 정확도 균형
- **임베딩 모델**: 한국어 전용 모델 사용
### 💾 메모리 관리
- **캐싱**: 벡터 인덱스 로컬 저장
- **동적 로드**: 필요 시에만 LLM 모델 로드
- **청크 최적화**: 너무 긴 문서 분리
### ⚡ 응답 속도
- **템플릿 모드**: LLM 없이 빠른 응답
- **캐싱**: 자주 묻는 질문 응답 저장
- **비동기 처리**: 대용량 문서 처리 시 배치 작업
## 🔧 개발 가이드
### 새로운 문서 추가
```python
from document_processor import DocumentProcessor
# 문서 처리기 생성
processor = DocumentProcessor()
# 새 문서 로드
new_docs = processor.load_documents_from_folder("new_documents")
# 기존 문서에 추가
from vector_store import VectorStore
vector_store = VectorStore()
vector_store.add_documents(new_docs)
```
### 커스텀 프롬프트
```python
# config.py에서 시스템 프롬프트 수정
SYSTEM_PROMPT = """
당신은 소방 복무관리 전문가입니다...
[원하는 프롬프트 내용]
"""
```
## 🚨 주의사항
### 보안
- 민감한 개인정보가 포함된 문서는 업로드하지 마세요
- 법적 효력이 있는 최신 규정만 사용하세요
- 정기적으로 문서를 업데이트해야 합니다
### 성능
- 대용량 문서 처리 시 시간이 오래 걸릴 수 있습니다
- LLM 모델 로드 시 충분한 메모리가 필요합니다
- 무료 플랜의 경우 리소스 제한이 있을 수 있습니다
### 정확성
- 생성된 답변은 반드시 실제 규정과 교차 확인하세요
- 중요한 결정 시 반드시 담당자와 상담하세요
- 챗봇 답변을 법적 효력으로 사용하지 마세요
## 🤝 기여 방법
1. 이슈 등록: 버그나 개선사항 등록
2. 코드 제출: Pull Request를 통한 기여
3. 문서 개선: README나 코드 주석 개선
4. 테스트: 다양한 문서로 테스트 및 피드백
## 📞 문의
- 개발자: Claude (AI Assistant)
- 이메일: [개발자 이메일]
- 라이선스: MIT License
## 🙏 감사
- **Hugging Face**: 오픈소스 모델 및 플랫폼 제공
- **LangChain**: RAG 프레임워크 제공
- **Sentence-Transformers**: 한국어 임베딩 모델 제공
- **FAISS**: 고성능 벡터 검색 라이브러리 제공
- **Gradio**: 간편한 웹 인터페이스 제공
---
**⚠️ 본 챗봇은 보조 도구입니다. 중요한 업무 결정 시 반드시 관련 규정 원본과 담당자의 확인을 받으세요!**