|
|
import random |
|
|
import time |
|
|
from datasets import Dataset, DatasetDict |
|
|
from huggingface_hub import HfApi |
|
|
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MODEL_NAME = "Qwen/Qwen2.5-0.5B-Instruct" |
|
|
DATASET_REPO = "caarleexx/AMP" |
|
|
|
|
|
print("[LOG] Carregando modelo...") |
|
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) |
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
MODEL_NAME, |
|
|
device_map="cpu" |
|
|
) |
|
|
generator = pipeline( |
|
|
"text-generation", |
|
|
model=model, |
|
|
tokenizer=tokenizer, |
|
|
max_new_tokens=200, |
|
|
temperature=0.9 |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gerar_pergunta_e_opcoes(): |
|
|
N = random.randint(2, 6) |
|
|
prompt = f"Crie uma pergunta curta com {N} respostas possíveis diferentes entre si." |
|
|
pergunta = generator(prompt)[0]["generated_text"].strip() |
|
|
return pergunta, N |
|
|
|
|
|
def gerar_resposta(principal_pergunta): |
|
|
prompt = f"Pergunta: {principal_pergunta}\nResponda de forma direta e objetiva." |
|
|
resposta = generator(prompt)[0]["generated_text"].strip() |
|
|
return resposta |
|
|
|
|
|
def gerar_alternativas(pergunta, N): |
|
|
prompt = f"Pergunta: {pergunta}\nListe {N} respostas possíveis, diferentes entre si, sem explicações." |
|
|
texto = generator(prompt)[0]["generated_text"] |
|
|
alternativas = [] |
|
|
for linha in texto.split("\n"): |
|
|
linha = linha.strip("-•1234567890. ") |
|
|
if len(linha) > 2: |
|
|
alternativas.append(linha) |
|
|
return alternativas[:N] |
|
|
|
|
|
def gerar_explicacao(pergunta): |
|
|
prompt = f"Explique de forma objetiva por que esta pergunta pode ter múltiplas respostas possíveis:\n{pergunta}" |
|
|
explicacao = generator(prompt)[0]["generated_text"].strip() |
|
|
return explicacao |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def carregar_dataset(): |
|
|
try: |
|
|
print("[LOG] Tentando carregar dataset remoto...") |
|
|
ds = DatasetDict.load_from_disk(DATASET_REPO) |
|
|
return ds |
|
|
except: |
|
|
print("[LOG] Criando dataset novo...") |
|
|
return DatasetDict({"train": Dataset.from_dict({"pergunta": [], "resposta": [], "alternativas": [], "explanação": []})}) |
|
|
|
|
|
def salvar_dataset(ds): |
|
|
print("[LOG] Salvando dataset no HuggingFace...") |
|
|
ds.push_to_hub(DATASET_REPO, private=False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def loop_geracao(qtd=10): |
|
|
ds = carregar_dataset() |
|
|
|
|
|
for i in range(qtd): |
|
|
print("\n====================================") |
|
|
print(f"[LOG] ITERAÇÃO {i+1}") |
|
|
print("====================================") |
|
|
|
|
|
pergunta, N = gerar_pergunta_e_opcoes() |
|
|
resposta = gerar_resposta(pergunta) |
|
|
alternativas = gerar_alternativas(pergunta, N) |
|
|
explicacao = gerar_explicacao(pergunta) |
|
|
|
|
|
novo_registro = { |
|
|
"pergunta": pergunta, |
|
|
"resposta": resposta, |
|
|
"alternativas": alternativas, |
|
|
"explanação": explicacao |
|
|
} |
|
|
|
|
|
print(f"[LOG] Pergunta: {pergunta}") |
|
|
print(f"[LOG] Resposta: {resposta}") |
|
|
print(f"[LOG] Alternativas: {alternativas}") |
|
|
print(f"[LOG] Explicação: {explicacao}") |
|
|
|
|
|
ds["train"] = ds["train"].add_item(novo_registro) |
|
|
salvar_dataset(ds) |
|
|
|
|
|
time.sleep(1) |
|
|
|
|
|
print("[LOG] Concluído.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
loop_geracao(qtd=50) |
|
|
|