import gradio as gr from openai import OpenAI from utils.utils import send_qwenvl, mathml2latex client = OpenAI( api_key="sk-86ec70f3845c46dd937f9827f9572b81", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) # Send Qwen2.5-72B-vl def submit_qwenvl(stem, analysis, score, student_answer, model): stem = mathml2latex(stem) analysis = mathml2latex(analysis) scoring = send_qwenvl(client, analysis, score, student_answer, model, stem) # Determine word problem return [stem, analysis, scoring] # Clean up input and output def clean(): return [None, None, None, None, None, 'qwen2.5-vl-72b-instruct'] type_chioes = ['llm', '多模态'] def update_dropdown(choice): if choice == 'llm': return [ ('72b', 'qwen2.5-72b-instruct'), ('32b', 'qwen2.5-32b-instruct'), ('14b', 'qwen2.5-14b-instruct'), ('7b', 'qwen2.5-7b-instruct'), ('3b', 'qwen2.5-3b-instruct'), ('1.5b', 'qwen2.5-1.5b-instruct'), ('0.5b', 'qwen2.5-0.5b-instruct') ] else: return [ ('72b', 'qwen2.5-vl-72b-instruct'), ('32b', 'qwen2.5-vl-32b-instruct'), ('7b', 'qwen2.5-vl-7b-instruct'), ('3b', 'qwen2.5-vl-3b-instruct') ] with gr.Blocks(title="测学练") as demo: gr.Markdown("<center><h1>测学练</h1></center>") with gr.Row(): # input with gr.Column(): with gr.Row(): type_choice = gr.Dropdown(label='类型', choices=type_chioes) model_choice = gr.Dropdown(label='模型') stem_input = gr.Textbox(label="题干", lines=5) analysis_input = gr.Textbox(label="标准答案", lines=5) score = gr.Slider(label="分值", minimum=1, maximum=50, step=1) student_answer = gr.Textbox(label="学生作答", lines=5) with gr.Row(): submit_btn = gr.Button(value="提交") clean_btn = gr.Button(value="清除") # output with gr.Column(): stem_output = gr.Textbox(label="题干", lines=5) analysis_output = gr.Textbox(label="标准答案", lines=5) scoring_output = gr.Text(label="评分结果") gr.on(triggers=[type_choice.change], fn=update_dropdown, inputs=type_choice, outputs=model_choice) submit_btn.click(fn=submit_qwenvl, inputs=[stem_input, analysis_input, score, student_answer, model_choice], outputs=[stem_output, analysis_output, scoring_output]) clean_btn.click(fn=clean, inputs=None, outputs=[stem_input, analysis_input, scoring_output, score, student_answer, model_choice]) demo.launch( server_name="0.0.0.0", server_port=7860, share=False )
时间: 2025-04-07 21:13:55 浏览: 151
<think>好的,我现在需要帮助用户理解他们提供的Gradio代码。首先,我会先通读整个代码,了解其结构和各个部分的功能。代码的主要目的是创建一个名为“测学练”的Web应用,用于评分学生答案,可能用于教育或测试场景。
首先,用户导入了必要的库:gradio和openai,还有一些自定义的工具函数,比如send_qwenvl和mathml2latex。这提示应用可能涉及到与OpenAI的API交互,特别是Qwen模型的不同版本,包括视觉语言模型(VL)。接下来,初始化了OpenAI客户端,但注意到base_url指向阿里云的地址,这可能说明使用的是定制或特定部署的模型服务。
然后,定义了一个submit_qwenvl函数,负责处理题干、标准答案、分数和学生答案,通过调用send_qwenvl函数来获取评分结果。这里用到了mathml2latex转换,可能用户输入的是MathML格式,需要转为LaTeX以便模型处理。
接下来是clean函数,用于清除输入输出内容。然后是update_dropdown函数,根据用户选择的类型(llm或多模态)更新模型下拉菜单的选项。这显示了界面允许用户选择不同的模型版本,可能根据任务需求选择适合的模型大小。
在Gradio的界面构建部分,使用了gr.Blocks来创建布局,包含输入和输出两个列。输入部分有类型选择、模型选择、题干、标准答案、分数滑块、学生作答输入框以及提交和清除按钮。输出部分显示处理后的题干、标准答案和评分结果。
事件处理部分,type_choice的变化触发update_dropdown,更新模型选项。提交按钮触发submit_qwenvl函数,清除按钮则调用clean函数。最后,应用启动在本地服务器的7860端口。
接下来,我需要将这些分析转化为用户容易理解的中文解释,分步骤说明各部分的功能,以及整个应用的工作流程。需要注意的是,用户可能对Gradio和OpenAI API的使用不太熟悉,所以需要用简洁的语言说明,同时保持结构清晰。
另外,需要检查是否有潜在的问题或改进点,比如API密钥硬编码在代码中,存在安全风险,应该提醒用户注意;或者模型版本的选择是否合理等。不过根据用户的问题,主要是介绍代码,可能不需要深入讨论这些,但如果有明显的问题,可以提及。
最后,确保回答符合用户要求的格式,特别是数学表达式使用$...$,但当前代码中似乎没有涉及数学内容,可能在send_qwenvl或mathml2latex中处理,但用户提供的代码中没有这部分细节。因此,在解释时不需要特别处理数学公式,除非在题干或答案中有涉及,但用户提供的示例代码中没有明显数学内容,所以可能不需要使用LaTeX格式。
总结回答的结构:先整体介绍应用用途,然后分解代码各部分的功能,包括导入库、OpenAI客户端设置、核心函数、界面布局、事件绑定,最后总结应用的工作流程和潜在注意事项。</think>这是一个基于Gradio构建的AI评分系统,主要用于处理数学类题目的自动评分。我分模块帮你解析代码结构和工作原理:
$$\text{系统架构图:} \quad \text{用户界面} \rightarrow \text{处理逻辑} \rightarrow \text{Qwen大模型API}$$
一、核心功能模块
1. **模型对接层**:
- 使用阿里云部署的Qwen2.5系列大模型
- 支持两种类型模型:
- 纯文本模型(`llm`):7种参数量可选(0.5B-72B)
- 多模态模型(`vl`):4种参数量可选(3B-72B)
- API密钥硬编码存在安全隐患(生产环境建议使用环境变量)
2. **数据处理流程**:
```mermaid
graph TD
A[用户输入题干] --> B[MathML转LaTeX]
C[标准答案] --> B
D[学生作答] --> E[模型评分]
B --> E
E --> F[返回评分结果]
```
二、界面设计解析
$$\begin{cases}
\text{输入侧} & \text{输出侧} \\
\hline
• \text{题型选择下拉菜单} & • \text{标准题干展示} \\
• \text{动态模型选择器} & • \text{格式化答案展示} \\
• \text{滑动评分区间(1-50分)} & • \text{最终评分结果} \\
• \text{清除/提交按钮组} &
\end{cases}$$
三、关键技术点
1. **动态组件更新**:
- 当用户切换`llm`/`多模态`类型时,使用`update_dropdown`函数实时更新可用模型列表
- 示例代码片段:
```python
def update_dropdown(choice):
return [
('72b', 'qwen2.5-72b-instruct'),
... # 动态生成模型选项
]
```
2. **数学公式处理**:
- 内置`mathml2latex`转换器,支持将MathML格式转换为LaTeX
- 确保模型接收标准数学表达式,如:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$
四、系统运行方式
1. 本地启动命令:
```bash
python app.py
```
2. 访问地址:
- 本地访问:http://localhost:7860
- 局域网访问:http://[服务器IP]:7860
五、改进建议
1. 安全性优化:建议通过环境变量注入API密钥
2. 错误处理:增加异常捕获机制,特别是API调用失败时的回退策略
3. 历史记录:添加评分记录存储功能,便于后续分析
这个系统适合教育机构用于:
$$自动化批改 \propto \frac{\text{模型精度} \times \text{题目复杂度}}{\text{响应时间}}$$
阅读全文
相关推荐

















