Guia sobre a avaliação de modelos de linguagem para tarefas de Pergunta e Resposta (QA) em português brasileiro.
Equipe:
CAMILLE SOUSA MENESES DE SANTANA
NAYLA SAHRA SANTOS DAS CHAGAS
TULIO SOUSA DE GOIS
Neste tutorial, vamos explorar um processo estruturado para testar e comparar o desempenho de modelos de código aberto, disponíveis gratuitamente na plataforma Hugging Face. Nosso principal objetivo é responder à pergunta: "Como é o desempenho de modelos gratuitos do Hugging Face na tarefa de QA em português brasileiro?"
Para isso, utilizaremos um notebook em Python, criado no ambiente do Google Colab, e dois documentos que servirão como nossa base de conhecimento: um sobre doenças respiratórias crônicas e um dicionário de dados do sus.
O primeiro passo em qualquer projeto de processamento de linguagem natural é garantir que todas as ferramentas necessárias estejam instaladas. No ambiente do Google Colab, isso é feito de maneira simples, utilizando o comando:
!pip install -U --quiet transformers pypdf python-docx pandas
transformers
: Esta é a biblioteca principal do Hugging Face. Ela nos dá acesso a milhares de modelos pré-treinados para diversas tarefas, incluindo a de Perguntas e Respostas.pypdf
: Utilizada para extrair o texto de documentos no formato PDF. No nosso caso, será usada para ler o arquivodoencas_respiratorias_cronicas.pdf
.python-docx
: Permite a extração de texto de documentos do Microsoft Word (.docx
), como o nossoDICIONARIO_DE_DADOS.docx
.pandas
: Embora não seja central para a tarefa de QA em si, é uma ferramenta poderosa para manipulação e análise de dados, útil para organizar os resultados dos testes.
Após a instalação, importamos os módulos necessários para o nosso script.
import pypdf
import docx
import pandas as pd
from transformers import pipeline
Um modelo de QA precisa de um contexto para encontrar as respostas. Nesta etapa, preparamos nossos dois documentos para que sirvam como essa base de conhecimento, extraindo o texto bruto e armazenando-o em variáveis.
doencas_respiratorias_cronicas.pdf
Utiliza-se a biblioteca pypdf
para ler o arquivo PDF página por página e concatenar todo o texto em uma única variável chamada conteudo_doencas_cronicas
.
doencas_cronicas = pypdf.PdfReader("doencas_respiratorias_cronicas.pdf")
conteudo_doencas_cronicas = "\\n".join([doencas_cronicas.pages[i].extract_text() for i in range(len(doencas_cronicas.pages))])
DICIONARIO_DE_DADOS.docx
De forma similar à pypdf, a biblioteca docx
é percorre o documento do Word, extraindo o conteúdo de parágrafos e tabelas. O texto de cada célula da tabela é unido por um separador (|
) para manter a estrutura, e o resultado final é armazenado na variável dict_dados
.
doc = docx.Document("DICIONARIO_DE_DADOS.docx")
textos_completos = []
for para in doc.paragraphs:
textos_completos.append(para.text)
for table in doc.tables:
for row in table.rows:
textos_completos.append(" | ".join(cell.text for cell in row.cells))
dict_dados = "\\n".join(textos_completos)
Para organizar o processo de avaliação, foi criada uma função reutilizável chamada responder_pergunta
. Esta função é o coração do nosso experimento. Ela recebe dois argumentos: qa_input e model_name.
def responder_pergunta(qa_input: dict, model_name: str) -> dict:
"""
Carrega um modelo de Question Answering e retorna a resposta para uma pergunta.
"""
qa_model = pipeline("question-answering", model=model_name, tokenizer=model_name)
resultado = qa_model(qa_input)
return resultado
Os argumentos da função possuem os seguintes papéis:
* qa_input
: Um dicionário contendo a pergunta (question
) e o texto de referência (context
).
* model_name
: O nome do modelo a ser baixado do Hugging Face.
Dentro dela, inicializamos o pipeline
, executamos o modelo com a pergunta desejada e o contexto e retornamos a resposta gerada.
O
pipeline
do Hugging Face é uma abstração de alto nível que simplifica o uso de modelos. Ao especificar"question-answering"
, a biblioteca cuida de todo o pré-processamento do texto e da formatação da saída.
A saída da função é um dicionário que contém a resposta encontrada (answer
), um índice de confiança (score
) e a localização da resposta no texto original (start
e end
).
Com o ambiente e as funções prontos, o processo de avaliação pode começar. O objetivo é submeter três modelos diferentes às mesmas perguntas e comparar suas respostas.
1. Seleção dos modelos:
Para este teste, foram escolhidos três modelos gratuitos disponíveis no Hugging Face. A seleção levou em conta a popularidade e a adequação para a tarefa, mas também as limitações do ambiente (Google Colab gratuito), que restringe o uso de modelos muito grandes. Os modelos selecionados para o teste foram:
deepset/xlm-roberta-large-squad2
pierreguillou/bert-base-cased-squad-v1.1-portuguese
benjleite/ptt5-ptbr-qa
2. Escolha das perguntas:
Foram selecionadas manualmente três perguntas para cada documento, buscando cobrir diferentes tipos de extração de informação.
- Para o documento
doencas_respiratorias_cronicas.pdf
:- O que diferencia a hemoptise falsa da verdadeira?
- Quais os tratamentos e atos de prevenção para rinite persistente grave?
- Quais os cuidados ambientais necessários para o controle das crises asmáticas?
- Para o documento
DICIONARIO_DE_DADOS.docx
:- Quais são os possíveis tipos de serviço referenciado, de acordo com a tabela
LFCES019
? - Que tabelas se relacionam com a
tb_carga_horaria_sus
? - Recebi um arquivo de planilha via email, que alegava ser uma amostra da tabela
rl_estab_serv_class
. Ao investigar o arquivo, notei que a planilha apresentava a colunacodservico
com alguns registros nulos. Posso considerar esse arquivo como uma amostra verídica?
- Quais são os possíveis tipos de serviço referenciado, de acordo com a tabela
3. Execução dos Testes:
Para cada uma das seis perguntas, o processo é o mesmo:
- Monta-se o dicionário
qa_input
com a pergunta e o contexto apropriado. - Executa-se a função
responder_pergunta
três vezes, uma para cadamodel_name
selecionado. - As respostas de cada modelo são armazenadas para análise posterior.