caarleexx commited on
Commit
22df6b5
·
verified ·
1 Parent(s): 0b4c98b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -79
app.py CHANGED
@@ -1,113 +1,159 @@
 
1
  import json
2
- import random
3
  import time
 
4
  from datetime import datetime
5
 
6
- DATASET_PATH = "dataset_castelos.jsonl"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
- # -----------------------------
9
- # Funções auxiliares
10
- # -----------------------------
11
 
12
- def gerar_pergunta():
13
- temas = [
14
- "Como construir um castelo?",
15
- "Como plantar uma árvore?",
16
- "Como organizar uma festa?",
17
- "Como iniciar um projeto?",
18
- "Como aprender rápido?",
19
- "Como montar uma estratégia?",
20
- "Como resolver um problema complexo?"
21
- ]
22
- return random.choice(temas)
23
 
 
 
 
24
 
25
- def gerar_respostas_possiveis(pergunta, n):
26
- moldes = [
27
- "Planeje cuidadosamente, estabeleça uma base sólida e avance com estratégia.",
28
- "Comece pelos fundamentos, eleve a estrutura e finalize com precisão.",
29
- "Prepare o terreno, organize os elementos e execute cada etapa com clareza.",
30
- "Defina o objetivo, estruture fases e avance de forma consistente.",
31
- "Analise o contexto, construa a base e reforce cada camada do processo."
32
- ]
33
 
34
- respostas = random.sample(moldes, n)
35
- return respostas
 
36
 
 
 
37
 
38
- def escolher_resposta_mais_provavel(respostas):
39
- # Critério simples: escolhe a mais "genérica" (menor divergência aparente)
40
- return min(respostas, key=len)
 
 
 
 
 
41
 
 
42
 
43
- def calcular_divergencia(base, resposta):
44
- # Divergência = diferença de tamanho + diferença lexical superficial
45
- return abs(len(resposta) - len(base)) + random.randint(1, 5)
 
 
 
 
 
 
 
 
 
46
 
47
 
48
- # -----------------------------
49
- # Loop principal de geração
50
- # -----------------------------
51
 
52
- def gerar_dataset_loop(iteracoes=20, intervalo=1.5):
 
53
 
54
- print("\n===== INICIANDO GERADOR DE DATASET =====\n")
 
55
 
56
- for i in range(iteracoes):
 
 
 
57
 
58
- print(f"\n========= CICLO {i+1}/{iteracoes} =========")
59
- print("Gerando pergunta...")
 
 
 
 
 
60
 
61
- pergunta = gerar_pergunta()
62
 
63
- n = random.randint(2, 5)
64
- print(f"N de respostas alternativas: {n}")
65
 
66
- respostas = gerar_respostas_possiveis(pergunta, n)
67
- print("\nRespostas geradas:")
68
- for r in respostas:
69
- print(" -", r)
70
 
71
- mais_provavel = escolher_resposta_mais_provavel(respostas)
72
- print(f"\nResposta mais provável selecionada:\n -> {mais_provavel}")
73
 
74
- divergencias = {
75
- resp: calcular_divergencia(mais_provavel, resp)
76
- for resp in respostas
77
- }
78
 
79
- print("\nDivergências calculadas:")
80
- for r, d in divergencias.items():
81
- print(f" - {d}: {r}")
 
82
 
83
- registro = {
84
- "timestamp": str(datetime.now()),
85
- "pergunta": pergunta,
86
- "n_respostas": n,
87
- "resposta_mais_provavel": mais_provavel,
88
- "outras_respostas": [
89
- {"resposta": r, "divergencia": divergencias[r]}
90
- for r in respostas if r != mais_provavel
91
- ],
92
- "explicacao": (
93
- "Perguntas abertas podem gerar múltiplas respostas válidas. "
94
- "A variação ocorre devido a diferentes interpretações, níveis "
95
- "de abstração e estratégias possíveis incluídas nos moldes de resposta."
96
- )
97
- }
98
 
99
- print("\nSalvando no dataset...")
 
100
 
101
- with open(DATASET_PATH, "a", encoding="utf-8") as f:
102
- f.write(json.dumps(registro, ensure_ascii=False) + "\n")
 
 
 
 
103
 
104
- print(" Salvo.")
 
 
 
105
 
106
- print("Aguardando próxima iteração...")
107
  time.sleep(intervalo)
108
 
109
- print("\n===== FINALIZADO =====")
110
 
 
 
 
111
 
112
- # Executar
113
- gerar_dataset_loop(iteracoes=10, intervalo=1.2)
 
1
+ import os
2
  import json
 
3
  import time
4
+ import random
5
  from datetime import datetime
6
 
