Construindo um Sistema RAG com GROQ e LlamaIndex
Construindo um Sistema RAG com GROQ e LlamaIndex
RAG (Retrieval-Augmented Generation) em LLMs (Large Language Models) combina a capacidade de recuperação de informações de fontes externas com a geração de texto, permitindo que o modelo acesse dados atualizados e específicos sem precisar armazená-los em seus pesos. Isso melhora a precisão das respostas e oferece flexibilidade ao integrar bases de conhecimento dinâmicas ou personalizadas. Além disso, o RAG pode lidar melhor com contextos amplos, garantindo respostas mais relevantes e contextualizadas, ao mesmo tempo em que diminui custos de re-treinamento do modelo.
Neste tutorial, vamos aprender como construir um sistema RAG usando as tecnologias GROQ, LlamaIndex, e OpenAI Embeddings.
GROQ oferece vantagens significativas no processamento de modelos de IA, especialmente por sua arquitetura baseada em aceleração de hardware específico. Ele se destaca por executar cálculos de forma paralela e eficiente, reduzindo a latência e aumentando o desempenho, mesmo em tarefas computacionalmente intensivas. Além disso, sua escalabilidade permite otimizar operações em larga escala com menor consumo de energia. Isso o torna ideal para aplicações que demandam alto desempenho e baixo tempo de resposta, como sistemas em tempo real e inferências complexas.
LlamaIndex é um framework que facilita a integração de dados externos em modelos de linguagem, como LLMs. É altamente personalizável e suporta múltiplas fontes de dados (como arquivos locais, APIs e bancos de dados), sendo adequado para construir sistemas RAG e enriquecer modelos de linguagem com bases de conhecimento dinâmicas.
É preciso transformar o texto que será analisado em representações vetoriais de alta dimensão, capturando o significado semântico de palavras, frases ou documentos. Para isso utilizaremos o OpenAI Embedding.
O modelo de linguagem utilizado será o Llama 3-70B-8192, um modelo avançado com 70 bilhões de parâmetros e suporte a janelas contextuais de até 8192 tokens.
Pré-requisitos
Antes de começar, certifique-se de ter o seguinte:
Python 3.8 ou superior instalado.
Chave de API da OpenAI, caso ainda não tenha você pode adquirir em openai.com.
Chave de API da Groq, caso ainda não tenha você pode adquirir em console.groq.com/keys.
Passo 1 - Instalação das bibliotecas necessárias
Execute os comandos abaixo para instalar as bibliotecas necessárias:
pip install groq
pip install llama-index-llms-groq
pip install llama-index
pip install openai
Passo 2 - Baixar o documento em PDF
No nosso exemplo usaremos um documento de análise regional econômica realizada pelo Banco do Brasil. O documento pode ser baixado com o seguinte comando:
!wget https://raw.githubusercontent.com/aeledois/corpora/main/ResenhaRegional.pdf
Passo 3- Importar os módulos que serão utilizados
import os
import time
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import VectorStoreIndex
from llama_index.core import SimpleDirectoryReader
from llama_index.llms.groq import Groq
O módulo os será usado para armazenar em uma variável de ambiente, o valor da chave para acessar a API da OpenAI. Os outros módulos iremos explicar no momento da utilização.
Passo 4- Adicionar as chaves
No trecho de código abaixo são atribuídas as chaves da OpenAI e do Groq ao ambiente por meio do módulo os. Não é recomendado que você coloque as chaves no seu código fonte, mas para o nosso exemplo isso não é um problema.
os.environ['GROQ_API_KEY'] = "SUA GROQ_API_KEY"
os.environ['OPENAI_API_KEY'] = 'SUA OPENAI_API_KEY'
Passo 5- Ler o documento e transformar em texto
No trecho de código abaixo é realizada a leitura de um arquivo PDF e a extração do texto contido em cada uma de suas páginas.
documents = SimpleDirectoryReader(input_files=["ResenhaRegional.pdf"]).load_data()
Passo 5 - Particionar o texto
O próximo passo é particionar o texto antes de submetê-lo à vetorização, ou seja, antes de transformar as palavras em vetores. O particionamento é importante, uma vez que modelos de linguagem, especialmente aqueles baseados em Transformers como BERT, GPT, etc., têm um limite no número de tokens (palavras ou caracteres) que podem processar de uma vez. Textos longos que excedem esse limite precisam ser divididos em partes menores para serem processados corretamente. Além disso, dividir o texto em partes menores permite que cada segmento mantenha um contexto coerente. Se um texto for muito longo e não for dividido, o modelo pode perder o contexto ou ignorar partes importantes do texto. Dividindo-o em segmentos, garantimos que cada parte seja significativa e compreensível por si só.
No nosso exemplo usaremos o SentenceSplitter do LLamaIndex. Ele foi projetado para dividir o texto em pedaços menores, garantindo que os pedaços sejam coerentes e significativos.
splitter = SentenceSplitter(chunk_size=1024, chunk_overlap=128)
nodes = splitter.get_nodes_from_documents(documents)
No exemplo usamos um chunk_size de 1024, definindo o tamanho máximo de cada segmento, e chunk_overlap de 128, definindo o número de caracteres que se sobrepõem entre segmentos consecutivos. A sobreposição ajuda a manter o contexto entre os segmentos.
Passo 6 - Configurar os Embeddings e definir o modelo LLM
Os embeddings são usados para indexar documentos e recuperar informações relevantes. Aqui está como configurá-los:
Settings.llm = Groq(model="llama3-70b-8192")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-ada-002")
vector_index = VectorStoreIndex(nodes)
vector_query_engine = vector_index.as_query_engine()
O modelo de linguagem Llama3-70B-8192 é configurado para tarefas de compreensão e geração de texto, enquanto o modelo text-embedding-ada-002 da OpenAI é utilizado para converter textos em vetores numéricos (embeddings). Esses vetores são armazenados em um índice vetorial (VectorStoreIndex), que facilita buscas rápidas baseadas em similaridade. O índice é então transformado em um motor de consulta (query_engine), permitindo realizar buscas por documentos ou informações semanticamente semelhantes à consulta fornecida.
Passo 7 - Consultando o documento
Neste último passo realizamos a consulta. No caso vamos perguntar "Qual região do Brasil possui a melhor projeção de crescimento PIB em 2024?". Lembre-se de perguntar com educação.
response = vector_query_engine.query(
"Por favor, qual região do Brasil possui a melhor projeção de crescimento PIB em 2024?")
print(response.response)
Segue abaixo a saída emitida pela consulta:
Norte
Conclusão
Você acabou de criar um sistema RAG usando GROQ, LlamaIndex, e OpenAI Embedding. Esse pipeline pode ser aplicado a uma ampla gama de problemas, como suporte ao cliente, análise de documentos e muito mais. Chegamos ao final deste Post. Se esse post foi útil para você, por favor, considere deixar um comentário.
Comentários
Postar um comentário