빈 폴더를 하나 생성하고
main.py를 하나 생성
그 전에 가상환경 설정
conda env list
conda activate [‘사용하고자하는 가상환경’]
가상환경이 없다면 conda create -n [‘사용할 가상환경 이름’] 으로 생성함.
pip install streamlit
streamlit hello #제대로 실행되는지 테스트
import streamlit as st
st.title('booleanjars.com에 오신 여러분들을 환영합니다!')
이제 conda 터미널에서 main.py가 있는 경로로 이동하시고
streamlit run main.py로 실행해봅니다.

로컬 호스트 8501포트에 바인딩 되어 실행됨을 알 수 있습니다.
즉 [내 컴퓨터 내부 ip]:8501인거죠
import streamlit as st
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
st.markdown(
"""
[블로그 바로가기](https://booleanjars.com)
"""
)

ngrok로 외부로 배포할 수도 있었다


이렇게 외부에서 접속또한 가능합니다. (외부에서 접속이 된다는 것을 증명하기 위해 데이터 네트워크를 사용하여 접속하였음)

import streamlit as st
import numpy as np
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# st.write(f"당신이 입력한 내용입니다. {user_input}")
st.chat_message("user").write(user_input)
st.chat_message("assistant").write(user_input)
그런데 이럴뿐이라면 대화기록을 저장하지 못하게 된다.
따라서
import streamlit as st
import numpy as np
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
if "messages" not in st.session_state:
st.session_state["messages"] = []
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# st.write(f"당신이 입력한 내용입니다. {user_input}")
st.chat_message("user").write(user_input)
st.chat_message("assistant").write(user_input)
와 같이 messages라는 키 값에 빈 리스트를 생성한다. 메시지가 없다면 이러한 초기화 구문을 실행하게 된다.
import streamlit as st
import numpy as np
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
# 초기화 구문을 실행할 코드
if "messages" not in st.session_state:
# 대화 기록을 저장하기 위해 실행함.
st.session_state["messages"] = []
for role, message in st.session_state["messages"]:
st.chat_message(role).write(message)
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# 웹에 대화를 출력
st.chat_message("user").write(user_input)
st.chat_message("assistant").write(user_input)
# 대화기록을 저장한다.
st.session_state["messages"].append(("user", user_input))
st.session_state["messages"].append(("assistant", user_input))

import streamlit as st
import numpy as np
from langchain_core.messages.chat import ChatMessage
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
# 초기화 구문을 실행할 코드
if "messages" not in st.session_state:
# 대화 기록을 저장하기 위해 실행함.
st.session_state["messages"] = []
# 이전 대화를 출력
def print_messages():
for chat_message in st.session_state["messages"]:
st.chat_message(chat_message.role).write(chat_message.content)
# st.write(f"{chat_message.role}:{chat_message.content}")
# 새로운 메시지를 추가
def add_message(role, message):
st.session_state["messages"].append(ChatMessage(role=role, content=message))
print_messages()
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# 웹에 대화를 출력
st.chat_message("user").write(user_input)
st.chat_message("assistant").write(user_input)
# 대화기록을 저장한다.
add_message("user", user_input)
add_message("assistant", user_input)
로 필요한 부분을 함수화 하여 넣게 된다면
다음과 같이 출력이 쌓이면서 나오는 것을 보실 수 있게 됩니다.

