File size: 8,973 Bytes
d0b32be
f068274
 
d0b32be
2d6369f
d0b32be
 
 
f068274
 
d0b32be
 
 
 
 
 
 
 
 
2f394e3
d0b32be
 
f068274
 
d0b32be
f068274
d0b32be
f068274
d0b32be
 
f068274
d0b32be
f068274
 
2e7b3be
45c5911
2d6369f
45c5911
 
 
 
 
f9ce600
 
 
 
45c5911
 
f9ce600
45c5911
 
 
 
f9ce600
45c5911
 
f9ce600
 
 
 
 
 
2d6369f
 
d0b32be
29ab382
 
 
 
 
f3dde0c
29ab382
1dec5a8
45c5911
2d6369f
d0b32be
2d6369f
1dec5a8
 
 
 
 
 
 
 
2d6369f
 
 
f9ce600
 
 
 
 
 
 
 
 
2d6369f
 
 
 
 
f3dde0c
45c5911
 
 
 
 
 
 
2d6369f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29ab382
 
2d6369f
 
29ab382
2d6369f
29ab382
 
45c5911
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3dde0c
45c5911
29ab382
d0b32be
29ab382
d0b32be
 
45c5911
2d6369f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d0b32be
2d6369f
d0b32be
 
 
 
2d6369f
d0b32be
 
 
2d6369f
d0b32be
 
2d6369f
 
 
d0b32be
2f394e3
2d6369f
 
45c5911
 
 
d0b32be
 
 
2e7b3be
f3dde0c
 
2d6369f
45c5911
 
2d6369f
f3dde0c
 
2d6369f
 
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
import os
import sys
import subprocess
import gradio as gr
import time

# 诪转拽讬谉 讞讘讬诇讜转 谞讚专砖讜转 讗诐 讞住专讜转
print("===== Application Startup at", os.popen('date "+%Y-%m-%d %H:%M:%S"').read().strip(), "=====")

try:
    import transformers
    import huggingface_hub
    import torch
except ImportError:
    print("诪转拽讬谉 讞讘讬诇讜转 谞讚专砖讜转...")
    packages = [
        "transformers>=4.38.0",
        "huggingface_hub>=0.20.0",
        "torch>=2.0.0",
        "accelerate>=0.25.0"
    ]
    subprocess.check_call([sys.executable, "-m", "pip", "install"] + packages)
    print("讛转拽谞转 讛讞讘讬诇讜转 讛讜砖诇诪讛 讘讛爪诇讞讛!")

# 诪讬讬讘讗 讗转 讛住驻专讬讜转 讗讞专讬 讛转拽谞讛 讘诪讬讚转 讛爪讜专讱
try:
    import transformers
    from huggingface_hub import login
    import torch
    import gradio as gr
    print("讬讘讜讗 讛住驻专讬讜转 讛爪诇讬讞!")
except ImportError as e:
    print(f"砖讙讬讗讛 讘讬讘讜讗 讛住驻专讬讜转: {str(e)}")
    sys.exit(1)

# 专砖讬诪转 诪讜讚诇讬诐 Qwen3-Coder
MODELS = {
    "Qwen/Qwen1.5-0.5B-Chat": "诪讜讚诇 Qwen 拽讟谉 - 转讜诪讱 讘注讘专讬转 讜诪转讗讬诐 诇砖讬讞讛 讜转讻谞讜转",
    "Qwen/Qwen1.5-1.8B-Chat": "诪讜讚诇 Qwen 讘讬谞讜谞讬 - 转讜诪讱 讘砖驻讜转 专讘讜转 讻讜诇诇 注讘专讬转",
    "Qwen/Qwen1.5-4B-Chat": "诪讜讚诇 Qwen 讞讝拽 讬讜转专 - 转讜诪讱 讘砖驻讜转 专讘讜转 讜拽讬讚讜讚",
    "Qwen/Qwen1.5-7B-Chat": "诪讜讚诇 Qwen 讞讝拽 诪讗讜讚 - 诪转讗讬诐 诇砖讬讞讛 讜转讻谞讜转 诪转拽讚诪转",
    "Qwen/Qwen1.5-7B-Coder": "诪讜讚诇 Qwen3-Coder - 诪砖讜驻专 诇转讻谞讜转 讜诪砖讬诪讜转 拽讜讚"
}

