DHEIVER commited on
Commit
d86f558
·
verified ·
1 Parent(s): 725ef5e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -298
app.py CHANGED
@@ -1,337 +1,114 @@
1
  import gradio as gr
2
- import random
3
- from transformers import AutoModelForCausalLM, AutoTokenizer
4
  import torch
5
- from typing import Dict, List, Tuple, Optional
6
- from dataclasses import dataclass
7
- import json
8
- import os
9
- from datetime import datetime
10
  import logging
11
 
12
- # Configuração de logging
13
- logging.basicConfig(
14
- level=logging.INFO,
15
- format='%(asctime)s - %(levelname)s - %(message)s'
16
- )
17
 
18
- @dataclass
19
- class PromptConfig:
20
- """Configuração para geração de prompts"""
21
- temperatura: float = 0.7
22
- top_p: float = 0.9
23
- max_tokens: int = 512
24
- repetition_penalty: float = 1.1
25
-
26
- # Templates corrigidos com estrutura adequada
27
  TEMPLATES = {
28
- "história": {
29
- "creative": {
30
- "template": "Crie uma história {gênero} sobre {tema} com {personagens} personagens. A história deve ter {comprimento} palavras e incluir {elementos}.",
31
- "sugestoes": ["Narrativa épica", "História de mistério", "Conto de fantasia"]
32
- },
33
- "analysis": {
34
- "template": "Analise a seguinte história considerando {aspectos}. Foque em {elementos} e forneça exemplos específicos do texto.",
35
- "sugestoes": ["Análise de personagens", "Análise de trama", "Análise temática"]
36
- },
37
- "continuation": {
38
- "template": "Continue a seguinte história mantendo o {tom} e desenvolvendo {elementos}.",
39
- "sugestoes": ["Desenvolvimento de personagem", "Resolução de conflito", "Expansão do universo"]
40
- }
41
- },
42
- "técnico": {
43
- "tutorial": {
44
- "template": "Crie um tutorial detalhado sobre {tema} para {público}. Inclua {elementos} e forneça {exemplos} exemplos práticos.",
45
- "sugestoes": ["Tutorial passo a passo", "Guia de início rápido", "Manual detalhado"]
46
- },
47
- "documentation": {
48
- "template": "Documente {sistema} incluindo {aspectos}. Foque em {elementos} e forneça {exemplos} exemplos de uso.",
49
- "sugestoes": ["Documentação técnica", "Manual do usuário", "Especificação de API"]
50
- },
51
- "troubleshooting": {
52
- "template": "Crie um guia de solução de problemas para {sistema} cobrindo {problemas}.",
53
- "sugestoes": ["Resolução de erros comuns", "Guia de manutenção", "FAQ técnico"]
54
- }
55
- },
56
- "educacional": {
57
- "lesson": {
58
- "template": "Prepare uma aula sobre {tema} para {público}. Inclua {objetivos} e atividades práticas.",
59
- "sugestoes": ["Plano de aula", "Roteiro de workshop", "Material didático"]
60
- },
61
- "exercise": {
62
- "template": "Crie exercícios sobre {tema} com {dificuldade} níveis de dificuldade.",
63
- "sugestoes": ["Exercícios práticos", "Desafios progressivos", "Questões de revisão"]
64
- },
65
- "explanation": {
66
- "template": "Explique {conceito} para {público} usando {analogias} e exemplos práticos.",
67
- "sugestoes": ["Explicação detalhada", "Guia simplificado", "Tutorial conceitual"]
68
- }
69
- }
70
  }
71
 
72
- # Mudança principal na classe do gerador para usar um modelo mais leve
73
- class EnhancedPromptGenerator:
74
- def __init__(self, model_name: str = "neuralmind/bert-base-portuguese-cased"):
75
- self.model_name = model_name
76
  self.load_model()
77
 
78
  def load_model(self):
79
- """Carrega o modelo com otimizações para Spaces"""
80
  try:
81
- logging.info("Carregando modelo... (pode demorar alguns minutos na primeira vez)")
82
- self.tokenizer = AutoTokenizer.from_pretrained(
83
- self.model_name,
84
- use_fast=True
85
- )
86
  self.model = AutoModelForCausalLM.from_pretrained(
87
- "microsoft/phi-2", # Modelo mais leve e eficiente
88
  torch_dtype=torch.float16,
89
  device_map="auto",
90
  low_cpu_mem_usage=True
91
  )
92
- logging.info("Modelo carregado com sucesso!")
93
  except Exception as e:
