【Streamlit】LangChainでGPT-4oを使ったチャットアプリ

Streamlit
この記事は約12分で読めます。

こんにちは、JS2IIUです。

近年、OpenAIのAPIを活用したアプリケーションが注目を集めています。その中でも、LangChainは強力なフレームワークであり、対話型AIを構築するための便利なツールです。本記事では、LangChainの基本的な使い方を紹介し、Streamlitを使ってリアルタイムのチャットアプリを作成する方法を解説します。今回もよろしくお願いします。

LangChainとは?

LangChainは、自然言語処理(NLP)アプリケーションの開発を簡単にするためのPythonフレームワークです。特に以下の特徴を持っています:

  • プロンプトエンジニアリング: プロンプトの管理と最適化を容易にします。
  • メモリ管理: チャット履歴を保持し、会話の文脈を考慮した応答を生成できます。
  • ツールの統合: OpenAIのAPIやGoogle検索などの外部ツールを簡単に統合可能です。

LangChainを使うことで、複雑なチャットアプリやカスタムAIソリューションを効率的に構築できます。

LangChain
LangChain provides the engineering platform and open source frameworks developers use to build, test, and deploy reliable AI agents.

LangChainの導入方法

以下のコマンドでLangChainをインストールできます:

Bash
pip install langchain openai

また、Streamlitも必要なので以下をインストールしてください:

Bash
pip install streamlit

さらに、OpenAIのAPIを利用するためにAPIキーが必要です。以下の公式サイトで取得できます:
OpenAI API

基本的な使い方

LangChainでは、以下のようにチャットモデルを定義し、メッセージを送信して応答を取得します:

Python
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

# OpenAIクライアントの初期化
chat = ChatOpenAI(model="gpt-4", openai_api_key="YOUR_API_KEY")

# ユーザーメッセージを送信
response = chat([HumanMessage(content="こんにちは、元気ですか?")])

# 応答を表示
print(response.content)

Streamlitを使ったリアルタイムチャットアプリのサンプル

以下は、LangChainとStreamlitを組み合わせたチャットアプリの完全なサンプルコードです。

Python
import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, AIMessage, SystemMessage

# OpenAIクライアントを生成
chat = ChatOpenAI(
    model="gpt-4",  # 適切なモデル名を指定してください
    temperature=0.7,
    streaming=True,
    openai_api_key="YOUR API KEY HERE"  # ここにあなたのAPIキーを入力してください
)

# セッションステートを初期化
if "messages" not in st.session_state:
    st.session_state.messages = [SystemMessage(content="You are a helpful assistant.")]

# メッセージ履歴を表示
for message in st.session_state.messages:
    if isinstance(message, HumanMessage):
        with st.chat_message("user"):
            st.markdown(message.content)
    elif isinstance(message, AIMessage):
        with st.chat_message("assistant"):
            st.markdown(message.content)

# ユーザーからの入力を受け取る
if prompt := st.chat_input("What is up?"):
    # ユーザーのメッセージを履歴に追加
    user_message = HumanMessage(content=prompt)
    st.session_state.messages.append(user_message)

    # チャットメッセージとして表示
    with st.chat_message("user"):
        st.markdown(prompt)

    # OpenAI APIを使ってAIからの応答をストリーミングで生成
    with st.chat_message("assistant"):
        full_response = ""
        placeholder = st.empty()  # プレースホルダーを作成
        for chunk in chat.stream(st.session_state.messages):
            content = chunk.content
            if content:
                full_response += content
                placeholder.markdown(full_response + "")  # 途中経過を表示
        placeholder.markdown(full_response)  # 最終的な応答を表示

    # AIのメッセージを履歴に追加
    ai_message = AIMessage(content=full_response)
    st.session_state.messages.append(ai_message)

サンプルコードのポイント解説

このプログラムは、Streamlitを使ったリアルタイムのチャットアプリケーションです。LangChainを利用してOpenAIのAPIと連携し、AIからの応答をストリーミングで受け取る仕組みを実現しています。以下にプログラムの各部分を詳細に解説します。

1. インポートセクション

Python
import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, AIMessage, SystemMessage
  • streamlit as st: StreamlitはWebアプリケーションを簡単に作成するためのPythonライブラリです。このアプリはStreamlitを使ってユーザーインターフェースを構築します。
  • ChatOpenAI: LangChainライブラリのモデルクラスで、OpenAIのGPTモデルにアクセスするために使用されます。
  • HumanMessage, AIMessage, SystemMessage: メッセージの種類を表すLangChainのスキーマです。
  • HumanMessage: ユーザーが送信したメッセージ。
  • AIMessage: AIからの応答メッセージ。
  • SystemMessage: チャットの設定やコンテキストを伝えるメッセージ。

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

