Gradioの`ChatInterface`こと始め その3:ドロップダウンの選択追加して、c4ai-command-r-v01を試してみる
Gradioの"ChatInterface"のこと始めの3です。
前回の続きで、additionの部分にドロップダウンが追加することをしてみました。
結論から言うと、以下のコードでできました。
additional_inputs=[
gr.Dropdown(
["Conversation", "Internet Search", "RAG"], value="Conversation", label="Model Mode",
info="Select the mode, Default is Conversation."
),
gr.Slider(100, 1024, value=250, label="Tokens"),
gr.Slider(0, 1, value=0.3, label="Temperture")
]
引数としては、message, history, の続きの順番で引き継がれます。
さて、ドロップダウンメニューのお試しとして、日本語の含まれた多言語LLMとして登場した、c4ai-command-r-v01 を使ってみます。
こちらですね。
ちょうど、mlx-communityに4bitバージョンがアップされていたので、こちらを使いました。
このモデルは日本語が使えるだけでなく、ツールが使えると言うことで、例としてinternet searchとRAGの例が載っています。他のツールについても追って発表があるようです。
ドロップダウンメニューの練習として、普通の会話と、インターネットサーチとRAGの3つの選択をするようにしました。
全体のコードは下記です。
remote_codeを実行する形でloadを設定してます。
import time
import gradio as gr
from mlx_lm import load, generate
# https://huggingface.co/mlx-community/c4ai-command-r-v01-4bit
model, tokenizer = load("mlx-community/c4ai-command-r-v01-4bit",
tokenizer_config={"trust_remote_code": True})
# define documents to ground on:
P_documents = [
{ "title": "Tall penguins", "text": "Emperor penguins are the tallest growing up to 122 cm in height." },
{ "title": "Penguin habitats", "text": "Emperor penguins only live in Antarctica."}
]
# Define tools available for the model to use:
tools = [
{
"name": "internet_search",
"description": "Returns a list of relevant document snippets for a textual query retrieved from the internet",
"parameter_definitions": {
"query": {
"description": "Query to search the internet with",
"type": 'str',
"required": True
}
}
},
{
'name': "directly_answer",
"description": "Calls a standard (un-augmented) AI chatbot to generate a response given the conversation history",
'parameter_definitions': {}
}
]
def predict(message, history, model_mode, token, temp_value):
prompt = []
for human, assistant in history:
prompt.append({'role': 'user', 'content': human})
prompt.append({'role': 'assistant', 'content': assistant})
prompt.append({'role': 'user', 'content': message})
#print (f"履歴の形はこんな感じ:\n {history}")
#print (f"promptの形はこんな感じ:\n {prompt}")
# render the tool use prompt as a string:
if model_mode == "Conversation":
inputs = tokenizer.apply_chat_template(prompt,
tokenize=False,
add_generation_prompt=True)
elif model_mode == "Internet Search":
inputs = tokenizer.apply_tool_use_template(prompt,
tools=tools,
tokenize=False, add_generation_prompt=True)
elif model_mode == "RAG":
inputs = tokenizer.apply_grounded_generation_template(prompt,
documents=P_documents,
citation_mode="accurate", # or"fast"
tokenize=False,
add_generation_prompt=True)
#full_prompt = f"<|system|>{system_message}\n{inputs}"
print (f"入力される最終プロンプトはこんな感じ:\n{inputs}")
response = generate(model, tokenizer, prompt=inputs, 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="mlx-community/c4ai-command-r-v01-4bit",
description="selct Conversation or Search or RAG mode in addition",
additional_inputs=[
gr.Dropdown(
["Conversation", "Internet Search", "RAG"], value="Conversation", label="Model Mode",
info="Select the mode, Default is Conversation."
),
gr.Slider(100, 1024, value=250, label="Tokens"),
gr.Slider(0, 1, value=0.3, label="temperature")
]
)
if __name__ == "__main__":
#demo .queue().launch()
demo.launch()
ドロップダウンメニュー部分はこんな感じに表示されます。
押すと、こんな感じで選べます。
会話モードでは普通に日本語でやり取りできます。
なかなか整った日本語が生成されます。まれに単語が英語のまま混じりますが、それでもかなりいい感じだと思います。
こんにちは、あなたは誰? 自己紹介してください。
人生の意味をメタファーやアナロジーを使って説明してください。
今は3月です。日本の春を待ち望む詩を書いてください。
なかなか端正な日本語が生成されてくる印象です。
さて、インターネットサーチモードは、サンプル通りJSON形式で出力されます。
アメリカの大統領選の様子を調べて。
Search about the election of the U.S. President.
RAGもサンプル通りの質問をしたら、サンプル文書にそった回答がでました。
Whats the biggest penguin in the world?
とは言え、ドキュメントにないこと(40キロとか)まで言っていますね(苦笑
ドキュメント内容は以下です。
さらに、ドキュメントにない一番小さなペンギンはと尋ねてみたら・・・
Whats the smallest penguin in the world?
存在しないドキュメント番号3を引っ張り出しながら、なかなか華麗に幻覚を生み出してきました(苦笑
4bitの量子化の所為でしょうか。登録したら、開発会社のほうでこのモデルを試せるようでしたが、登録までと思って試してません。
ぜひエネルギーのある人は上記で試してみてください。
あと、上記のスクリプトはhistoryを用いてプロンプトを作り上げているので、RAGモードからConversationモードに戻っても、RAGモードの出力形式で表示されたりしますので、普通に会話に戻りたかったら、Clearで履歴を消したほうがよいかと思います。
下は履歴を消さなくてもうまくいった例です。
じゃあ、普通の会話に戻って、日本のアニメについて紹介して。
ともあれ、整った日本語がでてくる多言語モデルとしてはいい線なのかもしれません。日本語と英語しか試してませんが・・・。
あと最後に、chat_templateの解説がHuggingfaceにちゃんと掲載されていました。こちらです。
P.S.
RAGでtemperatureを0にしたらどうかなと思いましたが、やっぱりダメでした。人間で一番背の高い人はと尋ねたら、ドキュメントを勝手に作って回答してきました。
#AI #AIとやってみた #やってみた #ローカルLLM #大規模言語モデル #Huggingface #mlx #MacbookPro #Gradio
この記事を最後までご覧いただき、ありがとうございます!もしも私の活動を応援していただけるなら、大変嬉しく思います。