mirror of
https://github.com/modelscope/modelscope.git
synced 2025-12-16 16:27:45 +01:00
* format chatglm output * format code and add one problem to llm riddle * fix app warning * refine app.py and add test fn for validate fn
224 lines
8.0 KiB
Python
224 lines
8.0 KiB
Python
import functools
|
||
import inspect
|
||
import os
|
||
import random
|
||
import re
|
||
|
||
import gradio as gr
|
||
from challenges.ch1 import challenge1
|
||
from challenges.ch2 import challenge2
|
||
from challenges.ch3 import challenge3
|
||
from challenges.ch4 import challenge4
|
||
from llm import create_model
|
||
from PIL import Image, ImageDraw, ImageFont
|
||
|
||
model_cache = {}
|
||
|
||
# 定义关卡信息和验证逻辑
|
||
challenges = [
|
||
challenge1,
|
||
challenge2,
|
||
challenge3,
|
||
challenge4,
|
||
]
|
||
|
||
CONGRATS_STR = '所有挑战完成!👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻'
|
||
CONGRATS_QUESTION = f'<center><font size=4>{CONGRATS_STR}</center>\n\n <center><font size=3> </center>'
|
||
|
||
SHARE_CHALLENGES_HINT = [
|
||
'小试牛刀新手上路', '数字玩家已经上线', '巅峰对决,你就是提示词高手', '无人之境,胜利就在前方', '哇塞,我冲出了LLM的重围'
|
||
]
|
||
|
||
|
||
def get_problem(challenge_idx, problem_idx):
|
||
problems = challenges[challenge_idx]['problems']
|
||
return problems[problem_idx]
|
||
|
||
|
||
def update_challenge_info(current_chapter_index, current_challenge_index):
|
||
return get_problem(current_chapter_index,
|
||
current_challenge_index)['description']
|
||
|
||
|
||
def update_question_info(current_chapter_index, current_challenge_index):
|
||
|
||
global challenges
|
||
current_chapter = challenges[current_chapter_index]
|
||
challenge = get_problem(current_chapter_index, current_challenge_index)
|
||
question_info = f"""\n<center><font size=4>{current_chapter["name"]}""" \
|
||
f"""</center>\n\n <center><font size=3>{challenge["title"]}</center>"""
|
||
return question_info
|
||
|
||
|
||
def validate_challenge(response, input, state, generate_response):
|
||
if 'success' in state:
|
||
return CONGRATS_STR, CONGRATS_QUESTION, ''
|
||
assert 'current_chapter_index' in state, 'current_chapter_index not found in state'
|
||
assert 'current_challenge_index' in state, 'current_challenge_index not found in state'
|
||
current_chapter_index = state['current_chapter_index']
|
||
current_challenge_index = state['current_challenge_index']
|
||
# 获取当前章节
|
||
current_chapter = challenges[current_chapter_index]
|
||
# 获取当前挑战
|
||
challenge = current_chapter['problems'][current_challenge_index]
|
||
|
||
validate_fn = challenge['validator']
|
||
params = inspect.signature(validate_fn).parameters
|
||
if 'generate_response' in params:
|
||
valid_result = validate_fn(response, input, generate_response)
|
||
else:
|
||
valid_result = validate_fn(response, input)
|
||
|
||
if valid_result:
|
||
challenge_result = '挑战成功!进入下一关。'
|
||
# 检查是否还有更多挑战在当前章节
|
||
if current_challenge_index < len(current_chapter['problems']) - 1:
|
||
# 移动到当前章节的下一个挑战
|
||
current_challenge_index += 1
|
||
else:
|
||
# 如果当前章节的挑战已经完成,移动到下一个章节
|
||
if current_chapter_index < len(challenges) - 1:
|
||
current_challenge_index = 0
|
||
current_chapter_index += 1
|
||
else:
|
||
state['success'] = True
|
||
challenge_result = '所有挑战完成!'
|
||
|
||
else:
|
||
challenge_result = '挑战失败,请再试一次。'
|
||
state['current_chapter_index'] = current_chapter_index
|
||
state['current_challenge_index'] = current_challenge_index
|
||
print('update state: ', state)
|
||
if 'success' in state:
|
||
return CONGRATS_STR, CONGRATS_QUESTION, ''
|
||
else:
|
||
return challenge_result, \
|
||
update_question_info(current_chapter_index, current_challenge_index), \
|
||
update_challenge_info(current_chapter_index, current_challenge_index)
|
||
|
||
|
||
def generate_response(input, model_name):
|
||
if model_name in model_cache:
|
||
model = model_cache[model_name]
|
||
else:
|
||
model = create_model(model_name)
|
||
model_cache[model_name] = model
|
||
|
||
try:
|
||
return model(input)
|
||
except RuntimeError as e:
|
||
# if exception happens, print error in log and return empty str
|
||
print('error', e)
|
||
return ''
|
||
|
||
|
||
def on_submit(input, model_name, state):
|
||
# model_name = os.environ.get('MODEL', 'qwen-plus')
|
||
name_map = {
|
||
'qwen-max': 'qwen-max',
|
||
'qwen-plus': 'qwen-plus',
|
||
'chatglm-turbo': 'chatglm_turbo',
|
||
}
|
||
gen_fn = functools.partial(
|
||
generate_response, model_name=name_map[model_name])
|
||
response = gen_fn(input)
|
||
history = [(input, response)]
|
||
print(history)
|
||
challenge_result, question_info, challenge_info = validate_challenge(
|
||
response, input, state, gen_fn)
|
||
return challenge_result, history, question_info, challenge_info
|
||
|
||
|
||
def generate_share_image(state):
|
||
share_state = state['current_chapter_index']
|
||
if share_state > 3:
|
||
share_state = 3
|
||
if 'success' in state:
|
||
share_state = 4 # 全部通关为 4
|
||
|
||
img_pil = Image.open(f'assets/background{share_state}.png')
|
||
# 设置需要显示的字体
|
||
fontpath = 'assets/font.ttf'
|
||
font = ImageFont.truetype(fontpath, 48)
|
||
draw = ImageDraw.Draw(img_pil)
|
||
# 绘制文字信息
|
||
draw.text((70, 1000),
|
||
SHARE_CHALLENGES_HINT[share_state],
|
||
font=font,
|
||
fill=(255, 255, 255))
|
||
if share_state == 4:
|
||
share_chapter_text = '顺利闯过了全部关卡'
|
||
else:
|
||
share_chapter_text = f"我顺利闯到第 {state['current_chapter_index']+1}-{state['current_challenge_index']+1} 关"
|
||
draw.text((70, 1080), share_chapter_text, font=font, fill=(255, 255, 255))
|
||
draw.text((70, 1160), '你也来挑战一下吧~', font=font, fill=(255, 255, 255))
|
||
|
||
return gr.Image.update(visible=True, value=img_pil)
|
||
|
||
|
||
def create_app():
|
||
# Gradio界面构建
|
||
block = gr.Blocks()
|
||
|
||
with block as demo:
|
||
current_chapter_index = 0
|
||
current_challenge_index = 0
|
||
state = gr.State(
|
||
dict(
|
||
current_challenge_index=current_challenge_index,
|
||
current_chapter_index=current_chapter_index))
|
||
|
||
gr.Markdown("""<center><font size=6>完蛋!我被LLM包围了!</center>""")
|
||
gr.Markdown("""<font size=3>欢迎来玩LLM Riddles复刻版:完蛋!我被LLM包围了!
|
||
|
||
你将通过本游戏对大型语言模型产生更深刻的理解。
|
||
|
||
在本游戏中,你需要构造一个提给一个大型语言模型的问题,使得它回复的答案符合要求。""")
|
||
|
||
model_selector = gr.Dropdown(
|
||
label='选择模型',
|
||
choices=['qwen-max', 'qwen-plus', 'chatglm-turbo'],
|
||
value='qwen-max')
|
||
question_info = gr.Markdown(
|
||
update_question_info(current_chapter_index,
|
||
current_challenge_index))
|
||
challenge_info = gr.Textbox(
|
||
value=update_challenge_info(current_chapter_index,
|
||
current_challenge_index),
|
||
label='当前挑战',
|
||
interactive=False)
|
||
challenge_result = gr.Textbox(label='挑战结果', interactive=False)
|
||
chatbot = gr.Chatbot(label='llm', elem_classes='control-height')
|
||
message = gr.Textbox(lines=2, label='输入')
|
||
|
||
with gr.Row():
|
||
submit = gr.Button('🚀 发送')
|
||
shareBtn = gr.Button('💯 分享成绩')
|
||
|
||
shareImg = gr.Image(label='分享成绩', visible=False, width=400)
|
||
|
||
submit.click(
|
||
on_submit,
|
||
inputs=[message, model_selector, state],
|
||
outputs=[challenge_result, chatbot, question_info, challenge_info])
|
||
shareBtn.click(
|
||
generate_share_image, inputs=[state], outputs=[shareImg])
|
||
|
||
gr.HTML("""
|
||
<div style="text-align: center;">
|
||
<span>
|
||
Powered by <a href="https://dashscope.aliyun.com/" target="_blank">
|
||
<img src=
|
||
"//img.alicdn.com/imgextra/i4/O1CN01SgKFXM1qLQwFvk6j5_!!6000000005479-2-tps-99-84.png"
|
||
style="display: inline; height: 20px; vertical-align: bottom;"/>DashScope
|
||
</a>
|
||
</span>
|
||
</div>
|
||
""")
|
||
|
||
demo.queue(concurrency_count=10).launch(height=800, share=True)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
create_app()
|