🙆‍♀️

Streamlit + LangChain _ver1_editing

2024/08/25に公開
import streamlit as st
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
#from langchain_core.messages import Message
# 履歴を保存するためにmessegaplaceholderを使う
from langchain.prompts import PromptTemplate, MessagesPlaceholder

import os
load_dotenv(".env")

st.title("🦜🔗 Quickstart")

#openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password")

llm=ChatOpenAI(temperature=0, model_name="gpt-4o-mini")


prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant.",
        ),
        (
            "human",
            "{question}"),
            MessagesPlaceholder(variable_name = "history")
    ]
)

default_chain = prompt|llm

# side barを作成
st.sidebar.title("Settings")
st.sidebar.write("Set the temperature for the model.")
#temperature = st.sidebar.slider("Temperature", 0.0, 1.0, 0.5, 0.1)
#llm.temperature = temperature

# session stateを使って、チャット履歴を保存
if "history" not in st.session_state:
    st.session_state["history"] = []

# チャット履歴を表示
# ["speaker"]によって、ユーザーかシステムかを判別
# ["content"]によって、メッセージの内容を表示
# システムのメッセージは、st.markdown(f"🤖 {message['content']}")で表示
# メッセージを枠で囲むには?st.markdown(f"```{message['content']}```")


# チャット履歴を表示
def display_chat_history():
    for message in st.session_state["history"]:
        if message["role"] == "system":
            st.markdown(f"🤖 {message["content"]}")
            st.markdown("---")
        else:
            st.markdown(f"👤 {message['content']}")
            st.markdown("---")

# チャットの入力フォーム, 送信ボタン
def generate_response(input_text):
    input = {"question": input_text, "history": st.session_state["history"]}
    response_content = default_chain.invoke(input).content
    st.session_state["history"].append({"role": "human", "content": input_text})
    st.session_state["history"].append({"role": "system", "content": response_content})
    st.experimental_set_query_params(rerun="true")  # ページをリロード

    #st.session_state.sync()

# チャット履歴の表示
display_chat_history()
st.info(st.session_state["history"])
with st.form("my_form"):
    text = st.text_area(
        "Enter text:",
        "HELLO",
    )
    submitted = st.form_submit_button("Submit")
    #if not openai_api_key.startswith("sk-"):
    #    st.warning("Please enter your OpenAI API key!", icon="⚠")
    if submitted :
        generate_response(text)
        # ページをリロード
        st.rerun()

Discussion