Spring AI: Utilizando Inteligência Artificial em Projetos Spring Boot

O Spring AI representa uma evolução significativa no ecossistema Spring, permitindo aos desenvolvedores incorporar facilmente capacidades de inteligência artificial em suas aplicações Spring Boot. Esta ferramenta oferece uma abstração poderosa que facilita a escolha entre diferentes implementações de IA, como OpenAI, Amazon Bedrock, ou Ollama, dependendo das necessidades específicas do projeto.
Configuração
Para integrar o Spring AI, é necessário configurar os repositórios Maven ou Gradle para acessar as versões Snapshot/Milestone. No Maven, adiciona-se os repositórios da seguinte maneira:
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
E no Gradle:
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}
Inclua também o BOM do Spring AI para gerenciar as versões dos artefatos de forma coerente e adicione as dependências necessárias:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependencies {
implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT")
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
Para começar a usar a API do OpenAI, gere uma chave de acesso através deste link.
Em seguida, configure a chave de API no arquivo de propriedades do seu projeto Spring Boot:
spring.ai.openai.api-key=sua-chave-de-api
spring.ai.openai.chat.options.model=gpt-3.5-turbo
Recomendamos o uso de mecanismos de segurança, como secrets, para armazenar a chave de acesso. No entanto, para simplificar este exemplo, a configuramos diretamente no arquivo de propriedades.
Exemplo de Implementação
Como exemplo prático, utilizamos no blog um serviço que integra o cliente de chat da OpenAI para gerar automaticamente descrições e palavras-chave. Este serviço analisa os títulos dos posts e, por meio de uma simulação de conversa, cria metadados SEO otimizados, melhorando significativamente a visibilidade dos conteúdos nas buscas.
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class OpenAIChatServiceImpl implements OpenAIChatService {
private final OpenAiChatClient openAiChatClient;
private final ObjectMapper objectMapper;
public OpenAIChatServiceImpl(OpenAiChatClient openAiChatClient, ObjectMapper objectMapper) {
this.openAiChatClient = openAiChatClient;
this.objectMapper = objectMapper;
}
@Override
public MetaTags generateMetaTags(String title) {
var messages = predefinedMessages(title);
var prompt = new Prompt(messages);
var call = openAiChatClient.call(prompt);
var content = call.getResult().getOutput().getContent();
return convertContentToMetaTags(content);
}
private MetaTags convertContentToMetaTags(String content) {
try {
return objectMapper.readValue(content, MetaTags.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private List<Message> predefinedMessages(String title) {
var metaTagMessage = "Gere valores para a meta tag description e keywords sobre: %s";
var systemMessage = new SystemMessage("""
Você é um especialista em SEO.
Sabe que as metatags description e keywords são muito importantes para que determinado contéudo seja encontrado pelos sites de buscas como o google e bing.
Você deve retornar as meta tags no formato de json, onde o campo description é uma string, já o campo keywords é um array de string, conforme exemplo:
{
"description": "",
"keywords": []
}
""");
var userMessage = new UserMessage(metaTagMessage.formatted("a linguagem de programação Java"));
var assistantMessage = new AssistantMessage("""
{
"description": "Explore o poder e a versatilidade da linguagem de programação Java. Descubra suas características, aplicativos práticos e seu papel fundamental no desenvolvimento de software",
"keywords": ["Java", "linguagem de programação", "programação orientada a objetos", "desenvolvimento de software", "JVM", "Java Virtual Machine"]
}
""");
var message = new UserMessage(metaTagMessage.formatted(title));
var messages = new ArrayList<Message>(4);
messages.add(systemMessage);
messages.add(userMessage);
messages.add(assistantMessage);
messages.add(message);
return messages;
}
}
Veja como a biblioteca Spring AI simplifica o desenvolvimento: injetamos o bean OpenAiChatClient, fornecido pela biblioteca, e definimos mensagens de sistema e de usuário que orientam as respostas do chat. Além disso, treinamos o chat para retornar o contéudo no formato de JSON, convertendo a resposta no seguinte DTO.
import java.util.List;
public record MetaTags(String description, List<String> keywords) {
public String keywordsFormatted() {
return String.join(",", keywords);
}
}
Conclusão
O Spring AI abre portas para uma automação sofisticada e personalizada em aplicações Spring Boot. Com sua abordagem flexível e poderosa, é uma escolha excelente para desenvolvedores que buscam incorporar inteligência artificial em suas soluções. Para mais informações, visite a documentação oficial do Spring AI.