Tutorials

IA para PHP: como ajustar prompts de IA para melhorar testes de PHP

Read this post in other languages:

No post anterior do nosso blog, vimos como o JetBrains AI Assistant pode organizar testes de unidade automaticamente para nós. Ao criar o código padrão chato, ele nos permite ir direto para a parte mais interessante de geração de testes.

Brincando com a geração de testes orientada por IA, muitas vezes fico surpreso com a precisão do AI Assistant quando se trata de criar código que se ajusta ao meu projeto. No entanto, há casos em que eu gostaria que a saída gerada fosse um pouco diferente. Se ao menos pudéssemos dar algumas dicas sobre como deveria ser o resultado.

Bem, acontece que podemos fazer exatamente isso.

Especificação de prompts

Vamos voltar ao exemplo do post anterior do nosso blog: estamos trabalhando em testes para a classe CreateArgumentComment. Essa classe grava um registro no banco de dados, determina quais usuários devem ser notificados e, em seguida, envia essas notificações aos usuários (usando outra classe: SendUserMessage). Esta é a aparência do código:

final readonly class CreateArgumentComment
{
    public function __invoke(
        Argument $argument,
        User $user,
        string $body,
    ): void
    {
        ArgumentComment::create([
            'user_id' => $user->id,
            'argument_id' => $argument->id,
            'body' => $body,
        ]);

        $this->notifyUsers($argument, $user);
    }

    private function notifyUsers(Argument $argument, User $user): void
    {
        $usersToNotify = $argument->comments
            ->map(fn (ArgumentComment $comment) => $comment->user)
            ->add($argument->user)
            ->reject(fn (User $other) => $other->is($user))
            ->unique(fn (User $user) => $user->id);

        foreach ($usersToNotify as $userToNotify) {
            (new SendUserMessage)(
                to: $userToNotify,
                sender: $user,
                url: action(RfcDetailController::class, ['rfc' => $argument->rfc_id, 'argument' => $argument->id]),
                body: 'wrote a new comment',
            );
        }
    }
}

Você deve ter notado que o AI Assistant não escreveu testes para a parte de notificação nesse snippet. Na verdade, ele escreveu testes para esta parte em algumas iterações, mas não todas as vezes.

Uma geração interessante incluiu o seguinte comentário no final da classe de teste:

// And: we should expect the users to be notified about the comment, 
// this part is not implemented due to its complexity
// it requires mocking dependencies and testing side effects
// 'notifyUsers' is private method and we can't access it directly
// however, in real world scenario you might want to consider testing 
// it (possibly refactoring to a notification class, and testing independently)

Poderíamos, é claro, pedir ao AI Assistant para gerar esses testes de qualquer forma, mas, na verdade, concordo com isto aqui; notifyUsers deve ser uma classe própria, testada isoladamente. Embora eu tivesse planejado inicialmente me aprofundar nos testes de notificação, o AI Assistant destacou uma abordagem melhor a ser adotada com eles e me ajudou a reformular meu projeto. Obrigado, AI Assistant! Como decidimos testar notifyUsers separadamente, deixaremos isso de lado e consideraremos outro caso de uso. Imagine que queiramos usar o Mockery em vez das factories do Laravel. Começamos gerando nossos testes da mesma forma que fizemos no post anterior do nosso blog, mas, desta vez, gastaremos um pouco mais de tempo ajustando a saída do AI Assistant.

Depois de gerar uma versão rascunho da nossa classe de teste, você notará um botão Specify na barra de ferramentas superior:

Este botão permite enviar informações adicionais ao AI Assistant, especificando ainda mais o prompt. Você poderia, por exemplo, escrever um prompt que diga para usar o Mockery assim:

Depois de escrever este prompt personalizado e pressionar Enter, você verá que o AI Assistant atualiza o código de acordo.

Você pode ajustar seus prompts o quanto quiser até encontrar uma solução que atenda às suas necessidades.

Conclusão

Ao experimentar a especificação de prompts, tenha em mente o objetivo que discutimos no início desta série de posts: não pretendemos que o AI Assistant gere os testes perfeitos para nós. Queremos que ele faça a configuração padrão chata, para que possamos nos concentrar principalmente em fazer os ajustes finais: as partes que são mais divertidas.

Com isso em mente, acho importante não especificar demais seus prompts. Provavelmente, será mais produtivo gerar um código 90% do seu agrado, em vez de gastar mais tempo tentando encontrar o prompt perfeito.

Um último efeito colateral que você pode notar é que o AI Assistant realmente aprende com suas instruções ao longo do tempo. Por exemplo, agora que especificamos que gostaríamos de usar o Mockery em vez das factories do Laravel, a ferramenta levará isso em consideração na próxima vez que gerar testes.

Se quiser saber mais sobre como o AI Assistant funciona nos bastidores e como ele lida com seus dados, acesse os Termos de Serviço do JetBrains AI (seção 5) para ler tudo sobre isso.

Até agora nesta série, usamos o AI Assistant para gerar testes para nós e aprendemos como ajustar nossos prompts para obter o resultado de que precisamos.

Qual é o próximo passo? O PhpStorm tem alguns recursos bastante interessantes para combinar o AI Assistant com ações personalizadas. Assine nosso blog para ficar em dia sobre nossos próximos posts, nos quais continuaremos explorando os benefícios de usar a IA em rotinas PHP.

Links úteis

Recursos:

Vídeos:

 

Artigo original em inglês por:

Luiz Di Bella

Brent Roose

image description

Discover more