IA: Explorando Oportunidades para Gestores e Técnicos

IA: Explorando Oportunidades para Gestores e Técnicos

Para nós que temos uma origem técnica, o cargo de gestão, inevitavelmente, nos deixa um pouco distantes do código. Creio que, como gestores, não temos a obrigação de saber tudo sobre todos os temas. Contudo, isso não nos isenta de saber o mínimo sobre os principais temas da atualidade. Saber o mínimo nos permite discutir com propriedade com nossos times, tomar decisões mais assertivas e orientá-los pelos caminhos mais performáticos.

Hoje, quero falar um pouco sobre inteligência artificial e compartilhar o que venho desbravando sobre esse imenso novo mundo. Neste artigo, quero compartilhar uma aplicação em Java que construí com fins educativos, cujo objetivo é coletar entradas do usuário e enviar essas informações para as APIs da OpenAI, utilizando um modelo de LLM para gerar respostas ao input do usuário.

Além disso, aprendemos a armazenar um arquivo PDF com informações do perfil de LinkedIn de Marco Túlio Macedo Rodrigues em um banco de dados vetorial. Isso permite enriquecer as respostas do modelo LLM da OpenAI com dados específicos que não estão públicos na internet.


Sobre a aplicação

A aplicação disponibiliza 04 métodos:

  • SendMessage: Coleta um input do cliente e envia para uma LLM via API. Retorna a resposta da LLM.
  • SendMessageAndReturnMetaData: Coleta um input do cliente e envia para uma LLM via API. Retorna a resposta da LLM, porém com metadados.
  • SendMessageWithPromptTemplate: Coleta um input do cliente e envia para a LLM usando prompt pré-moldado pelo programador para direcionar a resposta da LLM. Retorna a resposta da LLM.
  • SendMessageWithRag: Em tempo de inicialização a aplicação vai criar um banco de vetorial local de um conjunto de arquivos fornecidos. Nesse exemplo, exportamos o meu perfil (Marco Túlio) no LinkedIn em .pdf para representar esse conjunto de arquivos. Em tempo de execução, coletamos o input do client e enviamos para a LLM junto com os documentos semelhantes que encontramos no bd vetorial. O resultado disso será que a LLM poderá responder qualquer dúvida que sobre Marco Túlio que estiver no .pdf fornecido.


Construção da aplicação

A aplicação foi construída usando 17 e Maven com gerenciador de dependências. As principais dependências que fazem toda a magia acontecer, são: spring-ai-openai-spring-boot-starter, spring-ai-tika-document-reader.

<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>
<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-tika-document-reader</artifactId></dependency>        

Spring AI

O projeto Spring AI visa agilizar o desenvolvimento de aplicações que incorporem funcionalidades de inteligência artificial sem complexidade desnecessária.

O projeto Spring nos oferece interfaces genéricas que permitem conectar com diversas LLMs de diferentes empresas, tais como: OpenAI, Meta, AWS, etc. No artigo de hoje, iremos focar no uso da implementação da interface para se comunicar com as APIs da OpenAI: OpenAiChatModel.

A OpenAiChatModel é a implementação da interface ChatModel, fornecida pelo projeto Spring, para se comunicar com as APIs da OpenAI. A nossa classe para receber um input do usuário e enviar essa mensagem de forma simples para a OpenAI fica da seguinte maneira:

@RestController
public class AIController {

    private final OpenAiChatModel chatClient;
    private final SimpleVectorStore vectorStore;
    @Value("classpath:/rag-prompt-template.st")
    private Resource ragPromptTemplate;

    public AIController(OpenAiChatModel chatClient, SimpleVectorStore vectorStore) {
        this.chatClient = chatClient;
        this.vectorStore = vectorStore;
    }

    @GetMapping("/chat")
    public String sendMessage(@RequestParam(defaultValue = "Ola Mundo") String message) {
        return chatClient.call(message);
    }
}        

Na figura 1, veja o resultado no Postman:

Figura 1 - Resposta da API

Implementando RAG

Figura 2 - Perguntando sobre Marco Túlio

