Create app.py
Browse files
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()
|