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"]}]
강의계획서 챗봇
- 강의계획서 챗봇은 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
반응형