Gradioでチャットボットを実装して色々なLLMやプロンプトで遊んでいた時、同じテキストを入力した場合にLLMの種類やプロンプト設計で結果がどのように変わるのかを比較したくなった。
1つのTextboxから複数のChatbotに同じメッセージを送れるようになれば簡単に実現できるのではと思ったので実装。
調べた限り似たような事例を見つけることが出来なかったので備忘録。
こちらが完成したデモ。
まずはチュートリアルから始める。
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を調べる。
Chatbotのinputもoutputもlist of listsで良さそう。
チュートリアルを見る限り、chat_historyのリストで会話履歴を保存している。
次に、gr.Textboxを見る。
下の方に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のモデルなどの出力を一気に確認することができる。
コメント