𝗘𝘂 𝗖𝗼𝗻𝘀𝘁𝗿𝘂í 𝗥𝗔𝗚 𝗱𝗼 𝗭𝗲𝗿𝗼 𝗲𝗺 𝗣𝘆𝘁𝗵𝗼𝗻 𝗽𝗮𝗿𝗮 𝗘𝗻𝘁𝗲𝗻𝗱ê-𝗹𝗼

Usei LangChain em produção por seis meses. Eu não conseguia explicar como funcionava. Não sabia por que escolhia métricas específicas ou como o texto se tornava vetores. A biblioteca escondia a lógica.

Para resolver isso, deletei o framework. Escrevi um pipeline de RAG do zero usando 500 linhas de Python puro.

Aqui está o que aprendi ao construir a stack manualmente.

O Problema com as Caixas Pretas Quando você usa bibliotecas de alto nível, você perde o controle. Vi modelos alucinarem fatos ou fornecerem citações erradas. Eu não conseguia dizer se o erro estava no chunker, no modelo de embedding ou no prompt.

Quando você constrói por conta própria, cada camada é inspecionável. Você pode imprimir os chunks exatos enviados para o LLM. Você pode ver exatamente onde uma frase é quebrada.

As Cinco Camadas do RAG RAG não é um único algoritmo. São cinco processos diferentes empilhados:

  • Chunking: Decidir como dividir o texto.
  • Embedding: Transformar texto em matemática.
  • Retrieval: Encontrar as partes certas.
  • Prompt Construction: Dizer ao modelo como se comportar.
  • Generation: Obter a resposta final.

Lições da Construção

  1. Chunking é a etapa mais importante A maioria dos tutoriais pula isso. Se você não usar overlap, perderá o contexto nos limites. Usei uma janela deslizante (sliding window) com overlap em nível de caractere. Isso garante que o modelo veja a conexão entre dois chunks.

  2. Métricas de distância importam Passei horas depurando resultados de busca ruins. O problema não era o dado. Era a métrica. O ChromaDB usa a distância L2 por padrão. Para busca semântica, você precisa de Cosine similarity. Uma linha de código mudou tudo.

  3. Prompts precisam de restrições Um LLM é um completador, não um oráculo. Se você fizer uma pergunta vaga, ele inventará uma resposta. Aprendi a usar um template de recusa estrito. Eu disse ao modelo: "Se o contexto não contiver a resposta, diga que não sabe". Isso reduziu as alucinações de 40% para 5%.

  4. Processe suas requisições em lotes Enviar uma requisição HTTP por chunk é lento. Enviá-las em lotes (batches) é muito mais rápido. Isso permite que o modelo local faça o pipeline do trabalho.

  5. Teste de baixo para cima Não escreva testes no final. Teste seu chunker primeiro. Depois teste seu embedder. Depois teste seu store. Se você testar por último, testará os bugs em vez da lógica.

Se você sente que não entende verdadeiramente sua stack de IA, construa-a você mesmo. O código não é o objetivo. O raciocínio é o objetivo.

Source: https://dev.to/avinash_zala_1c6f5e7c4af9/i-built-rag-from-scratch-in-python-to-understand-it-heres-what-i-learned-33kf

Optional learning community: https://t.me/GyaanSetuAi