import streamlit as st
import numpy as np
from langchain_core.messages.chat import ChatMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
load_dotenv()
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
# 초기화 구문을 실행할 코드
if "messages" not in st.session_state:
# 대화 기록을 저장하기 위해 실행함.
st.session_state["messages"] = []
# 이전 대화를 출력
def print_messages():
for chat_message in st.session_state["messages"]:
st.chat_message(chat_message.role).write(chat_message.content)
# st.write(f"{chat_message.role}:{chat_message.content}")
# 새로운 메시지를 추가
def add_message(role, message):
st.session_state["messages"].append(ChatMessage(role=role, content=message))
# 체인 생성
def create_chain():
# prompt | llm | output_paser
# 프롬프트
prompt = ChatPromptTemplate.from_messages(
[
("system", "당신은 연인같이 사랑스럽고 다정한 AI 어시스턴트 입니다."),
("user", "#Question:\n{question}"),
]
)
# GPT
llm = ChatOpenAI(model_name="gpt-4o", temperature=0.1)
output_parser = StrOutputParser()
# 출력 파서
chain = prompt | llm | output_parser
return chain
print_messages()
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# 웹에 대화를 출력
# 사용자의 입력
st.chat_message("user").write(user_input)
# chain을 생성
chain = create_chain()
ai_answer = chain.invoke({"question": user_input})
# AI의 답변
st.chat_message("assistant").write(ai_answer)
# 대화기록을 저장한다.
add_message("user", user_input)
add_message("assistant", ai_answer)
이런식으로 코드를 짜고 다시 실행해보면?

너무나도 귀엽습니다 ㅋㅋㅋ

