Alura > Cursos de Inteligência Artificial > Cursos de IA para Dados > Conteúdos de IA para Dados > Primeiras aulas do curso LlamaIndex: integração de LLMs com bancos de dados vetoriais

LlamaIndex: integração de LLMs com bancos de dados vetoriais

Aplicando LLM na recomendação de livros - Apresentação

Você já se perguntou como podemos usar as LLMs (Large Language Models ou Modelos de Linguagem Grande) para criar um buscador ou um chatbot que traga informações relevantes para nossos projetos? Ao combinar o conceito das LLMs com bancos de dados vetoriais, conseguimos construir resultados incríveis.

Boas-vindas ao curso de LlamaIndex utilizando bases de dados vetoriais. O instrutor Igor do Nascimento Alves nos acompanhará neste projeto.

Audiodescrição: Igor é uma pessoa branca, de cabelos curtos pretos e olhos castanhos. Usa camiseta cinza e fones de ouvido sem fio. Ao fundo, parede lisa sem decorações, iluminada pelas cores azul e verde, com uma planta decorativa à esquerda.

Este curso é para quem se interessa em aproveitar as LLMs em um projeto que requer a recuperação de informações. Utilizaremos, por exemplo, um banco de dados vetorial para trazer essas informações para a LLM e gerar insights e respostas mais interessantes.

O que vamos aprender?

Para desenvolver esse conhecimento, aplicaremos o projeto da Buscante, uma empresa que vende livros. Atualmente, o site possui um buscador tradicional que consulta um banco de dados para trazer os livros para a pessoa cliente.

A empresa deseja enriquecer essas respostas utilizando as LLMs, mas sempre recomendando livros que existam na base de dados deles. Por isso, utilizaremos bancos de dados vetoriais para alimentar o modelo.

Durante o desenvolvimento deste projeto, aprenderemos diversas técnicas importantes. Vamos entender como os bancos de dados vetoriais funcionam e explorar a técnica de embedding para transformar um texto em um vetor e carregá-lo nessa base de dados.

Também aprenderemos a trazer informações para a LLM, que responderá somente com base nos dados fornecidos, utilizando a técnica de RAG (Retrieval Augmented Generation ou Geração Aumentada de Recuperação).

Combinando essas diversas técnicas, conseguiremos atender ao projeto da Buscante. Ao final, seremos capazes de pegar uma base de dados estruturada ou não-estruturada, fornecer esses dados para uma base de dados vetorial e utilizá-los em um pipeline completo junto com uma LLM.

Pré-requisitos

Para acompanhar os projetos deste curso, é importante que você já tenha tido contato com a linguagem Python, com o LlamaIndex e com modelos de Machine Learning (Aprendizado de Máquina). Todas essas informações combinadas permitirão que construamos este projeto.

Aplicando LLM na recomendação de livros - Utilizando LLMs com Llamaindex

Nós somos o time de ciência de dados da empresa Buscante, que nos trouxe um problema para resolver. Atualmente, o buscador, para encontrar livros dentro da plataforma, utiliza uma busca tradicional.

O cliente faz uma busca pelo nome do livro ou por uma categoria de interesse, como livros de romance. Essa busca é enviada para uma consulta padrão de SQL dentro do banco de dados tradicional, retornando os livros que se encaixam na categoria ou que tenham aquele nome, e a lista é apresentada ao cliente.

O problema aparece quando o cliente não sabe exatamente o que está buscando. Como atender esse tipo de cliente? Com o avanço dos LLMs (Large Language Models), surgiu a ideia de oferecer uma resposta mais rica para esse usuário. Vamos atender a esse projeto.

Preparando o ambiente

Nosso primeiro passo será integrar uma LLM ao projeto. Optamos por utilizar o Google Colab, uma plataforma excelente que já possui várias ferramentas pré-instaladas que ajudarão nesse processo.

Precisamos também de uma LLM, que pode ser muito pesada para rodar localmente, o que envolve um custo computacional. Neste projeto, utilizaremos a plataforma Groq, que permite interação via API. Enviamos um contexto para a plataforma Groq, que responde utilizando uma LLM. Dentre os diversos modelos disponíveis, utilizaremos o Llama 3.

