Update app.py
Browse files
app.py
CHANGED
|
@@ -1,113 +1,159 @@
|
|
|
|
|
| 1 |
import json
|
| 2 |
-
import random
|
| 3 |
import time
|
|
|
|
| 4 |
from datetime import datetime
|
| 5 |
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
# -----------------------------
|
| 11 |
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 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 |
-
|
| 35 |
-
|
|
|
|
| 36 |
|
|
|
|
|
|
|
| 37 |
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
|
|
|
| 42 |
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
|
| 48 |
-
#
|
| 49 |
-
#
|
| 50 |
-
#
|
| 51 |
|
| 52 |
-
def
|
|
|
|
| 53 |
|
| 54 |
-
|
|
|
|
| 55 |
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
-
|
| 62 |
|
| 63 |
-
n = random.randint(2, 5)
|
| 64 |
-
print(f"N de respostas alternativas: {n}")
|
| 65 |
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
print(" -", r)
|
| 70 |
|
| 71 |
-
|
| 72 |
-
print(f"\nResposta mais provável selecionada:\n -> {mais_provavel}")
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
for resp in respostas
|
| 77 |
-
}
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
|
|
| 82 |
|
| 83 |
-
|
| 84 |
-
|
| 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("\
|
|
|
|
| 100 |
|
| 101 |
-
|
| 102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
|
| 104 |
-
print("
|
|
|
|
|
|
|
|
|
|
| 105 |
|
| 106 |
-
print("Aguardando próxima
|
| 107 |
time.sleep(intervalo)
|
| 108 |
|
| 109 |
-
print("\n===== FINALIZADO =====")
|
| 110 |
|
|
|
|
|
|
|
|
|
|
| 111 |
|
| 112 |
-
|
| 113 |
-
gerar_dataset_loop(
|
|
|
|
| 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()
|