import gradio as gr
import time
from typing import List, Dict, Tuple
import os
from rag_chatbot import RAGChatbot, ChatResponse
class GradioInterface:
"""Gradio 웹 인터페이스 클래스"""
def __init__(self):
self.chatbot = RAGChatbot()
self.is_initialized = False
# 예시 질문
self.example_questions = [
"연차휴가 사용 방법을 알려주세요",
"정규근무시간은 어떻게 되나요?",
"당직근무 절차가 궁금합니다",
"인사평가는 언제 어떻게 진행되나요?",
"파견근무 신청 방법을 알려주세요",
"복무규정 위반 시 어떻게 되나요?"
]
def initialize_chatbot(self, docs_folder: str = None, force_rebuild: bool = False) -> str:
"""챗봇 초기화"""
try:
success = self.chatbot.initialize(docs_folder, force_rebuild)
if success:
self.is_initialized = True
return "✅ RAG 챗봇이 성공적으로 초기화되었습니다!"
else:
return "❌ 챗봇 초기화에 실패했습니다. documents 폴더에 파일이 있는지 확인해주세요."
except Exception as e:
return f"❌ 초기화 중 오류 발생: {str(e)}"
def format_chat_response(self, response: ChatResponse) -> Tuple[str, str]:
"""챗봇 응답을 채팅 형식으로 변환"""
# 메인 답변
answer_html = response.answer.replace('\n', '
')
# 신뢰도 색상
if response.confidence >= 0.8:
confidence_color = "green"
confidence_text = "높음"
elif response.confidence >= 0.5:
confidence_color = "orange"
confidence_text = "보통"
else:
confidence_color = "red"
confidence_text = "낮음"
# 정보 메시지
info_html = f"""
⚠️ 챗봇이 초기화되지 않았습니다.
" return stats_html except Exception as e: return f"❌ 통계 정보 조회 실패: {str(e)}" def create_interface(self): """Gradio 인터페이스 생성""" # 커스텀 CSS custom_css = """ .chat-message { padding: 15px; border-radius: 10px; margin: 10px 0; } .user-message { background-color: #e3f2fd; border-left: 4px solid #2196f3; } .assistant-message { background-color: #f1f8e9; border-left: 4px solid #4caf50; } .info-box { background-color: #fff3e0; border: 1px solid #ffb74d; border-radius: 8px; padding: 12px; margin: 10px 0; } .stats-box { background-color: #f5f5f5; border-radius: 8px; padding: 15px; margin: 10px 0; } """ with gr.Blocks( title="소방 복무관리 RAG 챗봇", theme=gr.themes.Soft(), css=custom_css ) as interface: gr.Markdown("# 🚒 소방 복무관리 RAG 챗봇") gr.Markdown("소방업무 복무관리 규정 및 절차에 대한 질문에 답변해 드립니다.") with gr.Tab("💬 채팅"): with gr.Row(): with gr.Column(scale=4): chatbot = gr.Chatbot( height=500, avatar_images=["👤", "🤖"] ) msg = gr.Textbox( placeholder="복무관리 관련 질문을 입력해주세요 (예: 연차휴가 사용 방법)", label="질문 입력", submit_btn="전송" ) with gr.Row(): submit_btn = gr.Button("💬 전송", variant="primary") clear_btn = gr.Button("🗑️ 대화 초기화") with gr.Column(scale=1): gr.Markdown("### 🚀 빠른 시작") init_btn = gr.Button("🔧 챗봇 초기화", variant="secondary") init_status = gr.HTML("⏳ 초기화를 눌러주세요.") gr.Markdown("### 💡 예시 질문") for question in self.example_questions: gr.Button(question, size="sm").click( fn=lambda q=question: q, outputs=msg ) gr.Markdown("### 📊 상태 정보") stats_info = gr.HTML("상태 정보를 확인해주세요.") with gr.Tab("🔍 테스트"): gr.Markdown("### 예시 질문 테스트") with gr.Row(): with gr.Column(): test_question = gr.Textbox( placeholder="테스트할 질문을 입력하세요", label="질문" ) test_btn = gr.Button("🧪 테스트 실행", variant="primary") with gr.Column(): test_result = gr.HTML("테스트 결과가 여기에 표시됩니다.") gr.Markdown("### 통계 정보") stats_display = gr.HTML(self.get_chatbot_stats()) with gr.Tab("⚙️ 설정"): gr.Markdown("### 시스템 설정") with gr.Row(): with gr.Column(): docs_folder = gr.Textbox( value="documents", label="문서 폴더 경로" ) force_rebuild = gr.Checkbox( label="강제 재구축", info="체크 시 기존 인덱스를 새로构建" ) with gr.Column(): rebuild_btn = gr.Button("🔄 인덱스 재구축", variant="primary") gr.Markdown("### 시스템 정보") system_info = gr.HTML("""