import gradio as gr import pandas as pd from llm import OpenAI3, OpenAI4 from question import generate block_css = """ .importantButton { background: linear-gradient(45deg, #7e0570,#5d1c99, #6e00ff) !important; border: none !important; } .importantButton:hover { background: linear-gradient(45deg, #ff00e0,#8500ff, #6e00ff) !important; border: none !important; }""" webui_title = "📚📚📚📚📚📚📚📚📚📚📚📚* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ☘️ * * *智能生题* * * ☘️ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *📚📚📚📚📚📚📚📚📚📚📚📚" llm_name_dict = {'chatgpt-3.5': 'OpenAI3', 'chatgpt-4': 'OpenAI4', 'chatglm—6b': 'ChatGLM'} kg = pd.read_excel('教材知识点.xlsx') qt = pd.read_excel('题型.xlsx') def llm_change(name): llm = eval(eval('llm_name_dict[name]'))() return llm def clear_screen(chatbot): return [[None, None]] def function_select(mode): if mode == "试题生成": return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False) elif mode == "试卷生成": return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False) elif mode == "阅读理解生成": return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), gr.update(visible=False) else: return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) def update_semesters(_publisher): df = kg[kg['教材'] == _publisher] _semesters = list(set(df['学期'])) _semesters.sort() return gr.inputs.Dropdown.update(choices=_semesters) def update_units(_publisher, _semester): df = kg[kg['教材'] == _publisher] df = df[df['学期'] == _semester] _units = list(set(df['进度'])) _units.sort() return gr.inputs.Dropdown.update(choices=_units) def update_material_and_skill(_publisher, _semester, _unit, _material_type): df = kg[kg['教材'] == _publisher] df = df[df['学期'] == _semester] df = df[df['进度'] == _unit] _materials = df[_material_type].to_list() _materials = list(set(_materials[0].split('\n'))) _materials.sort() if '' in _materials: _materials.pop(_materials.index('')) # _materials = ['全选', '随机'] + _materials df = qt[qt['材料类型'] == _material_type] _skills = list(set(df['能指'])) _skills.sort() return gr.inputs.Radio.update(choices=_materials, value=None), gr.inputs.Radio.update(choices=_skills, value=None),\ gr.inputs.Radio.update(choices=[], value=None), gr.inputs.Radio.update(choices=[], value=None), \ gr.inputs.Textbox.update(value='') def update_question_class(_material_type, _skill): df = qt[qt['材料类型'] == _material_type] df = df[df['能指'] == _skill] _question_class = list(set(df['一级题型'])) _question_class.sort() return gr.inputs.Dropdown.update(choices=_question_class, value=None), \ gr.inputs.Dropdown.update(choices=[], value=None), \ gr.inputs.Textbox.update(value=''), def update_question_type(_material_type, _skill, _question_class): df = qt[qt['材料类型'] == _material_type] df = df[df['能指'] == _skill] df = df[df['一级题型'] == _question_class] _question_type = list(set(df['二级题型'])) _question_type.sort() return gr.inputs.Dropdown.update(choices=_question_type) def update_question_example(_question_type): if _question_type: df = qt[qt['二级题型'] == _question_type] return df['样例'].to_list()[0] else: return '' def generate_questions(_model_mode, _material, _question_type, _question_num, _chatbot): questions = generate(materials=_material, q_type=_question_type, q_num=_question_num, model=_model_mode) response = _question_type + '\n\n' for i in range(len(questions)): q = questions[i] response = response + f'{i+1}_question:\n\n' + q['question'] + '\n\n' + f'{i+1}_answer:\n\n' +\ q['answer'] + '\n\n\n\n' _chatbot = _chatbot + [[None, response]] return _chatbot with gr.Blocks(css=block_css) as demo: gr.Markdown('\n\n\n\n') gr.Markdown(webui_title) gr.Markdown('\n\n\n\n') llm = gr.State('') # model_mode = gr.Radio(['chatgpt-3.5', "chatgpt-4", 'chatglm—6b'], label="请选择驱动模型") model_mode = gr.Radio(['chatgpt-3.5'], label="请选择驱动模型") model_mode.change(fn=llm_change, inputs=[model_mode], outputs=[llm]) # fun_mode = gr.Radio(["试题生成"], label="请选择功能模式", value="试题生成") # fun_mode = gr.Radio(["试题生成","试卷生成", "阅读理解生成", "作文批改"], label="请选择功能模式", value="试卷生成") qg = gr.Column(visible=True) pg = gr.Column(visible=False) rc = gr.Row(visible=False) aa = gr.Row(visible=False) # fun_mode.change(fn=function_select, inputs=[fun_mode], outputs=[qg, pg, rc, aa]) # progress.change(fn=llm_change, inputs=[model_mode], outputs=[llm]) with qg: with gr.Row(): with gr.Column(scale=10): publishers = list(set(kg['教材'])) publishers.sort() publisher = gr.inputs.Dropdown(label="版本", choices=publishers) semester = gr.inputs.Dropdown(label="学期", choices=[]) unit = gr.inputs.Dropdown(label="单元", choices=[]) material_type = gr.Radio(['词汇', '短语', '句子', '语法'], label="出题材料类型") material = gr.CheckboxGroup([], label="出题材料") skill = gr.Radio([], label="考察能力") question_class = gr.Radio([], label="题类") question_type = gr.Radio(label="题型", choices=[]) question_example = gr.Textbox('', label='题例') publisher.change(update_semesters, inputs=[publisher], outputs=[semester]) semester.change(update_units, inputs=[publisher, semester], outputs=[unit]) skill.change(update_question_class, inputs=[material_type, skill], outputs=[question_class, question_type, question_example]) question_class.change(update_question_type, inputs=[material_type, skill, question_class], outputs=[question_type]) question_type.change(update_question_example, inputs=[question_type], outputs=[question_example]) material_type.change(update_material_and_skill, inputs=[publisher, semester, unit, material_type], outputs=[material, skill, question_class, question_type, question_example]) # option_num = gr.Slider(0, 5, value=3, step=1, label="选项数量", interactive=True) question_num = gr.Slider(0, 5, value=1, step=1, label="题量", interactive=True) # question = gr.Textbox('', label='生成题目') generate_button = gr.Button('生成') with gr.Column(scale=10): chatbot = gr.Chatbot([[None, None]], elem_id="chat-box", show_label=False).style(height=1000) generate_button.click(generate_questions, inputs=[model_mode, material, question_type, question_num, chatbot], outputs=chatbot) # with pg: # # publisher = gr.inputs.Dropdown(label="教材版本", choices=textbooks) # semester = gr.inputs.Dropdown(label="教材版本", choices=['三年级上', '三年级下']) # progress = gr.Radio(['unit1', 'unit2', 'unit3', 'unit4', 'unit5', 'unit6', 'unit7', '期中', 'unit8', 'unit9', # 'unit10', 'unit11', 'unit12', 'unit13', 'unit14', '期末'], label="请选择教学进度") # # with gr.Row(): # # with gr.Column(scale=10): # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************word pronunciation**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # word_p1 = gr.Slider(0, # 5, # value=2, # step=1, # label="选择划线部分发音不同的单词", # interactive=True) # # word_p2 = gr.Slider(0, # 5, # value=1, # step=1, # label="选择与指定单词划线部分发音不同的单词", # interactive=True) # # word_p3 = gr.Slider(0, # 5, # value=2, # step=1, # label="以下划线字母哪个发/r/的音", # interactive=True) # # gr.Markdown('\n') # gr.Markdown('judge') # gr.Markdown('\n') # # word_p4 = gr.Slider(0, # 5, # value=1, # step=1, # label="判断下列单词划线部分读音是否相同", # interactive=True) # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************word spelling**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # word_s1 = gr.Slider(0, # 5, # value=2, # step=1, # label="选出拼写正确的单词", # interactive=True) # # word_s2 = gr.Slider(0, # 5, # value=1, # step=1, # label="选择正确的拼写补全单词", # interactive=True) # # word_s3 = gr.Slider(0, # 5, # value=2, # step=1, # label="看图,选出该图表示单词的首字母", # interactive=True) # # gr.Markdown('\n') # gr.Markdown('fill') # gr.Markdown('\n') # # word_s4 = gr.Slider(0, # 5, # value=1, # step=1, # label="根据图片补全单词", # interactive=True) # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************word meaning**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # word_m1 = gr.Slider(0, # 5, # value=2, # step=1, # label="挑选一组词中不同类的词", # interactive=True) # # word_m2 = gr.Slider(0, # 5, # value=1, # step=1, # label="挑选单词的正确释义", # interactive=True) # # word_m3 = gr.Slider(0, # 5, # value=2, # step=1, # label="选择可以替换划线部分的词", # interactive=True) # word_m4 = gr.Slider(0, # 5, # value=2, # step=1, # label="选择与图片相符的单词", # interactive=True) # # gr.Markdown('\n') # gr.Markdown('judge') # gr.Markdown('\n') # # word_m5 = gr.Slider(0, # 5, # value=1, # step=1, # label="判断单词中文意思是否正确", # interactive=True) # # word_m6 = gr.Slider(0, # 5, # value=1, # step=1, # label="判断下列单词是否属于同一类", # interactive=True) # # gr.Markdown('\n') # gr.Markdown('fill') # gr.Markdown('\n') # # word_m7 = gr.Slider(0, # 5, # value=1, # step=1, # label="根据汉语提示补全句子", # interactive=True) # # word_m8 = gr.Slider(0, # 5, # value=1, # step=1, # label="根据图片提示补全句子", # interactive=True) # # word_m9 = gr.Slider(0, # 5, # value=1, # step=1, # label="下厨下列单词的反义词", # interactive=True) # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************fixed phrase**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # phrase_f1 = gr.Slider(0, # 5, # value=2, # step=1, # label="请选择合适的词语将句子补充完整", # interactive=True) # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************sentence structure**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('fill') # gr.Markdown('\n') # # sentence_s1 = gr.Slider(0, # 5, # value=2, # step=1, # label="请将下列单词组成句子", # interactive=True) # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************sentence meaning**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('fill') # gr.Markdown('\n') # # sentence_s2 = gr.Slider(0, # 5, # value=2, # step=1, # label="请将下列汉语翻译成对应英语", # interactive=True) # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # sentence_s3 = gr.Slider(0, # 5, # value=2, # step=1, # label="选出正确的中文翻译", # interactive=True) # # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************名词所有格**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # grammar_1 = gr.Slider(0, # 5, # value=2, # step=1, # label="请选择正确的单词进行填空", # interactive=True) # # gr.Markdown('\n\n\n\n') # gr.Markdown('📚**************there be 句型**************📚') # gr.Markdown('\n\n\n\n') # # gr.Markdown('\n') # gr.Markdown('choice') # gr.Markdown('\n') # # grammar_2 = gr.Slider(0, # 5, # value=2, # step=1, # label="请选择正确的单词进行填空", # interactive=True) # # # gr.Markdown(f'试卷存储路径') # # paper_path = gr.Textbox(show_label=False, placeholder="请输入待生成试卷存放路径", # # value='.\\papers\\', lines=1).style(container=False) # # generate_button = gr.Button(value="生成试卷", visible=False) # # with gr.Column(scale=10): # # chatbot = gr.Chatbot([[None, None]], # elem_id="chat-box", # show_label=False).style(height=1000) # # generate_button.click(fn=generate_paper, # inputs=[progress, word_p1, word_p2, word_p3, word_p4, word_s1, word_s2, word_s3, word_s4, # word_m1, word_m2, word_m3, word_m4, word_m5, word_m6, word_m7, word_m8, word_m9, # phrase_f1, sentence_s1, sentence_s2, sentence_s3, grammar_1, grammar_2], # outputs=[chatbot]) # with rc: # # with gr.Column(scale=10): # chatbot = gr.Chatbot([[None, None]], # elem_id="chat-box", # show_label=False).style(height=800) # clear_button = gr.Button(value="清屏") # clear_button.click(fn=clear_screen, inputs=[chatbot], outputs=[chatbot]) # # with gr.Column(scale=10): # # with gr.Tab('生成配置'): # generate_number = gr.Slider(1, # 5, # value=3, # step=1, # label="请设定单篇文章需要生成的问题数量", # interactive=True) # # gr.Markdown(f'单篇生成') # texts = gr.Textbox(show_label=False, placeholder="文本内容", lines=12).style(container=False) # text_button = gr.Button(value="生成问题") # text_button.click(fn=text_generate, inputs=[chatbot, texts, generate_number, llm], outputs=[chatbot]) # # gr.Markdown(f'批量生成') # folder_address = gr.File(label="添加文件", # file_types=['.txt', '.md', '.docx', '.pdf'], # file_count="multiple", # show_label=False # ) # file_button = gr.Button(value="生成问题") # file_button.click(fn=files_generate, inputs=[chatbot, folder_address, generate_number, llm], # outputs=[chatbot]) # # with aa: # # with gr.Column(scale=10): # chatbot = gr.Chatbot([[None, None]], # elem_id="chat-box", # show_label=False).style(height=800) # clear_button = gr.Button(value="清屏") # clear_button.click(fn=clear_screen, inputs=[chatbot], outputs=[chatbot]) # # with gr.Column(scale=10): # # with gr.Tab('批改配置'): # # gr.Markdown(f'写作要求') # require_texts = gr.Textbox(show_label=False, placeholder="文本内容", lines=4).style(container=False) # # require_texts_button = gr.Button(value="批改") # # require_texts_button.click(fn=text_correct, inputs=[chatbot, texts, llm], outputs=[chatbot]) # # gr.Markdown(f'单篇批改') # feedback_texts = gr.Textbox(show_label=False, placeholder="文本内容", lines=12).style(container=False) # feedback_button = gr.Button(value="批改") # feedback_button.click(fn=text_correct, inputs=[chatbot, require_texts, feedback_texts, llm], # outputs=[chatbot]) # # gr.Markdown(f'批量批改') # folder_address = gr.File(label="添加文件", # file_types=['.txt', '.md', '.docx', '.pdf'], # file_count="multiple", # show_label=False # ) # file_button = gr.Button(value="批改") # file_button.click(fn=files_correct, inputs=[chatbot, require_texts, folder_address, llm], # outputs=[chatbot]) # demo.queue(concurrency_count=5).launch(server_name='0.0.0.0', server_port=7858, share=True) demo.queue(concurrency_count=5).launch()