Adsterra

Construindo um Sistema RAG com GROQ e LlamaIndex

Construindo um Sistema RAG com GROQ e LlamaIndex

Sistema RAG com GROQ e LlamaIndex


AL2

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

Post Populares