DEV Community

Lucas Oliveira
Lucas Oliveira

Posted on

1

Explorando a Biblioteca JLama com Spring Boot e LangChain

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));
}
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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!

Billboard image

Use Playwright to test. Use Playwright to monitor.

Join Vercel, CrowdStrike, and thousands of other teams that run end-to-end monitors on Checkly's programmable monitoring platform.

Get started now!

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay