1
resposta

[Projeto] 07 Faça como eu fiz: RAG Avançado

IMPLEMENTAÇÃO COMPLETA
1️ Instalação de dependências
pip install langchain
pip install langchain-openai
pip install langchain-community
pip install tiktoken
pip install faiss-cpu
pip install pinecone-client
pip install pypdf
pip install python-dotenv
pip install beautifulsoup4

2️ Carregamento de Documentos
Carregador de TXT
from langchain_community.document_loaders import TextLoader

txt_loader = TextLoader("manual_operacional.txt")
txt_docs = txt_loader.load()

Carregador de PDF com Metadados
from langchain_community.document_loaders import PyPDFLoader

pdf_loader = PyPDFLoader("contrato_logistica.pdf")
pdf_docs = pdf_loader.load()

print(pdf_docs[0].metadata)

Metadados úteis:

página

fonte

caminho_do_arquivo

Carregador Web
from langchain_community.document_loaders import WebBaseLoader

web_loader = WebBaseLoader("https://hermexlog.com/politicas")
web_docs = web_loader.load()

Carregador de diretórios
from langchain_community.document_loaders import DirectoryLoader

dir_loader = DirectoryLoader("./documentos", glob="**/*.txt")
dir_docs = dir_loader.load()

Carregador de Mesclagem
all_docs = txt_docs + pdf_docs + web_docs + dir_docs

Simples. E eficiente.

3️ Fragmentação Simples (Divisor de Caracteres)
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)

chunks = splitter.split_documents(all_docs)

4️ Chunking por Tokens (TikToken)
from langchain.text_splitter import TokenTextSplitter

token_splitter = TokenTextSplitter(
chunk_size=500,
chunk_overlap=100
)

token_chunks = token_splitter.split_documents(all_docs)

Melhor controle de custo de tokens.

5️ Chunking Semântico (OpenAI)
from langchain_openai import OpenAIEmbeddings
from langchain_experimental.text_splitter import SemanticChunker

embeddings = OpenAIEmbeddings()

semantic_splitter = SemanticChunker(embeddings)
semantic_chunks = semantic_splitter.split_documents(all_docs)

Aqui você está jogando no modo hard.
Chunks são criados com base em significado, não tamanho fixo.

6️ Armazenamento vetorial na memória
from langchain.vectorstores import FAISS

vector_store = FAISS.from_documents(semantic_chunks, embeddings)

7️ Busca com Score de Similaridade
query = "Qual o prazo de entrega para transporte rodoviário?"

results = vector_store.similarity_search_with_score(query, k=3)

for doc, score in results:
print(score)
print(doc.page_content)

Pontuação menor → maior similaridade.

8️ Filtros por Metadados
results = vector_store.similarity_search(
query,
k=3,
filter={"source": "contrato_logistica.pdf"}
)

Agora você tem controle fino. Isso é produção.

9️ Pinha (Nuvem)
import pinecone
from langchain.vectorstores import Pinecone

pinecone.init(
api_key="SUA_API_KEY",
environment="us-east-1"
)

index_name = "hermex-log-index"

vector_store = Pinecone.from_documents(
semantic_chunks,
embeddings,
index_name=index_name
)

1 resposta

Oi, Moacir! Como vai?

Agradeço por compartilhar suas reflexões e aprendizados com a comunidade Alura.

Gostei da sua organização da implementação completa, estruturando desde os carregadores até o uso de FAISS e Pinecone. Você demonstrou domínio do fluxo de um RAG avançado, conectando ingestão, fragmentação, embeddings e busca com score e filtros por metadados. Importante como você destacou a diferença entre chunk por caracteres, tokens e abordagem semântica, mostrando entendimento de custo e qualidade de recuperação.

Continue aprofundando nesse nível de detalhamento, pois isso já se aproxima bastante de um cenário real de produção. ✨

Conte com o apoio do Fórum na sua jornada. Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!