Na figura 2, estamos perguntando ao modelo "Quem é Marco Túlio?" e a resposta é, obviamente, sobre o filósofo da antiguidade. Isso é esperado, uma vez que esse modelo da OpenAI (gpt-4o-mini) não foi treinado com informações sobre mim.

Como faço para capacitar esse modelo a responder perguntas sobre mim ou sobre dados privados da minha empresa sem expô-los na internet? Fique comigo no restante deste artigo, em que compartilharei como fiz para que essa aplicação respondesse perguntas sobre meu perfil profissional, usando um PDF com meu perfil no LinkedIn.

No trecho de código abaixo, estamos criando um bean para a classe SimpleVectorStore. Ela tem como objetivo gerar um banco vetorial local. Você provavelmente não quer usar isso em produção, pois é uma boa opção apenas para fins didáticos e estudos. Como esse é o nosso cenário aqui, vamos utilizá-la.

O banco vetorial será criado em uma pasta temporária: /tmp/vectorstore.json.

O arquivo que será lido e armazenado em vetores no banco está dentro do repositório do projeto, no diretório: /documents/curriculo_marcot.pdf. Nesse método loadSimpleVectorStore, o arquivo PDF tem todo o texto extraído usando o TikaDocumentReader, e esse texto é dividido em fragmentos menores com o TextSplitter, o que facilita o cálculo de embeddings das partes menores do documento.

O EmbeddingModel que estamos usando nesta implementação é o OpenAiEmbeddingModel. Ele é o responsável pelo cálculo dos embeds que serão armazenados no nosso banco vetorial.

Como estamos usando o SimpleVectorStore, este será um bean singleton, e esse trecho de código será executado apenas no tempo de inicialização da aplicação. Não queremos gastar recursos computacionais dividindo o arquivo em fragmentos ou fazendo requisições para a OpenAI para calcular os embeds a cada interação.

figura 3 - Inicializando o banco vetorial

O nosso método para receber o input do cliente e enviá-lo para a OpenAI, utilizando o banco vetorial criado no passo anterior, fica da seguinte forma:

figura 4 - Enviando uma mensagem com um dados vetoriais próximos

Na figura 4, começamos com o SystemPromptTemplate. Ele é um template de prompt que deixei pronto para ser usado em cada iteração. Na figura 5, você poderá ver como formatei o prompt.

figura 5 - prompt pré moldado

Voltando à figura 4, usamos o bean vectorStore, que criamos nos passos anteriores, para fazer uma busca por similaridade em documentos que se assemelhem ao input do cliente. O input do cliente está representado, nesse exemplo, pela variável message. Uma vez que encontramos os dois documentos que mais se assemelham ao input do cliente, esses documentos serão adicionados ao prompt, representado na figura 5, substituindo o placeholder {documents}. O placeholder {input} no prompt será substituído pela variável message, que contém o input recebido do cliente.

Finalmente, temos nossa systemMessage pronta para ser submetida à OpenAI. O resultado pode ser verificado na figura 6.

figura 6 - resposta da LLM com RAG

Veja a diferença na resposta agora para a pergunta "Quem é Marco Túlio?" em comparação à resposta que tivemos na figura 2. Desta vez, o modelo respondeu com dados precisos sobre mim, já que ele utilizou meu perfil no LinkedIn para enriquecer sua resposta.


Agradecimentos

Se você chegou até aqui, muito obrigado pelo seu tempo. Não deixe de comentar e deixar suas ideias para um próximo artigo. :D


Código fonte

Acesso o código fonte completo no meu GitHub.

Maicon Reichert

Gestão & Governança | Transformação Digital | Gestão de Projetos | Liderança

2 m

Boa reflexão Marco Túlio Macedo Rodrigues. Fato é, quanto mais alto o nível da hierarquia, mais distantes ficamos da operação. Entretanto, equilibrar esta balança é fundamental tanto para uma boa gestão quanto para desenvolvimento do time, pois na maioria das vezes o líder é justamente o espelho técnico dos liderados. Ações como esta, de experimentar novos caminhos, tecnologias, oportunidades, é o que nós mantém atuantes e prósperos nas duas esferas!

Entre para ver ou adicionar um comentário

Outras pessoas também visualizaram

Conferir tópicos