見出し画像

方言チャットボット: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()

いいなと思ったら応援しよう!