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

TIL 51

musukie 2024. 11. 28. 18:34

사이드바에 대화 내역 버튼 생성

버튼 생성 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)

[출처](https://discuss.streamlit.io/t/how-to-create-a-chat-history-on-the-side-bar-just-like-chatgpt/59492/4)

 

How to create a chat history on the side bar just like chatGPT?

A simple example is to save user/ai chat say in a csv. Add an id column to be used in building a button in the sidebar. CSV CSV_FILE = "chat_history.csv" try: chat_history_df = pd.read_csv(CSV_FILE) except FileNotFoundError: chat_history_df = pd.DataFrame(

discuss.streamlit.io

버튼 생성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"라는 메시지가 표시된다.

 

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

TIL 50  (1) 2024.11.27
TIL 49  (0) 2024.11.26
TIL 48  (0) 2024.11.25
TIL 47  (0) 2024.11.23
WIL 7  (0) 2024.11.22