Gradioで最も簡単にチャットボットを作るChatInterfaceの使い方

公開日:
目次

Gradioとは

Gradioは機械学習モデルを簡単にデプロイできるライブラリです。
機械学習モデルに関わらずpythonの関数をwebアプリとしてデプロイが可能です。

詳しくは下記の記事を参照してください。

Gradioで最も簡単にチャットボットを作る

Gradioでチャットボットを作るには2つの方法があります。

  • ChatInterfaceを使って最小構成のチャットボットを作る
  • Chatbotコンポーネントを使ってチャットボットを作る

この記事では、ChatInterfaceを使って最小構成のチャットボットを作る方法を紹介します。

Chatbotコンポーネントを使ってチャットボットを作る方法については、下記の記事を参照してください。

ChatInterfaceを使って最小構成のチャットボットを作る

Chatbotコンポーネントを最も簡単に作るには、下記のようにgr.ChatInterface()を利用します。

chatbot.py
import gradio as gr

def chatbot_response(message, history):
    return "いいえ"

app = gr.ChatInterface(random_response)
app.launch()

上記のコードを実行すると、下記のような画面が表示されます。

Image from Gyazo

これだけでチャットボットが作成出来ました!

超シンプル!

チャットボットの中身を変更したい場合は、関数を変更してもらえばOKです。

gr.ChatInterface()を理解する

このコードでは、gr.ChatInterface()を利用しています。

gr.ChatInterface()は、下記のような引数を取ります。

これらの引数を指定することで、チャットボットの見た目や挙動を変更することができます。

引数 デフォルト値 説明
fn(必須) Callable None チャットを処理するための関数。この関数には入力メッセージを表す文字列と、チャット履歴を表す [[user_message, bot_message], ...] 形式の2要素リストのリストが必要。
chatbot Chatbot None カスタマイズしたい場合、gr.Chatbotコンポーネントのインスタンスを指定。未指定の場合、デフォルトのgr.Chatbotコンポーネントが作成される。
textbox Textbox None カスタマイズしたい場合、gr.Textboxコンポーネントのインスタンスを指定。未指定の場合、デフォルトのgr.Textboxコンポーネントが作成される。
additional_inputs str | Component | list[str | Component] | None None gradioコンポーネント(またはそれらの文字列のショートカット)のインスタンス、またはそのリストを指定して、チャットボットへの追加の入力として使用。未レンダリングの場合、アコーディオン内に表示される。
additional_inputs_
accordion_name
str None [廃止予定] 将来のGradioのバージョンで削除されます。代わりにadditional_inputs_accordionパラメータを使用してください。
additional_inputs_
accordion
str | Accordion | None None 文字列が指定された場合、追加の入力を含むgr.Accordionのラベル。gr.Accordionオブジェクトが指定されると、追加の入力を保持するコンテナの他のプロパティを構成できる。デフォルトはgr.Accordion(label="Additional Inputs", open=False)。このパラメータは、additional_inputsが指定された場合にのみ使用されます。
examples list[str] | None None 関数のサンプル入力。指定された場合、チャットボットの下に表示され、クリックしてチャットボットの入力をポピュレートできる。
cache_examples bool | None None Trueの場合、サーバーで例を高速に実行するために例をキャッシュ。HuggingFace SpacesのデフォルトオプションはTrue。他の場所のデフォルトオプションはFalse。
title str | None None インターフェースのタイトル。指定された場合、チャットボットの上に大きなフォントで表示される。ブラウザウィンドウで開かれた場合のタブのタイトルとしても使用。
description str | None None インターフェースの説明。指定された場合、タイトルの下に通常のフォントで表示される。MarkdownおよびHTMLコンテンツを受け入れる。
theme Theme | str | None None 使用するテーマ。gradio.themesから読み込む。
css str | None None カスタムのCSSまたはCSSファイルへのパス。
analytics_enabled bool | None None 基本的なテレメトリを許可するかどうか。Noneの場合、GRADIO_ANALYTICS_ENABLED環境変数が定義されていればそれを使用し、それ以外の場合はTrueにデフォルト。
submit_btn str | None | Button "Submit" 提出ボタンに表示されるテキスト。Noneの場合、ボタンは表示されない。Buttonオブジェクトが指定された場合、そのボタンが使用される。
stop_btn str | None | Button "Stop" ストリーミング応答の場合、提出ボタンまたはretry_btnがクリックされているときに提出ボタンの代わりになるストップボタンに表示されるテキスト。ストップボタンをクリックすると、チャットボットの応答が停止します。Noneに設定されている場合、ストップボタンの機能はチャットボットに表示されません。Buttonオブジェクトが指定された場合、そのボタンがストップボタンとして使用されます。
retry_btn str | None | Button "🔄 Retry" リトライボタンに表示されるテキスト。Noneの場合、ボタンは表示されない。Buttonオブジェクトが指定された場合、そのボタンが使用される。
undo_btn str | None | Button "↩️ Undo" 最後の削除ボタンに表示されるテキスト。Noneの場合、ボタンは表示されない。Buttonオブジェクトが指定された場合、そのボタンが使用される。
clear_btn str | None | Button "🗑️ Clear" クリアボタンに表示されるテキスト。Noneの場合、ボタンは表示されない。Buttonオブジェクトが指定された場合、そのボタンが使用される。
autofocus bool True Trueの場合、ページの読み込み時にテキストボックスにフォーカスを当てる。

チャットボットの中身をカスタマイズする

チャットボットの中身(処理内容)は、gr.ChatInterface()の引数に指定する関数で定義します。

今回の場合はchatbot_response()がその関数になります。

実際に指定されている関数の引数messageとhistoryを使ってみましょう。

  • message: ユーザーからのメッセージ文字列(str)
  • history: ユーザーとチャットボットのやり取りの履歴(list[list[str, str]])

historyで過去のやり取りの履歴を取得できるので、それを使ってチャットボットの応答を変えることができます。

今回はchatbotの解答リストを作成して、その中から使われていない解答をランダムに返すようにしてみます。

chatbot.py
import gradio as gr
import random

chatbot_responses = ["はい", "いいえ", "わかりません", "もう一度言ってください"]

def chatbot_response(message, history):
    for h in history:
        chatbot_responses.remove(h[1])
    return random.choice(chatbot_responses)

app = gr.ChatInterface(chatbot_response)
app.launch()

これ以外の使い方としては、messageやhistoryを外部APIに送信してその結果を返すようにすることもできます。

例として下記の記事では、OpenAIのAPIを使ってChatGPTライクなチャットボットを作っています。

ChatInterfaceを使ってチャットボットの見た目をカスタマイズする

ChatInterfaceの引数を指定することで、チャットボットの見た目をカスタマイズすることができます。

一例として、チャットボットのタイトルを変更してみます。

chatbot.py
import gradio as gr

def chatbot_response(message, history):
    return "いいえ"

app = gr.ChatInterface(chatbot_response, 
                       title="タイトルを変更しました。"
                      )
app.launch()

その他については引数の説明を参照してください。

もっとカスタマイズしたい場合はChatbotコンポーネントを使う

ChatInterfaceでも、多少のカスタマイズは出来ますが幅が限られてしまいます。

よりカスタマイズしたい場合は、Chatbotコンポーネントを使います。

Chatbotコンポーネントの使い方は下記の記事を参照してください。

参考