Boas-vindas ao Curso de Llama Index: Criando um assistente virtual para consulta de dados estruturados! Me chamo Mirla Costa e sou instrutora da Alura.
Audiodescrição: Mirla se declara uma mulher de pele clara, com cabelos cacheados e pretos, que estão presos. Ela usa óculos de grau com armação redonda e veste uma camisa preta. Ao fundo, estantes flutuantes com livros e decorações, além de uma iluminação em degradê na cor verde e azul.
Serei a pessoa que acompanhará você durante todo este projeto!
Você já pensou em desenvolver algo semelhante a um chat? Isto é, uma interface que possibilite conversarmos com um assistente SQL.
Esse assistente, a partir do momento em que enviamos uma mensagem para tirar uma dúvida sobre um banco de dados, retorna as informações sobre esses dados. Essas informações são obtidas através de consultas que o próprio assistente realiza dentro do nosso banco de dados.
Neste curso, você irá aprender a utilizar o Llama Index para criar um assistente de consultas em banco de dados.
Neste curso, trabalhamos como pessoas cientistas de dados na Zoop. Precisamos desenvolver um assistente para que pessoas sem conhecimento sólido em SQL e Python consigam consultar o banco de dados da empresa e obter informações que ajudarão em seu trabalho.
Durante todo o desenvolvimento do nosso projeto, utilizaremos Python e bibliotecas como sqlalchemy, llama-index e gradio, que nos permitirão conectar ao banco de dados, realizar consultas e construir essa interface.
Para que você aproveite bem este curso, recomendamos fortemente que tenha um sólido conhecimento em Python e também um conhecimento básico sobre Llama Index e LLMs (modelos de linguagem ampla).
Vamos começar!
Trabalhamos como pessoas cientistas de dados na Zoop Megastore, onde armazenamos informações sobre nossos clientes, funcionários e fornecedores em nosso banco de dados.
Muitas pessoas que precisam das informações contidas no nosso banco de dados não sabem utilizar comandos SQL para fazer consultas e, assim, ajudar em suas pesquisas. Isso acaba consumindo bastante tempo de quem tem esse conhecimento técnico para poder ajudá-los nessa tarefa.
Para resolver esse problema, construiremos uma interface que, ao receber um comando em linguagem natural, ou seja, a mesma que utilizamos para nos comunicar, realiza uma consulta SQL de forma inteligente e retorna a resposta.
Dessa forma, eliminamos parte da necessidade de conhecimento de SQL para obter informações sobre as tabelas dentro do banco de dados da Zoop.
Para fazer isso, precisamos utilizar dados LLMs, mas, para saber qual ferramenta utilizar, precisamos primeiro conhecer nossos bancos de dados e entender suas características para saber que tipo de ferramenta vamos utilizar para resolver nosso problema.
Vamos para o nosso Colab, que é o ambiente onde desenvolveremos este projeto. Já estamos dentro do Colab, conectados, e utilizaremos o notebook durante todo o projeto. Ele contém links de referência e algumas explicações para nos ajudar a desenvolver isso juntos.
O notebook está disponível para download, assim como os dados que utilizaremos durante este curso, que são os dados de e-commerce da Zoop. Vá até as atividades desta aula e baixe esses dois arquivos para que possamos seguir neste projeto juntos.
A primeira coisa que faremos é importar esses arquivos para dentro do ambiente Colab. Para isso, consultamos a barra do canto esquerdo da tela do Colab, clicando em "arquivos". Em seguida, clicamos no primeiro botão de fazer upload abaixo do título de "Arquivos" na parte superior esquerda. Já estamos com a aba aberta, que contém o dado de "ecommerce". Clicamos no botão "Abrir" na parte inferior direita, e o carregamento é feito.
sample_data
ecommerce.db
Logo em seguida, já temos o arquivo ecommerce.db
salvo dentro do nosso ambiente.
Atentem-se que ele tem o final
.db
, que é database, um tipo de arquivo de banco de dados.
Agora faremos a importação desses dados para termos acesso a eles. Para importar e acessar esses dados, precisamos nos conectar a um banco de dados, sendo ele o ecommerce.db
. Para isso, utilizamos o SQLite com o suporte da biblioteca SQL Alchemy. Vamos criar um engine que permita o acesso a um banco de dados localizado na memória, que é o e-commerce, e também podemos extrair algumas informações que estão dentro desse banco de dados, que ainda nem sabemos quais são, com o MetaData
.
Vamos importar as funções create_engine
e MetaData
, que na verdade é uma classe. Em uma célula, digitamos:
from sqlalchemy import create_engine, MetaData
Em seguida, na mesma célula, salvamos o caminho do nosso arquivo, que é o ecommerce.db
. Vamos chamar esse arquivo de url
, que será igual a caminho do arquivo entre aspas simples. Por enquanto, temos:
from sqlalchemy import create_engine, MetaData
url = ''
Para coletar esse caminho, voltamos aos nossos arquivos clicando no botão de arquivos à esquerda, à direita do arquivo ecommerce.db
clicamos nos três pontos e copiamos o caminho selecionando a opção "Copiar caminho". Fechamos os arquivos novamente e, dentro das aspas simples do nosso url
, colamos o caminho:
from sqlalchemy import create_engine, MetaData
url = '/content/ecommerce.db'
Na mesma célula, criamos a engine de acesso a esse banco de dados. Chamaremos de engine
, que será igual a create_engine(f'sqlite:///{url}')
, sendo o que está dentro dos parênteses o nosso caminho. Com o suporte do SQLite, criamos uma string utilizando o SQLite, mas nos dirigindo ao banco de dados da nossa memória.
from sqlalchemy import create_engine, MetaData
url = '/content/ecommerce.db'
engine = create_engine(f'sqlite:///{url}')
Executamos o comando com "Shift + Enter" e já temos a engine.
Verificaremos que tipos de tabelas temos dentro desse arquivo. Para isso, criaremos um objeto de metadados com o metadata.
Metadados são as informações sobre essas tabelas.
Em uma nova célula, chamaremos de metadata_obj
e colocaremos MetaData()
para criar o objeto. Esse objeto irá coletar as informações da engine. Para isso, na mesma célula, utilizamos o comando metadata_obj.reflect(engine)
:
metadata_obj = MetaData()
metadata_obj.reflect(engine)
Feito isso, conseguimos acessar os nomes das nossas tabelas. Para acessar, na mesma célula, utilizamos metadata_obj.tables.keys()
:
metadata_obj = MetaData()
metadata_obj.reflect(engine)
metadata_obj.tables.keys()
dict_keys(['Clientes', 'Fornecedores', 'Funcionarios'])
Executamos o comando e temos um dicionário com todos os nomes das nossas tabelas: clientes, fornecedores e funcionários.
Observaremos o que há em cada uma dessas tabelas para entender melhor os dados que estamos recebendo. Para uma visualização bonita e acessível, em formato tabelar, utilizaremos o pandas. Neste momento, utilizaremos o pandas, mas durante o projeto, quase não utilizaremos dataframes, apenas para ações pontuais como esta.
Faremos um import
do pandas como pd
e utilizaremos o comando pd.read_sql_table()
. Entre parênteses, digitamos o nome da tabela que desejamos consultar. No caso, vamos consultar Clientes
(entre aspas simples) e, na sequência, digitamos vírgula engine
:
import pandas as pd
pd.read_sql_table('Clientes', engine)
Executamos com "Shift + Enter" e obtemos:
A tabela abaixo foi parcialmente transcrita:
- ID_Cliente Nome Rua_Numero Estado Valor_gasto 0 1 lucas moura lucas.moura@email.com sitio de cardoso, 49 sao paulo 29017 1 2 julia andrade julia.andrade@email.com trecho mariane teixeira, 90 tocantins 7834 2 3 rafael dias rafael.dias@email.com setor de duarte, 114 paraiba 4071 3 4 carla souza carla.souza@email.com recanto ana livia lopes, 53 para 17512 4 5 felipe neto felipe.neto@email.com jardim de monteiro, 11 sao paulo 24307
Temos o id
, o nome dos nossos clientes, e-mail e algumas informações sobre eles, sendo cada linha um cliente específico.
Copiamos o comando pd.read_sql_table('Clientes', engine)
, pois desejamos verificar também a tabela fornecedores. Ao invés de clientes, colocamos fornecedores:
pd.read_sql_table('Fornecedores', engine)
A tabela abaixo foi parcialmente transcrita:
- ID_Fornecedores Nome Contato Telefone Rua Bairro Cidade Estado CEP 0 1 technex solutions lucas martins 11912345678 info@technexsolutions.com rua das inovacoes, 123 centro sao paulo sp 1000000 1 2 quantum devices isabela oliveira 11923456789 contact@quantumdevices.net avenida tecnologica, 456 jardim futuro guarulhos sp 20000000 2 3 innovatetech corporation rafael pereira 11934567890 support@innovatetechcorp.com alameda do progresso, 789 centro das inovacoes santo andre sp 30000000
Temos também nossos fornecedores, onde cada linha se refere a um, com informações sobre eles. Falta apenas a tabela Funcionarios
. Vamos novamente colocar o nosso read_sql_table()
e, ao invés de Clientes
, utilizamos Funcionarios
:
pd.read_sql_table('Funcionarios', engine)
Obtemos uma tabela com as colunas "ID_Fornecedor", "Nome", "Contato", "Telefone", "Email", "Rua", "Bairro", "Cidade", "Estado" e "cep".
O mesmo padrão se aplica. Cada linha é uma informação específica sobre uma pessoa funcionária. Temos cargos e, entre as pessoas fornecedoras, até as localidades de cada pessoa fornecedora, o que é muito interessante.
Percebemos que temos dados estruturados. Um LLM muito simples não nos ajudará tanto a resolver nosso problema. Precisamos de uma ferramenta que permita o acesso a esses bancos de dados para fazer as consultas SQL.
A ferramenta em questão é o Llama Index, e iniciaremos seu uso no próximo vídeo!
Agora que conhecemos nossos dados, entendemos que é necessário utilizar uma ferramenta específica para realizar consultas no nosso banco de dados e, principalmente, para acessá-lo de forma eficiente. A ferramenta responsável por essa tarefa é o Llama Index, que permite realizar essas operações de maneira eficaz.
O Llama Index é uma ferramenta que nos permite conectar os dados que temos a modelos de linguagem natural.
Assim, conseguimos enviar uma requisição em linguagem natural e fazer com que esse modelo busque, dentro dos nossos dados, uma resposta equivalente à pergunta que fizemos, sem a necessidade de estarmos diretamente consultando o banco de dados.
Para utilizarmos o Llama Index, seguimos alguns passos. O primeiro é a instalação dos pacotes no ambiente Colab, pois o Colab não possui esses pacotes nativamente. Também precisaremos coletar uma chave API do groq para ter acesso aos modelos de linguagem natural. Além disso, precisamos configurar o Llama Index para que ele utilize o modelo LLM do groq e um modelo de embeddings que aceite nosso modelo groq.
Vamos para o nosso notebook para começar o primeiro passo.
Dentro do notebook, na parte de "Configurando o Llama Index", já temos uma lista com um pip install
dos pacotes que utilizaremos durante todo o projeto. Esses pacotes envolvem o Llama Index e, mais adiante, o gradio, que nos permitirá construir nossa interface.
!pip install llama-index llama-index-llms-groq llama-index-experimental llama-index-embeddings-huggingface llama-index-postprocessor-cohere-rerank gradio
Collecting llama-index
Downloading llama_index-0.12.2-py3-none-any.whl.metadata (11 kB)
Collecting llama-index-llms-groq …
Executamos a célula para instalar os pacotes no ambiente Colab.
O segundo passo é coletar a chave da API do groq, o que nos permite utilizar os modelos LLMs e outros recursos do Llama para construir nossa interface. Como já fizemos a instalação, para não ficarmos com texto do retorno do comando anterior, podemos realizar algumas ações para a saída da célula de código.
Clicamos no botão abaixo do ícone de play (de executar a célula) à esquerda do comando e selecionamos a opção de "Mostrar/Ocultar saída", para não termos um texto muito extenso com a saída do pip install
.
Voltando ao segundo passo, em uma nova célula, já deixamos um código pronto para coletar essa chave da groq API:
from google.colab import userdata
key = userdata.get('GROQ_API')
Como chegamos no código acima?
À esquerda, clicamos no botão representado por uma chave, identificado como "Secrets" ("segredos") dentro do notebook. Ao clicar nessa chave, encontramos a cheva groq armazenada e nomeada como GROQ_API
, com acesso ao notebook.
Disponibilizamos um passo a passo na atividade "Preparando o ambiente" que orienta como chegar até este ponto.
O código fornecido pelo Colab na parte inferior é copiado e colado na célula, o que gerou a key
, correspondente à chave do groq API, armazenada no secret. A próxima etapa consiste em executar esta célula para obter a nossa key, concluindo assim o segundo passo.
O terceiro passo consiste em configurar o Llama Index para que ele compreenda que, ao realizar uma consulta utilizando a ferramenta, deve-se utilizar o modelo groq, em vez do modelo padrão do Llama Index, que é da OpenAI.
Como o modelo da OpenAI não é o desejado, é necessário ajustar as configurações do Llama Index para que ele utilize as LLMs fornecidas pela groq. Outro aspecto importante é que, por ser necessário usar embeddings e criar índices vetoriais, é preciso também configurar qual modelo de embedding o Llama Index irá utilizar, visto que o modelo padrão do Llama também está relacionado à OpenAI.
Esses dois modelos, tanto o LLM quanto o embedding, já estão armazenados no nosso notebook. O modelo LLM é o llama-3.1-70b-versatile, e o modelo de embedding é o BAAI/bge-m3 do Hugging Face.
Caso queira mais informações sobre esses modelos, é possível acessar os links correspondentes dos modelos disponíveis no notebook.
modelo="llama-3.1-70b-versatile"
modelo_hf_emb="BAAI/bge-m3"
Executamos a célula para salvar os nomes.
Agora, vamos configurar o Llama Index para utilizar tanto o LLM quanto o embedding.
Essa configuração será feita através da classe Settings
dentro do Llama Index. Para utilizá-la, precisamos importá-la no nosso ambiente. Vamos digitar na célula:
from llama_index.core import Settings
Essa classe Settings
que nos permitirá fazer as configurações. Teclamos "Enter" para pular uma linha e agora vamos importar a classe do groq dentro do Llama Index para utilizá-la:
from llama_index.core import Settings
from llama_index.llms.groq import Groq
Por fim, na mesma célula, também faremos um import
do Hugging Face Embedding para utilizar o modelo de embedding do Hugging Face:
from llama_index.core import Settings
from llama_index.llms.groq import Groq
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Com isso, importamos todas as classes necessárias e podemos definir as configurações.
Na mesma célula, a primeira configuração será as LLMs que o Llama utilizará. Para isso, colocamos: Settings.llm = Groq(model=modelo, api_key = key)
. Dentro dos parênteses do Groq()
estamos especificando o modelo e a chave.
Assim, ficamos com:
from llama_index.core import Settings
from llama_index.llms.groq import Groq
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Settings.llm = Groq(model=modelo, api_key = key)
Por fim, ainda na mesma célula, configuramos o modelo de embedding com Settings.embed_model = HuggingFaceEmbedding(model_name = modelo_hf_emb)
, sendo o modelo_hf_emb
da mesma forma que criamos na célula anterior.
from llama_index.core import Settings
from llama_index.llms.groq import Groq
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Settings.llm = Groq(model=modelo, api_key = key)
Settings.embed_model = HuggingFaceEmbedding(model_name = modelo_hf_emb)
Pressionamos "Shift + Enter" para criar as configurações e importar esses modelos para o nosso ambiente.
Com isso, todas as configurações foram feitas! Com tudo configurado, podemos estruturar nosso banco de dados no Llama Index para que o modelo tenha acesso e faça suas consultas. Isso será abordado no próximo vídeo!
O curso LlamaIndex: criando um assistente virtual para consulta de banco de dados possui 156 minutos de vídeos, em um total de 48 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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.