# 诪讬诇讜谉 讛讙讚专讜转 讗讜驻讟讬诪诇讬讜转 诇驻讬 住讜讙讬 诪讜讚诇讬诐
MODEL_CONFIGS = {
    "qwen": {  # 诇诪讜讚诇讬 Qwen
        "max_new_tokens": 512,
        "do_sample": True,
        "temperature": 0.7,
        "top_p": 0.95,
        "repetition_penalty": 1.05,
        "no_repeat_ngram_size": 3
    },
    "default": {  # 诇诪讜讚诇讬诐 讗讞专讬诐
        "max_new_tokens": 256,
        "do_sample": True,
        "temperature": 0.7,
        "top_p": 0.92,
        "repetition_penalty": 1.1,
        "no_repeat_ngram_size": 2
    }
}

# 诪转讞讘专 诇讞砖讘讜谉 Hugging Face
token = os.environ.get("HF_TOKEN")
if token:
    login(token)
    print("讛转讞讘专讜转 诇-Hugging Face 讛爪诇讬讞讛!")
else:
    print("讗讝讛专讛: 讟讜拽谉 HF_TOKEN 诇讗 诪讜讙讚专 讘住讘讬讘转 讛注讘讜讚讛. 讬讬转讻谉 砖诇讗 转讛讬讛 讙讬砖讛 诇诪讜讚诇讬诐 诪讜讙讘诇讬诐.")

# 讛讙讚专转 诪砖转谞讬诐 讙诇讜讘诇讬讬诐
default_model_name = "Qwen/Qwen1.5-7B-Coder"
current_model_name = default_model_name
generator = None

# 诪讙讚讬专 讗转 generator 讻诪砖转谞讛 讙诇讜讘诇讬 讘讻诇 讛驻讜谞拽爪讬讜转
def init_globals():
    global generator, current_model_name
    # 砖诐 诪砖转谞讬诐 讙诇讜讘诇讬讬诐 诪讗讜转讞诇讬诐
    
# 诪讗转讞诇 讗转 讛诪砖转谞讬诐 讛讙诇讜讘诇讬讬诐
init_globals()

def load_model(model_name, status_box=None):
    """讟注讬谞转 诪讜讚诇 讜注讚讻讜谉 住讟讟讜住"""
    global generator, current_model_name
    
    # 砖讞专讜专 诪砖讗讘讬诐 砖诇 诪讜讚诇 拽讜讚诐 讗诐 拽讬讬诐
    if generator is not None:
        import gc
        del generator
        gc.collect()
        if torch.cuda.is_available():
            torch.cuda.empty_cache()
    
    current_model_name = model_name
    
    if status_box is not None:
        status_box = gr.Markdown(f"讟讜注谉 讗转 讛诪讜讚诇: {model_name}...")

    try:
        # Qwen 诪讜讚诇讬诐 诪转讗讬诪讬诐 诇爪'讗讟
        generator = transformers.pipeline(
            "text-generation",
            model=model_name,
            device_map="auto",
            torch_dtype="auto"
        )
        
        if status_box is not None:
            status_box = gr.Markdown(f"**讛诪讜讚诇 {model_name} 谞讟注谉 讘讛爪诇讞讛!**")
        
        return f"讛诪讜讚诇 {model_name} 谞讟注谉 讘讛爪诇讞讛!", status_box
    
    except Exception as e:
        error_msg = f"砖讙讬讗讛 讘讟注讬谞转 讛诪讜讚诇 {model_name}: {str(e)}"
        print(error_msg)
        
        if status_box is not None:
            status_box = gr.Markdown(f"**砖讙讬讗讛:** {error_msg}")
        
        return error_msg, status_box

