Atualmente os serviços de software estão cada vez mais voltados e tendenciosos a utilizarem do poder da AI de alguma forma, seja como um assistente para o desenvolvimento de código até mesmo para ajudar na modernização de software legado.
O interessante nisso tudo é que também conseguimos trazer essas características para os serviços que trabalhamos. Hoje é possível construir software com interações conversacionais de forma relativamente simples. Imagine situações onde ao invés do usuário ter um fluxo de navegação em tela ele possa realizar suas ações de forma conversacional, literalmente solicitando em um chat a ação desejada. Por exemplo, em alguns aplicativos bancários já é possível realizar ações como pix. transferências e pagamentos interagindo com um chat.
A ideia aqui é apresentar como podemos construir sistemas que são baseados em AI utilizando Spring AI. No ecossistema Spring é possível utilizar esta dependência para conectar APIs aos modelos de AI disponíveis.
Um problema
A criação de infraestrutura para execução de software é um ponto onipresente em qualquer serviço, e de certa forma requer conhecimentos específicos para realizar a criação e configuração seja de um simples servidor web, a configurações avançadas de clusters, filas, bancos de dados, etc.
A proposta aqui é criar um agente que irá permitir através de uma interação conversacional criar alguns recursos na AWS utilizando o serviço Amazon Bedrock e Terraform para provisionar recursos tais como, S3, SQS ou ECS.
Uma solução
O agente será responsável por criar um plano de execução baseado em terraform, e em seguida com a permissão do usuário o agente irá executar as ações descritas no plano anterior. Em resumo ao solicitar pelo chat algo como “crie um bucket s3” ele então irá gerar um terraform com a solicitação, e em seguida poderá responder algo “deseja executar” assim que o usuário confirmar a ação com algo do tipo “sim, execute o plano” ele irá provisionar o recurso solicitado na conta AWS que tiver sido configurada.
Criando uma solução utilizando Spring AI
Neste ponto irei focar apenas na configuração e nos pontos de uso das Tools, todo o em torno do projeto foi criado de forma fictícia para ilustrar a aplicabilidade da ferramenta na construção de sistemas baseados em AI Generativa.
Tool Calling
Tool Calling permite que os grandes modelos de linguagem LLM possam enriquecer suas interações e respostas consultando serviços e APIs externas. Neste caso o modelo com base na instrução do usuário decide quando e qual função ou serviço deverão ser executados.

Com base na imagem acima será apresentado como foi estruturado cada item do diagrama dentro do projeto de código.
AI Model
Inicialmente configure as variáveis de ambiente no application properties, note que neste artigo vamos utilizar o Amazon Bedrock.

Um ponto relevante aqui é que a troca do AI Model pode acontecer de forma transparente para o serviço, sem que isso implique em ajustar o ChatClient, isso permite que seja possível sair do Amazon Bedrock para o Gemini com um esforço mínimo.
Chat Request
Abaixo está o código do Builder para o componente ChatClient, este objeto sabe quais instruções ele deverá seguir, e por consequência quais ferramentas Tools devem ser chamadas.

Para construir este ChatClient foi setado os seguintes parâmetros:
defaultSystem – Prompt com instruções para que o modelo saiba o que ele precisa fazer, e ou o que ele é. A importância de saber escrever bons prompts ajudará a dar as melhores instruções para a AI cumprir seus objetivos;
defaultToolNames – Definição das Tools que o modelo terá acesso, na prática são classes representadas como Beans;
TOOLS – Function as Tools
A implementação específica para essa solução está utilizando “Function as Tool” que é uma forma mais dinâmica para o uso de ferramentas, pois através do uso de Beans é possível alterar as funções em tempo de execução. O Spring AI fornece outras implementações para trabalhar com Tool Calling. Abaixo está um exemplo utilizando funções.

Ou seja, pelo fato de ter construído um ChatClient()…defaultToolNames() informando os nomes dos Beans apresentados na imagem 04 este chat irá fazer uso desses Beans como ferramentas para enriquecer e melhorar suas respostas.
Chat Response
0 ChatClient construído quando executado ele retornará uma string contendo a resposta da execução solicitada.

Explicando os parâmetros:
.user – O prompt de entrada fornecido pelo usuário;
.call – Executa o prompt;
.content – Obtém o retorno da execução;
Executando o agente
Abaixo segue imagens de uma interação completa com o agente
Primeiro perguntamos o que ele sabe fazer:

Neste caso conseguimos através do prompt refinar como ele deve responder, quais informações podem ou não ser mencionadas. Se fosse desejável por exemplo apresentar para o usuário quais ferramentas ele pode utilizar, bastaria informar isso no prompt em ChatClient()…defaultSystem(), e então no momento da resposta ele consideraria mostrar quais ferramentas foram utilizadas durante determinado fluxo, isso pode ajudar a entender melhor o fluxo de funcionamento.
Agora vamos pedir para ele: “crie um bucket s3 chamado noite-de-carnaval”

A imagem acima apresenta a interação com o agente no momento que solicitamos a criação de um bucket s3, neste caso observe que sua resposta ele apresentou o código terraform que foi gerado este comportamento acontece pois o modelo acionou a Tool (planejarInfra) e se confirmado ele irá chamar a Tool (executarInfra) que executa o código terraform.
Em seguida vamos confirmar a execução do plano terraform que foi gerado:

Abaixo está a saída completa da execução:

Por fim a criação do recurso bucket s3 noite-de-carnaval na AWS:

A ideia aqui foi apresentar de forma prática um exemplo de serviço que utiliza IA Generativa para realizar suas tarefas. E como implementar Tool Calling utilizando Spring AI.
Link para o exemplo Github.
Link oficial para Tools Spring AI




