【第2回】ChainlitでオリジナルAIチャットボットを作成してみる

Posted at 2024 年 03 月 27 日

前回の記事ではChainlitのセットアップまで終わらせました。
今回はその続きとして、ChainlitにLangChainを統合しOpenAI APIの連携させてみます。

【第1回】ChainlitでオリジナルAIチャットボットを作成してみる

ChainlitにLangChainを統合する方法

次の公式サイトの情報をもとに実装してみます。

LangChain - Chainlit

LangChainについては以下の記事から

大規模言語モデルを自由に操れるPythonライブラリ「Langchain」を使ってみた

まず必要なPythonライブラリをインストールします。

pip install langchain

pip install python-dotenv

langchainが大規模言語モデルを扱うためのライブラリでpython-dotenvがAPIキーを.envファイルから環境変数として設定するためライブラリです。

Chainlitのルートディレクトリにapp.pyファイルと.envファイルを作成します。

app.py

# LangChainライブラリからChatOpenAI(チャット用のAIモデル)、ChatPromptTemplate(プロンプトのテンプレート)、StrOutputParser(文字列出力パーサー)をインポートします。
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
# Runnable(実行可能オブジェクト)とその設定に関するクラスをインポートします。
from langchain.schema.runnable import Runnable
from langchain.schema.runnable.config import RunnableConfig
# 環境変数の設定
from dotenv import load_dotenv
import os

# 環境変数を`.env`ファイルから読み込む
load_dotenv()

# 環境変数からAPIキーを取得
api_key = os.getenv('OPENAI_API_KEY')

# chainlit(チャットボット作成用フレームワーク)をclとしてインポートします。
import chainlit as cl

# チャットセッションが開始されたときに呼び出される関数を定義します。このデコレータが関数をイベントハンドラとして登録します。
@cl.on_chat_start
async def on_chat_start():
    # ChatOpenAIモデルをストリーミングモードでインスタンス化します。
    model = ChatOpenAI(api_key=api_key, model="gpt-3.5-turbo", streaming=True)
    # チャットプロンプトテンプレートを作成し、AIの役割を定義します。
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "Please provide appropriate responses to the questions.",
            ),
            ("human", "{question}"),
        ]
    )
    # プロンプト、モデル、出力パーサーをつなげて実行可能なオブジェクトを作成します。
    runnable = prompt | model | StrOutputParser()
    # この実行可能オブジェクトをユーザーセッションに格納し、後で再利用できるようにします。
    cl.user_session.set("runnable", runnable)

# ユーザーからのメッセージを受け取った時に呼び出される関数を定義します。
@cl.on_message
async def on_message(message: cl.Message):
    # ユーザーセッションから実行可能オブジェクトを取得します。
    runnable = cl.user_session.get("runnable")  # type: Runnable

    # メッセージオブジェクトを作成し、初期コンテンツを空に設定します。
    msg = cl.Message(content="")

    # 取得した実行可能オブジェクトを非同期に実行し、メッセージの内容を質問としてAIに渡します。
    async for chunk in runnable.astream(
        {"question": message.content},
        # 実行時の設定として、Langchainのコールバックハンドラを設定します。
        config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]),
    ):
        # AIからの応答チャンクをメッセージオブジェクトに追加します。
        await msg.stream_token(chunk)

    # 構築したメッセージをユーザーに送信します。
    await msg.send()

.env

OPENAI_API_KEY=Your-API-Key

.envのYour-API-Keyは実際のAPIキーを設定して下さい。
APIキーの設定は次から
OpenAIのAPIとは?概要からAPIキーを取得する方法まで

アプリを実行する


ターミナル開いてapp.pyが含まれるディレクトリに移動します。
その後、以下のコマンドを実行してください。

chainlit run app.py -w

http://localhost:8000でアクセスが可能になります。

実行するとチャットの画面が表示され会話することができます。