Uso de LLMs na Engenharia de Software

Tempo de leitura: 15 minutos

Large Language Models

Um Modelo de Linguagem de Grande Escala (LLM) é um tipo de modelo de Inteligência Artificial especializado em processamento de linguagem natural (NLP). Esses modelos são treinados com vastas quantidades de dados textuais, permitindo que eles aprendam padrões e estruturas complexas da linguagem humana. A característica principal dos LLMs é a capacidade de gerar textos que são coerentes e contextualmente apropriados, imitando a maneira como os humanos escrevem e se comunicam.

Os LLMs utilizam técnicas avançadas de aprendizado profundo, como as redes neurais transformers, que são projetadas para lidar com a complexidade da linguagem natural. Esses modelos são altamente versáteis e podem ser aplicados em uma variedade de tarefas de linguagem, como geração de texto, resposta a perguntas, tradução automática, sumarização de textos e análise de sentimentos.

Essas capacidades tornam os LLMs ferramentas poderosas em diversas aplicações de processamento de linguagem natural!

A Evolução Temporal dos Modelos de Linguagem de Grande Escala (LLMs)

A evolução dos Modelos de Linguagem de Grande Escala (LLMs) pode ser traçada desde os primeiros desenvolvimentos nas arquiteturas de redes neurais, passando por avanços cruciais que levaram à criação dos modelos modernos usados hoje em dia.

1. Introdução das Redes Neurais Recorrentes (RNNs)

Em 1986, Rumelhart et al. introduziram o conceito de Redes Neurais Recorrentes (RNNs), que abriu a possibilidade de processar dados sequenciais. Isso foi um marco importante, pois as RNNs permitiram que os modelos levassem em consideração a ordem dos dados, uma característica essencial para o processamento de linguagem natural (NLP). As RNNs possibilitaram a geração de sequências de texto e a modelagem de contextos linguísticos que dependiam de informações precedentes.

2. A Evolução com Long Short-Term Memory (LSTM)

Na década de 1990, Hochreiter e Schmidhuber propuseram a arquitetura Long Short-Term Memory (LSTM), uma extensão das RNNs. As LSTMs abordaram algumas das limitações das RNNs, como o problema de “vanishing gradient”, que dificultava o treinamento em longas sequências de dados. As LSTMs conseguiram melhorar significativamente o desempenho em muitas aplicações de NLP, sendo amplamente adotadas em tarefas como tradução automática, reconhecimento de fala e geração de texto.

3. Revolução com a Arquitetura Transformer (2017)

Em 2017, Vaswani et al. introduziram a arquitetura Transformer, que marcou uma revolução no campo de NLP. Diferente das RNNs e LSTMs, os Transformers utilizam um mecanismo de autoatenção (self-attention) que permite capturar relacionamentos entre palavras em uma sequência sem depender da ordem sequencial dos dados. Essa arquitetura facilitou o treinamento em paralelo de modelos maiores e mais complexos, resultando em um impacto profundo na modelagem de linguagem e desencadeando uma explosão de atividades na pesquisa e desenvolvimento de LLMs.

4. O Surgimento dos Modelos GPT e a Popularização dos LLMs

Em 2018, a OpenAI lançou o modelo Generative Pre-trained Transformer (GPT), que se destacou por sua capacidade de gerar texto de maneira coerente e relevante após ser pré-treinado em grandes corpora de dados textuais. O GPT foi seguido por iterações subsequentes, como GPT-2, GPT-3, GPT-3.5 e, mais recentemente, GPT-4. Com o GPT-3 e GPT-3.5, observou-se uma mudança significativa no desempenho gerativo, o que atraiu um grande interesse tanto no GPT (e seu derivado ChatGPT) quanto nos LLMs em geral.

Esses modelos alcançaram um desempenho notável em parte devido à enorme quantidade de dados nos quais foram treinados. Por exemplo, o GPT-3 foi treinado em 45 terabytes de dados textuais e possui 175 bilhões de parâmetros, permitindo uma capacidade impressionante de gerar e compreender linguagem.

5. Expansão e Open Source com LLaMA (2023)