Deixamos algumas atividades após este vídeo, explicando como usar o Colab, caso nunca tenha utilizado, e como obter a API Key do Groq e configurá-la no Colab. Após cumprir esses pré-requisitos, podemos iniciar o projeto.

Carregando API Key

Primeiramente, queremos carregar a API Key. Para isso, vamos importar uma ferramenta do Google Colab com o seguinte comando:

from google.colab import userdata

Na linha seguinte, criamos a variável GROQ_API, que será igual a userdata.get('GROQ_API'). Isso carrega o código secreto que permite acessar a API, salvo no Google Colab, para essa variável.

GROQ_API = userdata.get('GROQ_API')

Executamos a célula com "Shift + Enter". Na primeira execução, a máquina pode demorar um pouco para conectar, pois está alocando recursos.

Também surgirá um aviso que o notebook não tem acesso ao secret. Vamos clicar no botão "Permitir acesso" para conceder a permissão de acesso à API e, assim, disponibilizar a informação secreta.

É uma boa prática não deixar keys no notebook, pois, ao versionar o projeto no GitHub, não é interessante que essa informação fique pública. Por isso, a salvamos em uma variável de ambiente do Google Colab.

Instando LlamaIndex

Agora, como conversamos com essa LLM? Estamos acostumados a abrir o ChatGPT ou o Gemini e interagir em um console. O Groq possui um playground equivalente, onde enviamos mensagens e recebemos respostas em formato de chatbot.

Mas como trazemos isso para o notebook? Utilizaremos a ferramenta LlamaIndex, que facilita a junção das diversas etapas de um projeto de LLM, como acesso a diferentes LLMs e o pipeline de dados. Fazer todas essas conexões exigiria muito código e conhecimento, mas o LlamaIndex facilita esse processo.

Para instalar a ferramenta, fazemos um pip install do llama-index e llama-index-llms-groq:

!pip install -q llama-index llama-index-llms-groq

Utilizando LLM via Groq

Após a instalação, como a LLM que utilizaremos será via Groq, devemos importar o Groq através do comando:

from llama_index.llms.groq import Groq

Para criar a LLM, vamos criar uma variável chamada llm, que será igual ao Groq() importado, passando duas informações: model e api_key.

O modelo que queremos utilizar será o Llama 3, de 70 bilhões de parâmetros, identificado pelo código 8192. A documentação do Groq oferece muitos modelos para diferentes propósitos.

Passamos também a API Key para identificar o usuário, que está armazenada na variável GROQ_API. Como o Groq oferece opções gratuitas e pagas, com limites de tokens e requisições diárias, é preciso identificar quem está usando o serviço.

llm = Groq(model="llama3-70b-8192", api_key=GROQ_API)

Executamos o código para ter acesso ao modelo via API. Vamos testá-lo.

Construindo sessão de chat

Primeiramente, queremos construir uma sessão de chat semelhante ao que estamos habituados em vários modelos de linguagem. O LlamaIndex facilita isso. Basta fazer a importação do SimpleChatEngine:

from llama_index.core.chat_engine import SimpleChatEngine

Para utilizá-lo, criamos uma variável chamada chat_engine, igual a SimpleChatEngine.from_defaults(), pois queremos usar os valores padrões, exceto a LLM. Nesse caso, queremos utilizar a llm do Groq que instanciamos anteriormente, por isso, a passamos como parâmetro.

chat_engine = SimpleChatEngine.from_defaults(llm=llm)

Depois de criar essa conexão, podemos iniciar o chat:

chat_engine.chat_repl()

Ao executar o comando, uma interface é aberta no Colab, indicando que estamos em um chat de respostas. Podemos interagir com a LLM, escrevendo nossa pergunta na caixa de mensagem para humanos:

Human: Você consegue me ajudar com dúvidas literárias?

A LLM possui vasto conhecimento para gerar textos coerentes e responde que pode, sim, nos ajudar com nossas dúvidas literárias:

Assistant: Eu estou aqui para ajudar!

Sim, posso ajudar com dúvidas literárias. Qual é o assunto ou obra literária que você gostaria de discutir? Você tem alguma pergunta específica sobre um livro, autor, estilo literário ou movimento literário?

