Gradioで1つのTextboxから複数のChatbotに同じメッセージを送る

Gradioでチャットボットを実装して色々なLLMやプロンプトで遊んでいた時、同じテキストを入力した場合にLLMの種類やプロンプト設計で結果がどのように変わるのかを比較したくなった。

1つのTextboxから複数のChatbotに同じメッセージを送れるようになれば簡単に実現できるのではと思ったので実装。

調べた限り似たような事例を見つけることが出来なかったので備忘録。

こちらが完成したデモ。

Gradio Playground
Play Around with Gradio Demos
Screenshot

まずはチュートリアルから始める。

Creating A Custom Chatbot With Blocks
A Step-by-Step Gradio Tutorial
import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.ClearButton([msg, chatbot])

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        chat_history.append((message, bot_message))
        time.sleep(2)
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])

demo.launch()

gr.Chatbotを調べる。

Gradio Chatbot Docs
Creates a chatbot that displays user-submitted messages and responses. Supports a subset of Markdown including bold, ita...

Chatbotのinputもoutputもlist of listsで良さそう。

チュートリアルを見る限り、chat_historyのリストで会話履歴を保存している。

次に、gr.Textboxを見る。

Gradio Textbox Docs
Creates a textarea for user to enter string input or display string output.

下の方にevent listnerがあり、submitした時の引数がevent argumentsとして定義されている。

こちらはinputsもoutputsもlist of gradio.componentsとなっていればいいみたい。

以上から、1つのTextboxから複数のChatbotに同じメッセージを送るために必要なチュートリアルの改変は以下の通り。

・gr.Chatbotを複数定義する。

・1つのTextboxと複数のChatbotからlist of gradio.componentsを作り、msg.submitにいれる。

・respond関数の返り値をhistoryだけにする。

import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot1 = gr.Chatbot()
    chatbot2 = gr.Chatbot()
    msg = gr.Textbox()

  
    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        chat_history.append((message, bot_message))
        
        return chat_history

  
    def fn(*inputs):
        pair1 = (inputs[0], inputs[1])
        pair2 = (inputs[2], inputs[3])
      
        respond1 = respond(*pair1)
        respond2 = respond(*pair2)

        return ["", respond1, "", respond2]
      

    components = [msg, chatbot1, msg, chatbot2]

    msg.submit(fn, components, components)


demo.launch()

今回は2個のChatbotだったためpairやrespondは愚直に実装したが、本当forで書いた方が汎用性が高い。

respondの部分を各LLM毎に書き換えていけば、1つのメッセージでGPT、Claude、Gemini、HuggingFaceのモデルなどの出力を一気に確認することができる。

コメント

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