Em fevereiro de 2023, a Meta lançou o LLaMA, um modelo de código aberto que foi treinado em 1,4 trilhões de tokens, com tamanhos de modelo variando de 7 bilhões a 65 bilhões de parâmetros. O LLaMA representa um esforço para democratizar o acesso a LLMs de alto desempenho, permitindo que pesquisadores e desenvolvedores em todo o mundo explorem e desenvolvam novas aplicações baseadas em modelos de linguagem de grande escala.

A evolução dos LLMs reflete um progresso contínuo na modelagem de linguagem, desde as primeiras arquiteturas de redes neurais até os avançados modelos de hoje, como GPT-4 e LLaMA. Cada avanço contribuiu para a construção de modelos mais poderosos e capazes, expandindo as fronteiras do que é possível em processamento de linguagem natural e transformando diversas áreas da tecnologia.

LLMs em Engenharia de Software

Nos últimos anos, os Modelos de Linguagem de Grande Escala (Large Language Models – LLMs) têm se destacado como uma tecnologia emergente com potencial significativo para transformar diversas áreas do conhecimento, incluindo a Engenharia de Software (Software Engineering – SE).

Este artigo apresenta o trabalho realizado pelos pequisadores da Meta Platforms (Facebook e Instagram), trazendo um um panorama abrangente dessa nova área, explorando as aplicações dos LLMs em atividades essenciais da Engenharia de Software, como codificação, design, levantamento de requisitos, reparo, refatoração, melhoria de desempenho, documentação e análise de dados.

Os LLMs, com suas propriedades emergentes, trazem uma nova dimensão de novidade e criatividade para o campo da Engenharia de Software.

No entanto, essas mesmas propriedades também introduzem desafios técnicos consideráveis, como a necessidade de identificar e eliminar soluções incorretas, comumente conhecidas como “alucinações”.

A pesquisa apresentada neste artigo destaca o papel crucial que as técnicas híbridas — combinando abordagens tradicionais da Engenharia de Software com LLMs — desempenham no desenvolvimento e na implementação de soluções baseadas em LLMs que sejam confiáveis, eficientes e eficazes. Além de fornecer uma visão geral das aplicações atuais, este artigo também discute os desafios de pesquisa ainda em aberto, buscando fornecer direções futuras para o avanço do uso de LLMs na Engenharia de Software.

As “alucinações”

As “alucinações” de um Modelo de Linguagem de Grande Escala (LLM) referem-se a situações em que o modelo gera respostas que são factualmente incorretas, irrelevantes ou inventadas, apesar de parecerem plausíveis ou coerentes no contexto da linguagem.

Essas alucinações ocorrem porque os LLMs, ao serem treinados em grandes volumes de dados textuais, aprendem padrões e correlações na linguagem, mas não têm uma compreensão profunda do mundo real ou acesso a informações atualizadas durante o processo de inferência.

Essas alucinações podem manifestar-se de várias formas, como:

  1. Fatos Inventados: O modelo pode gerar informações que parecem factuais, mas que são completamente inventadas ou imprecisas.
  2. Contexto Irrelevante: O LLM pode produzir respostas que, embora linguisticamente corretas, não se aplicam ao contexto da pergunta ou solicitação feita.
  3. Invenção de Detalhes: Em algumas situações, o modelo pode preencher lacunas de informação com detalhes fictícios, especialmente quando os dados de treinamento não cobrem suficientemente o tópico em questão.

Essas alucinações representam um desafio significativo para a utilização confiável de LLMs em aplicações críticas, onde a precisão e a veracidade das informações são essenciais.

Por isso, há um interesse crescente em desenvolver técnicas que possam mitigar ou detectar essas alucinações, garantindo que as respostas geradas pelos modelos sejam mais precisas e confiáveis.

O Não Determinismo dos Modelos de Linguagem de Grande Escala (LLMs)

Os Modelos de Linguagem de Grande Escala (LLMs) são intrinsecamente não determinísticos, o que significa que a mesma solicitação (prompt) pode produzir respostas diferentes em execuções distintas de inferência. Isso ocorre a menos que a temperatura seja configurada para zero, uma configuração que, embora possa reduzir a variação nas respostas, geralmente é considerada subótima em múltiplas execuções.

