Seção 1: Abertura e Engajamento¶
1.1. Problema Motivador¶
Imagine que você é um engenheiro de software sênior em uma equipe que acabou de herdar um sistema complexo. O gerente de produto chega com um requisito claro, porém vago: “Precisamos melhorar a manutenibilidade deste código. Ele é muito frágil e difícil de entender”. Como você traduz “melhorar a manutenibilidade” em algo que um algoritmo de otimização possa entender? Quais métricas você deve otimizar? Complexidade Ciclomática? Coesão? Acoplamento? E se você estiver otimizando a logística de entrega de uma frota, será que uma simples troca aleatória de duas cidades no operador de mutação é a melhor abordagem, ou existem heurísticas mais inteligentes que poderiam acelerar a busca?
Até agora, a definição da função de fitness e dos operadores de busca dependia inteiramente da experiência e criatividade do engenheiro. Era um processo artesanal, sujeito a vieses e, muitas vezes, limitado pelo conhecimento humano. E se pudéssemos ter um “consultor especialista” disponível 24/7 para nos ajudar a explorar essas possibilidades? É exatamente aqui que a sinergia entre SBSE e a Inteligência Artificial generativa, especialmente os LLMs, revoluciona o campo.
1.2. Objetivos deste Laboratório¶
Ao final deste laboratório, você será capaz de:
Formular Funções de Fitness: Utilizar a técnica de “Persona Prompting” para interagir com um LLM e transformar requisitos de alto nível (como “melhorar a manutenibilidade”) em funções de fitness concretas e quantificáveis.
Gerar Heurísticas de Busca: Aplicar “Chain-of-Thought Prompting” para que um LLM sugira operadores de mutação e crossover customizados e mais inteligentes para um problema de otimização específico.
Integrar IA no Fluxo de SBSE: Construir um fluxo de trabalho prático onde as sugestões de um LLM são usadas para configurar e executar um algoritmo de otimização com DEAP.
Seção 2: Fundamentos Teóricos (Versão Expressa)¶
Nesta aula, não introduzimos novos algoritmos de busca, mas sim uma nova ferramenta para aprimorar os que já conhecemos. A ideia central é usar LLMs como parceiros de brainstorming e co-criação no processo de formulação de problemas de SBSE.
2.1. O LLM como um “Oráculo de Métricas”¶
O maior desafio ao aplicar SBSE é definir a função de fitness. Uma boa função de fitness é a bússola que guia a busca para soluções de alta qualidade. Uma função mal definida pode levar a otimizações inúteis ou até prejudiciais (Lei de Goodhart).
Técnica: Persona Prompting
O que é? É uma técnica de engenharia de prompt onde instruímos o LLM a assumir uma persona específica (ex: “Aja como um Arquiteto de Software Sênior da Google...”, “Você é um especialista em logística...”).
Por que funciona? Ao assumir uma persona, o LLM ativa as partes de seu modelo de conhecimento mais relevantes para aquele domínio, fornecendo respostas mais focadas, detalhadas e com o jargão correto.
Aplicação em SBSE: Usamos essa técnica para traduzir um requisito vago em métricas.
Prompt Vago: “Como melhorar a manutenibilidade do código?”
Prompt com Persona: “Aja como um engenheiro de software especialista em qualidade de código. Dado o requisito de ‘melhorar a manutenibilidade de um sistema orientado a objetos’, sugira 5 métricas de software concretas e quantificáveis que poderiam ser combinadas em uma função de fitness. Para cada métrica, explique o que ela mede e por que é importante.”
2.2. O LLM como um “Gerador de Heurísticas”¶
Os operadores genéticos (crossover, mutação) são o motor da exploração em algoritmos evolutivos. Operadores genéricos funcionam, mas operadores especializados, que conhecem a estrutura do problema, são muito mais eficientes.
Técnica: Chain-of-Thought (CoT) Prompting
O que é? É uma técnica que instrui o LLM a “pensar passo a passo” antes de dar a resposta final. Isso o força a decompor o problema, raciocinar sobre as etapas e, geralmente, leva a respostas mais lógicas e corretas.
Por que funciona? Em vez de saltar para uma conclusão, o modelo externaliza seu processo de raciocínio, o que permite corrigir erros intermediários e explorar o espaço do problema de forma mais estruturada.
Aplicação em SBSE: Usamos CoT para criar operadores de busca inteligentes.
Prompt Simples: “Sugira um operador de mutação para o Problema do Caixeiro Viajante.”
Prompt com CoT: “Estou resolvendo o Problema do Caixeiro Viajante (TSP) com um Algoritmo Genético, onde um indivíduo é uma permutação de cidades. O operador de mutação padrão é o ‘swap’, que troca duas cidades aleatoriamente. Pense passo a passo e sugira 3 operadores de mutação mais inteligentes que o ‘swap’. Para cada um, explique a lógica, por que ele pode ser superior ao ‘swap’ e forneça um pseudocódigo de como implementá-lo.”
Seção 3: Laboratório Prático Guiado (Google Colab)¶
3.1. Roteiro do Notebook: workshop.ipynb¶
Neste laboratório, vamos atuar como consultores de software contratados para otimizar a alocação de tarefas em uma equipe de desenvolvimento. O objetivo é usar um LLM para nos ajudar a definir o que “melhor alocação” significa e como explorar as possíveis alocações de forma inteligente. Usaremos a biblioteca DEAP para a implementação do algoritmo genético e a API da OpenAI para interagir com o LLM.
3.2. Estrutura do Laboratório¶
O notebook será dividido em três partes principais:
Parte 1: Configuração do Ambiente: Instalação das bibliotecas necessárias (
openai,deap) e configuração da chave de API.Parte 2: Usando “Persona Prompting” para Definir a Fitness:
Apresentaremos ao LLM um cenário com desenvolvedores de diferentes níveis de sênioridade e tarefas com diferentes complexidades.
Usando um prompt de persona (“Aja como um Gerente de Projetos Ágeis experiente...”), pediremos ao LLM para sugerir múltiplos objetivos conflitantes para definir uma “boa” alocação (ex: minimizar tempo total, balancear carga de trabalho, maximizar o aprendizado de juniores).
Traduziremos as sugestões do LLM em uma função de fitness multi-objetivo em Python.
Parte 3: Usando “Chain-of-Thought” para Criar um Operador de Mutação:
Descreveremos nossa representação do problema para o LLM (um indivíduo é uma lista onde o índice é a tarefa e o valor é o desenvolvedor alocado).
Usando um prompt CoT, pediremos ao LLM para sugerir um operador de mutação mais inteligente do que simplesmente realocar uma tarefa aleatoriamente. Uma possível sugestão seria uma mutação que tende a mover tarefas complexas de desenvolvedores sobrecarregados para seniores ociosos.
Implementaremos o operador de mutação sugerido pelo LLM e o registraremos na
toolboxdo DEAP.
Parte 4: Execução e Análise: Executaremos o algoritmo genético com a função de fitness e o operador de mutação definidos com a ajuda da IA e analisaremos os resultados.
Seção 4: Análise e Discussão dos Resultados¶
4.1. Interpretando os Resultados¶
Ao final do notebook, teremos uma solução de alocação otimizada. As perguntas a serem feitas são:
A função de fitness sugerida pelo LLM capturou bem os trade-offs do problema real? Houve algum objetivo importante que ficou de fora?
O operador de mutação “inteligente” levou a uma convergência mais rápida ou a melhores resultados em comparação com um operador de mutação simples (que pode ser testado como um exercício)?
Como a qualidade das sugestões do LLM varia com a qualidade do prompt? O que acontece se usarmos um prompt vago versus um prompt detalhado com persona e CoT?
4.2. O “Porquê” das Decisões¶
Escolha da API da OpenAI: Utilizamos a API da OpenAI por sua simplicidade e pelo poder de modelos como o GPT-4. No entanto, o mesmo fluxo de trabalho poderia ser adaptado para modelos open-source via bibliotecas como
TransformersouOllama, uma decisão importante para cenários que envolvem dados sensíveis.Foco em Sugestões, não em Código Final: Note que pedimos ao LLM para sugerir métricas e pseudocódigo, não para escrever o código Python final. Isso mantém o engenheiro no controle, usando a IA como uma ferramenta de aumento de criatividade, e não como um substituto que poderia introduzir erros sutis. O papel do engenheiro é validar, traduzir e integrar as ideias da IA no sistema.
Seção 5: Síntese e Próximos Passos¶
5.1. Resumo do Laboratório¶
LLMs podem atuar como excelentes assistentes na fase de formulação de problemas de SBSE, ajudando a traduzir requisitos vagos em funções de fitness quantificáveis.
A técnica de Persona Prompting é eficaz para extrair conhecimento de domínio específico de um LLM, resultando em sugestões de métricas mais relevantes.
A técnica de Chain-of-Thought Prompting ajuda o LLM a raciocinar sobre um problema, permitindo a geração de heurísticas e operadores de busca mais sofisticados.
A integração da IA no fluxo de SBSE não remove o engenheiro da equação; pelo contrário, aumenta sua capacidade criativa, permitindo explorar o espaço de soluções de forma mais eficaz.
5.2. Preparação para o Próximo Bloco¶
Até agora, focamos em problemas “clássicos” de otimização e engenharia de software. No próximo módulo, SBSE Aplicada à Engenharia de Software Tradicional, vamos mergulhar em uma das aplicações mais poderosas e impactantes da SBSE: o Teste Baseado em Busca (Search-Based Software Testing - SBST). Você aplicará os algoritmos que aprendeu para um novo desafio: gerar automaticamente dados de teste que explorem os cantos mais obscuros de um programa para encontrar bugs, maximizando a cobertura de código. A habilidade de formular problemas que você praticou hoje será crucial.