サイトアイコン アマチュア無線局JS2IIU

【Streamlit】GPT-4oとストリーミングを使って自然なチャットを実現

こんにちは、JS2IIUです。
StreamlitとOpenAIのAPIを組み合わせることで、GPT-4oを使ったチャットボットを簡単に作成できます。今回は、ストリーミングという技術を使って、まるで人間がタイピングしているかのような、より自然なチャット体験を実現する方法を解説します。今回もよろしくお願いします。

はじめに

今回のサンプルコードに使うテクニックはこちらの記事で詳しく説明しているので、事前に確認しておくとスムーズに進めることができます。st.chat_message()st.chat_input()、そしてst.session_state()の使い方について解説しています。

サンプルコード

まずは、今回解説するサンプルコード全体をご紹介します。API KEYのところだけご自身のものを入力してから実行して下さい。

Python
import streamlit as st
from openai import OpenAI

# OpenAIクライアントを生成
client = OpenAI(api_key="YOUR API KEY HERE")  # ここにあなたのAPIキーを入力してください

# セッションステートを初期化
if "messages" not in st.session_state:
    st.session_state.messages = []

# メッセージ履歴を表示
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# ユーザーからの入力を受け取る
if prompt := st.chat_input("What is up?"):
    # ユーザーのメッセージを履歴に追加
    st.session_state.messages.append({"role": "user", "content": prompt})
    # チャットメッセージとして表示
    with st.chat_message("user"):
        st.markdown(prompt)

    # OpenAI APIを使ってAIからの応答をストリーミングで生成
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            *st.session_state.messages,
        ],
        stream=True  # ストリーミングを有効にする
    )

    # AIのメッセージをチャンクごとに表示
    with st.chat_message("assistant"):
        full_response = ""
        placeholder = st.empty()  # プレースホルダーを作成
        for chunk in response:
            content = chunk.choices[0].delta.content
            if content is not None:
                full_response += content
                placeholder.markdown(full_response + "")  # 途中経過を表示
        placeholder.markdown(full_response)  # 最終的な応答を表示

    # AIのメッセージを履歴に追加
    st.session_state.messages.append({"role": "assistant", "content": full_response})
https://js2iiu.com/wp-content/uploads/2025/01/chat_07.mov

解説

それでは、上記のコードをステップバイステップで詳しく解説していきます。

1. 必要なライブラリをインポート

Python
import streamlit as st
from openai import OpenAI

2. OpenAIクライアントを生成

Python
client = OpenAI(api_key="YOUR API KEY HERE")  # ここにあなたのAPIキーを入力してください

3. セッションステートを初期化

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

4. メッセージ履歴を表示

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

5. ユーザーからの入力を受け取る

Python
if prompt := st.chat_input("What is up?"):
    # ユーザーのメッセージを履歴に追加
    # ...

6. ユーザーのメッセージを履歴に追加 & 表示

Python
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

7. OpenAI APIを使ってAIからの応答をストリーミングで生成

Python
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            *st.session_state.messages,
        ],
        stream=True  # ストリーミングを有効にする
    )

8. AIのメッセージをチャンクごとに表示

Python
    with st.chat_message("assistant"):
        full_response = ""
        placeholder = st.empty()  # プレースホルダーを作成
        for chunk in response:
            content = chunk.choices[0].delta.content
            if content is not None:
                full_response += content
                placeholder.markdown(full_response + "")  # 途中経過を表示
        placeholder.markdown(full_response)  # 最終的な応答を表示

9. AIのメッセージを履歴に追加

Python
    st.session_state.messages.append({"role": "assistant", "content": full_response})

まとめ

StreamlitとOpenAIのAPI、そしてストリーミングを組み合わせることで、まるで人間と会話しているかのような自然なチャットボットを構築できます。ぜひ、ご自身のアプリケーションにこの技術を組み込んで、ユーザーに新しい体験を提供してみてください。

さらに発展として、LangChainを使ったアプリ構築について、こちらの記事で確認してみて下さい。

参考リンク

最後に、書籍のPRです。

最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。

最後まで読んでいただきありがとうございました。73

モバイルバージョンを終了