Pode ser sobre:

Sinta-se à vontade para fazer sua pergunta, e farei o meu melhor para ajudar!

Para sair dessa interface, basta digitar exit.

Human: exit

Próximos passos

Nosso próximo passo, agora que conseguimos essa conexão com o modelo, é encontrar uma maneira de conversar com a LLM sobre buscas de livros dentro da plataforma Buscante.

Aplicando LLM na recomendação de livros - Recomendando livros com LLMs

Conseguimos estabelecer a conexão e interagir com a LLM de maneira usual, como a maioria dos usuários faz, via chat. Nesse formato, há uma troca direta de perguntas e respostas.

No entanto, em nosso projeto, precisamos de uma interação diferente com a LLM. Vamos enviar uma pergunta e, com base na resposta, construiremos nosso sistema de busca para fornecer informações ao usuário.

Fazendo interação única com LLM

Por isso, utilizaremos uma função diferente para acessar a LLM. A função que usaremos é a llm.complete(). Com essa função, podemos passar um prompt para a LLM.

Como é uma interação única, devemos incluir o máximo de informações possível nessa interação. Nesse caso, vamos perguntar se a LLM pode nos ajudar com dúvidas literárias, assim como perguntamos anteriormente.

llm.complete("Consegue me ajudar com dúvidas literárias?")

A resposta será no formato da classe CompletionResponse, que contém um atributo de texto e outras informações técnicas, como o tempo de resposta e até x_groq.

CompletionResponse(text='Eu estou aqui para ajudar!\n\nClaro que sim, posso ajudar com dúvidas literárias. Qual é o assunto ou obra literária que você gostaria de discutir? Você tem alguma pergunta específica sobre um livro, autor, estilo literário ou movimento literário?\n\nSe você precisar de ajuda com:\n\n* Análise de um texto ou obra literária\n* Explicação de um conceito ou estilo literário\n* Informações sobre um autor ou sua obra\n* Sugestões de leitura ou recomendações de livros\n* Discussão sobre temas ou tópicos literários\n\nou qualquer outra coisa relacionada à literatura, sinta-se à vontade para perguntar!\n\nEstou ansioso para ajudar e discutir literatura com você!', additional_kwargs={}, raw=ChatCompletion(id='chatcmpl-24f52f3a-c601-4e5a-b0a6-4288d53af4dd', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='Eu estou aqui para ajudar!\n\nClaro que sim, posso ajudar com dúvidas literárias. Qual é o assunto ou obra literária que você gostaria de discutir? Você tem alguma pergunta específica sobre um livro, autor, estilo literário ou movimento literário?\n\nSe você precisar de ajuda com:\n\n* Análise de um texto ou obra literária\n* Explicação de um conceito ou estilo literário\n* Informações sobre um autor ou sua obra\n* Sugestões de leitura ou recomendações de livros\n* Discussão sobre temas ou tópicos literários\n\nou qualquer outra coisa relacionada à literatura, sinta-se à vontade para perguntar!\n\nEstou ansioso para ajudar e discutir literatura com você!', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1731903360, model='llama3-70b-8192', object='chat.completion', service_tier=None, system_fingerprint='fp_87cbfbbc4d', usage=CompletionUsage(completion_tokens=177, prompt_tokens=22, total_tokens=199, completion_tokens_details=None, prompt_tokens_details=None, queue_time=0.011116782, prompt_time=0.003572297, completion_time=0.505714286, total_time=0.509286583), x_groq={'id': 'req_01jcyqr3s9eer9dtvwjngdcb0f'}), logprobs=None, delta=None)

Nosso objetivo inicial é verificar se a LLM consegue recomendar um livro ao usuário. Por isso, focaremos na parte textual da resposta. Basta pegar o llm.complete() e acessar o atributo text para obter apenas a resposta.

llm.complete("Consegue me ajudar com duvidas literarias ?").text

