aldohenrique commited on
Commit
67a5668
·
verified ·
1 Parent(s): 8823c04

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -160
app.py CHANGED
@@ -1,172 +1,54 @@
1
  import gradio as gr
2
- from transformers import pipeline
3
- import os
4
-
5
- # Modelos leves recomendados
6
-
7
 
 
8
  MODEL_OPTIONS = {
9
- "Qwen2.5:3B": "Qwen/Qwen2.5-3B-Instruct",
10
- "GPT-2 Médio": "gpt2-medium",
11
- "BLOOM (560M)": "bigscience/bloom-560m",
12
- "DistilGPT2": "distilgpt2",
13
  "TinyLLaMA": "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
14
  }
15
 
 
 
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- # Escolha o modelo Qwen2.5
19
- MODEL_NAME = MODEL_OPTIONS["TinyLLaMA"]
20
-
21
- def load_model():
22
- global MODEL_NAME # Declarar global no início da função
23
-
24
- # Tentar carregar com configurações otimizadas primeiro
25
- try:
26
- print(f"Tentando carregar modelo: {MODEL_NAME}")
27
- return pipeline(
28
- "text-generation",
29
- model=MODEL_NAME,
30
- max_new_tokens=512,
31
- temperature=0.7,
32
- top_p=0.9,
33
- do_sample=True,
34
- token=os.getenv("HF_TOKEN")
35
- )
36
- except Exception as e:
37
- print(f"Erro com {MODEL_NAME}: {str(e)}")
38
-
39
- # Fallback 1: Tentar modelo menor
40
- print("Tentando modelo Qwen2.5:0.5B...")
41
- try:
42
- MODEL_NAME = MODEL_OPTIONS["Qwen2.5:0.5B"]
43
- return pipeline(
44
- "text-generation",
45
- model=MODEL_NAME,
46
- max_new_tokens=512,
47
- temperature=0.7,
48
- top_p=0.9,
49
- do_sample=True,
50
- token=os.getenv("HF_TOKEN")
51
- )
52
- except Exception as e2:
53
- print(f"Erro com Qwen2.5:0.5B: {str(e2)}")
54
-
55
- # Fallback 2: GPT-2 Medium (mais compatível)
56
- print("Tentando GPT-2 Medium...")
57
- try:
58
- MODEL_NAME = MODEL_OPTIONS["GPT-2 Médio"]
59
- return pipeline(
60
- "text-generation",
61
- model=MODEL_NAME,
62
- max_new_tokens=256,
63
- temperature=0.7,
64
- top_p=0.9,
65
- do_sample=True
66
- )
67
- except Exception as e3:
68
- print(f"Erro com GPT-2: {str(e3)}")
69
-
70
- # Fallback 3: BLOOM (último recurso)
71
- print("Tentando BLOOM...")
72
- try:
73
- MODEL_NAME = MODEL_OPTIONS["BLOOM (560M)"]
74
- return pipeline(
75
- "text-generation",
76
- model=MODEL_NAME,
77
- max_new_tokens=256,
78
- temperature=0.7,
79
- top_p=0.9,
80
- do_sample=True
81
- )
82
- except Exception as e4:
83
- raise gr.Error(f"Falha ao carregar qualquer modelo. Último erro: {str(e4)}")
84
-
85
- gerador = load_model()
86
-
87
  def responder_como_aldo(pergunta):
88
- # Adaptar prompt baseado no modelo carregado
89
- if "Qwen" in MODEL_NAME:
90
- # Prompt otimizado para Qwen2.5
91
- prompt = f"""<|im_start|>system
92
- Você é o professor Dr. Aldo Henrique, especialista em programação C, Java, desenvolvimento web e inteligência artificial. Responda com clareza, profundidade e tom acadêmico, como um professor experiente e didático.
93
- <|im_end|>
94
- <|im_start|>user
95
- {pergunta}
96
- <|im_end|>
97
- <|im_start|>assistant"""
98
- else:
99
- # Prompt genérico para outros modelos
100
- prompt = f"""Você é o professor Dr. Aldo Henrique, especialista em programação C, Java, desenvolvimento web e inteligência artificial. Responda com clareza, profundidade e tom acadêmico.
101
 
102
  Pergunta: {pergunta}
103
-
104
  Resposta:"""
105
 
106
  try:
107
- # Configurar parâmetros baseados no modelo
108
- max_tokens = 300 if "Qwen" in MODEL_NAME else 200
109
-
110
- resposta = gerador(
111
- prompt,
112
- max_new_tokens=max_tokens,
113
- pad_token_id=gerador.tokenizer.eos_token_id,
114
- eos_token_id=gerador.tokenizer.eos_token_id,
115
- truncation=True
116
- )[0]["generated_text"]
117
-
118
- # Extrair apenas a resposta do assistente
119
- if "Qwen" in MODEL_NAME and "<|im_start|>assistant" in resposta:
120
- resposta_limpa = resposta.split("<|im_start|>assistant")[-1]
121
- resposta_limpa = resposta_limpa.split("<|im_end|>")[0] if "<|im_end|>" in resposta_limpa else resposta_limpa
122
- return resposta_limpa.strip()
123
- elif "Resposta:" in resposta:
124
- resposta_limpa = resposta.split("Resposta:")[-1]
125
- return resposta_limpa.strip()
126
- else:
127
- # Fallback: pegar texto após o prompt
128
- resposta_limpa = resposta.replace(prompt, "").strip()
129
- return resposta_limpa if resposta_limpa else "Desculpe, não consegui gerar uma resposta adequada."
130
-
131
  except Exception as e:
