Project/SYU

[SYU] - SYU_Chat_Bot_3 (구조 개선 및 Gradio 기반 사용자 인터페이스 구현)

ro-jun 2024. 11. 20. 02:51
728x90
반응형
프로젝트 구조 개선
  • 기존의 모든 파일이 루트 디렉토리에 있었던 구조를 개선
  • core/ 디렉토리에는 LLM 설정, VectorDB 설정, Q&A 체인 관련 로직 등 핵심 파일을 배치.
  • gradio_app/ 디렉토리에는 Gradio UI와 관련된 로직 및 사용자 정보, PDF 요약, 삼육대학교 챗봇 관련 파일들을 분리.
SYU_CHAT_BOT/
├── core/                # 핵심 로직 디렉토리
│   ├── llm_setup.py         # LLM 설정
│   ├── vector_db_setup.py   # 벡터 DB 설정
│   ├── qa_setup.py          # Q&A 체인 설정
│   └── prompts.py           # 기본 프롬프트 저장
├── gradio_app/          # Gradio 관련 디렉토리
│   ├── gradio_ui.py         # Gradio 기반 UI
│   ├── user_info.py         # 사용자 정보 로직
│   ├── qa_chatbot.py        # 강의 계획서 챗봇 로직
│   ├── samyook_chatbot.py   # 삼육대학교 챗봇 로직
│   └── pdf_processing.py    # PDF 요약 처리 로직
├── main.py              # 프로젝트 초기화 및 실행 파일
├── README.md            # 프로젝트 설명
├── requirements.txt     # 의존성 패키지 목록
└── .env                 # 환경 변수
삼육대학교 챗봇
  • 삼육대학교 챗봇은 벡터 데이터베이스를 활용하여 사용자 질문에 기반한 맞춤 응답을 제공.
from core.qa_setup import qa_chain

def samyook_university_chatbot(question):
    inputs = {
        "question": f"삼육대학교 관련 정보: {question}",
        "chat_history": []
    }
    response = qa_chain.invoke(inputs)
    return [{"role": "assistant", "content": response["answer"]}]

삼육대학교 정보를 벡터DB에 저장하지 않았다.

강의계획서 챗봇
  • 강의계획서 챗봇은 VectorDB와 LangChain을 활용하여 사용자 정보에 기반한 맞춤형 응답을 생성
  • 사용자 정보(user_info)를 활용하여 질문 맥락을 추가.
  • Gradio 인터페이스에서 입력된 질문에 따라 벡터 DB에서 답변을 검색.
from core.qa_setup import qa_chain
from gradio_app.user_info import get_user_info

def lecture_plan_chatbot(question):
    user_info = get_user_info()
    user_context = (
        f"사용자는 {user_info['school']} {user_info['year']}학년 {user_info['department']} 학생입니다."
    )
    inputs = {
        "question": f"{user_context} {question}",
        "chat_history": []
    }
    response = qa_chain.invoke(inputs)
    return [{"role": "assistant", "content": response["answer"]}]
PDF 요약 챗봇
  • PDF 요약 기능은 PDF 파일의 내용을 LangChain 기반 LLM을 활용하여 요약
from core.llm_setup import llm
import pdfplumber

def pdf_bot_chatbot(pdf_file, prompt):
    with pdfplumber.open(pdf_file) as pdf:
        text = "".join(page.extract_text() for page in pdf.pages if page.extract_text())
    response = llm.predict_messages(
        messages=[
            {"role": "system", "content": prompt},
            {"role": "user", "content": text}
        ]
    )
    return response.content.strip()

Gradio 기반 UI
  • Gradio는 사용자와의 상호작용을 위한 직관적인 인터페이스를 제공.
  • 다양한 기능은 탭(Tab)으로 구분되어 있다.
  • UI 구성:
    • 내 정보 입력 탭
    • PDF 요약 탭
    • 삼육대학교 챗봇 탭
    • 강의 계획서 챗봇 탭
  • gradio_ui.py
import gradio as gr
from gradio_app.user_info import save_user_info
from gradio_app.pdf_processing import pdf_bot_chatbot
from gradio_app.samyook_chatbot import samyook_university_chatbot 
from gradio_app.qa_chatbot import lecture_plan_chatbot
from core.prompts import default_prompt

# Gradio UI 구성
with gr.Blocks() as app:
    # 1. 내 정보 입력 탭
    with gr.Tab("내 정보 입력"):
        # 사용자 정보 입력
        school = gr.Textbox(label="대학교")
        department = gr.Textbox(label="학과")
        year = gr.Textbox(label="학년")
        save_button = gr.Button("저장")
        user_info_output = gr.Textbox(label="저장된 정보", interactive=False)

        save_button.click(
            fn=save_user_info,
            inputs=[school, department, year],
            outputs=[user_info_output]
        )

    # 2. PDF 챗봇 (요약형)
    with gr.Tab("PDF 문서 요약봇"):
        pdf_input = gr.File(label="PDF 파일 업로드")
        summary_output = gr.Textbox(label="PDF 요약", interactive=False)
        pdf_summary_button = gr.Button("문서 요약", variant="primary")

        pdf_summary_button.click(
            fn=lambda pdf_file: pdf_bot_chatbot(pdf_file, default_prompt),
            inputs=[pdf_input],
            outputs=[summary_output]
        )

    # 삼육대학교 챗봇 (대화형)
    with gr.Tab("삼육대학교 챗봇"):
        user_input = gr.Textbox(placeholder="질문 입력", lines=1)
        chatbot_output = gr.Chatbot(
            value=[{"role": "assistant", "content": "### 안녕하세요, 삼육대학교 관련 질문을 입력해주세요."}],
            type="messages"
        )

        chatbot_button = gr.Button("보내기")
        chatbot_button.click(
            fn=samyook_university_chatbot,  # 수정된 응답 함수 사용
            inputs=[user_input],
            outputs=[chatbot_output]
        )

    # 4. 강의계획서 챗봇 (대화형)
    with gr.Tab("강의 계획서 챗봇"):
        user_input = gr.Textbox(placeholder="질문 입력", lines=1)
        chatbot_output = gr.Chatbot(
            value=[{"role": "assistant", "content": "### 안녕하세요, 질문을 입력해주세요."}],
            type="messages"
        )

        chatbot_button = gr.Button("보내기")
        chatbot_button.click(
            fn=lecture_plan_chatbot,
            inputs=[user_input],
            outputs=[chatbot_output]
        )

app.launch(debug=True)

 

728x90
반응형