Alpaca Data PT-BR: tradução e evolução de 51.759 instruções
Eu publiquei o Alpaca Data PT-BR como um corpus de ajuste instrucional em português no Hugging Face, em dominguesm/alpaca-data-pt-br. Traduzi automaticamente yahma/alpaca-cleaned, que deriva das demonstrações sintéticas do Stanford Alpaca. Com isso, tornei possível experimentar instruction tuning em português sem produzir dezenas de milhares de demonstrações do zero. Não submeti a primeira versão a uma revisão completa por falantes nativos e não a apresento como fonte factual confiável [1].
Na edição atual, publiquei 51.759 registros, uma única divisão train e três colunas de texto. O arquivo Parquet tem 11.508.709 bytes, com tamanho lógico declarado de 18.324.606 bytes [1]. Para reproduzir o trabalho, registre a edição usada, pois o Alpaca, o Alpaca-Cleaned e minha tradução receberam atualizações independentes.
| Propriedade | Estado público consultado |
|---|---|
| Repositório | dominguesm/alpaca-data-pt-br |
| Divisão | train |
| Registros | 51.759 |
| Esquema | instruction: string, input: string, output: string |
| Formato | um arquivo Parquet |
| Idioma declarado | português (pt) |
| Licença declarada | CC BY-NC 4.0 |
| Origem declarada | tradução automática de yahma/alpaca-cleaned |
Da Self-Instruct ao português
A linhagem começa na Self-Instruct, técnica que usa um modelo de linguagem para gerar instruções, entradas e respostas, filtra itens inválidos ou semelhantes e então reajusta um modelo com os exemplos aceitos [2]. O Stanford Alpaca adaptou essa ideia: partiu de 175 tarefas escritas por humanos, usou text-davinci-003 para gerar 20 instruções por chamada, eliminou a distinção entre tarefas de classificação e não classificação e gerou uma única instância para cada instrução. O resultado publicado foi alpaca_data.json, com 52.002 triplas e custo de API inferior a US$ 500. Cerca de 40% dos exemplos originais tinham input não vazio [3].
Os 52.002 registros são demonstrações, não conversas: instruction descreve a tarefa; input oferece contexto opcional; output é a resposta produzida por text-davinci-003. O template Alpaca apenas concatena esses campos antes do treino. Na versão inicial, não registrei campos para autoria, fonte, domínio, nível de risco, idioma por linha, qualidade, identificador estável ou revisão humana.
O projeto AlpacaDataCleaned surgiu em 21 de março de 2023 e publicou yahma/alpaca-cleaned no Hub em 24 de março. Seus mantenedores identificaram URLs sem conteúdo disponível, instruções fundidas, saídas vazias ou N/A, pedidos dependentes de imagem, exemplos de código incompletos, marcadores inconsistentes de entrada vazia, caracteres de controle e respostas erradas. O README estima que cerca de 80% dos problemas matemáticos examinados estavam incorretos, mas não apresenta desenho amostral ou intervalo de confiança; esse número deve ser tratado como estimativa dos curadores, não como prevalência comprovada [4].
“Cleaned” também não significa “validado”. O próprio repositório avisa que ainda há problemas e seu histórico registra correções manuais, substituição de exercícios de código, inclusão de tarefas adversariais e, em abril, fusão de resultados do GPT-4. A edição inglesa de 26 de março tinha 51.759 itens; a edição publicada em 10 de abril tem 51.760, quatro triplas exatamente duplicadas e conteúdo posterior à publicação PT-BR. Logo, o dataset português atual não é tradução do estado atual da coleção inglesa, mas de um estágio anterior compatível em data e cardinalidade [4][5].
Renderizando diagrama...
Evolução dos dados publicados
Publiquei duas edições do conjunto. A primeira tinha 52.002 linhas. Depois, substituí esse arquivo pela edição atual, com 51.759 linhas traduzidas do Alpaca-Cleaned. Não se trata da mesma edição com outro nome [1].
Na segunda edição, traduzi as 51.759 linhas de yahma/alpaca-cleaned. Na versão inicial, não registrei chaves estáveis de origem, pares inglês-português nem um manifesto de execução. Com o Parquet final que preservei, não consigo reconstruir uma correspondência linha a linha.
Para traduzir, carreguei alpaca_data.json, criei um pipeline("translation") com Helsinki-NLP/opus-mt-tc-big-en-pt na GPU e prefixei cada campo não vazio com >>por<<. Em seguida, transformei instruction, input e output em três itens por registro, traduzi lotes de 32 com truncation=True e max_length=512 e reagrupei os resultados [6].
Usei o OPUS-MT transformer-big Marian, com SentencePiece e 232,5 milhões de parâmetros, e escolhi o marcador >>por<< para português genérico; o modelo também aceita >>pob<< para português brasileiro. Seus resultados de referência são chrF de 0,69320 no Tatoeba e 0,71673 no FLORES-101, além de BLEU 49,6 e 50,4; essas métricas são do tradutor em conjuntos gerais e não medem a tradução deste Alpaca [7].
Na primeira versão, não fixei as versões de transformers, do modelo ou do dataset. Também usei max_length=512 na geração com truncamento sem registrar quantos campos foram cortados. Por fim, preservei uma célula que chama batched(ds, 3) em vez de percorrer translated_ds; essa célula não recompõe as traduções e precisa ser corrigida. Não preservei a versão final usada na execução. A tradução dos três campos também levou para o português eventuais erros factuais das respostas inglesas.
Validação após a publicação
Depois da publicação, validei o Parquet completo e encontrei zero valores nulos, mas 12 output vazios. Há 32.037 input vazios, comportamento esperado porque o contexto é opcional. Não existem triplas exatamente duplicadas nem triplas duplicadas após normalização NFKC, caixa e espaços. Entretanto, há nove repetições de instruction normalizada e cinco repetições da chave instruction + input.
As colisões de prompt são materialmente relevantes. “Traduza o "Twitter" para Inglês.” aparece quatro vezes com respostas sem relação entre si: traduções equivalentes a “crescimento verde”, “é lindo”, “sou berlinense” e “estou cansada”. “Traduzir ‘WPReadability’ para Inglês.” aparece duas vezes com saídas diferentes e igualmente desconectadas. Isso parece perda de informação ou colisão criada pela tradução, não diversidade útil.
Testes lexicais encontraram zero caracteres de controle e zero marcadores como <no input>, <no output> ou <Picture Attached>, mas 149 linhas ainda contêm URLs. O primeiro Parquet tinha 40 saídas vazias, 418 linhas com URL e 182 com esses marcadores. A segunda edição melhorou indicadores simples, mas não os eliminou por completo, e tais expressões regulares não avaliam sentido.
Na amostra que revisei, a descrição do átomo atribui carga positiva a prótons e nêutrons; uma tarefa com entrada “João” responde sobre “John”; código Python perde operadores e sintaxe; fórmulas perdem sinais; várias respostas terminam no meio de uma frase. São erros factuais, de localização, preservação de símbolos e completude. Uma amostra revisada ainda é necessária para estimar prevalências.
O código abaixo reproduz os principais testes sobre o estado baixado e seleciona uma amostra. Registre a data de acesso e preserve o Parquet analisado junto ao relatório. Deduplicar apenas a tripla completa seria insuficiente: antes de separar treino e validação, deve-se agrupar a chave de prompt e, idealmente, vizinhos semânticos.
import math
import unicodedata
from datasets import load_dataset
REPO = "dominguesm/alpaca-data-pt-br"
df = load_dataset(REPO, split="train").to_pandas()
assert len(df) == 51_759
assert list(df.columns) == ["instruction", "input", "output"]
def normalize(text: str) -> str:
text = unicodedata.normalize("NFKC", text).casefold()
return " ".join(text.split())
keys = df.assign(
instruction_norm=df["instruction"].map(normalize),
input_norm=df["input"].map(normalize),
)
print("saídas vazias:", df["output"].str.strip().eq("").sum())
print("triplas repetidas:", df.duplicated().sum())
print(
"prompts repetidos:",
keys.duplicated(["instruction_norm", "input_norm"]).sum(),
)
# Amostra conservadora para 95% de confiança e erro de ±5 p.p.
z, p, error = 1.96, 0.5, 0.05
n = math.ceil(z**2 * p * (1 - p) / error**2) # 385
audit_sample = df.sample(n=n, random_state=2026)
audit_sample.to_json("audit-sample.jsonl", orient="records", lines=True)Próxima etapa de validação: 385 exemplos, tradução e fatos
Para estimar uma proporção desconhecida de comportamentos que quero corrigir com 95% de confiança e margem de erro de aproximadamente ±5 pontos percentuais, usa-se a condição conservadora p = 0,5:
A correção para população finita daria cerca de 382 itens para N = 51.759; manter 385 é simples e conservador. A fórmula pressupõe amostragem aleatória simples e estima uma proporção global. Para diagnosticar melhor, convém estratificar por presença de input, domínio, código/matemática, comprimento, URLs e caudas de baixa pontuação automática, ponderando os resultados para recuperar a estimativa global. Dois revisores bilíngues devem rotular adequação da instrução, fidelidade da entrada, correção da saída, fluência PT-BR, preservação de nomes/números/código, completude, segurança e gravidade. Relate concordância e intervalo de Wilson, não apenas a média.
Renderizando diagrama...
chrF. Para uma subamostra com traduções PT-BR de referência feitas por humanos, calcule chrF ou chrF++, que compara n-gramas de caracteres e tolera melhor variações morfológicas que correspondência por palavra [9]. Reporte por campo e estrato, não uma única pontuação concatenada. Sem referência humana, não existe “chrF da tradução” confiável.
Retrotradução. Traduza o PT-BR de volta ao inglês com um modelo independente e calcule chrF entre fonte inglesa e retrotradução. Um BT-chrF baixo é útil para priorizar revisão; um valor alto não me permite concluir qualidade, pois ida e volta podem preservar o mesmo erro, desfazer uma escolha ruim ou ignorar naturalidade e variante brasileira. Para isso seria preciso recuperar e alinhar a edição inglesa de 26 de março, adicionando uma chave de origem e o mapeamento explícito de cada campo.
Factualidade e execução. Separe proposições atômicas e marque a fração sustentada por fontes confiáveis, no espírito do FActScore [10]. Para respostas curtas, use exatidão ou F1 contra gabaritos; para matemática, extraia números, unidades e recalcule; para código, preserve blocos e execute testes em sandbox; para resumo e extração, verifique cobertura e contradição contra o input. Mantenha métricas distintas para correção factual e cumprimento da instrução: uma resposta pode ser verdadeira e ainda não realizar a tarefa.
Uso no Alpaca-LoRA PT-BR
Usei a estrutura de três campos deste dataset para montar os prompts do alpaca-lora-ptbr-7b [8]. No primeiro treino, processei 52.002 linhas da edição inicial. A versão limpa de 51.759 linhas foi publicada depois e não representa o corpus daquele primeiro ajuste. Não preservei o registro de um novo ajuste do adaptador após a substituição.
Essa mudança afeta reprodutibilidade e avaliação. Treinar hoje com load_dataset(REPO) usa 51.759 exemplos diferentes dos 52.002 vistos em 2023. Para uma reprodução, recomendo nomear a edição pela data, preservar o arquivo-fonte e um manifesto de execução, guardar os índices de treino/validação e impedir que prompts duplicados ou semanticamente próximos cruzem a divisão. Apresento o adaptador como registro da utilidade histórica do corpus, não como validação de sua tradução ou de suas respostas.
Licença e limites dos dados sintéticos
Publiquei a tradução sob CC BY-NC 4.0, a mesma licença declarada pelos dados Stanford Alpaca e pelo arquivo DATA_LICENSE do AlpacaDataCleaned. O cartão atual de yahma/alpaca-cleaned, por outro lado, exibe CC BY 4.0, em conflito com o repositório de origem. Para esta tradução, adote BY-NC: atribua autores e fontes, ligue a licença, indique modificações e não use para finalidade primariamente comercial [1][4][11]. A licença chama tradução de material adaptado e não concede direitos que o licenciante não possua. Ela tampouco garante exatidão, ausência de conteúdo de terceiros, direitos de personalidade ou adequação a um caso de uso. Isto não é aconselhamento jurídico.
Há ainda uma cadeia de termos por artefato. Um dataset licenciado não transfere automaticamente a licença do modelo-base, do código, do tradutor ou dos pesos ajustados. O LLaMA v1 usado pelo Alpaca-LoRA tinha licença própria; o OPUS-MT declara CC BY 4.0, mas foi treinado em coleções OPUS com proveniências variadas; e Stanford registrou que os termos então aplicáveis ao text-davinci-003 eram uma razão adicional para restringir o Alpaca à pesquisa [3][7][8].
Por fim, todo output descende de um modelo, não de um especialista. A coleção pode reproduzir vieses, estereótipos, estilo conciso, centrismo estadunidense e alucinações do professor; a limpeza pode introduzir respostas de outro modelo; a tradução acrescenta outra transformação probabilística. Não registrei no card PT-BR documentação de anotadores, validação de dados pessoais, cobertura regional, concordância humana ou testes de segurança. Pesquisas sobre treinamento recursivo mostram perda das caudas da distribuição quando conteúdo gerado substitui indiscriminadamente dados originais ao longo de gerações; isso não me permite concluir “colapso” neste ajuste único, mas reforça a necessidade de preservar fontes humanas, proveniência e avaliações independentes [12].
Hoje trato o uso responsável como pesquisa não comercial com versão fixada, deduplicação por prompt, amostragem inspecionada e validação externa. Para aplicações brasileiras reais, apresento o corpus como matéria-prima histórica e pretendo orientar sua evolução pela correção ou remoção de exemplos inadequados, pela inclusão de demonstrações humanas locais, pela documentação de domínios e riscos e pela publicação de um conjunto de teste PT-BR independente.
Referências
- Domingues, M. Alpaca-Cleaned-PTBR: cartão, arquivos e amostras. Hugging Face, 2023. https://huggingface.co/datasets/dominguesm/alpaca-data-pt-br
- Wang, Y. et al. Self-Instruct: Aligning Language Models with Self-Generated Instructions. ACL, 2023. https://arxiv.org/abs/2212.10560
- Taori, R. et al. Stanford Alpaca: An Instruction-following LLaMA Model. Stanford CRFM/GitHub, 2023. https://github.com/tatsu-lab/stanford_alpaca
- Gururise. AlpacaDataCleaned. GitHub, 2023. https://github.com/gururise/AlpacaDataCleaned
- Yahma; Gururise. alpaca-cleaned: cartão e arquivos. Hugging Face, 2023. https://huggingface.co/datasets/yahma/alpaca-cleaned
- Domingues, M. Notebook histórico
01 - Translate Dataset.ipynbe histórico do Alpaca-LoRA-PTBR. GitHub, 2023. https://github.com/DominguesM/alpaca-lora-ptbr-7b - Helsinki-NLP. opus-mt-tc-big-en-pt model card. Hugging Face, 2022. https://huggingface.co/Helsinki-NLP/opus-mt-tc-big-en-pt
- Domingues, M. Alpaca-LoRA PT-BR 7B: model card e notebook de treinamento. Hugging Face/GitHub, 2023. https://huggingface.co/dominguesm/alpaca-lora-ptbr-7b
- Popović, M. chrF: character n-gram F-score for automatic MT evaluation. WMT, 2015. https://aclanthology.org/W15-3049/
- Min, S. et al. FActScore: Fine-grained Atomic Evaluation of Factual Precision in Long Form Text Generation. EMNLP, 2023. https://aclanthology.org/2023.emnlp-main.741/
- Creative Commons. Attribution-NonCommercial 4.0 International: Legal Code. https://creativecommons.org/licenses/by-nc/4.0/legalcode
- Shumailov, I. et al. AI models collapse when trained on recursively generated data. Nature 631, 755-759, 2024. https://doi.org/10.1038/s41586-024-07566-y
BibTeX
@dataset{domingues2023alpacaptbr,
author = {Maicon Domingues},
title = {Alpaca-Cleaned-PTBR},
year = {2023},
publisher = {Hugging Face},
url = {https://huggingface.co/datasets/dominguesm/alpaca-data-pt-br}
}
@inproceedings{wang2023selfinstruct,
author = {Yizhong Wang and Yeganeh Kordi and Swaroop Mishra and Alisa Liu and Noah A. Smith and Daniel Khashabi and Hannaneh Hajishirzi},
title = {Self-Instruct: Aligning Language Models with Self-Generated Instructions},
booktitle = {Proceedings of ACL},
year = {2023},
url = {https://arxiv.org/abs/2212.10560}
}
@misc{taori2023alpaca,
author = {Rohan Taori and Ishaan Gulrajani and Tianyi Zhang and Yann Dubois and Xuechen Li and Carlos Guestrin and Percy Liang and Tatsunori B. Hashimoto},
title = {Stanford Alpaca: An Instruction-following LLaMA Model},
year = {2023},
howpublished = {GitHub repository},
url = {https://github.com/tatsu-lab/stanford_alpaca}
}
@misc{gururise2023alpacacleaned,
author = {{Gururise contributors}},
title = {Cleaned Alpaca Dataset},
year = {2023},
howpublished = {GitHub repository},
url = {https://github.com/gururise/AlpacaDataCleaned}
}
@inproceedings{popovic2015chrf,
author = {Maja Popovi{\'c}},
title = {chrF: character n-gram F-score for automatic MT evaluation},
booktitle = {Proceedings of the Tenth Workshop on Statistical Machine Translation},
year = {2015},
pages = {392--395},
doi = {10.18653/v1/W15-3049}
}
@inproceedings{min2023factscore,
author = {Sewon Min and Kalpesh Krishna and Xinxi Lyu and Mike Lewis and Wen-tau Yih and Pang Koh and Mohit Iyyer and Luke Zettlemoyer and Hannaneh Hajishirzi},
title = {FActScore: Fine-grained Atomic Evaluation of Factual Precision in Long Form Text Generation},
booktitle = {Proceedings of EMNLP},
year = {2023},
pages = {12076--12100},
doi = {10.18653/v1/2023.emnlp-main.741}
}
@article{shumailov2024collapse,
author = {Ilia Shumailov and Zakhar Shumaylov and Yiren Zhao and Nicolas Papernot and Ross Anderson and Yarin Gal},
title = {AI models collapse when trained on recursively generated data},
journal = {Nature},
volume = {631},
pages = {755--759},
year = {2024},
doi = {10.1038/s41586-024-07566-y}
}