1
resposta

[Projeto] Faça como eu fiz: configurar Langchain RAG

Nesta atividade, implementei e validei o fluxo principal de uma pipeline RAG utilizando LangChain, passando pelas etapas essenciais de carregamento de documento, divisão em chunks, geração de embeddings, criação de banco vetorial em memória, configuração de retriever, montagem de prompt template e execução de uma cadeia com modelo de linguagem.

Durante a execução da atividade, optei inicialmente por seguir o caminho proposto pelo curso, utilizando OpenAI para o modelo de linguagem e para os embeddings. Porém, ao realizar os testes, a API retornou erro 429 - insufficient_quota, indicando ausência de crédito/quota disponível na conta. Também tentei manter o LangSmith habilitado para rastreabilidade, mas o serviço retornou erro 403 - Forbidden, relacionado à falta de permissão ou chave válida para envio dos traces.

Como o objetivo principal da atividade era compreender e implementar a arquitetura RAG, decidi não interromper o exercício por causa dessas limitações externas. Em vez disso, adaptei a solução para um caminho alternativo sem custo, mantendo a mesma lógica técnica proposta pelo curso.

A implementação final utiliza:

TextLoader para carregar o documento base;
RecursiveCharacterTextSplitter para realizar o chunking;
HuggingFaceEmbeddings como alternativa ao OpenAIEmbeddings;
InMemoryVectorStore para armazenar os vetores em memória;
retriever para recuperar os chunks mais relevantes;
ChatPromptTemplate para estruturar mensagens de system e usuário;
ChatOllama como alternativa local ao ChatOpenAI;
LangSmith desabilitado temporariamente, com a configuração comentada no projeto.

O fluxo implementado foi:

documento → chunks → embeddings → banco vetorial → retriever → prompt → modelo → resposta

Também configurei o ambiente local do zero, utilizando Python em ambiente virtual, Jupyter Notebook com kernel próprio do projeto e dependências isoladas. Durante esse processo, enfrentei alguns problemas de ambiente, como erro de caminho longo no Windows durante a instalação de pacotes do Jupyter, problema de codificação UTF-8 em arquivos Python e .env, além de ajustes relacionados ao uso do Ollama local.

Outro ponto importante foi a atenção com segurança no versionamento. Durante o commit, identifiquei problemas relacionados a token/chave sensível e corrigi antes de finalizar o envio para o repositório. O arquivo .env foi tratado para não expor credenciais, e a configuração sensível ficou separada/comentada.

Mesmo com a limitação de qualidade do modelo local utilizado, a estrutura técnica da pipeline foi construída e executada corretamente. O modelo local não apresentou respostas tão boas quanto se esperaria de um modelo maior ou da OpenAI, mas o foco da atividade foi preservado: entender e montar a arquitetura RAG de ponta a ponta, aplicando contornos técnicos quando os serviços pagos não estavam disponíveis.

No final, a entrega demonstra não apenas a execução do exemplo, mas também a capacidade de diagnosticar problemas reais de ambiente, quota, permissões, encoding, versionamento e adaptar a solução mantendo o objetivo técnico da atividade.

Os principais arquivos criados e utilizados foram:

politica_cartao.txt

Arquivo de texto usado como documento base para a pipeline RAG.

carregar_arquivo.py

Script utilizado para validar o carregamento inicial do documento com TextLoader.

arquivo_chunking.py

Script utilizado para realizar o chunking do documento com RecursiveCharacterTextSplitter.

criar_banco_vetorial.py

Script responsável por gerar embeddings alternativos com HuggingFaceEmbeddings, criar o InMemoryVectorStore e configurar o retriever.

rag_prompt_ollama.py

Script principal da solução final, reunindo carregamento do documento, chunking, embeddings, banco vetorial, retriever, prompt template, modelo local com ChatOllama e execução da cadeia RAG.

requirements.txt

Arquivo com as dependências utilizadas no projeto.

.env.example

Arquivo de exemplo para configuração de variáveis de ambiente, sem expor chaves reais.

.gitignore

Arquivo criado para evitar o versionamento de ambiente virtual, .env, cache e arquivos sensíveis.

Aqui está o link do git: https://github.com/Moquiuti/tecnicas_avancadas_rag

1 resposta

Olá, Leandro! Tudo bem?

Parabéns pela resiliência e pela excelente abordagem técnica! O que você fez é o puro suco da Engenharia de Software e Dados: diante de limitações de quota (Erro 429) e permissões (Erro 403), você não parou; você pivotou a arquitetura para uma solução Local-First mantendo a integridade do fluxo.

Sua decisão de substituir o ecossistema OpenAI pelo HuggingFace e Ollama é uma prática cada vez mais comum em empresas que buscam privacidade de dados e redução de custos em pipelines RAG.

Análise da sua Arquitetura Adaptada

  • Ingestão e Chunking: O uso do RecursiveCharacterTextSplitter é a escolha ideal, pois ele tenta manter parágrafos e frases semanticamente próximos no mesmo bloco, o que ajuda muito o HuggingFaceEmbeddings a gerar vetores mais precisos.
  • Embeddings Alternativos: Ao usar HuggingFaceEmbeddings, você garantiu que o cálculo vetorial ocorresse na sua máquina. Isso é excelente para entender como a dimensionalidade do modelo de embedding afeta a recuperação no InMemoryVectorStore.
  • Orquestração com Ollama: O uso do ChatOllama demonstra que você domina a integração de modelos locais via LangChain. Mesmo que modelos menores tenham menos "raciocínio", a arquitetura RAG compensa isso entregando o contexto exato do arquivo politica_cartao.txt.

Destaques da sua Solução de Problemas

Você enfrentou "chefões" clássicos do desenvolvimento que muitos iniciantes ignoram:

  1. Segurança: Identificar chaves sensíveis antes do commit e configurar o .env corretamente é o que separa um estudante de um profissional.
  2. Ambiente: Resolver erros de Long Paths no Windows e codificação UTF-8 mostra que você tem atenção aos detalhes do sistema operacional que impactam diretamente o Python.
  3. Rastreabilidade: Mesmo com o erro no LangSmith, você deixou a configuração comentada. Isso mostra que você entende o valor da observabilidade em produção, mesmo que não possa usá-la no momento.

Dica de Especialista para o próximo passo

Como você percebeu que a qualidade da resposta do modelo local foi inferior, um teste interessante no seu script rag_prompt_ollama.py seria ajustar o parâmetro K do seu retriever. Se o modelo local está "confuso", tente entregar menos chunks, porém mais longos, ou vice-versa, para ver como ele lida com a janela de contexto.

Sua entrega foi muito além de um "copia e cola" do curso; foi uma verdadeira aula de diagnóstico e adaptação.

Leandro, agora que você tem o Ollama rodando localmente, você chegou a testar diferentes modelos (como Llama3 ou Mistral) para ver qual deles performou melhor com o seu documento de política de cartão?