Python
chat = ChatOpenAI(
    model="gpt-4",
    temperature=0.7,
    streaming=True,
    openai_api_key="YOUR API KEY HERE"
)
  • model="gpt-4": OpenAIのGPTモデル(例: GPT-4)を指定。
  • temperature=0.7: 出力の多様性を制御するパラメータ。値が高いほど多様な応答が得られます。
  • streaming=True: ストリーミングモードを有効にして、応答をリアルタイムで受け取ります。
  • openai_api_key: OpenAIのAPIキーを指定します。

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

Python
if "messages" not in st.session_state:
    st.session_state.messages = [SystemMessage(content="You are a helpful assistant.")]
  • セッションステート: Streamlitのセッション中にデータを保持する仕組み。チャットの履歴を保持します。
  • 初期化: 最初のアクセス時にSystemMessageを設定。これはAIの振る舞いを制御するメッセージで、例えば「You are a helpful assistant.」と設定することで、AIの役割を規定しています。

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

Python
for message in st.session_state.messages:
    if isinstance(message, HumanMessage):
        with st.chat_message("user"):
            st.markdown(message.content)
    elif isinstance(message, AIMessage):
        with st.chat_message("assistant"):
            st.markdown(message.content)
  • st.session_state.messages: チャットのメッセージ履歴をループで表示。
  • isinstance: メッセージがHumanMessageまたはAIMessageかを判定し、それぞれの形式で表示。
  • st.chat_message: Streamlitのチャット形式UIを作成するメソッド。
  • st.markdown: メッセージ内容をMarkdown形式で表示。

5. ユーザー入力の取得

Python
if prompt := st.chat_input("What is up?"):
    user_message = HumanMessage(content=prompt)
    st.session_state.messages.append(user_message)
    with st.chat_message("user"):
        st.markdown(prompt)
  • st.chat_input: ユーザーがメッセージを入力するためのコンポーネント。
  • HumanMessage: 入力内容をHumanMessageとして作成し、セッションステートに追加。
  • チャットメッセージの表示: 入力されたメッセージをすぐに画面に表示。

6. AI応答の生成とストリーミング表示

Python
with st.chat_message("assistant"):
    full_response = ""
    placeholder = st.empty()
    for chunk in chat.stream(st.session_state.messages):
        content = chunk.content
        if content:
            full_response += content
            placeholder.markdown(full_response + "")
    placeholder.markdown(full_response)
  • ストリーミング応答:
  • chat.stream(): st.session_state.messages(メッセージ履歴)を入力として渡し、ストリーミングでAI応答を受け取ります。
  • チャンクごとにchunk.contentを取得し、full_responseに追加。
  • placeholderを使い、受信中のテキストをリアルタイムに更新。
  • 応答が完了すると最終的な結果を表示。

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

Python
ai_message = AIMessage(content=full_response)
st.session_state.messages.append(ai_message)
  • AIMessage: 完成した応答をAIMessageとして作成。
  • セッションステートに追加: 次のリクエストでも履歴として利用可能。

プログラムの全体的な流れ

  1. セッション開始時に履歴を初期化。
  2. 過去のメッセージ履歴を画面に表示。
  3. ユーザーがメッセージを入力。
  4. OpenAIのAPIにメッセージ履歴を送信し、ストリーミングでAI応答を取得。
  5. AIの応答を画面にリアルタイム表示。
  6. 応答が完了したら履歴に追加。

このプログラムの利点

  1. リアルタイム性: ストリーミングで応答をリアルタイムに表示することで、待ち時間を短く感じさせます。
  2. 履歴管理: st.session_stateを使ってメッセージ履歴を管理し、過去のやり取りを簡単に参照可能。
  3. 拡張性: LangChainを使うことで、プロンプトエンジニアリングやモデルチェーンなどの高度な機能に対応可能。

実行手順

  1. 必要なライブラリをインストール:
Bash
   pip install streamlit langchain openai
  1. スクリプトを実行:
Bash
   streamlit run your_script_name.py
  1. ブラウザでアプリを開き、チャットを開始します。

参考リンク

最後に、書籍のPRです。

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

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

コメント

タイトルとURLをコピーしました