이전 대화내용에서 quiz만 불러오기
quiz 중에서도 보기를 제외하고 질문 부분만 추출해오기 위해서, 특정 패턴만 추출하도록 정규식을 사용했다.
# '퀴즈:'로 시작하는 내용만 추출
quiz_pattern = r"퀴즈: .*"
quiz_onlys = re.findall(quiz_pattern, previous_conversation)
quiz_onlys를 for문으로 하나 씩 출력해서 질문 부분만 추출되었는지 확인할 수 있다.
# 필요한 부분 출력
print("추출된 퀴즈:")
for quiz_only in quiz_onlys:
print(quiz_only)
feedback_prompt에 '대화 기록' 부분에 불러오는 내용과 모델에 전달하는 데이터를 previous_conversation에서 quiz_onlys로 수정했다.
# 3. 사용자 답변에 대한 피드백 생성
feedback_prompt = ChatPromptTemplate.from_messages([
("system", f"""
AI 강사로서 다음 퀴즈의 정답 여부를 확인하고 피드백을 제공하세요.
퀴즈: {{quiz}}
답변: {{answer}}
대화 기록: {{quiz_onlys}}
거절 사유: {{refusal}}
""")
])
# 피드백 생성 - 키워드 인수로 전달
feedback_data = feedback_prompt.format(
quiz=quiz,
answer=user_answer,
quiz_onlys=quiz_onlys,
refusal="None"
)
아래의 코드를 통해 quiz_onlys가 잘 전달되었는지 확인할 수 있다.
# format 결과를 확인
print("Formatted Feedback Data:")
print(feedback_data)
깃허브에 commit을 올렸고, 조장님의 피드백을 받았다. 피드백을 바탕으로 코드를 수정했다.
quiz_list = []
# 대화 진행
while True:
# 1. 퀴즈 생성
quiz = rag_chain.invoke("퀴즈를 시작하세요.")
# '퀴즈:'로 시작하는 내용만 추출
quiz_pattern = r"퀴즈: .*"
all_quizzes = "\n".join(quiz_list) # 리스트를 문자열로 결합
quiz_onlys = re.findall(quiz_pattern, all_quizzes) # 문자열에서 검색
quiz의 질문 부분 내용을 추출해오는 곳을 previous_conversation에서 quiz_list로 바꿨다.
# '퀴즈:'로 시작하는 내용만 추출
quiz_pattern = r"퀴즈: .*"
all_quizzes = "\n".join(quiz_list) # 리스트를 문자열로 결합
quiz_onlys = re.findall(quiz_pattern, all_quizzes) # 문자열에서 검색
Streamlit으로 ui 구현하기
streamlit으로 간단한 채팅을 할 수 있는 챗봇을 구현했다.
import openai
import streamlit as st
from dotenv import load_dotenv
import os
load_dotenv()
# 페이지 구성
st.set_page_config(
page_title='복습 퀴즈 챗봇',
page_icon='🤖',
layout='wide',
initial_sidebar_state='auto'
)
# 챗봇 이름 꾸미기
st.markdown(
"""
<style>
.custom-title {
color: #008080;
font-size: 30px;
font-weight: bold;
}
</style>
""",
unsafe_allow_html=True,
)
st.markdown('<p class="custom-title">복습 퀴즈 챗봇📖</p>', unsafe_allow_html=True)
# 사이드바 구성하기
theme = st.sidebar.selectbox('주제를 선택하세요.', ['파이썬 라이브러리', '머신러닝', '딥러닝', 'LLM, RAG', 'AI 활용'])
st.write(f'{theme}에 대한 퀴즈를 내보겠습니다!')
# .env 파일에서 api 키 가져오기
API_KEY = os.getenv('openai_api_key')
# OpenAI API 키 설정
if API_KEY:
openai.api_key = API_KEY
else:
st.error("API 키가 설정되지 않았습니다. .env 파일을 확인하세요.")
st.stop()
@st.cache_data # 새로고침하면 대화 내역이 사라짐
# @st.cache_resource # 새로고침해도 대화 내역이 남아있음
def start_chat_session():
# 채팅 기록을 초기화합니다.
return []
if "chat_session" not in st.session_state:
st.session_state["chat_session"] = start_chat_session()
# 기존 채팅 기록 표시
for content in st.session_state.chat_session:
with st.chat_message("ai" if content["role"] == "assistant" else "user"):
st.markdown(content["content"])
# 사용자 입력 받기
if prompt := st.chat_input("메시지를 입력하세요."):
with st.chat_message("user"):
st.markdown(prompt)
# 사용자의 입력을 채팅 기록에 추가
st.session_state.chat_session.append({"role": "user", "content": prompt})
# GPT 모델로부터 응답 받기
with st.chat_message("ai"):
response = openai.ChatCompletion.create(
model="gpt-4", # 사용할 모델 지정 (gpt-4 또는 gpt-3.5-turbo 등)
messages=st.session_state.chat_session
)
# GPT의 응답 텍스트
reply = response["choices"][0]["message"]["content"]
st.markdown(reply)
# 응답을 채팅 기록에 추가
st.session_state.chat_session.append({"role": "assistant", "content": reply})
우리가 만든 챗봇과 연결시켜야 한다.