132
- return f"Erro ao gerar resposta: {str(e)}. Tente reformular sua pergunta."
133
 
134
- # Interface melhorada
135
- with gr.Blocks(
136
- title="Pergunte ao Dr. Aldo Henrique",
137
- theme=gr.themes.Soft(),
138
- css="""
139
- .gradio-container {
140
- max-width: 800px;
141
- margin: auto;
142
- }
143
- """
144
- ) as interface:
145
-
146
- gr.Markdown("# 🎓 Pergunte ao Dr. Aldo Henrique")
147
- gr.Markdown(f"**Modelo atual:** {MODEL_NAME}")
148
- gr.Markdown("💻 Especialista em C, Java, desenvolvimento web e IA. Tire suas dúvidas com clareza e profundidade acadêmica.")
149
 
150
- with gr.Row():
151
- with gr.Column(scale=1):
152
- entrada = gr.Textbox(
153
- lines=6,
154
- label="📝 Sua pergunta",
155
- placeholder="Digite sua dúvida sobre programação, desenvolvimento web ou IA...",
156
- info="Seja específico para obter respostas mais precisas"
157
- )
158
-
159
- btn = gr.Button("🚀 Enviar Pergunta", variant="primary", size="lg")
160
-
161
- with gr.Column(scale=1):
162
- saida = gr.Textbox(
163
- label="💡 Resposta do Dr. Aldo",
164
- interactive=False,
165
- lines=10
166
- )
167
-
168
- # Exemplos de perguntas
169
- gr.Examples(
170
  examples=[
171
  ["Como implementar uma lista ligada em C?"],
172
  ["Qual a diferença entre == e equals() em Java?"],
@@ -176,17 +58,13 @@ with gr.Blocks(
176
  ],
177
  inputs=entrada
178
  )
179
-
180
- btn.click(responder_como_aldo, inputs=entrada, outputs=saida)
181
-
182
- gr.Markdown("---")
183
- gr.Markdown("*Desenvolvido com Qwen2.5 - Modelo de linguagem otimizado para educação*")
184
 
185
- # Configurações de lançamento otimizadas
 
 
186
  if __name__ == "__main__":
187
  interface.launch(
188
  server_name="0.0.0.0",
189
  server_port=7860,
190
- share=True,
191
- show_error=True
192
  )
 
1
  import gradio as gr
2
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
3
+ import torch
 
 
 
4
 
5
+ # === Modelos leves recomendados ===
6
  MODEL_OPTIONS = {
7
+ "DistilGPT2": "distilgpt2", # muito rápido e leve (~80MB)
 
 
 
8
  "TinyLLaMA": "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
9
  }
10
 
11
+ # === Escolha o modelo padrão mais leve ===
12
+ MODEL_NAME = MODEL_OPTIONS["DistilGPT2"]
13
 
14
+ # === Carrega modelo e tokenizer uma vez ===
15
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
16
+ model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
17
+ gerador = pipeline(
18
+ "text-generation",
19
+ model=model,
20
+ tokenizer=tokenizer,
21
+ device=0 if torch.cuda.is_available() else -1,
22
+ max_new_tokens=200,
23
+ temperature=0.7,
24
+ top_p=0.9,
25
+ do_sample=True
26
+ )
27
 
28
+ # === Função principal ===
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  def responder_como_aldo(pergunta):
30
+ prompt = f"""Você é o professor Dr. Aldo Henrique, especialista em C, Java, Web e IA. Responda de forma clara, acadêmica e precisa.
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
  Pergunta: {pergunta}
 
33
  Resposta:"""
34
 
35
  try:
36
+ resposta = gerador(prompt, max_new_tokens=200)[0]["generated_text"]
37
+ resposta_limpa = resposta.replace(prompt, "").strip()
38
+ return resposta_limpa if resposta_limpa else "Desculpe, não consegui gerar uma resposta adequada."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  except Exception as e:
40
+ return f"Erro: {str(e)}"
41
 
42
+ # === Interface Gradio ===
43
+ with gr.Blocks(title="Pergunte ao Dr. Aldo Henrique") as interface:
44
+ gr.Markdown("## 🤖 Pergunte ao Dr. Aldo Henrique")
45
+ gr.Markdown(f"**Modelo carregado:** `{MODEL_NAME}`")
 
 
 
 
 
 
 
 
 
 
 
46
 
47
+ entrada = gr.Textbox(label="Pergunta", placeholder="Ex: Como usar ponteiros em C?", lines=4)
48
+ saida = gr.Textbox(label="Resposta do Dr. Aldo", lines=8, interactive=False)
49
+ botao = gr.Button("Responder")
50
+
51
+ exemplos = gr.Examples(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  examples=[
53
  ["Como implementar uma lista ligada em C?"],
54
  ["Qual a diferença entre == e equals() em Java?"],
 
58
  ],
59
  inputs=entrada
60
  )
 
 
 
 
 
61
 
62
+ botao.click(fn=responder_como_aldo, inputs=entrada, outputs=saida)
63
+
64
+ # === Lançamento com configurações otimizadas para HuggingFace ===
65
  if __name__ == "__main__":
66
  interface.launch(
67
  server_name="0.0.0.0",
68
  server_port=7860,
69
+ share=False
 
70
  )