Além disso, independentemente da configuração da temperatura, pequenas mudanças no prompt podem resultar em saídas significativamente diferentes. Esse comportamento não determinístico dos LLMs motiva a prática de “engenharia de prompts” (prompt engineering) e o processamento dos resultados obtidos, mas também levanta desafios importantes para a avaliação científica da Engenharia de Software baseada em LLMs.

A principal questão que surge é:

“Se os resultados podem variar a cada vez que o processo é executado, como podemos determinar se uma técnica proposta realmente representa um avanço em relação ao estado da arte?”

Essa indeterminação dificulta a comparação objetiva e a validação dos métodos desenvolvidos, uma vez que os resultados não são consistentemente replicáveis.

Técnicas híbridas – Combinando abordagens tradicionais da Engenharia de Software com LLMs

Vamos a alguns exemplos de técnicas híbridas apresentados no artigo:

  • Combinando LLMs com planejamento e pesquisa: Alguns pesquisadores desenvolveram modelos híbridos que integram LLMs com técnicas de planejamento e pesquisa, resultando em melhorias significativas em relação aos modelos básicos. Por exemplo, Zhang et al. relataram aprimoramentos na geração de código ao combinar LLMs com técnicas de busca de API.
  • Seleção de candidatos a partir dos resultados do LLM: As abordagens híbridas utilizam técnicas existentes de engenharia de software ou IA para selecionar o melhor candidato entre os principais resultados de um LLM. Técnicas como geração de testes e classificação baseada em redes neurais são usadas para melhorar a correção do código e identificar possíveis falhas.
  • Pós-processamento com análise de programas: Jain et al. introduziram o Jigsaw, que refina o código gerado usando técnicas de análise e síntese de programas, aprimorando a qualidade da saída .
  • Agentes de LLM colaborativos: Dong et al. propuseram um método em que vários LLMs trabalham de forma colaborativa, cada um desempenhando papéis distintos em tarefas de geração de código, levando a melhorias substanciais.
  • Geração e avaliação de testes: técnicas híbridas como a CODAMOSA combinam testes de software baseados em pesquisa com LLMs para gerar casos de teste de alta cobertura. Essa abordagem ajuda a redirecionar os esforços de busca para áreas subcobertas, obtendo uma cobertura melhor do que os métodos tradicionais.
  • Teste de mutação para geração de testes: Dakhel et al. usaram o teste de mutação para aprimorar os testes gerados pelo LLM, melhorando a detecção de falhas escritas por humanos ao aumentar as solicitações com mutantes sobreviventes.

Engenharia de Prompts

Prompt Engineering trata-se de melhorar as perguntas ou instruções dadas ao LLM para obter melhores resultados. Pense nisso como fazer as perguntas certas para obter as melhores respostas.

Por que isso é importante?

Melhores instruções levam a melhores artefatos. Se perguntarmos ao LLM da maneira correta, ele poderá produzir artefatos de software mais precisos e úteis.

O resultado do prompt

Os LLMs produzem duas coisas importantes: o artefato de software principal e uma explicação.

Tanto o artefato quanto a explicação são cruciais para os engenheiros de software. O artefato é o produto principal e a explicação ajuda a entendê-lo e usá-lo.

Mais pesquisas são necessárias para melhorar as instruções dadas aos LLMs e as explicações que eles fornecem. Isso tornará as saídas mais confiáveis e úteis.

Exemplo para ilustrar:

Imagine um chef e uma receita: pense no LLM como um chef. A saída primária (artefato) é o prato que o chef prepara. A explicação é como a receita que mostra como o prato foi feito. Tanto o prato quanto a receita são importantes. O prato é o que você come, mas a receita ajuda você a entender como prepará-lo sozinho ou ajustá-lo ao seu gosto.

Uso da Engenharia de Prompts na Engenharia de Software

