Gradioの`ChatInterface`こと始め その2:システムプロンプト設定画面の追加
昨日の続きです。以下を参考にしながら進めました。
今回は、システムプロンプトの設定画面とtoken数とtemperatureの設定ができるようにしました。
先にスクリプト全体を出します。
import time
import gradio as gr
from mlx_lm import load, generate
model, tokenizer = load("PygmalionAI/pygmalion-2-13b")
chat_template = (
"{% for message in messages %}"
"{{'<|' + message['role'] + '|>' + message['content'] + '\n'}}"
"{% endfor %}"
"{% if add_generation_prompt %}"
"{{ '<|model|>\n' }}"
"{% endif %}"
)
def predict(message, history, system_message, token, temp_value):
prompt = []
for human, assistant in history:
prompt.append({'role': 'user', 'content': human})
prompt.append({'role': 'model', 'content': assistant})
prompt.append({'role': 'user', 'content': message})
inputs = tokenizer.apply_chat_template(prompt,
tokenize=False,
add_generation_prompt=True,
chat_template=chat_template)
full_prompt = f"<|system|>{system_message}\n{inputs}"
#print (f"入力される最終プロンプトはこんな感じ:\n{full_prompt}")
response = generate(model, tokenizer, prompt=full_prompt, temp = temp_value, max_tokens = token, verbose=False)
#return response.strip()
for i in range(len(response)):
time.sleep(0.05)
yield response[: i+1]
demo = gr.ChatInterface(predict,
title="Pygmalion-2-13b",
description="Good model for roleplay, fictional stories. Create system prompt at first.",
additional_inputs=[
gr.Textbox("Enter RP mode. Pretend to be {{char}} whose persona follows:\n{{persona}}\nYou shall reply to the user while staying in character, and generate long responses.", lines=5, max_lines=50, label="System Prompt"),
gr.Slider(100, 1024, value=250, label="Tokens"),
gr.Slider(0, 1, value=0.3, label="Temperture")
]
)
if __name__ == "__main__":
#demo.queue().launch()
demo.launch()
今回、使ったモデルは下記です。システムプロンプトを組み込むモデルなので取り上げてみました。
モデルの特徴としては、ロールプレイや創造的執筆に良いと書かれています。
あと注意点は、X-rateですので、18歳未満の人は使わないでください。
モデルカードの説明に従って、chat templateは以下としました。
chat_template = (
"{% for message in messages %}"
"{{'<|' + message['role'] + '|>' + message['content'] + '\n'}}"
"{% endfor %}"
"{% if add_generation_prompt %}"
"{{ '<|model|>\n' }}"
"{% endif %}"
)
引数に、system_message を使ってフルプロンプトを下記のように作りました。
full_prompt = f"<|system|>{system_message}\n{inputs}"
説明の順番が変かもしれませんが、下記の引数をとります。
def predict(message, history, system_message, token, temp_value):
このうち、messageとhistoryはデフォで、あと3つを引き渡す形です。
chatInterfaceのなかに下記の additional_inputs を使います。
additional_inputs=[
gr.Textbox("Enter RP mode. Pretend to be {{char}} whose persona follows:\n{{persona}}\nYou shall reply to the user while staying in character, and generate long responses.", lines=5, max_lines=50, label="System Prompt"),
gr.Slider(100, 1024, value=250, label="Tokens"),
gr.Slider(0, 1, value=0.3, label="Temperture")
]
)
この順番の並びで引き渡しができるようでした。
以下のaddtional Inputsという部分が追加されます。
展開したら、こんな感じです。
あとストリーミング表示もサンプルに従って追加してみました。
#return response.strip()
for i in range(len(response)):
time.sleep(0.05)
yield response[: i+1]
あと、demo.queue().launch() と demo.launch() の違いがわからなかったので、Claudeに尋ねたところの解説は以下です。
とりあえず、個人的にローカルLLMとして使うなら、demo.launch()で良いのかなと思いました。
あと、本当か嘘かわかりませんが、additional inputsで使えるコンポーネントの種類を尋ねたら、下記の一覧を出してくれました。
ドロップダウンメニューのボタンが使えると、前もって設定しておいたシステムプロンプトの選択ができると期待していますので、試してみたいと思っているところです。
あと、Ctrl + C ですぐに止まらないことが多いことに困っているところです。
#AI #AIとやってみた #やってみた #ローカルLLM #Gradio #MLX #Huggingface #大規模言語モデル