Spaces:
Runtime error
Runtime error
import os | |
import uuid | |
import gradio as gr | |
from llmriddles.questions import QuestionExecutor | |
from llmriddles.questions import list_ordered_questions | |
_QUESTION_IDS = {} | |
_QUESTIONS = list_ordered_questions() | |
_LANG = os.environ.get('QUESTION_LANG', 'cn') | |
_LLM = os.environ.get('QUESTION_LLM', 'chatgpt') | |
if _LANG == "cn": | |
requirement_ph = """ | |
欢迎来玩LLM Riddles! | |
你将通过本游戏对语言大模型产生更深刻的理解。 | |
在本游戏中,你需要构造一个提给一个语言大模型的问题,使得它回复的答案符合要求。 | |
点击\"下一题\"开始游戏 | |
""" | |
requirement_label = "游戏须知" | |
question_ph = "你对大语言模型的提问" | |
question_label = "提问栏" | |
answer_ph = "大语言模型的回答" | |
answer_label = "回答栏" | |
submit_label = "提交" | |
next_label = "下一题" | |
api_ph = "你个人的大语言模型 API Key (例如:ChatGPT)" | |
api_label = "API key" | |
predict_label = "结果正确性" | |
explanation_label = "结果解释" | |
game_cleared_label = "祝贺!你已成功通关!" | |
correct_label = "正确" | |
wrong_label = "错误" | |
api_error_info = "请在提交问题之前先输入你的 API Key" | |
try_again_label = "再玩一次" | |
elif _LANG == "en": | |
requirement_ph = """ | |
Welcome to LLM Riddles! | |
In this game, you'll gain a deeper understanding of language models. | |
Your challenge is to create a question to ask a language model in a way that the answer it provides meets specific criteria. | |
Click \'Next\' to Start | |
""" | |
requirement_label = "Requirements" | |
question_ph = "Your Question for LLM" | |
question_label = "Question" | |
answer_ph = "Answer From LLM" | |
answer_label = "Answer" | |
submit_label = "Submit" | |
next_label = "Next" | |
api_ph = "Your API Key (e.g. ChatGPT)" | |
api_label = "API key" | |
predict_label = "Correctness" | |
explanation_label = "Explanation" | |
game_cleared_label = "Congratulations!" | |
correct_label = "Correct" | |
wrong_label = "Wrong" | |
api_error_info = "Please Enter API Key Before Submitting Question." | |
try_again_label = "Try Again" | |
else: | |
raise KeyError("invalid _LANG: {}".format(_LANG)) | |
def _need_api_key(): | |
return _LLM == 'chatgpt' | |
def _get_api_key_cfgs(api_key): | |
if _LLM == 'chatgpt': | |
return {'api_key': api_key} | |
else: | |
return {} | |
if __name__ == '__main__': | |
with gr.Blocks(theme='ParityError/Interstellar') as demo: | |
with gr.Row(): | |
with gr.Column(): | |
gr_requirement = gr.TextArea(placeholder=requirement_ph, label=requirement_label) | |
gr_question = gr.TextArea(placeholder=question_ph, label=question_label) | |
gr_answer = gr.TextArea(placeholder=answer_ph, label=answer_label) | |
gr_submit = gr.Button(submit_label, interactive=True) | |
with gr.Column(): | |
gr_api_key = gr.Text(placeholder=api_ph, label=api_label, type='password', | |
visible=_need_api_key()) | |
gr_uuid = gr.Text(value='', visible=False) | |
gr_predict = gr.Label(label=predict_label) | |
gr_explanation = gr.TextArea(label=explanation_label) | |
gr_next = gr.Button(next_label) | |
def _next_question(uuid_): | |
if not uuid_: | |
uuid_ = str(uuid.uuid4()) | |
global _QUESTION_IDS | |
_qid = _QUESTION_IDS.get(uuid_, -1) | |
_qid += 1 | |
_QUESTION_IDS[uuid_] = _qid | |
if _qid >= len(_QUESTIONS): | |
del _QUESTION_IDS[uuid_] | |
return game_cleared_label, '', '', {}, '', \ | |
gr.Button(submit_label, interactive=True), \ | |
gr.Button(try_again_label, interactive=True), \ | |
'' | |
else: | |
executor = QuestionExecutor(_QUESTIONS[_qid], _LANG) | |
return executor.question_text, '', '', {}, '', \ | |
gr.Button(submit_label, interactive=True), \ | |
gr.Button(next_label, interactive=False), \ | |
uuid_ | |
gr_next.click( | |
fn=_next_question, | |
inputs=[gr_uuid], | |
outputs=[ | |
gr_requirement, gr_question, gr_answer, | |
gr_predict, gr_explanation, gr_submit, gr_next, gr_uuid, | |
], | |
) | |
def _submit_answer(qs_text: str, api_key: str, uuid_: str): | |
if _need_api_key() and not api_key: | |
raise gr.Error(api_error_info) | |
_qid = _QUESTION_IDS[uuid_] | |
executor = QuestionExecutor( | |
_QUESTIONS[_qid], _LANG, | |
llm=_LLM, llm_cfgs=_get_api_key_cfgs(api_key) if _need_api_key() else {} | |
) | |
answer_text, correctness, explanation = executor.check(qs_text) | |
labels = {correct_label: 1.0} if correctness else {wrong_label: 1.0} | |
if correctness: | |
return answer_text, labels, explanation, gr.Button(next_label, interactive=True), uuid_ | |
else: | |
return answer_text, labels, explanation, gr.Button(next_label, interactive=False), uuid_ | |
gr_submit.click( | |
_submit_answer, | |
inputs=[gr_question, gr_api_key, gr_uuid], | |
outputs=[gr_answer, gr_predict, gr_explanation, gr_next, gr_uuid], | |
) | |
demo.launch() | |