# gradio_app.py - 테스트 기능이 포함된 Gradio 앱 import gradio as gr import os import sys from datetime import datetime # 시스템 모듈 import try: from tax_consultant import tax_consultant from rag_system import search_tax_law, is_rag_available, get_rag_system from space_test import gradio_test RAG_AVAILABLE = True except ImportError as e: print(f"⚠️ 모듈 import 실패: {e}") RAG_AVAILABLE = False def chat_with_tax_consultant(message, history): """세무 상담 챗봇""" try: if RAG_AVAILABLE: # RAG 시스템 사용 response = search_tax_law(message) else: # 폴백 응답 response = f"현재 시스템 점검 중입니다. 질문: {message}" return response except Exception as e: return f"오류가 발생했습니다: {str(e)}" def quick_test(): """빠른 시스템 테스트""" try: test_results = [] # 환경 정보 space_id = os.getenv('SPACE_ID') test_results.append(f"🌟 환경: {'허깅페이스 스페이스' if space_id else '로컬'}") test_results.append(f"📅 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # CUDA 확인 try: import torch cuda_available = torch.cuda.is_available() test_results.append(f"🔥 CUDA: {'사용가능' if cuda_available else '사용불가'}") if cuda_available: test_results.append(f"🎮 GPU: {torch.cuda.get_device_name()}") except: test_results.append("❌ PyTorch 로드 실패") # RAG 시스템 확인 if RAG_AVAILABLE: try: rag = get_rag_system() test_results.append(f"✅ RAG 시스템: 정상") test_results.append(f"🖥️ 디바이스: {rag.device}") if rag.vector_db: test_results.append(f"📚 벡터 DB: {rag.vector_db.ntotal}개 벡터") else: test_results.append("⚠️ 벡터 DB: 미구축") except Exception as e: test_results.append(f"❌ RAG 오류: {str(e)}") else: test_results.append("❌ RAG 시스템: 사용불가") # 간단한 검색 테스트 if RAG_AVAILABLE: try: import time start_time = time.time() result = search_tax_law("취득세 세율") response_time = time.time() - start_time test_results.append(f"🔍 검색 테스트: {response_time:.2f}초") test_results.append(f"📝 응답 길이: {len(result)}자") except Exception as e: test_results.append(f"❌ 검색 테스트 실패: {str(e)}") return "\n".join(test_results) except Exception as e: return f"테스트 실패: {str(e)}" def full_system_test(): """전체 시스템 테스트""" try: output, results = gradio_test() return output except Exception as e: return f"전체 테스트 실패: {str(e)}" def sample_questions(): """샘플 질문 제공""" samples = [ "취득세율이 얼마인가요?", "1세대 1주택자 감면 혜택은?", "신혼부부 취득세 특례는?", "농지 취득세 계산방법은?", "다주택자 중과세율은?", "취득세 신고 기한은 언제인가요?", "증여받은 부동산의 취득세는?", "상속 주택 취득세 신고기한은?" ] return "\n".join([f"{i+1}. {q}" for i, q in enumerate(samples)]) # Gradio 인터페이스 구성 def create_interface(): """Gradio 인터페이스 생성""" with gr.Blocks(title="취득세 AI 상담봇", theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🏛️ 취득세 AI 상담봇 ## 허깅페이스 스페이스에서 실행되는 RAG 기반 세무 상담 시스템 """) with gr.Tab("💬 세무 상담"): with gr.Row(): with gr.Column(scale=3): chatbot = gr.Chatbot( value=[], height=400, label="취득세 상담봇" ) msg = gr.Textbox( placeholder="취득세 관련 질문을 입력하세요...", label="질문", lines=2 ) with gr.Row(): submit_btn = gr.Button("질문하기", variant="primary") clear_btn = gr.Button("대화 초기화") with gr.Column(scale=1): gr.Markdown("### 💡 샘플 질문") samples_text = gr.Textbox( value=sample_questions(), lines=10, label="클릭하여 복사", interactive=False ) with gr.Tab("🧪 시스템 테스트"): with gr.Row(): with gr.Column(): gr.Markdown("### 빠른 테스트") quick_test_btn = gr.Button("빠른 시스템 체크", variant="secondary") quick_result = gr.Textbox( lines=10, label="테스트 결과", interactive=False ) with gr.Column(): gr.Markdown("### 전체 테스트") full_test_btn = gr.Button("전체 시스템 테스트", variant="primary") full_result = gr.Textbox( lines=15, label="상세 테스트 결과", interactive=False ) with gr.Tab("📊 시스템 정보"): gr.Markdown(f""" ### 시스템 정보 - **실행 환경**: {'허깅페이스 스페이스' if os.getenv('SPACE_ID') else '로컬 환경'} - **Python 버전**: {sys.version} - **RAG 시스템**: {'사용가능' if RAG_AVAILABLE else '사용불가'} - **실행 시간**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ### 사용법 1. **세무 상담 탭**: 취득세 관련 질문을 입력하세요 2. **시스템 테스트 탭**: 시스템 상태를 확인하세요 3. 샘플 질문을 참고하여 다양한 취득세 상황을 문의하세요 ### 주의사항 - 본 시스템은 참고용으로만 사용하세요 - 정확한 세무 상담은 전문가와 상의하시기 바랍니다 """) # 이벤트 핸들러 def respond(message, chat_history): bot_message = chat_with_tax_consultant(message, chat_history) chat_history.append((message, bot_message)) return "", chat_history # 버튼 이벤트 연결 msg.submit(respond, [msg, chatbot], [msg, chatbot]) submit_btn.click(respond, [msg, chatbot], [msg, chatbot]) clear_btn.click(lambda: [], None, chatbot) quick_test_btn.click(quick_test, None, quick_result) full_test_btn.click(full_system_test, None, full_result) return demo if __name__ == "__main__": # 환경에 따른 설정 space_id = os.getenv('SPACE_ID') if space_id: print(f"🚀 허깅페이스 스페이스에서 실행: {space_id}") # 허깅페이스 스페이스 환경 demo = create_interface() demo.launch( server_name="0.0.0.0", server_port=7860, share=False ) else: print("💻 로컬 환경에서 실행") # 로컬 개발 환경 demo = create_interface() demo.launch( server_name="127.0.0.1", server_port=7860, share=True )