7
+ import torch
8
+ from transformers import AutoTokenizer, AutoModelForCausalLM
9
+ from huggingface_hub import HfApi, CommitOperationAdd
10
+
11
+
12
+ # =====================================================================
13
+ # CONFIGURAÇÕES DO DATASET E MODELO
14
+ # =====================================================================
15
+
16
+ DATASET_REPO = "caarleexx/AM"
17
+ HF_TOKEN = os.getenv("HF_TOKEN")
18
+ MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
19
+
20
+ DEVICE = "cpu" # Forçamos CPU
21
+
22
+
23
+ # =====================================================================
24
+ # CARREGAR MODELO
25
+ # =====================================================================
26
+
27
+ print("\n📥 Baixando TinyLlama… (CPU mode)\n")
28
+
29
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
30
+ model = AutoModelForCausalLM.from_pretrained(
31
+ MODEL_NAME,
32
+ torch_dtype=torch.float32, # CPU mode
33
+ device_map={"": DEVICE}
34
+ )
35
+
36
+ print("✅ TinyLlama carregado com sucesso na CPU!\n")
37
+
38
+
39
+ # =====================================================================
40
+ # FUNÇÃO DE GERAÇÃO LOCAL
41
+ # =====================================================================
42
 
43
+ def gerar_texto(prompt):
44
+ inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
 
45
 
46
+ with torch.no_grad():
47
+ output = model.generate(
48
+ **inputs,
49
+ max_new_tokens=600,
50
+ temperature=0.9,
51
+ top_p=0.92,
52
+ do_sample=True
53
+ )
 
 
 
54
 
55
+ text = tokenizer.decode(output[0], skip_special_tokens=True)
56
+ # Remover prompt do início
57
+ return text[len(prompt):].strip()
58
 
 
 
 
 
 
 
 
 
59
 
60
+ # =====================================================================
61
+ # PROMPT FIXO
62
+ # =====================================================================
63
 
64
+ PROMPT_TEMPLATE = """
65
+ Gere um único item de dataset em formato JSON válido.
66
 
67
+ Regras:
68
+ - Crie uma pergunta curta.
69
+ - Gere N aleatório entre 2 e 5.
70
+ - Gere a resposta principal.
71
+ - Gere N respostas alternativas.
72
+ - Para cada alternativa gere um valor "divergencia" de 0 a 1.
73
+ - Explique por que a pergunta pode ter múltiplas respostas.
74
+ - Devolva SOMENTE o JSON. Nada fora do JSON.
75
 
76
+ Formato exato:
77
 
78
+ {
79
+ "pergunta": "...",
80
+ "n": 3,
81
+ "resposta_principal": "...",
82
+ "respostas_alternativas": [
83
+ { "resposta": "...", "divergencia": 0.42 },
84
+ { "resposta": "...", "divergencia": 0.13 },
85
+ { "resposta": "...", "divergencia": 0.88 }
86
+ ],
87
+ "explicacao": "..."
88
+ }
89
+ """
90
 
91
 
92
+ # =====================================================================
93
+ # SALVAR NO DATASET HF
94
+ # =====================================================================
95
 
96
+ def salvar_no_dataset(registro):
97
+ api = HfApi()
98
 
99
+ filename = f"item_{int(time.time()*1000)}.json"
100
+ content = json.dumps(registro, indent=2, ensure_ascii=False)
101
 
102
+ op = CommitOperationAdd(
103
+ path_in_repo=filename,
104
+ path_or_fileobj=content.encode("utf-8")
105
+ )
106
 
107
+ api.create_commit(
108
+ repo_id=DATASET_REPO,
109
+ repo_type="dataset",
110
+ operations=[op],
111
+ commit_message=f"add {filename}",
112
+ token=HF_TOKEN
113
+ )
114
 
115
+ print(f"💾 Salvo no dataset: {filename}")
116
 
 
 
117
 
118
+ # =====================================================================
119
+ # LOOP PRINCIPAL DE GERAÇÃO
120
+ # =====================================================================
 
121
 
122
+ def gerar_dataset_loop(total=50000, intervalo=1):
 
123
 
124
+ print("\n🚀 Iniciando loop de geração com TinyLlama/CPU…\n")
125
+ time.sleep(3) # evita timeout do HF
 
 
126
 
127
+ for i in range(1, total + 1):
128
+ print("\n=================================================")
129
+ print(f"🔄 Iteração {i}/{total}")
130
+ print("=================================================")
131
 
132
+ print("📤 Gerando item…")
133
+ resposta = gerar_texto(PROMPT_TEMPLATE)
 
 
 
 
 
 
 
 
 
 
 
 
 
134
 
135
+ print("\n📥 Resposta crua:")
136
+ print(resposta)
137
 
138
+ # Tentar interpretar JSON
139
+ try:
140
+ data = json.loads(resposta)
141
+ except Exception as e:
142
+ print(f"❌ JSON inválido. Erro: {e}\nRetornando próxima iteração…")
143
+ continue
144
 
145
+ print("\n📌 JSON final:")
146
+ print(json.dumps(data, indent=2, ensure_ascii=False))
147
+
148
+ salvar_no_dataset(data)
149
 
150
+ print("Aguardando próxima geração…")
151
  time.sleep(intervalo)
152
 
 
153
 
154
+ # =====================================================================
155
+ # EXECUÇÃO
156
+ # =====================================================================
157
 
158
+ if __name__ == "__main__":
159
+ gerar_dataset_loop()