|
|
import gradio as gr |
|
|
import anthropic |
|
|
|
|
|
LESSON_DATA = [ |
|
|
[1, "自己紹介してもらいましょう\n\n送信ボタンを押してください", "あなたの自己紹介して"], |
|
|
[2, "自己紹介しましょう", "私はAIの初学者です"], |
|
|
[3, "得意を聞いてみましょう", "あなたは何が得意ですか?"], |
|
|
[4, "やさしく説明してもらいましょう", "高校生レベルでAIのすごさをおしえてください"], |
|
|
[5, "たたき台を作ってもらいましょう", "高校生向けに、AIのすごさをプレゼンするための原稿をつくって。"], |
|
|
[6, "具体的にお願いしてみましょう", "高校生向けに、AIのすごさをプレゼンするための原稿をつくって。300文字以上"], |
|
|
[7, "あいまいなお願いも結構得意です", "なんかいい感じにAIの得意不得意を語って"], |
|
|
[8, "無茶振りをしてみましょう", "AIによる生産性向上の可能性を語って。\n\n## 制約 \n夏目漱石の文体で"], |
|
|
[9, "役割を与えましょう", "AIを活用して心の整理をしたいです。始め方を語って。\n\n## 役割 \nあなたはツンデレ美少女をロール・プレイするチャットボットです。"], |
|
|
[10, "具体例を与えましょう", "AIを活用して心の整理をしたいです。始め方を語って。\n\n## 役割 \nあなたはツンデレ美少女をロール・プレイするチャットボットです。\n\n## 具体例\nべ、べつにあんたのことなんて嫌いなんだから!"], |
|
|
[11, "調節しましょう", "もっとギャルっぽく。絵文字使うとか"], |
|
|
[12, "話を聞いてもらいましょう", "AIには役割を与えるのが大事なんだって"], |
|
|
[13, "まとめ", "今までの対話から、生成AIに与えるプロンプトのコツをまとめて"], |
|
|
] |
|
|
|
|
|
def get_window_url_params(): |
|
|
return """ |
|
|
function(url_params) { |
|
|
const params = new URLSearchParams(window.location.search); |
|
|
url_params = Object.fromEntries(params); |
|
|
return url_params['api_key']; |
|
|
} |
|
|
""" |
|
|
|
|
|
def fetch_message(df, num, direction): |
|
|
if 0 <= num + direction < len(df): |
|
|
row = df.iloc[num + direction] |
|
|
return f"## 第{row['id']}章 \n\n{row['message']}\n\n\n\n---", num + direction, row['prompt'] |
|
|
else: |
|
|
return "これ以上のメッセージはありません。", num, "" |
|
|
|
|
|
|
|
|
def create_prompt(instruction, num, tone, limit): |
|
|
return f"{instruction}\n## 制約条件\n- {num}文字以上\n- {tone}\n- {limit}\n" |
|
|
|
|
|
|
|
|
def respond(message, chat_history, system_prompt, model, api_key, temperature, max_tokens): |
|
|
try: |
|
|
client = anthropic.Anthropic(api_key=api_key) |
|
|
messages = [] |
|
|
for item in chat_history: |
|
|
if isinstance(item, tuple): |
|
|
usermessage = item[0] |
|
|
assistantmessage = item[1] |
|
|
elif isinstance(item, list): |
|
|
usermessage = item[0] |
|
|
assistantmessage = item[1] |
|
|
if isinstance(usermessage, str) and usermessage.startswith("[('"): |
|
|
usermessage = eval(usermessage)[0][1] |
|
|
assistantmessage = eval(assistantmessage)[0][1] |
|
|
else: |
|
|
continue |
|
|
|
|
|
messages.append({ |
|
|
"role": "user", |
|
|
"content": [ |
|
|
{ |
|
|
"type": "text", |
|
|
"text": usermessage |
|
|
} |
|
|
] |
|
|
}) |
|
|
messages.append({ |
|
|
"role": "assistant", |
|
|
"content": [ |
|
|
{ |
|
|
"type": "text", |
|
|
"text": assistantmessage |
|
|
} |
|
|
] |
|
|
}) |
|
|
|
|
|
messages.append( |
|
|
{ |
|
|
"role": "user", |
|
|
"content": [ |
|
|
{ |
|
|
"type": "text", |
|
|
"text": message |
|
|
} |
|
|
] |
|
|
} |
|
|
) |
|
|
bot_message = "" |
|
|
chat_history.append((message,bot_message)) |
|
|
with client.messages.stream( |
|
|
messages=messages, |
|
|
system=system_prompt, |
|
|
model=model, |
|
|
max_tokens=max_tokens, |
|
|
temperature=temperature, |
|
|
)as stream: |
|
|
for text in stream.text_stream: |
|
|
bot_message += text |
|
|
chat_history[-1]=(message, bot_message) |
|
|
yield chat_history |
|
|
except Exception as e: |
|
|
bot_message = str(e) |
|
|
chat_history.append((message, bot_message)) |
|
|
return chat_history |
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# 生成AIのプロンプト術を学ぶクイックスタートガイド") |
|
|
with gr.Tab("メイン"): |
|
|
with gr.Row(): |
|
|
with gr.Column(scale=13): |
|
|
with gr.Group(): |
|
|
with gr.Row(): |
|
|
button_back = gr.Button("前", scale=1, size="sm") |
|
|
number_now = gr.Number(value=0, show_label=False, scale=8) |
|
|
button_next = gr.Button("次", scale=1, size="sm") |
|
|
clear_button = gr.ClearButton(value='クリア') |
|
|
message = gr.Markdown() |
|
|
prompt_now = gr.Dropdown(choices=[row[2] for row in LESSON_DATA], allow_custom_value=True, label='プロンプト') |
|
|
with gr.Group(): |
|
|
slider_select = gr.Slider(minimum=100, maximum=1000, step=100, label='文字数', value=100) |
|
|
target = gr.Dropdown(choices=['高校生レベルで', '大学教授レベルで', '小学生レベルで'], label="むずかしさ", allow_custom_value=True) |
|
|
limit = gr.Dropdown(choices=['夏目漱石の文体で', '私のことを称賛する気持ちを持って', '私に対する改善点を3つ添えながら'], label="制約条件", allow_custom_value=True) |
|
|
with gr.Column("プロンプト作成", scale=21): |
|
|
chat = gr.Chatbot(height=680, show_copy_button=True, show_share_button=True, layout="panel", avatar_images=( |
|
|
"image/ahiruguchi_man.png", |
|
|
"image/ai.png" |
|
|
)) |
|
|
with gr.Group(): |
|
|
with gr.Row(): |
|
|
textbox_submit = gr.Textbox(placeholder="ここに入力できますよ", scale=5) |
|
|
button_submit = gr.Button("送信", scale=1) |
|
|
with gr.Tab("設定"): |
|
|
model = gr.Dropdown(choices=["claude-3-opus-20240229", "claude-3-sonnet-20240229", "claude-3-haiku-20240307"], label="モデル", value="claude-3-haiku-20240307") |
|
|
api_key = gr.Textbox(label="APIキー", type="password") |
|
|
temperature = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label="Temperature", value=0.7) |
|
|
max_tokens = gr.Slider(minimum=1000, maximum=4000, step=1, label="Max Tokens", value=1000) |
|
|
system_prompt = gr.Textbox("私の名前はクロードです。Anthropic社によって開発された人工知能アシスタントです。 lang:jp") |
|
|
df = gr.Dataframe(headers=["id", "message", "prompt"], value=LESSON_DATA) |
|
|
|
|
|
|
|
|
slider_select.change(create_prompt, [prompt_now, slider_select, target, limit], textbox_submit) |
|
|
target.change(create_prompt, [prompt_now, slider_select, target, limit], textbox_submit) |
|
|
limit.change(create_prompt, [prompt_now, slider_select, target, limit], textbox_submit) |
|
|
|
|
|
button_next.click(lambda df, num: fetch_message(df, num, 1), [df, number_now], [message, number_now, textbox_submit]) |
|
|
button_back.click(lambda df, num: fetch_message(df, num, -1), [df, number_now], [message, number_now, textbox_submit]) |
|
|
|
|
|
button_submit.click(respond, [textbox_submit, chat, system_prompt, model, api_key, temperature, max_tokens], chat) |
|
|
clear_button.add([chat, textbox_submit]) |
|
|
|
|
|
|
|
|
demo.load(lambda x: x, api_key, api_key, js=get_window_url_params()) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.queue() |
|
|
demo.launch() |