DHEIVER commited on
Commit
ea865d5
·
verified ·
1 Parent(s): 1d3b1d1

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +176 -0
app.py ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import random
3
+ from transformers import AutoModelForCausalLM, AutoTokenizer
4
+ import torch
5
+ from typing import Dict, List
6
+
7
+ class PromptGenerator:
8
+ def __init__(self):
9
+ # Carrega o modelo Mistral em português do Hugging Face
10
+ print("Carregando modelo... (pode demorar alguns minutos na primeira vez)")
11
+ self.model_name = "beomi/llama-2-ko-7b" # Modelo base que funciona bem com português
12
+ self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
13
+ self.model = AutoModelForCausalLM.from_pretrained(
14
+ self.model_name,
15
+ torch_dtype=torch.float16,
16
+ device_map="auto"
17
+ )
18
+ print("Modelo carregado!")
19
+
20
+ def generate_with_model(self, prompt: str) -> str:
21
+ """Gera texto usando o modelo local"""
22
+ inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
23
+
24
+ outputs = self.model.generate(
25
+ **inputs,
26
+ max_new_tokens=512,
27
+ temperature=0.7,
28
+ top_p=0.9,
29
+ do_sample=True,
30
+ pad_token_id=self.tokenizer.eos_token_id
31
+ )
32
+
33
+ return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
34
+
35
+ # Templates de prompts por categoria
36
+ TEMPLATES = {
37
+ "história": {
38
+ "creative": "Crie uma história {gênero} sobre {tema} com {personagens} personagens. A história deve ter {comprimento} palavras e incluir {elementos}.",
39
+ "analysis": "Analise a seguinte história considerando {aspectos}. Foque em {elementos} e forneça exemplos específicos do texto.",
40
+ "continuation": "Continue a seguinte história mantendo o {tom} e desenvolvendo {elementos}."
41
+ },
42
+ "técnico": {
43
+ "tutorial": "Crie um tutorial detalhado sobre {tema} para {público}. Inclua {elementos} e forneça {exemplos} exemplos práticos.",
44
+ "documentation": "Documente {sistema} incluindo {aspectos}. Foque em {elementos} e forneça {exemplos} exemplos de uso.",
45
+ "troubleshooting": "Crie um guia de solução de problemas para {sistema} cobrindo {problemas}."
46
+ },
47
+ "educacional": {
48
+ "lesson": "Prepare uma aula sobre {tema} para {público}. Inclua {objetivos} e atividades práticas.",
49
+ "exercise": "Crie exercícios sobre {tema} com {dificuldade} níveis de dificuldade.",
50
+ "explanation": "Explique {conceito} para {público} usando {analogias} e exemplos práticos."
51
+ }
52
+ }
53
+
54
+ # Inicializa o gerador de prompts
55
+ generator = PromptGenerator()
56
+
57
+ def generate_prompt(categoria: str, subcategoria: str, tema: str, elementos: str,
58
+ público_alvo: str, tom: str, comprimento: int,
59
+ usar_llm: bool = True) -> str:
60
+ """Gera um prompt baseado nos parâmetros e usa o modelo para expandir"""
61
+
62
+ if categoria not in TEMPLATES or subcategoria not in TEMPLATES[categoria]:
63
+ return "Categoria ou subcategoria não encontrada"
64
+
65
+ template = TEMPLATES[categoria][subcategoria]
66
+
67
+ # Parâmetros base para o template
68
+ params = {
69
+ "tema": tema,
70
+ "elementos": elementos,
71
+ "público": público_alvo,
72
+ "tom": tom,
73
+ "comprimento": comprimento,
74
+ "gênero": random.choice(["de aventura", "de mistério", "de fantasia", "de ficção científica"]),
75
+ "personagens": random.randint(2, 5),
76
+ "aspectos": "caracterização, desenvolvimento do enredo, temas principais",
77
+ "exemplos": random.randint(3, 5),
78
+ "sistema": tema,
79
+ "problemas": "problemas comuns e casos específicos",
80
+ "dificuldade": random.randint(3, 5),
81
+ "conceito": tema,
82
+ "analogias": "analogias cotidianas"
83
+ }
84
+
85
+ # Gera o prompt base
86
+ base_prompt = template.format(**params)
87
+ base_prompt += f"\n\nTom desejado: {tom}"
88
+
89
+ if comprimento:
90
+ base_prompt += f"\nComprimento aproximado: {comprimento} palavras"
91
+
92
+ # Se solicitado, usa o modelo para expandir o prompt
93
+ if usar_llm:
94
+ instruction = f"""
95
+ Você é um assistente especializado em criar prompts detalhados em português para LLMs.
96
+ Expanda e melhore o seguinte prompt base, adicionando mais detalhes, exemplos e estrutura:
97
+
98
+ {base_prompt}
99
+
100
+ Crie uma versão mais completa e detalhada deste prompt, mantendo o objetivo original
101
+ mas adicionando mais contexto e especificidade.
102
+ """
103
+ return generator.generate_with_model(instruction)
104
+
105
+ return base_prompt
106
+
107
+ def create_interface():
108
+ """Cria a interface do Gradio"""
109
+
110
+ with gr.Blocks(title="Gerador de Prompts para LLMs") as app:
111
+ gr.Markdown("# 🤖 Gerador de Prompts Inteligente")
112
+ gr.Markdown("Crie prompts estruturados e detalhados usando IA")
113
+
114
+ with gr.Row():
115
+ with gr.Column():
116
+ categoria = gr.Dropdown(
117
+ choices=list(TEMPLATES.keys()),
118
+ label="Categoria",
119
+ value="história"
120
+ )
121
+ subcategoria = gr.Dropdown(
122
+ choices=list(TEMPLATES["história"].keys()),
123
+ label="Subcategoria",
124
+ value="creative"
125
+ )
126
+ tema = gr.Textbox(
127
+ label="Tema Principal",
128
+ placeholder="Ex: inteligência artificial, sustentabilidade"
129
+ )
130
+
131
+ with gr.Column():
132
+ elementos = gr.Textbox(
133
+ label="Elementos Específicos",
134
+ placeholder="Ex: conflitos, conceitos, exemplos práticos"
135
+ )
136
+ público_alvo = gr.Textbox(
137
+ label="Público Alvo",
138
+ placeholder="Ex: iniciantes, profissionais, estudantes"
139
+ )
140
+ tom = gr.Dropdown(
141
+ choices=["formal", "informal", "técnico", "conversacional", "educativo"],
142
+ label="Tom",
143
+ value="formal"
144
+ )
145
+ comprimento = gr.Slider(
146
+ minimum=100,
147
+ maximum=2000,
148
+ step=100,
149
+ label="Comprimento (palavras)",
150
+ value=500
151
+ )
152
+ usar_llm = gr.Checkbox(
153
+ label="Usar IA para expandir prompt",
154
+ value=True
155
+ )
156
+
157
+ gerar_btn = gr.Button("Gerar Prompt")
158
+ saida = gr.Textbox(label="Prompt Gerado", lines=10)
159
+
160
+ def atualizar_subcategorias(categoria):
161
+ return gr.Dropdown(choices=list(TEMPLATES[categoria].keys()))
162
+
163
+ categoria.change(atualizar_subcategorias, inputs=[categoria], outputs=[subcategoria])
164
+ gerar_btn.click(
165
+ generate_prompt,
166
+ inputs=[categoria, subcategoria, tema, elementos, público_alvo, tom, comprimento, usar_llm],
167
+ outputs=[saida]
168
+ )
169
+
170
+ return app
171
+
172
+ # Criar e iniciar a aplicação
173
+ app = create_interface()
174
+
175
+ if __name__ == "__main__":
176
+ app.launch()