Projeto de exemplo para demonstrar o uso de IA generativa em Java com Spring Boot, Spring AI, LangChain4j e Ollama. A ideia é servir como material didático para comparar duas formas de conversar com um modelo local e também mostrar um exemplo simples de RAG usando um arquivo de texto.
- Java 21
- Spring Boot 3.5.9
- Gradle
- Spring AI 1.1.4
- LangChain4j 1.12.2
- Ollama
- Thymeleaf, para a página web de chat
- Springdoc OpenAPI, para documentação Swagger
- SimpleVectorStore do Spring AI, para o exemplo de RAG
Instale o Ollama e baixe o modelo usado no projeto:
ollama pull llama3.2:latestDepois deixe o Ollama rodando:
ollama serveEm outro terminal, você também pode testar o modelo diretamente:
ollama run llama3.2:latestPor padrão, o Ollama fica disponível em:
http://localhost:11434
No Windows:
gradlew.bat bootRunNo Linux ou macOS:
./gradlew bootRunDepois acesse:
http://localhost:8080
A aplicação possui uma página web em:
GET /
Essa página abre um chat simples feito com Thymeleaf e JavaScript. Ela usa os endpoints do Spring AI:
POST /springai/chat, para enviar mensagens.POST /springai/chat/reset, para limpar a conversa.GET /springai/health, para verificar se o Ollama está acessível.
O chat mantém um histórico curto em memória por sessionId, para simular memória de conversa.
GET /springai/generate?message=Sua pergunta
Envia uma pergunta simples para o modelo usando Spring AI.
Exemplo:
curl "http://localhost:8080/springai/generate?message=Explique%20Spring%20AI"POST /springai/chat
Envia uma mensagem para o chat com memória.
Corpo da requisição:
{
"sessionId": "",
"message": "Explique o que e Spring AI"
}Resposta:
{
"sessionId": "id-da-sessao",
"response": "resposta do modelo"
}POST /springai/chat/reset
Remove o histórico de uma sessão.
Corpo da requisição:
{
"sessionId": "id-da-sessao"
}GET /springai/health
Verifica se o Ollama está respondendo e mostra o modelo configurado.
GET /langchain4j/generate?message=Sua pergunta
Envia uma pergunta simples para o modelo usando LangChain4j.
Exemplo:
curl "http://localhost:8080/langchain4j/generate?message=Explique%20LangChain4j"GET /rag/generate?message=Sua pergunta
Executa uma pergunta usando RAG. O projeto carrega o arquivo src/main/resources/rfc7231.txt, divide o texto em partes, grava ou reutiliza o vectorstore.json e busca trechos relacionados para montar o prompt.
Exemplo:
curl "http://localhost:8080/rag/generate?message=Qual%20o%20codigo%20do%20status%20Bad%20Request?"A documentação dos endpoints fica disponível em:
http://localhost:8080/swagger-ui/index.html
No arquivo src/main/resources/application.properties, altere:
spring.ai.ollama.chat.model=llama3.2
spring.ai.ollama.embedding.model=llama3.2Para usar explicitamente a tag latest, você pode deixar assim:
spring.ai.ollama.chat.model=llama3.2:latest
spring.ai.ollama.embedding.model=llama3.2:latestSe quiser usar outro modelo, primeiro baixe com o Ollama:
ollama pull nome-do-modelo:tagDepois altere as propriedades para o mesmo nome.
No arquivo src/main/java/com/luizreal/ai_example/langchain4j/Lang4jChatService.java, altere o valor de modelName:
return OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3.2")
.build();Para usar a tag latest:
return OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3.2:latest")
.build();Se trocar para outro modelo, use o mesmo nome baixado pelo comando ollama pull.
- O endpoint
/springai/generatemostra o uso direto do Spring AI. - O endpoint
/langchain4j/generatemostra o uso direto do LangChain4j. - A página
/usa Spring AI com memória simples em memória da aplicação. - O endpoint
/rag/generatedemonstra uma consulta com RAG usando um documento local e um vector store simples. - O projeto depende do Ollama em execução local para responder as chamadas de IA.