A Engenharia de Prompts pode ser utilizada de forma eficaz em vários aspectos da engenharia de software, para otimizar o desempenho de grandes modelos de linguagem (LLMs):

  • Codificação e geração de código: Ao criar solicitações específicas, os desenvolvedores podem orientar os LLMs a gerar trechos de código que atendam a requisitos específicos ou sigam determinados padrões de codificação. Isso ajuda a produzir saídas de código mais precisas e relevantes 
  • Design e arquitetura: No design de software, a engenharia de prompts pode ser usada para obter padrões de design ou sugestões arquitetônicas dos LLMs. Instruções personalizadas podem ajudar a explorar diferentes alternativas de design e avaliar seu impacto potencial no sistema.
  • Coleta de requisitos: os prompts podem ser criados para ajudar os LLMs a extrair e refinar os requisitos de software das descrições em linguagem natural. Isso pode melhorar a clareza e a integridade da documentação de requisitos.
  • Teste e depuração: Ao usar solicitações que se concentram em cenários específicos de teste ou tarefas de depuração, os LLMs podem ser direcionados para gerar casos de teste ou sugerir estratégias de depuração. Isso pode aumentar a eficiência do processo de teste e ajudar a identificar possíveis problemas desde o início.
  • Documentação e análise: A engenharia de prompts pode ajudar na geração de documentação abrangente, instruindo os LLMs a se concentrarem em aspectos específicos do software, como instruções de uso ou detalhes da API. Além disso, os prompts podem ser usados para analisar o código em busca de melhorias de desempenho ou oportunidades de refatoração.

Essas aplicações de engenharia rápida demonstram seu potencial para aprimorar vários estágios do ciclo de vida da engenharia de software, tornando os LLMs ferramentas mais eficazes para desenvolvedores.

Trabalhos futuros

  • Construir e ajustar LLMs para tarefas de engenharia de software apresenta uma área de pesquisa significativa, com foco no treinamento e ajuste de modelos específicos para tarefas de engenharia de software, aumentando a precisão de tarefas preditivas, como detecção de vulnerabilidades e previsão de clones.
  • A melhoria do desempenho em técnicas baseadas em LLM requer uma exploração mais aprofundada, especialmente no desenvolvimento de técnicas para encontrar melhorias de desempenho além do tempo de execução, considerando atributos não funcionais, como consumo de energia e consumo de memória.
  • Explorar a engenharia de explicação junto com a engenharia de prompt é crucial, pois os LLMs podem fornecer explicações para artefatos gerados, potencialmente impactando a aceitação de soluções em tarefas de engenharia de software.

Conclusões

O artigo destaca a sub-representação da engenharia e design de requisitos baseados em LLM na literatura de engenharia de software, indicando a necessidade de mais pesquisas nessas áreas.

Ele enfatiza o potencial dos LLMs em testes de software, geração de código e tarefas de reparo, apresentando oportunidades de avanços na geração de testes de software baseados em LLM .

O estudo identifica a importância da engenharia de prompte e do processamento de saída na engenharia de software baseada em LLM, enfatizando a necessidade de pesquisas para otimizar as explicações fornecidas com a saída primária.

O artigo discute os desafios impostos pela alucinação das LLM e a necessidade de técnicas de teste automatizadas para garantir a correção dos artefatos de engenharia de software gerados pela LLM.

Referências

S. Hochreiter and J. Schmidhuber, “Long short-term memory,” Neuralcomputation, vol. 9, no. 8, pp. 1735–1780, 1997

D. E. Rumelhart, G. E. Hinton, and R. J. Williams, “Learning repre-sentations by back-propagating errors,” nature, vol. 323, no. 6088, pp.533–536, 1986.

A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N.Gomez, L. Kaiser, and I. Polosukhin, “Attention is all you need,” 2017, arXiv:1706.03762

K. Zhang, G. Li, J. Li, Z. Li, and Z. Jin, “Toolcoder: Teach code generation models to use api search tools,” 2023, arXiv:2305.04032

N. Jain, S. Vaidyanath, A. Iyer, N. Natarajan, S. Parthasarathy, S. Ra-jamani, and R. Sharma, “Jigsaw: large language models meet programsynthesis,” in Proceedings of the 44th International Conference onSoftware Engineering. Pittsburgh Pennsylvania: ACM, May 2022,
pp. 1219–1231

Y. Dong, X. Jiang, Z. Jin, and G. Li, “Self-collaboration Code Gener-ation via ChatGPT,” Apr. 2023, arXiv:2304.07590

Y. Dong, X. Jiang, Z. Jin, and G. Li, “Self-collaboration Code Gener-ation via ChatGPT,” Apr. 2023, arXiv:2304.07590