5. StreamlitμΌλ‘ DocumentGPT μ± λ§λ€κΈ°
π― μ΄ μ±ν°μμ λ°°μΈ κ²
- Streamlitμ κΈ°λ³Έ μ¬μ©λ²κ³Ό λ€μν UI μ»΄ν¬λνΈ(μμ ―) νμ©λ²
- λ€μ€ νμ΄μ§ Streamlit μ ν리μΌμ΄μ μ ꡬμ±νλ λ°©λ²
- νμΌ μ λ‘λ, μ±ν μΈν°νμ΄μ€ λ± μ€μ μΉ μ ν리μΌμ΄μ μ ν΅μ¬ κΈ°λ₯ ꡬννκΈ°
- RAG νμ΄νλΌμΈ(Load, Split, Embed, Store, Retrieve)μ Streamlit μ±μ ν΅ν©νλ λ°©λ²
- λν κΈ°λ‘μ
st.session_state
λ‘ κ΄λ¦¬νλ λ°©λ² - LLMμ λ΅λ³μ μ€μκ°μΌλ‘ μ€νΈλ¦¬λ°νμ¬ μ¬μ©μ κ²½νμ ν₯μμν€λ λ°©λ²
Streamlit κΈ°μ΄
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
streamlit run
λͺ λ Ήμ΄λ‘ μ±μ μ€ννλ λ°©λ²st.title
,st.selectbox
,st.text_input
,st.slider
λ± κΈ°λ³Έ μμ ― μ¬μ©λ²- μμ ―μ μ λ ₯κ°μ λ°λΌ μ±μ λμμ λμ μΌλ‘ λ³κ²½νλ λ°©λ²
π 1λ¨κ³: Streamlit μμ ― μ¬μ©ν΄λ³΄κΈ°
μ 체 μ½λ (Home.py):
1 | import streamlit as st |
π μ½λ μμΈ μ€λͺ
1. Streamlitμ΄λ?
Streamlitμ λ°μ΄ν° κ³Όνμμ λ¨Έμ λ¬λ μμ§λμ΄λ₯Ό μν΄ λ§λ€μ΄μ§ Python μΉ νλ μμν¬μ
λλ€. 볡μ‘ν HTML/CSS/JavaScript μμ΄ Python μ½λλ§μΌλ‘ μΈν°λν°λΈν μΉ μ ν리μΌμ΄μ
μ λ§€μ° λΉ λ₯΄κ³ μ½κ² λ§λ€ μ μμ΅λλ€.
- μ€ν λ°©λ²: ν°λ―Έλμμ
streamlit run <νμΌλͺ >.py
μ μ€νν©λλ€. - λμ μ리: μ€ν¬λ¦½νΈκ° μμμ μλλ‘ μ€νλλ©°,
st.
μΌλ‘ μμνλ ν¨μλ€μ μΉ νμ΄μ§μ ν΄λΉ UI μμλ₯Ό λ λλ§ν©λλ€. μ¬μ©μκ° μμ ―κ³Ό μνΈμμ©(μ: λ²νΌ ν΄λ¦, ν μ€νΈ μ λ ₯)νλ©΄ μ€ν¬λ¦½νΈ μ μ²΄κ° λ€μ μ€νλμ΄ νλ©΄μ΄ μ λ°μ΄νΈλ©λλ€.
2. κΈ°λ³Έ μμ ―
st.title()
: ν° μ λͺ©μ νμν©λλ€.st.selectbox()
: λλ‘λ€μ΄ λ©λ΄λ₯Ό λ§λλλ€. μ νλ κ°μ λ³μμ μ μ₯λ©λλ€.st.text_input()
: μ¬μ©μλ‘λΆν° ν μ€νΈλ₯Ό μ λ ₯λ°λ μμλ₯Ό λ§λλλ€.st.slider()
: μ¬λΌμ΄λλ₯Ό λ§λ€μ΄ μ«μ λ²μλ₯Ό μ ννκ² ν©λλ€.
β 체ν¬λ¦¬μ€νΈ
-
streamlit
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉνλμ? -
streamlit run Home.py
λ‘ μ±μ μ€ννλμ? -
st.selectbox
λ₯Ό μ¬μ©νμ¬ λͺ¨λΈμ μ ννκ³ , μ νμ λ°λΌ λ€λ₯Έ μμ ―μ΄ λνλλ κ²μ νμΈνλμ?
λ€μ€ νμ΄μ§ μ± (Multi-Page Apps)
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
pages
λλ ν 리λ₯Ό μ¬μ©νμ¬ μ¬λ¬ νμ΄μ§λ₯Ό κ°μ§ Streamlit μ±μ ꡬμ±νλ λ°©λ²st.set_page_config
λ‘ νμ΄μ§μ μ λͺ©κ³Ό μμ΄μ½μ μ€μ νλ λ°©λ²
π 1λ¨κ³: pages
λλ ν 리 νμ©νκΈ°
μ 체 μ½λ (Home.py):
1 | import streamlit as st |
μ 체 μ½λ (pages/01_DocumentGPT.py):
1 | import streamlit as st |
π μ½λ μμΈ μ€λͺ
1. λ€μ€ νμ΄μ§ μ± κ΅¬μ‘°
Streamlitμ λ§€μ° κ°λ¨ν λ°©μμΌλ‘ λ€μ€ νμ΄μ§ μ±μ μ§μν©λλ€. λ©μΈ νμΌ(μ: Home.py
)μ΄ μλ λλ ν 리 μμ pages
λΌλ μ΄λ¦μ λλ ν 리λ₯Ό λ§λ€κ³ , κ·Έ μμ λ€λ₯Έ Python νμΌμ λ£κΈ°λ§ νλ©΄ λ©λλ€. Streamlitμ΄ μλμΌλ‘ pages
λλ ν 리λ₯Ό κ°μ§νμ¬ μ¬μ΄λλ°μ κ° νμ΄μ§λ‘ μ΄λν μ μλ λ€λΉκ²μ΄μ
λ©λ΄λ₯Ό λ§λ€μ΄μ€λλ€.
- νμΌ μμ: νμΌλͺ
μμ μ«μμ λ°λΌ λ©λ΄μ μμκ° κ²°μ λ©λλ€. (μ:
01_...
,02_...
)
2. st.set_page_config()
- κ° νμ΄μ§μ λΈλΌμ°μ ν μ λͺ©, νλΉμ½(μμ΄μ½), λ μ΄μμ λ±μ μ€μ νλ ν¨μμ λλ€.
- μ€ν¬λ¦½νΈμμ κ°μ₯ λ¨Όμ νΈμΆλμ΄μΌ νλ ν¨μ μ€ νλμ λλ€.
β 체ν¬λ¦¬μ€νΈ
-
pages
λλ ν 리λ₯Ό λ§λ€κ³ κ·Έ μμ.py
νμΌμ μΆκ°νλμ? - μ±μ μ€ννμ λ μ¬μ΄λλ°μ νμ΄μ§ λ€λΉκ²μ΄μ μ΄ μλμΌλ‘ μμ±λμλμ?
-
st.set_page_config
λ₯Ό μ¬μ©νμ¬ κ° νμ΄μ§μ μ λͺ©κ³Ό μμ΄μ½μ μ€μ νλμ?
μ±ν κΈ°λ₯κ³Ό λν κΈ°λ‘
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
st.chat_input
κ³Όst.chat_message
λ₯Ό μ¬μ©νμ¬ μ±ν UIλ₯Ό ꡬννλ λ°©λ²st.session_state
λ₯Ό μ¬μ©νμ¬ λν κΈ°λ‘μ μ μ₯νκ³ μ μ§νλ λ°©λ²
π 1λ¨κ³: μ±ν UI λ° μν κ΄λ¦¬
μ 체 μ½λ (pages/01_DocumentGPT.py):
1 | import streamlit as st |
π μ½λ μμΈ μ€λͺ
1. st.session_state
Streamlitμ μ¬μ©μκ° μνΈμμ©ν λλ§λ€ μ€ν¬λ¦½νΈ μ 체λ₯Ό μ¬μ€νν©λλ€. μ΄ λ μΌλ° λ³μμ μ μ₯λ κ°μ μ¬λΌμ§λλ€. st.session_state
λ μ¬μ©μμ μΈμ
λμ λ°μ΄ν°λ₯Ό μ μ§μμΌμ£Όλ λμ
λ리 κ°μ κ°μ²΄μ
λλ€. μ±λ΄μ λν κΈ°λ‘μ²λΌ μ¬λ¬ μ¬μ€ν κ³Όμ μμ μ μ§λμ΄μΌ νλ κ°μ μ μ₯νλ λ° νμμ μ
λλ€.
2. μ±ν UI
st.chat_input()
: νλ©΄ νλ¨μ κ³ μ λ μ±ν μ λ ₯μ°½μ λ§λλλ€. μ¬μ©μκ° λ©μμ§λ₯Ό μ λ ₯νκ³ μν°λ₯Ό μΉλ©΄ κ·Έ λ©μμ§ λ΄μ©μ λ°νν©λλ€.st.chat_message(role)
:with
ꡬ문과 ν¨κ» μ¬μ©νμ¬ νΉμ μν (human
λλai
)μ λ§λ νλ‘ν μμ΄μ½κ³Ό λ°°κ²½μμΌλ‘ μ±ν λ²λΈμ λ§λλλ€.
λμ νλ¦:
- μ±μ΄ μ²μ μ€νλλ©΄
st.session_state["messages"]
κ° λΉ λ¦¬μ€νΈλ‘ μ΄κΈ°νλ©λλ€. paint_history()
κ° νΈμΆλμ§λ§, μμ§ λ©μμ§κ° μμΌλ―λ‘ μ무κ²λ νμλμ§ μμ΅λλ€.- μ¬μ©μκ°
st.chat_input
μ λ©μμ§λ₯Ό μ λ ₯ν©λλ€. - μ€ν¬λ¦½νΈκ° μ¬μ€νλκ³ ,
message
λ³μμ μ¬μ©μ μ λ ₯μ΄ λ΄κΉλλ€. send_message(message, "human")
κ° νΈμΆλμ΄ μ¬μ©μ λ©μμ§λ₯Ό νλ©΄μ νμνκ³st.session_state
μ μ μ₯ν©λλ€.- (AI μλ΅ λ‘μ§ μ€ν ν)
send_message(response, "ai")
κ° νΈμΆλμ΄ AIμ λ΅λ³μ νλ©΄μ νμνκ³st.session_state
μ μ μ₯ν©λλ€. - λ€μ μ¬μ€ν μ,
paint_history()
λst.session_state
μ μ μ₯λ λͺ¨λ λ©μμ§λ₯Ό νλ©΄μ κ·Έλ €μ€λλ€.
β 체ν¬λ¦¬μ€νΈ
-
st.session_state
λ₯Ό μ¬μ©νμ¬messages
리μ€νΈλ₯Ό μ΄κΈ°ννλμ? -
st.chat_input
μΌλ‘ μ¬μ©μ μ λ ₯μ λ°κ³ ,st.chat_message
λ‘ νλ©΄μ νμνλμ? - μ¬μ©μμ AIμ λ©μμ§λ₯Ό
st.session_state
μ μ μ₯νκ³ , μ±μ΄ μ¬μ€νλ λλ§λ€paint_history
ν¨μλ‘ λ³΅μνλμ?
RAG νμ΄νλΌμΈκ³Ό μ€νΈλ¦¬λ°
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
st.file_uploader
λ‘ νμΌμ μ λ‘λνκ³ ,@st.cache_data
λ‘ RAG νμ΄νλΌμΈμ λΉμΌ μ°μ°(μλ² λ©)μ μΊμ±νλ λ°©λ²- LCELλ‘ RAG 체μΈμ ꡬμ±νκ³ Streamlit μ±κ³Ό μ°λνλ λ°©λ²
BaseCallbackHandler
λ₯Ό μ¬μ©νμ¬ LLMμ λ΅λ³μ μ€μκ°μΌλ‘ μ€νΈλ¦¬λ°νλ λ°©λ²
π 1λ¨κ³: νμΌ μ λ‘λ λ° RAG μ²΄μΈ μ°λ
μ 체 μ½λ (pages/01_DocumentGPT.py):
1 | # ... (imports) |
π μ½λ μμΈ μ€λͺ
1. @st.cache_data
μ΄ λ°μ½λ μ΄ν°λ ν¨μμ μ€ν κ²°κ³Όλ₯Ό μΊμ±ν©λλ€. λμΌν μ
λ ₯μΌλ‘ ν¨μκ° λ€μ νΈμΆλλ©΄, ν¨μλ₯Ό μ¬μ€ννλ λμ μΊμλ κ²°κ³Όλ₯Ό μ¦μ λ°νν©λλ€. νμΌ μλ² λ©μ²λΌ λΉμ©κ³Ό μκ°μ΄ λ§μ΄ λλ κ³μ°μ μ¬μ©νμ¬ μ± μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
2. st.file_uploader
μ¬μ©μκ° νμΌμ μ
λ‘λν μ μλ μμ ―μ μμ±ν©λλ€. μ
λ‘λλ νμΌμ λ©λͺ¨λ¦¬ μμμ νμΌ κ°μ²΄λ‘ μ²λ¦¬λ©λλ€.
3. μ€νΈλ¦¬λ° ꡬν
ChatCallbackHandler
: LangChainμ μ½λ°± μμ€ν μ νμ©νμ¬ LLMμ μλ΅ μμ± κ³Όμ μ κ°μ ν©λλ€.on_llm_new_token
μ΄λ²€νΈλ λͺ¨λΈμ΄ μ ν ν°(λ¨μ΄)μ μμ±ν λλ§λ€ νΈλ¦¬κ±°λ©λλ€.st.empty()
: λμ€μ μ½ν μΈ λ₯Ό μ±μΈ μ μλ λΉ μ»¨ν μ΄λλ₯Ό λ§λλλ€. μ½λ°± νΈλ€λ¬λ μ΄message_box
μ κ³μν΄μ μλ‘μ΄ ν ν°μ μΆκ°νμ¬ μ€νΈλ¦¬λ° ν¨κ³Όλ₯Ό ꡬνν©λλ€.chain.invoke(message)
:llm
μstreaming=True
λ‘ μ€μ νκΈ° λλ¬Έμ,invoke
λ₯Ό νΈμΆνλ©΄ μλ΅μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬λ λμ μ€νΈλ¦¬λ°μ΄ μμλ©λλ€. μ½λ°± νΈλ€λ¬κ° λλ¨Έμ§ μμ μ μ²λ¦¬ν©λλ€.
β 체ν¬λ¦¬μ€νΈ
-
st.file_uploader
λ₯Ό μ¬μ΄λλ°μ μΆκ°νμ¬ νμΌ μ λ‘λ κΈ°λ₯μ ꡬννλμ? -
@st.cache_data
λ₯Όembed_file
ν¨μμ μ μ©νμ¬ μλ² λ© κ³Όμ μ μΊμ±νλμ? -
BaseCallbackHandler
λ₯Ό μμλ°μ μ€νΈλ¦¬λ° μ½λ°±μ λ§λ€κ³ ,on_llm_new_token
μμst.empty()
μμ ―μ μ λ°μ΄νΈνλμ? -
ChatOpenAI
λͺ¨λΈμstreaming=True
μcallbacks
μ ν¨κ» μ΄κΈ°ννλμ?
μΆμ² : https://nomadcoders.co/fullstack-gpt