AI 부트캠프/챕터3(11.08~12.04)

TIL 50

musukie 2024. 11. 27. 21:39

이전 대화내용에서 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})

 

우리가 만든 챗봇과 연결시켜야 한다.

'AI 부트캠프 > 챕터3(11.08~12.04)' 카테고리의 다른 글

TIL 51  (0) 2024.11.28
TIL 49  (0) 2024.11.26
TIL 48  (0) 2024.11.25
TIL 47  (0) 2024.11.23
WIL 7  (0) 2024.11.22