94
- logging.error(f"Erro ao carregar o modelo: {e}")
95
  raise
96
 
97
- def generate_with_model(self, prompt: str, config: PromptConfig = PromptConfig()) -> str:
98
- """Gera texto usando o modelo com configurações otimizadas"""
99
  try:
100
- # Adiciona contexto em português
101
- enhanced_prompt = f"""
102
- Por favor, gere um texto em português de acordo com as instruções:
103
- {prompt}
104
- """
105
- inputs = self.tokenizer(enhanced_prompt, return_tensors="pt").to(self.model.device)
106
-
107
  outputs = self.model.generate(
108
  **inputs,
109
- max_new_tokens=config.max_tokens,
110
- temperature=config.temperatura,
111
- top_p=config.top_p,
112
- repetition_penalty=config.repetition_penalty,
113
  do_sample=True,
114
- pad_token_id=self.tokenizer.eos_token_id,
115
- num_beams=4, # Melhor qualidade para português
116
- early_stopping=True
117
  )
118
-
119
  return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
120
-
121
  except Exception as e:
122
  logging.error(f"Erro na geração: {e}")
123
- return f"Erro na geração: {str(e)}"
124
-
125
- generator = EnhancedPromptGenerator()
126
 
127
- def get_suggestions(categoria: str, subcategoria: str) -> List[str]:
128
- """Retorna sugestões baseadas na categoria e subcategoria"""
129
- try:
130
- if categoria in TEMPLATES and subcategoria in TEMPLATES[categoria]:
131
- return TEMPLATES[categoria][subcategoria].get("sugestoes", [])
132
- return []
133
- except Exception as e:
134
- logging.error(f"Erro ao obter sugestões: {e}")
135
- return []
136
-
137
- def generate_prompt(
138
- categoria: str,
139
- subcategoria: str,
140
- tema: str,
141
- elementos: str,
142
- público_alvo: str,
143
- tom: str,
144
- comprimento: int,
145
- temperatura: float,
146
- usar_llm: bool = True
147
- ) -> Tuple[str, dict]:
148
- """Função aprimorada de geração de prompts"""
149
- try:
150
- if not tema or not elementos:
151
- return "Por favor, preencha o tema e os elementos.", {"erro": "Campos obrigatórios não preenchidos"}
152
-
153
- if categoria not in TEMPLATES or subcategoria not in TEMPLATES[categoria]:
154
- return "Categoria ou subcategoria não encontrada", {"erro": "Categoria inválida"}
155
-
156
- template = TEMPLATES[categoria][subcategoria]["template"]
157
-
158
- params = {
159
- "tema": tema,
160
- "elementos": elementos,
161
- "público": público_alvo,
162
- "tom": tom,
163
- "comprimento": comprimento,
164
- "gênero": random.choice(["de aventura", "de mistério", "de fantasia", "de ficção científica"]),
165
- "personagens": random.randint(2, 5),
166
- "aspectos": "caracterização, desenvolvimento do enredo, temas principais",
167
- "exemplos": random.randint(3, 5),
168
- "sistema": tema,
169
- "problemas": "problemas comuns e casos específicos",
170
- "dificuldade": random.randint(3, 5),
171
- "conceito": tema,
172
- "analogias": "analogias cotidianas"
173
- }
174
-
175
- base_prompt = template.format(**params)
176
- base_prompt += f"\n\nTom desejado: {tom}"
177
-
178
- if comprimento:
179
- base_prompt += f"\nComprimento aproximado: {comprimento} palavras"
180
-
181
- if usar_llm:
182
- config = PromptConfig(temperatura=temperatura)
183
- instruction = f"""
184
- Você é um assistente especializado em criar prompts detalhados em português para LLMs.
185
- Expanda e melhore o seguinte prompt base, adicionando mais detalhes, exemplos e estrutura:
186
-
187
- {base_prompt}
188
-
189
- Considere:
190
- - Público-alvo: {público_alvo}
191
- - Elementos específicos: {elementos}
192
- - Tom desejado: {tom}
193
-
194
- Crie uma versão mais completa e detalhada deste prompt, mantendo o objetivo original
195
- mas adicionando mais contexto e especificidade.
196
- """
197
- return generator.generate_with_model(instruction, config), {"status": "success"}
198
 
199
- return base_prompt, {"status": "success"}
200
- except Exception as e:
201
- logging.error(f"Erro na geração do prompt: {e}")
202
- return f"Erro na geração do prompt: {str(e)}", {"erro": str(e)}
203
 
