tregu0458's picture
Update app.py
519198a verified
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])
# URLパラメータからAPIキーを取得
demo.load(lambda x: x, api_key, api_key, js=get_window_url_params())
if __name__ == "__main__":
demo.queue()
demo.launch()