import gradio as gr
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from openai import OpenAI
from translate_utils import translate_ko_to_en
YOUR_OPENAI_API_KEY = "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"
# 임베딩 모델 로드
embedding_model_name = "snunlp/KR-SBERT-V40K-klueNLI-augSTS"
embedding_model = HuggingFaceEmbeddings(
model_name=embedding_model_name,
model_kwargs={"device": "cpu"}, # GPU 사용 시 "cuda"로 변경
encode_kwargs={"normalize_embeddings": True},
)
# vector DB 로드
save_path = "./version-2024-12-22"
vectorstore = FAISS.load_local(save_path, embedding_model, allow_dangerous_deserialization=True)
def chatbot(input_question, eng_trans=True, num_ref=3):
"""챗봇 함수"""
retriever = vectorstore.as_retriever(search_kwargs={"k": num_ref})
# 한국어로 질의
if not eng_trans:
basic_docs = retriever.invoke(input_question)
# 영어로 번역 후 질의(영어, 한글 둘 다 검색)
else:
eng = translate_ko_to_en(input_question)
basic_docs = retriever.invoke(input_question)
eng_docs = retriever.invoke(eng)
basic_docs = basic_docs + eng_docs
context = "\n".join([doc.page_content for doc in basic_docs])
client = OpenAI(api_key=YOUR_OPENAI_API_KEY)
# GPT-4 or GPT-4o-mini 등 모델 지정
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "user",
"content": f"""당신은 반도체와 차세대반도체학과에 대해서 설명하는 Assistant입니다.
차세대반도체학과는 한국 서울의 중앙대학교의 창의ICT공과대학에 설립된 학과입니다. 이 학과는 서울대학교, 중앙대학교, 포항공과대학교, 숭실대학교, 강원대학교, 대구대학교, 조선이공대학교가 학점교류를 통해 수강할 수 있는 학과입니다.
다음 맥락에 맞게 질문에 한글로 답하세요. 대신, 반도체 전문용어는 영어로 해도 됩니다.
맥락: {context}
질문: {input_question}
"""
}
]
)
return completion.choices[0].message.content
# Gradio Blocks 레이아웃으로 꾸민 버전
with gr.Blocks() as demo:
# 상단 이미지
gr.Image(
value="head.png", # 이미지 경로 또는 URL
elem_id="top-image",
label=None
)
# 안내 문구
gr.Markdown(
"""
# 차세대반도체학과 특화 챗봇
- 이 챗봇은 한국어 질의에 대해 반도체 관련 정보, 차세대반도체학과 관련 정보를 친절하게 제공합니다.
- 반도체 전문용어는 일부 영어로 답변될 수 있습니다.
### 영어 번역 사용 여부 기능
- 영어 번역 사용 여부를 키면, 정확도가 상승될 수 있으나, 추론 시간이 길어질 수 있습니다.
### 검색 문서 개수 변경 기능
검색할 문서 개수를 늘리면 정확도가 상승될 수 있으나, 추론 시간이 길어질 수 있습니다.
""",
elem_id="description"
)
# 메인 UI
with gr.Group():
with gr.Row():
# 입력 파트
with gr.Column():
input_question = gr.Textbox(
label="질문 입력",
placeholder="반도체와 차세대반도체학과에 대해 궁금한 점을 입력하세요."
)
eng_trans = gr.Checkbox(
label="영어 번역 사용 여부",
value=True
)
num_ref = gr.Slider(
minimum=1,
maximum=5,
value=3,
step=1,
label="검색할 문서 개수"
)
submit_btn = gr.Button("질문하기")
# 출력 파트
with gr.Column():
output_answer = gr.Textbox(
label="답변",
placeholder="답변이 여기에 표시됩니다...",
lines=10
)
# 버튼과 함수 연결
submit_btn.click(
fn=chatbot,
inputs=[input_question, eng_trans, num_ref],
outputs=output_answer
)
demo.launch()