선박 매뉴얼 PDF를 업로드하여 질문-답변 및 퀴즈 생성 기능을 제공하는 RAG(Retrieval-Augmented Generation) 기반 챗봇 시스템입니다.
- RAG 기반 답변: 업로드된 매뉴얼에서 관련 정보를 검색하여 정확한 답변 제공
- 대화 히스토리: 이전 대화 맥락을 고려한 연속적인 대화 지원
- 출처 표시: 답변에 참고한 매뉴얼 페이지 및 제목 표시
- 이미지 추출: 관련 페이지의 이미지 자동 추출 및 표시
- 다국어 지원: 한국어, 영어, 중국어, 일본어 지원
- 직급별 맞춤 답변: 사용자 직급에 맞는 수준과 표현으로 답변 조정
- 객관식 퀴즈: 4지선다 형식의 객관식 문제 생성 (정답 설명 포함)
- 순서 맞추기 퀴즈: 절차/프로세스의 올바른 순서를 묻는 문제 생성
- 문제 생성 방식:
- 무작위: 전체 매뉴얼에서 무작위로 청크 선택
- 주제 기반: 특정 주제에 대한 관련 청크를 검색하여 문제 생성
- 드래그 앤 드롭: 순서 맞추기 퀴즈는 드래그로 순서 변경 가능
- 결과 및 설명: 각 문제에 대한 정답 여부와 상세 설명 제공
- PDF 업로드: 매뉴얼 PDF 파일 업로드 및 자동 인덱싱
- 매뉴얼 삭제: 업로드된 매뉴얼 선택적 삭제
- 다중 매뉴얼 지원: 여러 매뉴얼을 동시에 관리하고 검색
- OpenAI API: GPT-4o-mini (답변 생성, 퀴즈 생성), text-embedding-3-small (임베딩)
- FAISS: 벡터 검색 인덱스 (Facebook AI Similarity Search)
- NumPy: 벡터 연산
- PyMuPDF (fitz): PDF 파싱 (텍스트, 테이블, 이미지 추출)
- Pandas: 테이블 데이터 처리
- python-docx: DOCX 파일 처리 (역할 정보)
- Pillow (PIL): 이미지 처리
- Streamlit: 웹 UI 프레임워크
- streamlit-sortables: 드래그 앤 드롭 UI 컴포넌트
- python-dotenv: 환경변수 관리
- orjson: 고성능 JSON 처리
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activatepip install -r requirements.txt프로젝트 루트에 .env 파일을 생성하고 OpenAI API 키를 설정합니다:
OPENAI_API_KEY=sk-...streamlit run app.py브라우저에서 http://localhost:8501로 접속합니다.
- 상단 우측의 "소스 업로드" 버튼 클릭
- PDF 파일 선택 및 업로드
- 자동으로 파싱, 청킹, 임베딩, 인덱싱이 진행됩니다
- 업로드 완료 후 매뉴얼 목록에서 확인 가능
- 매뉴얼 챗봇 페이지에서 질문 입력
- AI가 매뉴얼을 기반으로 답변 생성
- 답변 하단에 참고한 출처(페이지 번호) 표시
- 관련 이미지가 있으면 자동으로 표시
- "새 채팅" 버튼으로 새 대화 시작
- 왼쪽 사이드바에서 이전 대화 히스토리 확인 및 관리
- 퀴즈 페이지로 이동
- 왼쪽 사이드바에서 설정:
- 매뉴얼 선택
- 퀴즈 유형 선택 (객관식 / 순서 맞추기)
- 문항 수 설정
- 문제 생성 방식 선택 (무작위 / 주제 기반)
- 주제 기반 선택 시 주제 입력
- "퀴즈 생성" 버튼 클릭
- 문제 풀기:
- 객관식: 선택지 클릭
- 순서 맞추기: 드래그 앤 드롭으로 순서 변경
- "제출" 버튼으로 답안 제출
- 결과 확인: 각 문제의 정답 여부와 설명 확인
- 언어 설정: 상단 우측 "설정" 버튼에서 답변 언어 변경
- 직급 설정: 설정에서 사용자 직급 선택 (답변 수준 조정)
choseon/
├── app.py # 메인 챗봇 페이지
├── pages/
│ └── 01_퀴즈.py # 퀴즈 페이지
├── rag/
│ ├── __init__.py
│ ├── parser.py # PDF 파싱 및 청킹
│ ├── embed.py # 임베딩 생성
│ ├── index.py # FAISS 인덱스 관리
│ ├── store.py # 데이터 저장 및 관리
│ ├── chat.py # RAG 챗봇 로직
│ ├── quiz.py # 퀴즈 생성 로직
│ ├── image_extractor.py # 이미지 추출
│ └── role_parser.py # 직급 정보 파싱
├── data/
│ ├── catalog.json # 매뉴얼 메타데이터
│ ├── engine_department_roles.docx # 직급 정보
│ └── manuals/ # 업로드된 매뉴얼 저장소
│ └── {manual_id}/
│ ├── manual.pdf
│ ├── chunks.json
│ ├── emb.npy
│ ├── index.faiss
│ └── meta.json
├── requirements.txt # 의존성 패키지 목록
├── README.md # 프로젝트 문서
└── .env # 환경변수 (생성 필요)
-
문서 업로드 시:
- PDF → 파싱 (텍스트, 테이블, 이미지) → 의미 단위 청킹
- 각 청크를
text-embedding-3-small로 벡터화 - FAISS 인덱스 구축 및 저장
-
질문 처리 시:
- 사용자 질문을 벡터로 변환
- FAISS로 유사한 상위 5개 청크 검색
- 검색된 청크를 컨텍스트로 GPT-4o-mini에 전달
- 대화 히스토리 포함하여 답변 생성
-
장점:
- LLM의 환각(Hallucination) 문제 완화
- 실제 매뉴얼 내용 기반 정확한 답변
- 출처 추적 가능
- 객관식: GPT-4o-mini가 매뉴얼 내용 기반으로 4지선다 문제 생성, 정답 설명 포함
- 순서 맞추기: 절차/프로세스의 단계를 추출하여 순서 배열 문제 생성
- 청크 선택:
- 무작위: 전체 청크에서 무작위 선택
- 주제 기반: FAISS 벡터 검색으로 관련 청크 선택
- PDF 파싱 시 이미지의 bounding box(좌표) 정보 저장
- 관련 청크에 이미지가 포함된 경우, 해당 페이지에서 이미지 추출
- 답변과 함께 이미지 표시
- 업로드 가능한 파일 형식: PDF만 지원
- API 키 필요: OpenAI API 키가 반드시 필요합니다