204
- def create_interface():
205
- """Interface aprimorada com mais recursos"""
206
- with gr.Blocks(
207
- title="Gerador de Prompts Inteligente",
208
- theme=gr.themes.Soft(
209
- primary_hue="indigo",
210
- secondary_hue="blue",
211
- ),
212
- ) as app:
213
  gr.Markdown(
214
  """
215
- # 🤖 Gerador de Prompts Inteligente v2.0
216
- ### Crie prompts estruturados e detalhados usando IA avançada
217
  """
218
  )
219
 
220
- with gr.Tabs():
221
- with gr.TabItem("✨ Gerador de Prompts"):
222
- with gr.Group():
223
- with gr.Row():
224
- with gr.Column(scale=1):
225
- categoria = gr.Dropdown(
226
- choices=list(TEMPLATES.keys()),
227
- label="📚 Categoria",
228
- value="história",
229
- container=False,
230
- )
231
- subcategoria = gr.Dropdown(
232
- choices=list(TEMPLATES["história"].keys()),
233
- label="🔍 Subcategoria",
234
- value="creative",
235
- container=False,
236
- )
237
- sugestoes = gr.Dropdown(
238
- choices=get_suggestions("história", "creative"),
239
- label="💫 Sugestões",
240
- container=False,
241
- )
242
-
243
- with gr.Column(scale=2):
244
- tema = gr.Textbox(
245
- label="💡 Tema Principal",
246
- placeholder="Ex: inteligência artificial, sustentabilidade",
247
- container=False,
248
- )
249
- elementos = gr.Textbox(
250
- label="🔮 Elementos Específicos",
251
- placeholder="Ex: conflitos, conceitos, exemplos práticos",
252
- container=False,
253
- )
254
-
255
- with gr.Row():
256
- with gr.Column(scale=1):
257
- público_alvo = gr.Textbox(
258
- label="👥 Público Alvo",
259
- placeholder="Ex: iniciantes, profissionais, estudantes",
260
- container=False,
261
- )
262
- tom = gr.Dropdown(
263
- choices=["formal", "informal", "técnico", "conversacional", "educativo"],
264
- label="🎭 Tom",
265
- value="formal",
266
- container=False,
267
- )
268
-
269
- with gr.Column(scale=2):
270
- comprimento = gr.Slider(
271
- minimum=100,
272
- maximum=2000,
273
- step=100,
274
- label="📏 Comprimento (palavras)",
275
- value=500,
276
- container=False,
277
- )
278
- temperatura = gr.Slider(
279
- minimum=0.1,
280
- maximum=1.0,
281
- step=0.1,
282
- label="🌡️ Temperatura",
283
- value=0.7,
284
- container=False,
285
- )
286
-
287
- usar_llm = gr.Checkbox(
288
- label="🤖 Usar IA para expandir prompt",
289
- value=True,
290
- container=False,
291
- )
292
-
293
- with gr.Row():
294
- gerar_btn = gr.Button(
295
- "🚀 Gerar Prompt",
296
- variant="primary",
297
- scale=1,
298
- )
299
-
300
- with gr.Row():
301
- saida = gr.TextArea(
302
- label="📝 Prompt Gerado",
303
- lines=10,
304
- container=False,
305
- )
306
- status = gr.JSON(
307
- label="📊 Status",
308
- container=False,
309
- )
310
 
311
- def atualizar_interface(categoria, subcategoria):
312
- try:
313
- sugestoes_list = get_suggestions(categoria, subcategoria)
314
- return [
315
- gr.Dropdown(choices=list(TEMPLATES[categoria].keys())),
316
- gr.Dropdown(choices=sugestoes_list)
317
- ]
318
- except Exception as e:
319
- logging.error(f"Erro ao atualizar interface: {e}")
320
- return [gr.Dropdown(), gr.Dropdown()]
321
-
322
- categoria.change(
323
- atualizar_interface,
324
- inputs=[categoria, subcategoria],
325
- outputs=[subcategoria, sugestoes]
326
  )
327
 
328
  gerar_btn.click(
329
- generate_prompt,
330
- inputs=[
331
- categoria, subcategoria, tema, elementos,
332
- público_alvo, tom, comprimento, temperatura, usar_llm
333
- ],
334
- outputs=[saida, status]
335
  )
336
 
337
  return app
@@ -339,7 +116,4 @@ def create_interface():
339
  if __name__ == "__main__":
