
方言チャットボット:streamlit cloudで実装
google colabで動作確認した後に、streamlit cloudに実装しました。アプリのリンクは、後ろの方です。
このnotebookの内容をchatGPTにコピペして、streamlit実装用のコードを書いてもらい、まず、ローカルPCで動作確認しました。
いくつかエラーが出て動かないので、gptに聞いたり調べたりして、ローカルで動いたときは、嬉しい気持ち。
その後、GitHubのリポジトリにpushして、streamlit cloudにアプリ登録して、公開です。
リンクと、この投稿を書いている時点でのコードは、下の方に記載しました。
今回、コードの作成と修正は、cursorを使ってみました。
cursorは、コーディングをAIで支援してくれます。
参考記事です。
今回は、
会話の記録が上から下に流れるように、ずっと表示できるようにして。
入力文字数が長かったら、短くするようにメッセージ出して、再入力を促して。
規定回数終わったら、メッセージ出してアプリを終了させて
などとチャットしました。
そうすると、修正コードを提示しくれて、applyするとコードにdiffを表示した形で反映されて、accept(だったかな)したら、修正部分の反映が終わりました。
便利、凄いなど、web上では見聞きしていたのですが、初めて使ってみて、その便利さに感動です。自分で調べながらだと何時間もかかるような修正が、あっという間に終わりました。
チャットは、それなりに方言で会話できますが、違和感あることも多いのです。プロンプト、辞書、パラメータを調整していけば、自然に近づいていくと思います。あと、UIも、もう少し洗練したものにしたいですね。
ちょっとづつ、試していこうと思います。
まずは、APIのAssistantsを使ってチャットするようにして、トークンを節約するのが最初かな。
↓チャットアプリへのリンクです。諸事情により、公開を止めることがあるかも知れませんが、ご容赦ください。
コードです。
import streamlit as st
from openai import OpenAI
# OpenAI API Key
openai_api_key = st.secrets["OPENAI_API_KEY"]
client = OpenAI(api_key=openai_api_key)
# 方言辞書の読み込み
with open('dialect_dict.txt', 'r') as file:
dialects = file.read()
# チャット履歴の初期化
if "chat_history" not in st.session_state:
st.session_state.chat_history = [
{"role": "system", "content": f"""あなたは、方言でチャットするチャットボットです。\
ユーザーの入力に応じて、方言を使って簡潔に答えます。\
方言の辞書は、次のものを使います。\
辞書は、標準語 => 方言 の書式です。\
### 辞書 ###\
{dialects}"""}
]
st.session_state.conversation_count = 0 # 会話回数を初期化
# ユージレイアウト
st.title("方言チャットボット")
st.write("妙高市の方言を使って会話してみましょう!")
# メインコンテナ
main_container = st.container()
with main_container:
# 会話回数の表示
st.write(f"残りの会話回数: {10 - st.session_state.conversation_count}")
# チャット履歴を表示するコンテナ
chat_container = st.container()
# チャット履歴の表示
with chat_container:
for message in st.session_state.chat_history[1:]: # システムメッセージをスキップ
if message["role"] == "user":
st.write(f"あなた: {message['content']}")
elif message["role"] == "assistant":
st.write(f"ボット: {message['content']}")
# 入力セクション
input_container = st.container()
with input_container:
if st.session_state.conversation_count < 10:
user_input = st.text_input(
"あなた: ",
key=f"user_input_{st.session_state.conversation_count}"
)
if st.button("送信", key=f"send_{st.session_state.conversation_count}"):
if not user_input:
st.warning("メッセージを入力してください!")
elif len(user_input) > 20:
st.warning("長すぎるわね。もう少し短くして入力してくんないや!")
else:
# ユーザーのメッセージを履歴に追加
st.session_state.chat_history.append(
{"role": "user", "content": user_input}
)
# OpenAI APIを使用して応答を生成
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=st.session_state.chat_history,
temperature=0.3
)
assistant_reply = response.choices[0].message.content
# チャット履歴に追加
st.session_state.chat_history.append(
{"role": "assistant", "content": assistant_reply}
)
# 会話回数を増加
st.session_state.conversation_count += 1
# ページを再読み込みして新しい入力フィールドを表示
st.rerun()
except Exception as e:
st.error(f"APIエラー: {e}")
else:
st.write("しゃべった回数が10回になったわね。また、始めからやってくんないや!")
st.stop()