# 讟注讬谞转 诪讜讚诇 讘专讬专转 诪讞讚诇
print(f"讟讜注谉 诪讜讚诇 讘专讬专转 诪讞讚诇 {default_model_name}...")
_, _ = load_model(default_model_name)

def ask_model(prompt):
    global generator, current_model_name
    
    if generator is None:
        return "讛诪讜讚诇 诇讗 谞讟注谉 讘讛爪诇讞讛. 谞住讛 诇讟注讜谉 诪讜讚诇 转讞讬诇讛."
    
    try:
        # 讟讬驻讜诇 讘诪讜讚诇讬 Qwen
        outputs = generator(
            prompt,
            max_new_tokens=512,      # 讗讜专讱 转讜爪讗讛 诪拽住讬诪诇讬 - 讛讙讚诇谞讜 注讘讜专 Qwen
            do_sample=True,          # 讚讙讬诪讛 讗拽专讗讬转 讘诪拽讜诐 greedy
            temperature=0.7,         # 讗讬讝讜谉 讘讬谉 讚讬讜拽 讜讬爪讬专转讬讜转
            top_p=0.95,              # 谞讜拽诇讬讜住 讚讙讬诪讛 - 砖讜诪专 注诇 诪讙讜讜谉 转砖讜讘讜转
            repetition_penalty=1.05, # 诪讜谞注 讞讝专讜转
            no_repeat_ngram_size=3,  # 诪谞讬注转 讞讝专讛 注诇 讘讬讙专诪讜转 (讝讜讙讜转 诪讬诇讬诐)
            return_full_text=False   # 诪讞讝讬专 专拽 讗转 讛讟拽住讟 讛讞讚砖 砖谞讜爪专
        )
        
        # 诪讞讝讬专 讗转 讛讟拽住讟 砖谞讜爪专
        if isinstance(outputs, list) and len(outputs) > 0:
            return outputs[0]["generated_text"]
        else:
            return str(outputs)
    except Exception as e:
        return f"砖讙讬讗讛 讘讛驻注诇转 讛诪讜讚诇: {str(e)}"