'Eu estou aqui para ajudar!\n\nSim, posso ajudar com dúvidas literárias. Qual é o assunto ou obra literária que você gostaria de discutir? Você tem alguma pergunta específica sobre um livro, autor ou movimento literário?\n\nPode ser sobre:\n\n* Análise de um livro ou poema específico\n* Autor ou obra literária em particular\n* Movimentos literários (Romantismo, Realismo, Modernismo, etc.)\n* Gêneros literários (Ficção científica, Fantasia, Romance, etc.)\n* Técnicas literárias (Simbolismo, Ironia, etc.)\n* Contexto histórico ou cultural de uma obra literária\n\nSinta-se à vontade para fazer sua pergunta, e farei o meu melhor para ajudar!'

Por padrão, a resposta é formatada em Markdown, como podemos notar pelo uso de quebra de linhas (\n) e bullet points (*).

Então, podemos salvar essa resposta em uma variável chamada resposta e fazer um print() para imprimi-la já formatada.

resposta = llm.complete("Consegue me ajudar com duvidas literarias ?").text
print(resposta)

Eu estou aqui para ajudar!

Sim, posso ajudar com dúvidas literárias. Qual é o tema ou obra literária que você gostaria de discutir? Você tem alguma pergunta específica sobre um autor, um livro, um estilo literário ou um movimento literário?

Se você precisar de ajuda com:

ou qualquer outra coisa relacionada à literatura, sinta-se à vontade para perguntar!

Estou ansioso para ajudar!

Assim, alcançamos a mesma etapa que tínhamos no chat.

Recomendando livros

O próximo passo é permitir que o usuário faça buscas de livros. Nesse momento, definiremos um prompt padrão para usar ao longo do projeto e, assim, servir de referência para nosso progresso.

A dúvida do usuário será armazenada na variável duvida_user e o prompt será a string: "Recomende livros de romance."

duvida_user = "Recomende livros de romance"

Para interagir com a LLM, digitamos a variável resposta, que será igual a llm.complete(), passando o prompt duvida_user. Focaremos apenas na parte textual, utilizando o atributo text. E, por fim, imprimiremos a resposta.

resposta = llm.complete(duvida_user).text
print(resposta)

Romance! Aqui vão algumas recomendações de livros de romance que você pode gostar:

Clássicos

  1. "Pride and Prejudice" de Jane Austen - Um clássico do gênero que segue a história de Elizabeth Bennet e Mr. Darcy.
  2. "Jane Eyre" de Charlotte Brontë - A história de uma jovem governanta que se apaixona pelo seu patrão, Mr. Rochester.
  3. "Wuthering Heights" de Emily Brontë - Um romance trágico sobre a paixão entre Catherine e Heathcliff.

Contemporâneos

  1. "The Notebook" de Nicholas Sparks - Uma história de amor que dura décadas, entre dois jovens que se conhecem em um verão.
  2. "Me Before You" de Jojo Moyes - Uma história emocionante sobre uma jovem que se apaixona pelo seu paciente, um homem que sofreu um acidente.
  3. "The Fault in Our Stars" de John Green - Um romance trágico sobre dois adolescentes que se conhecem em um grupo de apoio a pacientes com câncer.

[restante da resposta omitida...]

Ao executar o código, a LLM fornece uma resposta completa, com recomendações de livros de romance, divididas em categorias como clássicos, contemporâneos, históricos e paranormais, incluindo títulos e descrições curtas.

Embora a LLM ofereça boas recomendações, precisamos considerar que a empresa Buscante possui um acervo específico de livros. Há regras de negócio que a resposta direta da LLM não atende. Precisamos que a LLM recomende livros que temos em estoque e que estamos interessados em vender.

Próximos passos

As LLMs foram treinadas com um grande conjunto de textos e utilizam esse conhecimento para gerar respostas. Nosso desafio é limitar essas respostas para que incluam apenas livros disponíveis na Buscante.

Nosso próximo passo será integrar nossa base de dados nas respostas da LLM.

Sobre o curso LlamaIndex: integração de LLMs com bancos de dados vetoriais

O curso LlamaIndex: integração de LLMs com bancos de dados vetoriais possui 101 minutos de vídeos, em um total de 47 atividades. Gostou? Conheça nossos outros cursos de IA para Dados em Inteligência Artificial, ou leia nossos artigos de Inteligência Artificial.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda IA para Dados acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas