Anonymous
format and clean code
d27fe32
import os
import gradio as gr
from openai import OpenAI
from generate_prompt import construct_generic_prompt, recommend_config
QA = "QA"
SUMMARIZATION = "Summarization"
NLI = "NLI"
NER = "NER"
tasks_datasets = {
QA: ["XQuad", "Indicqa"],
SUMMARIZATION: ["XLSum", "HeSum"],
NLI: ["XNLI"],
NER: ["MasakaNER", "WikiANN"],
}
# List of all languages
languages = [
"English",
"Spanish",
"French",
"German",
"Chinese",
"Japanese",
"Korean",
"Italian",
"Portuguese",
"Russian",
"Arabic",
"Hindi",
"Bengali",
"Turkish",
"Vietnamese",
"Polish",
"Dutch",
"Indonesian",
"Malay",
"Thai",
"Greek",
"Swedish",
"Hungarian",
"Finnish",
"Danish",
"Norwegian",
"Hebrew",
"Czech",
"Slovak",
"Bulgarian",
"Romanian",
"Serbian",
"Croatian",
"Ukrainian",
"Lithuanian",
"Latvian",
"Estonian",
"Filipino",
"Icelandic",
"Irish",
"Welsh",
"Maltese",
"Swahili",
"Zulu",
"Afrikaans",
]
def get_datasets(task):
return tasks_datasets.get(task, [])
with gr.Blocks(theme=gr.themes.Soft()) as demo:
with gr.Row():
gr.Markdown("## Multilingual Prompt Generator")
with gr.Accordion(label="Task Details", open=True):
with gr.Row():
task = gr.Dropdown(
label="Task", choices=list(tasks_datasets.keys()), value=QA
)
language = gr.Dropdown(
label="Source Language", choices=languages, value="English"
)
model_type = gr.Dropdown(
label="Model Type",
choices=["Multilingual", "Standard"],
value="Multilingual",
)
config_recommendation = gr.Button("Recommend Configuration")
with gr.Row():
config_prompt = gr.Textbox(
label="Recommended Configuration",
interactive=False,
placeholder="Recommended Configuration for this scenerio",
)
with gr.Row():
with gr.Accordion(label="Prompt Template", open=True):
with gr.Column(scale=2):
# Set the same background style across all components
with gr.Group(elem_id="prompt-background"):
instruction = gr.Textbox(label="Instruction")
with gr.Row(variant="panel"):
zero_shot = gr.Checkbox(label="Zero Shot Setting", value=False)
with gr.Accordion(
"Few Shot - Select Type of Examples ",
open=False,
visible=True,
) as few_shot:
dataset = gr.Dropdown(
label="Dataset",
choices=tasks_datasets[QA],
value="XlSum",
)
num_examples = gr.Slider(
label="Number of examples in context",
minimum=1,
maximum=10,
step=1,
value=3,
)
with gr.Row(equal_height=True, variant="panel"):
with gr.Accordion(
label="Language Component Selection", open=False
):
prefix_selection = gr.Dropdown(
["English", "Source"],
label="instruction",
value="English",
)
context_selection = gr.Dropdown(
["English", "Source"], label="context", value="English"
)
examples_selection = gr.Dropdown(
["English", "Source"], label="examples", value="English"
)
output_selection = gr.Dropdown(
["English", "Source"], label="output", value="English"
)
# Accordion for Few Shot example selection
with gr.Accordion(label="Prompt Input Data", open=False):
question = gr.Textbox(label="Question", visible=True)
context = gr.Textbox(label="Context", visible=True)
text = gr.Textbox(label="Text", visible=False)
sentence = gr.Textbox(label="Sentence", visible=False)
hypothesis = gr.Textbox(label="Hypothesis", visible=False)
premise = gr.Textbox(label="Premise", visible=False)
generate_button = gr.Button("Generate Prompt")
with gr.Row():
prompt = gr.Textbox(
label="Generated Prompt",
interactive=False,
placeholder="Generated prompt will appear here.",
)
def update_datasets(selected_task):
return gr.Dropdown(choices=get_datasets(selected_task))
def toggle_task_inputs(selected_task):
if selected_task == QA:
return (
gr.update(visible=True),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
)
elif selected_task == SUMMARIZATION:
return (
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
)
elif selected_task == NER:
return (
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
)
else:
return (
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=True),
)
def toggle_num_examples(zero_shot_value):
# If zero_shot is True, hide the num_examples slider
return gr.update(visible=not zero_shot_value)
def update_language_selection(language):
return (
gr.update(choices=list({"English", language})),
gr.update(choices=list({"English", language})),
gr.update(choices=list({"English", language})),
gr.update(choices=list({"English", language})),
)
def generatePrompt(
instruction,
num_examples,
zero_shot,
task,
selected_language,
dataset,
prefix_selection,
context_selection,
examples_selection,
output_selection,
text,
question,
context,
sentence,
hypothesis,
premise,
):
config = {
"prefix": str.lower(prefix_selection),
"input": str.lower(context_selection),
"context": str.lower(examples_selection),
"output": str.lower(output_selection),
}
if task == QA:
text_example = {
"context": context,
"question": question,
}
elif task == SUMMARIZATION:
text_example = {
"text": text,
}
elif task == NER:
text_example = {"tokens": sentence, "ner_tags": ""}
else:
text_example = {"hypothesis": hypothesis, "premise": premise}
prompt = construct_generic_prompt(
task,
instruction,
text_example,
zero_shot,
num_examples,
selected_language,
dataset,
config,
)
return prompt
def respond(
message,
openai_key,
url,
chat_history,
model,
config_input,
config_prefix,
config_context,
config_output,
task,
dataset,
language,
num_examples,
zero_shot,
):
os.environ["OPENAI_API_KEY"] = openai_key
client = OpenAI()
config = {
"input": config_input,
"prefix": config_prefix,
"context": config_context.split(", "),
"output": config_output,
"language": language,
"num_examples": num_examples,
"zero_shot": zero_shot,
}
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": message},
{"type": "image_url", "image_url": url},
{"type": "config", "config": config},
{"type": "task", "text": task},
{"type": "dataset", "text": dataset},
],
},
],
max_tokens=1000,
)
out = response.choices[0].message.content
chat_history.append((message, out))
return "", chat_history
# Bind functions to dropdown changes and button click
# task.change(fn=update_datasets, outputs=dataset)
language.change(
fn=update_language_selection,
inputs=language,
outputs=[
prefix_selection,
context_selection,
examples_selection,
output_selection,
],
)
zero_shot.change(fn=toggle_num_examples, inputs=zero_shot, outputs=few_shot)
zero_shot.change(fn=toggle_num_examples, inputs=zero_shot, outputs=num_examples)
task.change(fn=update_datasets, inputs=task, outputs=dataset)
task.change(
fn=toggle_task_inputs,
inputs=task,
outputs=[
question,
context,
text,
sentence,
hypothesis,
premise,
],
)
generate_button.click(
generatePrompt,
inputs=[
instruction,
num_examples,
zero_shot,
task,
language,
dataset,
prefix_selection,
context_selection,
examples_selection,
output_selection,
text,
question,
context,
sentence,
hypothesis,
premise,
],
outputs=[prompt],
)
config_recommendation.click(
recommend_config, inputs=[task, language, model_type], outputs=[config_prompt]
)
if __name__ == "__main__":
demo.launch(share=True)