# 讬爪讬专转 诪诪砖拽 诪砖转诪砖
with gr.Blocks() as demo:
    gr.Markdown("# 诪注专讻转 爪'讗讟 注诐 诪讜讚诇讬 Qwen3-Coder")
    
    # 讗讝讜专 讘讞讬专转 诪讜讚诇 讜讟注讬谞讛
    with gr.Row():
        with gr.Column(scale=3):
            # 专砖讬诪讛 谞驻转讞转 诇讘讞讬专转 诪讜讚诇
            model_dropdown = gr.Dropdown(
                choices=list(MODELS.keys()),
                value=default_model_name,
                label="讘讞专 诪讜讚诇",
                info="讘讞专 诪讜讚诇 诪讛专砖讬诪讛 讜诇讞抓 注诇 '讟注谉 诪讜讚诇'"             
            )
            
            # 转讬讗讜专 讛诪讜讚诇 讛谞讘讞专
            model_description = gr.Markdown(f"**转讬讗讜专 讛诪讜讚诇:** {MODELS[default_model_name]}")
            
        with gr.Column(scale=1):
            # 讻驻转讜专 讟注讬谞转 诪讜讚诇
            load_button = gr.Button("讟注谉 诪讜讚诇", variant="primary")
    
    # 讗讝讜专 住讟讟讜住 讟注讬谞转 诪讜讚诇
    model_status = gr.Markdown(f"**诪讜讚诇 谞讜讻讞讬:** {default_model_name}")
    
    # 驻讜谞拽爪讬讛 诇讛爪讙转 转讬讗讜专 讛诪讜讚诇 讘注转 讘讞讬专讛
    def update_model_description(model_name):
        return f"**转讬讗讜专 讛诪讜讚诇:** {MODELS[model_name]}"
    
    model_dropdown.change(fn=update_model_description, inputs=model_dropdown, outputs=model_description)
    
    # 驻讜谞拽爪讬讛 诇讟注讬谞转 讛诪讜讚诇 讛谞讘讞专
    def load_selected_model(model_name):
        message, _ = load_model(model_name)
        return message, f"**诪讜讚诇 谞讜讻讞讬:** {model_name}"
    
    load_button.click(fn=load_selected_model, inputs=model_dropdown, outputs=[gr.Textbox(visible=False), model_status])
    
    gr.Markdown("---")
    gr.Markdown("### 砖讗诇 讗转 讛诪讜讚诇")
    
    # 讗讝讜专 砖讗诇讜转 讜转砖讜讘讜转
    with gr.Row():
        input_text = gr.Textbox(
            placeholder="讻转讜讘 讻讗谉 讗转 讛砖讗诇讛 砖诇讱...", 
            lines=3, 
            label="砖讗诇讛/讘拽砖讛"
        )
        output_text = gr.Textbox(label="转砖讜讘转 讛诪讜讚诇", lines=10)
    
    submit_btn = gr.Button("砖诇讞", variant="primary")
    submit_btn.click(fn=ask_model, inputs=input_text, outputs=output_text)
    
    # 讚讜讙诪讗讜转 诇砖讗诇讜转
    gr.Markdown("### 讚讜讙诪讗讜转 诇砖讗诇讜转:")
    examples = gr.Examples(
        [
            "住驻专 诇讬 注诇 讘讬谞讛 诪诇讗讻讜转讬转",
            "诪讛 讚注转讱 注诇 讛砖驻讛 讛注讘专讬转?",
            "讻转讜讘 住讬驻讜专 拽爪专 注诇 讬专讜砖诇讬诐",
            "讻转讜讘 诇讬 拽讜讚 讘驻讬讬转讜谉 砖诪讞砖讘 讗转 诪住驻专讬 驻讬讘讜谞讗爪'讬",
            "讻转讜讘 诇讬 拽讜讚 讘-JavaScript 砖讬讜爪专 讗驻诇讬拽爪讬讬转 专砖讬诪转 诪砖讬诪讜转",
            "讛住讘专 诇讬 注诇 诪注专讻讜转 诪讘讜住住讜转 讟专谞住驻讜专诪专讬诐"
        ],
        input_text
    )

    gr.Markdown("""
    ### 讛注专讜转:
    - 讘讞专 诪讜讚诇 诪讛专砖讬诪讛 讜诇讞抓 注诇 '讟注谉 诪讜讚诇' 讻讚讬 诇讛讞诇讬祝 讗转 讛诪讜讚诇 讛谞讜讻讞讬
    - 诪讜讚诇讬 Qwen 诪转讗讬诪讬诐 讘诪讬讜讞讚 诇爪'讗讟 讜转讻谞讜转
    - 诪讜诪诇抓 诇讛转讞讬诇 注诐 讛诪讜讚诇 讛拽讟谉 讬讜转专 (0.5B) 讜诇讛砖转诪砖 讘诪讜讚诇讬诐 讛讙讚讜诇讬诐 讬讜转专 专拽 注讘讜专 诪砖讬诪讜转 诪讜专讻讘讜转
    - 讛讟注讬谞讛 讛专讗砖讜谞讬转 砖诇 讻诇 诪讜讚诇 注砖讜讬讛 诇拽讞转 诪住驻专 砖谞讬讜转 注讚 讚拽讜转
    """)

# 讛驻注诇转 讛诪诪砖拽 注诐 讛讙讚专讜转 谞讜住驻讜转
demo.launch(show_error=True)