340
  app = create_interface()
341
  app.queue()
342
- app.launch(
343
- server_name="0.0.0.0",
344
- server_port=7860
345
- )
 
1
  import gradio as gr
 
 
2
  import torch
3
+ from transformers import AutoModelForCausalLM, AutoTokenizer
 
 
 
 
4
  import logging
5
 
6
+ # Configuração básica de logging
7
+ logging.basicConfig(level=logging.INFO)
 
 
 
8
 
9
+ # Templates simplificados
 
 
 
 
 
 
 
 
10
  TEMPLATES = {
11
+ "história": [
12
+ "Crie uma história sobre {tema}",
13
+ "Escreva um conto sobre {tema}",
14
+ "Desenvolva uma narrativa sobre {tema}"
15
+ ],
16
+ "tutorial": [
17
+ "Crie um tutorial sobre {tema}",
18
+ "Explique como fazer {tema}",
19
+ "Desenvolva um guia sobre {tema}"
20
+ ],
21
+ "explicação": [
22
+ "Explique {tema} de forma simples",
23
+ "Descreva como funciona {tema}",
24
+ "Faça uma análise de {tema}"
25
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
27
 
28
+ class SimplePromptGenerator:
29
+ def __init__(self):
30
+ self.model_name = "pierreguillou/gpt2-small-portuguese" # Modelo menor em português
 
31
  self.load_model()
32
 
33
  def load_model(self):
 
34
  try:
35
+ logging.info("Carregando modelo...")
36
+ self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
 
 
 
37
  self.model = AutoModelForCausalLM.from_pretrained(
38
+ self.model_name,
39
  torch_dtype=torch.float16,
40
  device_map="auto",
41
  low_cpu_mem_usage=True
42
  )
43
+ logging.info("Modelo carregado!")
44
  except Exception as e:
45
+ logging.error(f"Erro ao carregar modelo: {e}")
46
  raise
47
 
48
+ def generate(self, prompt: str, max_length: int = 100) -> str:
 
49
  try:
50
+ inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
 
 
 
 
 
 
51
  outputs = self.model.generate(
52
  **inputs,
53
+ max_new_tokens=max_length,
54
+ temperature=0.7,
 
 
55
  do_sample=True,
56
+ pad_token_id=self.tokenizer.eos_token_id
 
 
57
  )
 
58
  return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
 
59
  except Exception as e:
60
  logging.error(f"Erro na geração: {e}")
61
+ return f"Erro: {str(e)}"
 
 
62
 
63
+ def create_interface():
64
+ generator = SimplePromptGenerator()
65
+
66
+ def gerar_prompt(categoria, tema, comprimento):
67
+ if not tema:
68
+ return "Por favor, insira um tema."
69
+
70
+ template = TEMPLATES[categoria][0].format(tema=tema)
71
+ prompt = f"Gere um texto em português:\n{template}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
+ return generator.generate(prompt, max_length=comprimento)
 
 
 
74
 
75
+ with gr.Blocks(theme=gr.themes.Soft()) as app:
 
 
 
 
 
 
 
 
76
  gr.Markdown(
77
  """
78
+ # 🤖 Gerador de Prompts
79
+ ### Crie textos em português usando IA
80
  """
81
  )
82
 
83
+ with gr.Row():
84
+ with gr.Column():
85
+ categoria = gr.Dropdown(
86
+ choices=list(TEMPLATES.keys()),
87
+ label="📚 Categoria",
88
+ value="história"
89
+ )
90
+ tema = gr.Textbox(
91
+ label="💡 Tema",
92
+ placeholder="Digite o tema aqui..."
93
+ )
94
+ comprimento = gr.Slider(
95
+ minimum=50,
96
+ maximum=200,
97
+ value=100,
98
+ step=10,
99
+ label="📏 Comprimento (palavras)"
100
+ )
101
+ gerar_btn = gr.Button("🚀 Gerar", variant="primary")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
+ saida = gr.Textbox(
104
+ label="📝 Texto Gerado",
105
+ lines=10
 
 
 
 
 
 
 
 
 
 
 
 
106
  )
107
 
108
  gerar_btn.click(
109
+ gerar_prompt,
110
+ inputs=[categoria, tema, comprimento],
111
+ outputs=saida
 
 
 
112
  )
113
 
114
  return app
 
116
  if __name__ == "__main__":
117
  app = create_interface()
118
  app.queue()
119
+ app.launch(server_name="0.0.0.0", server_port=7860)