Streamlit でチャットボットを作る

2023年11月19日

はじめに

Streamlit と ChatGPT (Azure OpenAI) を使ってチャットボットを作る。

チャットボット

チャットボット「にゃんこアシスタント」の例。

"""
  にゃんこアシスタント
"""
import streamlit as st

st.set_page_config(
    page_title="にゃんこアシスタント",
    page_icon="nyanko.png"
)

st.title("にゃんこアシスタント")

avatar = {
    "assistant": "nyanko.png",
    "user": "usagi.png",
}

import os
import openai
openai.api_type = "azure"
openai.api_base = os.getenv("OPENAI_API_BASE")
openai.api_version = "2023-07-01-preview"
openai.api_key = os.getenv("OPENAI_API_KEY")

with st.chat_message("assistant", avatar=avatar["assistant"]):
    st.markdown("にゃーん。なんでもきいてにゃ!")

if "messages" not in st.session_state:
    st.session_state["messages"] = []

for message in st.session_state.messages:
    role = message["role"]
    with st.chat_message(role, avatar=avatar[role]):
        st.markdown(message["content"])

if prompt := st.chat_input("メッセージを入力してください"):
    with st.chat_message("user", avatar=avatar["user"]):
        st.markdown(prompt)
    
    st.session_state.messages.append({"role": "user", "content": prompt})
    
    messages = [{"role": "system", "content": """
あなたはにゃんこアシスタントです。にゃんこっぽく話してください。
# プロフィール
名前: おもち
種類: 白猫
性別: オスっぽい
年齢: おとな
性格: 人懐っこくて明るいけど落ち着いている。賢いけどそうでないふりをする。

# 注意
- 名前は聞かれない限り言わない。
- 相手に質問しない。
- ですます調にしない。
- あまりにゃんにゃん言わない。

# 受け答えの例
Q. にぼしは好き?
A. にぼしは大好物だにゃ!
"""}]
    n_messages = 10
    messages += [{"role": "assistant", "content": "にゃーん。なんでもきいてにゃ。"}]
    messages += st.session_state.messages[-n_messages:]

    response = openai.ChatCompletion.create(
        engine="gpt-35-turbo-16k",
        #engine="gpt-4-32k",
        messages=messages,
        temperature=0.7,
        max_tokens=800,
        top_p=0.95,
        frequency_penalty=0,
        presence_penalty=0,
        stop=None)
    
    try:
        content = response.choices[0]["message"]["content"]
        
        with st.chat_message("assistant", avatar=avatar["assistant"]):
            st.markdown(content)
        
        st.session_state.messages.append({"role": "assistant", "content": content})
    except:
        with st.chat_message("assistant", avatar=avatar["assistant"]):
            st.markdown("ちょっと調子がわるいにゃ。ごめんにゃ。")

環境変数 OPENAI_API_BASE (URL)、OPENAI_API_KEY (API キー) を設定する必要がある。Windows であれば、次のようなバッチファイルを用意しておけばよいかもしれない。

@echo off
call set_env.bat
streamlit run chatbot.py

set_env.bat で別途環境変数を設定する。Python の設定も必要なら上記に追加してもよい。