File size: 4,771 Bytes
346b1be
 
 
 
 
 
40cee53
346b1be
 
 
 
 
40cee53
346b1be
 
40cee53
 
346b1be
 
40cee53
 
346b1be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40cee53
346b1be
 
 
 
 
 
 
 
 
 
4e39b88
 
346b1be
 
 
4e39b88
346b1be
4e39b88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
346b1be
 
 
 
 
 
 
 
 
 
 
 
 
40cee53
 
346b1be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e39b88
 
 
346b1be
100fb2e
93d1e6b
346b1be
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
"""
HuggingFace Spaces 推理应用
使用 Gradio 创建交互式界面
"""

import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# 模型配置
MODEL_NAME = "zhman/llama-SFT-GRPO"

# 加载模型和分词器(CPU 优化版本)
print("🔄 加载模型...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)

# CPU 模式:使用 float32,不使用量化
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    torch_dtype=torch.float32,  # CPU 友好的数据类型
    low_cpu_mem_usage=True,     # 降低内存使用
)
print("✅ 模型加载完成!")


def solve_math_problem(question, max_length=512, temperature=0.7, top_p=0.9):
    """
    解决数学问题
    
    Args:
        question: 数学问题
        max_length: 最大生成长度
        temperature: 温度参数
        top_p: Top-p 采样参数
    
    Returns:
        str: 模型生成的答案
    """
    # 构造提示词
    prompt = f"问题:{question}\n答案:"
    
    # 编码输入
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    
    # 生成回答
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=min(max_length, 256),  # 限制生成长度以加快速度
            temperature=temperature,
            top_p=top_p,
            do_sample=True,
            pad_token_id=tokenizer.pad_token_id,
            eos_token_id=tokenizer.eos_token_id
        )
    
    # 解码输出
    generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    
    # 清理和提取答案
    # 1. 移除输入的问题部分
    if "答案:" in generated_text:
        answer = generated_text.split("答案:", 1)[1].strip()
    else:
        answer = generated_text.replace(prompt, "").strip()
    
    # 2. 清理训练格式文本
    # 移除包含这些关键词的行(训练数据格式)
    cleanup_keywords = [
        "运算符", "运算方法", "运算公式", "运算步骤",
        "左值", "右值", "中值", "结果值",
        "Step", "步骤编号",
    ]
    
    # 分行处理
    lines = answer.split('\n')
    cleaned_lines = []
    
    for line in lines:
        line = line.strip()
        # 跳过空行
        if not line:
            continue
        # 跳过包含训练格式关键词的行
        if any(keyword in line for keyword in cleanup_keywords):
            continue
        # 保留这一行
        cleaned_lines.append(line)
    
    # 合并清理后的行,最多保留前 3 行
    if cleaned_lines:
        final_answer = '\n'.join(cleaned_lines[:3])
    else:
        # 如果全部被清理,返回原始答案的前 200 字符
        final_answer = answer[:200]
    
    return final_answer


# 创建 Gradio 界面
demo = gr.Interface(
    fn=solve_math_problem,
    inputs=[
        gr.Textbox(
            label="💬 请输入您的数学问题",
            placeholder="例如:一个长方形的长是8厘米,宽是5厘米,它的周长是多少?",
            lines=3
        ),
        gr.Slider(
            minimum=50,
            maximum=512,
            value=256,  # 降低默认值以加快 CPU 推理
            step=50,
            label="📏 最大长度"
        ),
        gr.Slider(
            minimum=0.0,
            maximum=2.0,
            value=0.7,
            step=0.1,
            label="🌡️ Temperature"
        ),
        gr.Slider(
            minimum=0.0,
            maximum=1.0,
            value=0.9,
            step=0.05,
            label="🎯 Top P"
        )
    ],
    outputs=gr.Textbox(
        label="✨ AI 回答",
        lines=5
    ),
    title="🧮 数学问题求解 AI",
    description="""
    基于 Llama-3.2-1B-Instruct 微调的数学问题求解模型。
    
    **使用方法**:
    1. 在输入框中输入您的数学问题
    2. 调整推理参数(可选)
    3. 点击 Submit 获取答案
    
    **模型信息**:
    - 基础模型:Llama-3.2-1B-Instruct
    - 微调任务:数学推理和问题求解
    """,
    examples=[
        ["Find the positive integer $n$ such that $10^n$ cubic centimeters is the same as 1 cubic kilometer.", 256, 0.7, 0.9],
        ["Define an operation $\\Diamond$ as $ a \\Diamond b = 12a - 10b.$ Compute the value of $((((20 \\Diamond 22) \\Diamond 22) \\Diamond 22) \\Diamond22).$", 256, 0.7, 0.9],
        ["S1.1 Let $a, b, c$ and $d$ be the distinct roots of the equation $x^{4}-15 x^{2}+56=0$. If $R=a^{2}+b^{2}+c^{2}+d^{2}$, find the value of $R$.", 256, 0.7, 0.9]
    ],
    cache_examples=False,  # 禁用示例缓存,避免启动时卡住
    theme=gr.themes.Soft()
)

# 启动应用
if __name__ == "__main__":
    demo.launch()