amalia-chat / app.py
mrcss's picture
Upload app.py with huggingface_hub
1341aab verified
Raw
History Blame Contribute Delete
3.5 kB
"""
Interface de chat para o modelo Amália (amalia-llm/AMALIA-9B-0626-DPO).
Corre como um HuggingFace Space com hardware "ZeroGPU" (gratuito, GPU partilhada
atribuída sob pedido através do decorador @spaces.GPU).
Modelo: https://huggingface.co/amalia-llm/AMALIA-9B-0626-DPO
Licença do modelo: Apache 2.0
"""
import gradio as gr
import spaces
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_ID = "amalia-llm/AMALIA-9B-0626-DPO"
SYSTEM_PROMPT_PADRAO = (
"És a Amália, um assistente de IA em português europeu, desenvolvido por um "
"consórcio de universidades e centros de investigação portugueses, com "
"financiamento do Governo de Portugal. Respondes sempre em português de Portugal, "
"de forma clara, precisa e útil. Quando não tens a certeza de um facto, dizes isso "
"abertamente em vez de inventar informação."
)
print(f"A carregar tokenizer e modelo: {MODEL_ID} ...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=torch.bfloat16,
device_map="auto",
)
print("Modelo carregado.")
@spaces.GPU(duration=90)
def gerar_resposta(mensagem, historico, system_message, max_tokens, temperature, top_p):
mensagens = [{"role": "system", "content": system_message}]
for turno_utilizador, turno_assistente in historico:
mensagens.append({"role": "user", "content": turno_utilizador})
if turno_assistente:
mensagens.append({"role": "assistant", "content": turno_assistente})
mensagens.append({"role": "user", "content": mensagem})
entradas = tokenizer.apply_chat_template(
mensagens,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(model.device)
tamanho_entrada = entradas["input_ids"].shape[-1]
with torch.no_grad():
saida = model.generate(
**entradas,
max_new_tokens=int(max_tokens),
temperature=float(temperature),
top_p=float(top_p),
do_sample=True,
pad_token_id=tokenizer.eos_token_id or tokenizer.pad_token_id,
)
resposta = tokenizer.decode(
saida[0][tamanho_entrada:],
skip_special_tokens=True,
)
return resposta
demo = gr.ChatInterface(
fn=gerar_resposta,
additional_inputs=[
gr.Textbox(
value=SYSTEM_PROMPT_PADRAO,
label="Instrução de sistema",
lines=4,
),
gr.Slider(minimum=32, maximum=1024, value=512, step=32, label="Máximo de tokens novos"),
gr.Slider(minimum=0.1, maximum=1.5, value=0.7, step=0.05, label="Temperatura"),
gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p"),
],
title="Amália, assistente em português europeu",
description=(
"Conversa com o Amália (AMALIA-9B-0626-DPO), o primeiro modelo de linguagem "
"aberto em português europeu, desenvolvido por um consórcio de universidades "
"portuguesas com financiamento do PRR. "
"As respostas podem conter erros, confirma sempre informação factual importante."
),
examples=[
["Explica-me, em poucas frases, o que é o projeto Amália."],
["Escreve um email formal a pedir uma reunião para a próxima semana."],
["Resume as vantagens de um modelo de linguagem soberano para Portugal."],
],
)
if __name__ == "__main__":
demo.launch()