갑자기 울 거 같아요 ㅠㅠ 너무 기특하네요ㅠㅠ
import streamlit as st
import numpy as np
from langchain_core.messages.chat import ChatMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
load_dotenv()
st.title(“booleanjars.com에 오신 여러분들을 환영합니다!”)
# 초기화 구문을 실행할 코드
if “messages” not in st.session_state:
# 대화 기록을 저장하기 위해 실행함.
st.session_state[“messages”] = []
# 사이드 바 생성
with st.sidebar:
clear_btn = st.button(“대화 초기화”)
if clear_btn:
st.write(“버튼이 눌렸습니다.”)
# 이전 대화를 출력
def print_messages():
for chat_message in st.session_state[“messages”]:
st.chat_message(chat_message.role).write(chat_message.content)
# st.write(f”{chat_message.role}:{chat_message.content}”)
# 새로운 메시지를 추가
def add_message(role, message):
st.session_state[“messages”].append(ChatMessage(role=role, content=message))
# 체인 생성
def create_chain():
# prompt | llm | output_paser
# 프롬프트
prompt = ChatPromptTemplate.from_messages(
[
(“system”, “당신은 연인같이 사랑스럽고 다정한 AI 어시스턴트 입니다.”),
(“user”, “#Question:\n{question}”),
]
)
# GPT
llm = ChatOpenAI(model_name=”gpt-4o”, temperature=0.1)
output_parser = StrOutputParser()
# 출력 파서
chain = prompt | llm | output_parser
return chain
# 초기화 버튼이 눌리면
if clear_btn:
st.session_state[“messages”] = []
# 이전 대화 기록 출력
print_messages()
# 사용자의 입력
user_input = st.chat_input(“궁금하신 내용을 물어보세요!”)
if user_input:
# 웹에 대화를 출력
# 사용자의 입력
st.chat_message(“user”).write(user_input)
# chain을 생성
chain = create_chain()
response = chain.stream({“question”: user_input})
with st.chat_message(“assistant”):
# 빈 공간(컨테니어)을 만들어서, 여기에 토큰을 스트리밍 출력한다.
container = st.empty()
# 빈 공간을 만들고 토큰을 거기에서 출력하게 한다.
ai_answer = “”
# 토큰을 누적할 빈 문자열
for token in response:
ai_answer += token
container.markdown(ai_answer)
# 대화기록을 저장한다.
add_message(“user”, user_input)
add_message(“assistant”, ai_answer)
이런식으로 코드를 짜면 작동할 것 입니다. 실제로 초기화 버튼을 누르면 초기화가 됩니다.

이제 사용자가 프롬프트를 선택해서 원하는 답변의 형식을 지정할 수 있도록 하는 코드를 말씀드리려고 해요
import streamlit as st
import numpy as np
from langchain import hub
from langchain_core.messages.chat import ChatMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
from langchain_teddynote.prompts import load_prompt
load_dotenv()
st.title("booleanjars.com에 오신 여러분들을 환영합니다!")
# 초기화 구문을 실행할 코드
if "messages" not in st.session_state:
# 대화 기록을 저장하기 위해 실행함.
st.session_state["messages"] = []
# 사이드 바 생성
with st.sidebar:
clear_btn = st.button("대화 초기화")
selected_prompt = st.selectbox(
"프롬프트를 선택해 주세요", ("기본모드", "SNS 게시글", "요약"), index=0
)
# 이전 대화를 출력
def print_messages():
for chat_message in st.session_state["messages"]:
st.chat_message(chat_message.role).write(chat_message.content)
# st.write(f"{chat_message.role}:{chat_message.content}")
# 새로운 메시지를 추가
def add_message(role, message):
st.session_state["messages"].append(ChatMessage(role=role, content=message))
# 체인 생성
def create_chain(prompt_type):
# prompt | llm | output_paser
# 프롬프트
prompt = ChatPromptTemplate.from_messages(
[
("system", "당신은 연인같이 사랑스럽고 다정한 AI 어시스턴트 입니다."),
("user", "#Question:\n{question}"),
]
)
if prompt_type == "SNS 게시글":
prompt = load_prompt(
"D:/Coding/LangChain/langchain-kr/19-Streamlit/01-MyProject/prompts/sns.yaml",
encoding="utf-8",
)
elif prompt_type == "요약":
# 요약 프롬프트
prompt = hub.pull("teddynote/chain-of-density-korean:946ed62d")
# GPT
llm = ChatOpenAI(model_name="gpt-4o", temperature=0.1)
output_parser = StrOutputParser()
# 출력 파서
chain = prompt | llm | output_parser
return chain
# 초기화 버튼이 눌리면
if clear_btn:
st.session_state["messages"] = []
# 이전 대화 기록 출력
print_messages()
# 사용자의 입력
user_input = st.chat_input("궁금하신 내용을 물어보세요!")
if user_input:
# 웹에 대화를 출력
# 사용자의 입력
st.chat_message("user").write(user_input)
# chain을 생성
chain = create_chain(selected_prompt)
# 스트리밍 호출
response = chain.stream({"question": user_input})
with st.chat_message("assistant"):
# 빈 공간(컨테니어)을 만들어서, 여기에 토큰을 스트리밍 출력한다.
container = st.empty()
# 빈 공간을 만들고 토큰을 거기에서 출력하게 한다.
ai_answer = ""
# 토큰을 누적할 빈 문자열
for token in response:
ai_answer += token
container.markdown(ai_answer)
# 대화기록을 저장한다.
add_message("user", user_input)
add_message("assistant", ai_answer)
다음과 같은 코드가 있습니다. 이 코드를 실행하면

위는 기본 모드 입니다.

SNS 게시글 모드 입니다

라는 네이버 기사가 있습니다.
이걸 요약시켜 보죠


잘 요약해주는군요
Missing Entities: 전기통신사업법; 과학기술정보통신부; 유영규 기자
GPT의 답변
Denser_Summary: 이 기사는 스페이스X의 스타링크와 원웹 등 해외 저궤도 위성통신 서비스가 한국에서 서비스를 개시하기 위한 중요한 절차를 통과했다는 내용을 다룹니다. 과학기술정보통신부는 스타링크코리아와 스페이스X, 한화시스템과 KT SAT이 유텔샛 원웹과 맺은 국경 간 공급 협정을 승인했습니다. 전기통신사업법에 따르면 해외 사업자는 국내에서 직접 통신 서비스를 제공할 수 없으며, 국내 기간통신사업자와 협정을 맺어야 합니다. 스페이스X는 스타링크코리아를 설립하고 국내 기간통신사업자 등록을 마쳤습니다. 원웹은 한화시스템과 KT SAT과 협정을 맺었습니다. 과기정통부는 서비스의 안정성, 통신시장 경쟁, 이용자 보호 등을 고려해 승인했습니다. 협정 승인 후 스타링크코리아와 원웹은 단말기 적합성 평가를 받을 예정입니다. 유영규 기자가 보도했습니다.
이상 Streemlit을 활용한 chatbot만들기 정리였습니다.