Spaces:
Running
Running
File size: 3,927 Bytes
d5968d4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import gradio as gr
import json
import random
from transformers import pipeline
generator = pipeline("text-generation", model="gpt2", max_length=60)
with open("wordlist.json") as wordlist_json:
wordlist = json.load(wordlist_json)
def autocomplete(text):
end_text = " ".join(text.split(" ")[-30:-1])
generated_text = generator(
end_text, return_full_text=False, clean_up_tokenization_spaces=True
)[0]["generated_text"]
generated_text = generated_text.replace("\n", "")
return generated_text
with gr.Blocks() as demo:
gr.Markdown(
"""
# GPT Golf
How many turns will it take you to get GPT to say the target word?
Here are the rules of the game:
- Your goal is to get GPT to say a target word in as few turns as possible.
- Each turn, you add up to 5 words to its dialogue.
- When you click submit, your prompt will be added to the dialogue. Then GPT will also add to the dialogue.
- You can't say the target word, but as soon as GPT does, you win!
"""
)
error_box = gr.Textbox(label="Error", elem_id="error", visible=False)
dialogue_var = gr.Variable(value=[])
start_btn = gr.Button("Start", variant="primary")
with gr.Column(visible=False) as game:
with gr.Row() as stats:
target_word_box = gr.Textbox(
label="Target Word", elem_id="target", interactive=False
)
num_turns_box = gr.Number(0, label="# of Turns so Far", elem_id="num_turns")
dialogue_box = gr.HighlightedText(label="Dialogue")
with gr.Column() as prompt_set:
prompt_box = gr.Textbox(label="Prompt", placeholder="Enter Next 5 Words...")
submit_btn = gr.Button("Submit").style(full_width=True)
win = gr.HTML(
"<div style='width: 100%; padding: 3rem; font-size: 4rem; color: green; text-align: center; font-weight: bold'>You Won!</div>",
visible=False,
)
def start_game():
return {
start_btn: gr.update(visible=False),
game: gr.update(visible=True),
target_word_box: random.choice(wordlist),
}
start_btn.click(start_game, inputs=None, outputs=[start_btn, game, target_word_box])
def submit(prompt, target_word, dialogue, num_turns):
if len(prompt.split(" ")) > 5:
return {
error_box: gr.update(
visible=True, value="Prompt must be a maximum of 5 words!"
)
}
if target_word in prompt:
return {
error_box: gr.update(
visible=True, value="You can't use the target word in the prompt!"
)
}
dialogue.append(prompt)
response = autocomplete(" ".join(dialogue))
dialogue.append(response)
labeled_dialogue = [
(text, None if i % 2 == 0 else "gpt") for i, text in enumerate(dialogue)
]
if target_word in response:
return {
dialogue_box: labeled_dialogue,
prompt_set: gr.update(visible=False),
win: gr.update(visible=True),
num_turns_box: num_turns + 1,
dialogue_var: dialogue,
error_box: gr.update(visible=False),
}
else:
return {
dialogue_box: labeled_dialogue,
prompt_box: "",
num_turns_box: num_turns + 1,
dialogue_var: dialogue,
error_box: gr.update(visible=False),
}
submit_btn.click(
submit,
inputs=[prompt_box, target_word_box, dialogue_var, num_turns_box],
outputs=[
dialogue_var,
dialogue_box,
prompt_box,
num_turns_box,
error_box,
prompt_set,
win,
],
)
demo.launch()
|