Atualmente, muito se fala sobre LLM (Large Language Models). Esses modelos trazem facilidades para diversas áreas, incluindo a programação. LLMs conseguem compreender e gerar mensagens de texto (e outros tipos de dados), permitindo sugestões, correções e até geração de código a partir de prompts textuais.
Neste artigo, vamos explorar a biblioteca JLama, que tem como objetivo integrar modelos LLM ao ecossistema Java. Totalmente desenvolvida em Java, essa biblioteca oferece diferentes formas de uso, seja como uma CLI ou integrada diretamente ao seu software como uma dependência no pom.xml
. Aqui, utilizaremos a integração com um projeto Spring Boot para demonstrar sua funcionalidade.
Requisitos e Destaques
A biblioteca JLama requer Java 20+, pois faz uso da Vector API do Java. Para quem já utiliza LangChain, é possível integrá-lo ao JLama, aproveitando as ferramentas do LangChain para facilitar a interação com os modelos.
O projeto apresentado neste artigo consiste em dois endpoints que interagem com modelos LLM por meio de prompts:
- Um endpoint configurado diretamente com JLama.
- Outro endpoint utilizando LangChain em conjunto com JLama.
Implementação no Projeto
Endpoint com JLama
O primeiro endpoint configura diretamente a biblioteca JLama para gerar respostas baseadas em um prompt enviado pelo usuário.
@PostMapping("/jlama") // Endpoint para funcionalidade de chat com JLama
public ResponseEntity<ChatPromptResponse> chatJlama(@RequestBody ChatPromptRequest request) {
PromptContext context;
if (abstractModel.promptSupport().isPresent()) {
context = abstractModel.promptSupport()
.get()
.builder()
.addSystemMessage("You are a helpful chatbot who writes very short responses.")
.addUserMessage(request.prompt())
.build();
} else {
context = PromptContext.of(request.prompt());
}
System.out.println("Prompt: " + context.getPrompt() + "\n");
Generator.Response response = abstractModel
.generate(UUID.randomUUID(), context, 0.0f, 256, (s, f) -> {});
System.out.println(response.responseText);
return ResponseEntity.ok(new ChatPromptResponse(response.responseText));
}
Aqui, configuramos o modelo desejado. Caso ele não esteja disponível localmente, será feito o download automático para o diretório especificado. Em seguida, criamos o contexto do prompt e geramos a resposta usando o JLama.
// Definindo o modelo e diretório para caso não encontre baixar o modelo Hugging Face
String model = "tjake/Llama-3.2-1B-Instruct-JQ4";
String workingDirectory = "./models";
// Baixando (se necessário) ou buscando localmente o modelo
File localModelPath = new Downloader(workingDirectory, model).huggingFaceModel();
// Carregando o modelo
ModelSupport.loadModel(localModelPath, DType.F32, DType.I8);
Endpoint com LangChain e JLama
O segundo endpoint utiliza o LangChain, reduzindo a quantidade de código necessário para interagir com o JLama.
@PostMapping("/langchain")
public ResponseEntity<Object> chatLangChain(@RequestBody ChatPromptRequest request) {
var model = JlamaChatModel.builder()
.modelName("meta-llama/Llama-3.2-1B")
.temperature(0.7f)
.build();
var promptResponse = model.generate(
SystemMessage.from("You are a helpful chatbot who writes the must possible short message."),
UserMessage.from(request.prompt()))
.content()
.text();
System.out.println("\n" + promptResponse + "\n");
return ResponseEntity.ok(promptResponse);
}
Com LangChain, definimos o modelo e os parâmetros diretamente no builder, simplificando a lógica de implementação.
Links e Referências
Este projeto foi inspirado pela palestra do professor Isidro no SouJava: Assista à palestra aqui.
Documentações úteis:
Conclusão
JLama e LangChain oferecem uma maneira poderosa de integrar modelos LLM em aplicações Java. Neste artigo, exploramos como configurar e utilizar essas ferramentas com Spring Boot para criar endpoints que processam prompts textuais de maneira eficiente.
E você? Já trabalhou com LLMs em projetos Java? Compartilhe seus desafios e aprendizados nos comentários!
Top comments (0)