사이드바에 대화 내역 버튼 생성
버튼 생성 1
대화 내역을 csv 파일로 저장하고 불러와서 사이드바에서 확인할 수 있게 했다. 버튼을 클릭해 해당 대화 내역 전체를 확인할 수 있다. 참고 코드는 아래와 같다.
CSV_FILE = "chat_history.csv"
try:
chat_history_df = pd.read_csv(CSV_FILE)
except FileNotFoundError:
chat_history_df = pd.DataFrame(columns=["ChatID", "Role", "Content"])
def get_button_label(chat_df, chat_id):
first_message = chat_df[(chat_df["ChatID"] == chat_id) & (chat_df["Role"] == "User")].iloc[0]["Content"]
return f"Chat {chat_id[0:7]}: {' '.join(first_message.split()[:5])}..."
for chat_id in chat_history_df["ChatID"].unique():
button_label = get_button_label(chat_history_df, chat_id)
if st.sidebar.button(button_label):
current_chat_id = chat_id
loaded_chat = chat_history_df[chat_history_df["ChatID"] == chat_id]
loaded_chat_string = "\n".join(f"{row['Role']}: {row['Content']}" for _, row in loaded_chat.iterrows())
st.text_area("Chat History", value=loaded_chat_string, height=300)
버튼 생성2
이전에는 사용자가 입력을 할 때마다 새로운 버튼이 생성되었다. 그러나 하나의 대화에 하나의 버튼만 생성되게 코드를 수정했다. 사용자가 새로고침할 때마다 새로운 대화가 시작되고, 그 때마다 하나의 버튼이 생성되도록 했다.
# 사이드바에 저장된 대화 기록을 표시
if len(chat_history_df) > 0:
# 이미 버튼이 만들어져 있다면 대화 목록 표시
for chat_id in chat_history_df["ChatID"].unique():
button_label = get_button_label(chat_history_df, chat_id)
if st.sidebar.button(button_label):
current_chat_id = chat_id
loaded_chat = chat_history_df[chat_history_df["ChatID"] == chat_id]
loaded_chat_string = "\n".join(f"{row['Role']}: {row['Content']}" for _, row in loaded_chat.iterrows())
st.text_area("Chat History", value=loaded_chat_string, height=300)
else:
st.sidebar.write("저장된 대화가 없습니다.")
사이드바에 목차 selectbox 생성하기
사용자가 대화를 시작할 때, 주제를 선택할 수 있게 사이드바에 selectbox를 만들었다.
# 사이드바 구성하기
st.sidebar.header('주제 선택')
# selectbox로 주제 선택
option = st.sidebar.selectbox('주제를 선택하세요.', ['파이썬 라이브러리', '머신러닝', '딥러닝', 'LLM, RAG', 'AI 활용'])
if option == '파이썬 라이브러리':
theme = st.sidebar.selectbox('어떤 교재를 선택할까요?', ['교재1', '교재2', '교재3', '교재4', '교재5'])
st.write(f'{theme}')
사용자가 첫 번째 selectbox에서 큰 주제를 선택하면, 새로운 selectbox에서 교재를 선택할 수 있게 코드를 구성했다.
트러블슈팅
참고 코드에서는 ChatID와 Content(대화 내역 전체)를 기반으로 버튼을 생성했다. Content 대신 가장 최근에 사용자가 입력한 메시지가 보이게 하기 위해서 get_button_label 함수를 수정했다. 그 과정에서 IndexError: single positional indexer is out-of-bounds 오류가 발생했다.
참고 코드에서는 chat_df[(chat_df["ChatID"] == chat_id) & (chat_df["Role"] == "User")].iloc[-1]["Content"]를 사용했다. 그런데 이 경우에는, User 메시지가 없을 경우 IndexError가 발생한다고 한다.
"User" 대신 "user"로 수정하고 예외처리를 해주면, User 메시지가 없는 경우 IndexError는 발생하지 않고, "No User message found"라는 메시지가 표시된다.