{"id":1105,"date":"2026-06-15T18:14:22","date_gmt":"2026-06-15T18:14:22","guid":{"rendered":"https:\/\/convly.ai\/how-to-build-a-rag-pipeline-2026\/"},"modified":"2026-06-15T18:17:48","modified_gmt":"2026-06-15T18:17:48","slug":"how-to-build-a-rag-pipeline-2026","status":"publish","type":"post","link":"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/","title":{"rendered":"Como Construir um Pipeline RAG em 2026 (Passo a Passo)"},"content":{"rendered":"<p>A gera\u00e7\u00e3o aumentada por recupera\u00e7\u00e3o deixou de ser uma curiosidade acad\u00eamica h\u00e1 anos. Em 2026, \u00e9 a abordagem padr\u00e3o para colocar um LLM \u00e0 frente de seus pr\u00f3prios documentos sem precisar pagar por ajuste fino de um modelo ou correr o risco de ele inventar respostas com confian\u00e7a. O padr\u00e3o \u00e9 simples de descrever, mas repleto de armadilhas na implementa\u00e7\u00e3o: encontrar o texto certo, entreg\u00e1-lo ao modelo e deixar que o modelo escreva a resposta.<\/p>\n<p>Este \u00e9 um guia pr\u00e1tico de constru\u00e7\u00e3o, n\u00e3o uma revis\u00e3o bibliogr\u00e1fica. Ao final, voc\u00ea saber\u00e1 exatamente quais componentes um pipeline RAG funcional requer em 2026, quais ferramentas espec\u00edficas e vers\u00f5es de modelos usar, al\u00e9m de um esbo\u00e7o m\u00ednimo de c\u00f3digo que pode ser executado localmente ou contra uma API. Verificamos todos os n\u00fameros de vers\u00e3o, pre\u00e7os e benchmarks listados abaixo em fontes atualizadas \u2014 pois o pior bug em um pipeline RAG \u00e9 aquele copiado de um post de blog escrito para bibliotecas do ano anterior.<\/p>\n<div class=\"convly-tldr\">\n<h3>Principais conclus\u00f5es<\/h3>\n<ul>\n<li><strong>Seis etapas, nesta ordem:<\/strong> dividir em partes, gerar embeddings, armazenar, recuperar, reordenar e gerar. Pular o reordenador resulta em desempenho visivelmente pior nos resultados principais; pular a avalia\u00e7\u00e3o significa que voc\u00ea nunca saber\u00e1 se funcionou.<\/li>\n<li><strong>Divis\u00e3o em partes simples vence.<\/strong> Divis\u00e3o recursiva com cerca de 512 tokens e sobreposi\u00e7\u00e3o de 10\u201320% superou t\u00e9cnicas sofisticadas de divis\u00e3o sem\u00e2ntica (69% vs. 54% de acur\u00e1cia) em benchmark de 2026. Comece por a\u00ed.<\/li>\n<li><strong>Embeddings:<\/strong> nomic-embed-text (768 dimens\u00f5es, gratuito, local) para prot\u00f3tipos; OpenAI text-embedding-3-large (US$ 0,13 por 1 milh\u00e3o de tokens, 3072 dimens\u00f5es) ou Voyage-3.5 para alta qualidade em larga escala.<\/li>\n<li><strong>Banco de dados vetorial:<\/strong> pgvector, se voc\u00ea j\u00e1 usa Postgres; Qdrant v1.18 (licen\u00e7a Apache 2.0, em Rust), quando precisa de busca filtrada r\u00e1pida; Chroma, para trabalhos locais r\u00e1pidos.<\/li>\n<li><strong>Frameworks:<\/strong> LangChain 1.x (com runtime LangGraph) para fluxos baseados em agentes; LlamaIndex 0.14.x para aplica\u00e7\u00f5es com foco em recupera\u00e7\u00e3o \u2014 e \u00e9 poss\u00edvel executar um pipeline \u00fatil com cerca de 40 linhas de c\u00f3digo, sem depender de nenhum desses frameworks.<\/li>\n<li><strong>Adicione um reordenador.<\/strong> Cohere Rerank 3.5 (US$ 2 por 1.000 buscas) ou o modelo de c\u00f3digo aberto BGE-reranker-v2-m3 (gratuito, com lat\u00eancia de ~50\u2013100 ms em GPU) melhora significativamente a relev\u00e2ncia dos resultados top-k de forma econ\u00f4mica.<\/li>\n<\/ul>\n<\/div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-flat ez-toc-counter ez-toc-container-direction\">\n<label for=\"ez-toc-cssicon-toggle-item-6a38a000a4932\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Alternar<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #000000;color:#000000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #000000;color:#000000\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a38a000a4932\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#How_a_RAG_pipeline_actually_works\" >Como realmente funciona um pipeline RAG<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_1_Chunk_your_documents\" >Etapa 1: Divida seus documentos em partes<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_2_Choose_an_embedding_model\" >Etapa 2: Escolha um modelo de embedding<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_3_Store_vectors_in_a_vector_database\" >Etapa 3: Armazene os vetores em um banco de dados vetorial<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_4_Retrieve_and_rerank\" >Etapa 4: Recupere e reordene<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_5_Augment_the_prompt_and_generate\" >Etapa 5: Enrique\u00e7a o prompt e gere a resposta<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_6_A_minimal_code_sketch\" >Etapa 6: Um esbo\u00e7o m\u00ednimo de c\u00f3digo<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Step_7_Evaluate_%E2%80%94_dont_skip_this\" >Etapa 7: Avalie \u2014 n\u00e3o pule esta etapa<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#FAQ\" >Perguntas frequentes<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Bottom_line\" >Conclus\u00e3o<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/convly.ai\/pt\/how-to-build-a-rag-pipeline-2026\/#Related_articles\" >Artigos relacionados<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"How_a_RAG_pipeline_actually_works\"><\/span>Como realmente funciona um pipeline RAG<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Um sistema RAG possui duas fases. <strong>Indexa\u00e7\u00e3o<\/strong> ocorre uma \u00fanica vez (ou sempre que seus documentos forem alterados): voc\u00ea divide os arquivos-fonte em partes, converte cada parte em um vetor usando um modelo de embedding e armazena esses vetores em um banco de dados. <strong>Consulta<\/strong> ocorre a cada requisi\u00e7\u00e3o: voc\u00ea transforma a pergunta do usu\u00e1rio em um embedding, encontra as partes mais similares, opcionalmente as reordena, insere as melhores delas no prompt e chama um LLM.<\/p>\n<p>Essa \u00e9 toda a ideia. A engenharia est\u00e1 nos detalhes \u2014 tamanho das partes, qual modelo de embedding escolher, quantos resultados recuperar, se deve ou n\u00e3o reordenar e como medir se qualquer parte disso realmente funciona. Se voc\u00ea deseja entender os fundamentos conceituais antes de construir, nosso <a href=\"\/pt\/rag-retrieval-augmented-generation-explained\/\">explicador sobre RAG<\/a> aborda a teoria; este artigo trata da implementa\u00e7\u00e3o pr\u00e1tica. E, se voc\u00ea ainda est\u00e1 decidindo entre RAG e personaliza\u00e7\u00e3o direta do modelo, a <a href=\"\/pt\/fine-tuning-vs-rag\/\">compara\u00e7\u00e3o entre ajuste fino e RAG<\/a> \u00e9 o ponto ideal para come\u00e7ar \u2014 para a maioria das equipes que alimentam um LLM com dados privados e din\u00e2micos, RAG \u00e9 a solu\u00e7\u00e3o mais econ\u00f4mica e sustent\u00e1vel.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_1_Chunk_your_documents\"><\/span>Etapa 1: Divida seus documentos em partes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Modelos de embedding possuem um limite de contexto e, mais importante, perdem precis\u00e3o em trechos longos. Por isso, dividimos os documentos em partes. O consenso de 2026, embasado em benchmarks e n\u00e3o em impress\u00f5es subjetivas, \u00e9 despretensioso: use um divisor recursivo por caracteres com alvo aproximado de <strong>512 tokens com sobreposi\u00e7\u00e3o de 10\u201320%<\/strong> (50\u2013100 tokens).<\/p>\n<p>Uma avalia\u00e7\u00e3o realizada em fevereiro de 2026 com 50 documentos reais revelou que a divis\u00e3o recursiva ing\u00eanua em blocos de 512 tokens obteve 69% de precis\u00e3o na recupera\u00e7\u00e3o, enquanto a fragmenta\u00e7\u00e3o sem\u00e2ntica \u2014 que tenta dividir nos limites de significado \u2014 alcan\u00e7ou apenas 54%. O motivo \u00e9 simples: a fragmenta\u00e7\u00e3o sem\u00e2ntica gerou trechos com m\u00e9dia de 43 tokens, muito pequenos para fornecer ao modelo contexto suficiente para responder. Enquanto isso, um estudo distinto realizado em janeiro de 2026, utilizando recupera\u00e7\u00e3o SPLADE, constatou que a sobreposi\u00e7\u00e3o entre trechos acrescentava custo de indexa\u00e7\u00e3o sem trazer benef\u00edcio mensur\u00e1vel no conjunto de dados analisado. A conclus\u00e3o honesta \u00e9: comece com trechos recursivos de tamanho fixo e s\u00f3 recorra \u00e0 fragmenta\u00e7\u00e3o sem\u00e2ntica ou por p\u00e1gina se suas m\u00e9tricas de avalia\u00e7\u00e3o comprovarem, em seus documentos espec\u00edficos, que essa abordagem \u00e9 realmente necess\u00e1ria.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_2_Choose_an_embedding_model\"><\/span>Etapa 2: Escolha um modelo de embedding<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Essa \u00e9 a decis\u00e3o mais impactante do fluxo de trabalho, e a diferen\u00e7a entre as op\u00e7\u00f5es \u00e9 real. Abaixo est\u00e3o as alternativas dignas de considera\u00e7\u00e3o em meados de 2026, com dados verificados.<\/p>\n<table class=\"convly-vs\">\n<thead>\n<tr>\n<th>Modelo<\/th>\n<th>Dimens\u00f5es<\/th>\n<th>Contexto<\/th>\n<th>Pre\u00e7o por 1 milh\u00e3o de tokens<\/th>\n<th>Observa\u00e7\u00f5es<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>nomic-embed-text v1.5<\/td>\n<td>768 (MRL 64\u2013768)<\/td>\n<td>8,192<\/td>\n<td>Gratuito (local)<\/td>\n<td>274 MB; a escolha padr\u00e3o local<\/td>\n<\/tr>\n<tr>\n<td>mxbai-embed-large<\/td>\n<td>1024<\/td>\n<td>512<\/td>\n<td>Gratuito (local)<\/td>\n<td>670 MB; qualidade superior, contexto curto<\/td>\n<\/tr>\n<tr>\n<td>BGE-M3<\/td>\n<td>1024 + esparsa<\/td>\n<td>8,192<\/td>\n<td>Gratuito (local)<\/td>\n<td>Licen\u00e7a MIT, suporte a mais de 100 idiomas<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-small<\/td>\n<td>1536<\/td>\n<td>8,191<\/td>\n<td>$0.02<\/td>\n<td>Refer\u00eancia econ\u00f4mica via API<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-large<\/td>\n<td>3072<\/td>\n<td>8,191<\/td>\n<td>$0.13<\/td>\n<td>US$ 0,065 via Batch API<\/td>\n<\/tr>\n<tr>\n<td>Voyage-3.5<\/td>\n<td>2048 (MRL 256\u20132048)<\/td>\n<td>32,000<\/td>\n<td>$0.06<\/td>\n<td>Supera o modelo 3-large em cerca de 8% nas tarefas de recupera\u00e7\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>Gemini Embedding<\/td>\n<td>3072<\/td>\n<td>\u2014<\/td>\n<td>API<\/td>\n<td>L\u00edder no MTEB v2 (~68,3)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para um prot\u00f3tipo, comece localmente com <strong>nomic-embed-text<\/strong> \u2014 \u00e9 r\u00e1pido, gratuito, roda facilmente em um laptop com 16 GB de RAM e, segundo relatos, supera o antigo modelo da OpenAI <code>text-embedding-ada-002<\/code>. Para produ\u00e7\u00e3o, o campo de modelos de c\u00f3digo aberto realmente alcan\u00e7ou o patamar comercial: o BGE-M3 \u00e9 o modelo robusto sob licen\u00e7a MIT adotado como padr\u00e3o pela maioria das pilhas auto-hospedadas, enquanto o Voyage-3.5 e o Gemini Embedding lideram os benchmarks de APIs gerenciadas. H\u00e1 uma \u00fanica regra essencial: <strong>qualquer modelo usado para incorporar seus documentos deve tamb\u00e9m ser usado para incorporar suas consultas.<\/strong> Misturar modelos de forma silenciosa destr\u00f3i completamente a efic\u00e1cia da recupera\u00e7\u00e3o.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_3_Store_vectors_in_a_vector_database\"><\/span>Etapa 3: Armazene os vetores em um banco de dados vetorial<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Uma vez obtidas as incorpora\u00e7\u00f5es, elas precisam ser armazenadas em algum lugar capaz de suportar buscas r\u00e1pidas por vizinhos mais pr\u00f3ximos. Em 2026, h\u00e1 tr\u00eas n\u00edveis razo\u00e1veis para isso.<\/p>\n<div class=\"convly-procons\">\n<div class=\"pros\">\n<h4>Opte por estes<\/h4>\n<ul>\n<li><strong>pgvector 0.8<\/strong> se voc\u00ea j\u00e1 utiliza Postgres. Com um \u00edndice HNSW, oferece lat\u00eancia p95 de um d\u00edgito a dois d\u00edgitos baixos (milissegundos) para 1 milh\u00e3o de vetores. A vers\u00e3o 0.8 introduziu varreduras iterativas, garantindo que consultas filtradas retornem um n\u00famero suficiente de resultados. Nenhuma nova infraestrutura necess\u00e1ria.<\/li>\n<li><strong>Qdrant v1.18<\/strong> (licen\u00e7a Apache 2.0, escrito em Rust), quando filtros s\u00e3o cr\u00edticos. Seu algoritmo ACORN (introduzido na vers\u00e3o 1.16) resolve o cl\u00e1ssico problema de 'filtros prejudicam minha taxa de recupera\u00e7\u00e3o' ao ampliar dinamicamente a busca HNSW sob filtros restritivos, sendo uma das melhores op\u00e7\u00f5es dispon\u00edveis para buscas filtradas. Pode ser auto-hospedado com um \u00fanico comando Docker.<\/li>\n<li><strong>Chroma<\/strong> para prototipagem local. Melhor experi\u00eancia para desenvolvedores, modo embutido, zero opera\u00e7\u00f5es \u2014 ideal at\u00e9 voc\u00ea ultrapassar suas necessidades iniciais.<\/li>\n<\/ul>\n<\/div>\n<div class=\"cons\">\n<h4>Aten\u00e7\u00e3o para<\/h4>\n<ul>\n<li>Servi\u00e7os gerenciados cobram conforme uso e podem surpreender: com 100 milh\u00f5es de vetores, o Pinecone pode custar mais de US$ 5.000\/m\u00eas, enquanto uma inst\u00e2ncia auto-hospedada de Qdrant ou pgvector em suas pr\u00f3prias m\u00e1quinas virtuais costuma ser bem mais econ\u00f4mica. Fa\u00e7a uma auditoria antes de escalar.<\/li>\n<li>A constru\u00e7\u00e3o de \u00edndices HNSW \u00e9 lenta em larga escala, e o \u00edndice pode atingir ~8 GB para 1 milh\u00e3o de vetores com dimens\u00e3o 1536 (use halfvec para reduzir esse valor aproximadamente pela metade).<\/li>\n<li>O hardware de armazenamento domina o desempenho: a mesma configura\u00e7\u00e3o de pgvector atingiu cerca de 410 QPS em SSDs em nuvem, contra 2.150 QPS em unidades NVMe.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Uma an\u00e1lise mais detalhada est\u00e1 dispon\u00edvel em nosso <a href=\"\/pt\/what-is-a-vector-database-2026\/\">guia de bancos de dados vetoriais<\/a>, mas, para a maioria das equipes, a \u00e1rvore de decis\u00f5es \u00e9 simples: j\u00e1 usa Postgres \u2192 pgvector; precisa de filtragem intensa ou bilh\u00f5es de vetores \u2192 Qdrant ou Milvus; est\u00e1 apenas experimentando \u2192 Chroma.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_4_Retrieve_and_rerank\"><\/span>Etapa 4: Recupere e reordene<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A recupera\u00e7\u00e3o propriamente dita consiste em uma \u00fanica chamada: incorporar a consulta, solicitar ao banco de dados os k trechos mais pr\u00f3ximos (k entre 20 e 50 \u00e9 t\u00edpico). Contudo, a similaridade vetorial bruta \u00e9 uma ferramenta grosseira. Um <strong>reordenador (reranker)<\/strong> \u2014 um modelo cross-encoder que avalia individualmente cada par consulta-documento \u2014 reorganiza esses candidatos e destaca os realmente relevantes antes que cheguem ao modelo gerador.<\/p>\n<p>O padr\u00e3o consolidado \u00e9: recuperar os 50 melhores trechos com seu bi-encoder, aplicar o reordenador e manter os 5\u201310 melhores. O Cohere Rerank 3.5 custa US$ 0,002 por pesquisa (US$ 2 por 1.000 pesquisas) e tipicamente adiciona lat\u00eancia na ordem de 100\u2013300 ms. Se voc\u00ea possui uma GPU e deseja custo zero por consulta, o modelo de c\u00f3digo aberto <strong>BGE-reranker-v2-m3<\/strong> executa em cerca de 50\u2013100 ms e suporta conte\u00fado multil\u00edngue. A reordena\u00e7\u00e3o \u00e9 uma das melhorias com maior impacto e menor esfor\u00e7o poss\u00edvel \u2014 a maioria dos fluxos de trabalho que 'recuperam lixo' simplesmente omite esse passo.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_5_Augment_the_prompt_and_generate\"><\/span>Etapa 5: Enrique\u00e7a o prompt e gere a resposta<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Agora monte o prompt: uma breve instru\u00e7\u00e3o de sistema orientando o modelo a responder exclusivamente com base no contexto fornecido, nos trechos reordenados e na pergunta do usu\u00e1rio. Em seguida, invoque seu LLM.<\/p>\n<p>Quanto ao modelo gerador, voc\u00ea pode optar por execu\u00e7\u00e3o local ou via API. Localmente, atrav\u00e9s de <a href=\"\/pt\/what-is-ollama-complete-guide-2026\/\">Ollama<\/a>Ollama, o ponto ideal em 2026 \u00e9 um modelo da classe 8B \u2014 como o Qwen3 8B ou o Llama 3.1 8B em quantiza\u00e7\u00e3o Q4_K_M \u2014 que cabe em 8\u201312 GB de VRAM e opera a mais de 40 tokens\/segundo em GPUs modernas. O Qwen3 14B (~8\u20139 GB em quantiza\u00e7\u00e3o Q4) representa um salto significativo, com janela de contexto de 128K tokens, permitindo inserir mais texto recuperado. Para uma op\u00e7\u00e3o hospedada com maior capacidade, modelos de ponta via API funcionam bem; nosso <a href=\"\/pt\/build-ai-chatbot-claude-api\/\">tutorial sobre chatbot com a API Claude<\/a> explica esse caminho integralmente. Um lembrete \u00fatil de profissionais: em RAG, a qualidade da recupera\u00e7\u00e3o normalmente importa mais do que o tamanho do modelo \u2014 trechos bem estruturados, um bom incorporador e um LLM pequeno superam um modelo gigantesco alimentado com contexto ruim.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_6_A_minimal_code_sketch\"><\/span>Etapa 6: Um esbo\u00e7o m\u00ednimo de c\u00f3digo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Abaixo est\u00e1 um fluxo de trabalho completo executado localmente usando LangChain 1.x, Chroma e Ollama. Ele indexa um documento e responde a uma pergunta \u2014 sem necessidade de chaves de API.<\/p>\n<pre><code class=\"language-python\"># pip install langchain langchain-community langchain-chroma langchain-ollama\nfrom langchain_community.document_loaders import TextLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_ollama import OllamaEmbeddings, ChatOllama\nfrom langchain_chroma import Chroma\n\n# 1. Carregar + fragmentar (~512 tokens, ~15% de sobreposi\u00e7\u00e3o; tamanhos em caracteres)\ndocs = TextLoader(&quot;handbook.txt&quot;).load()\nchunks = RecursiveCharacterTextSplitter(\n    chunk_size=2000, chunk_overlap=300\n).split_documents(docs)\n\n# 2. Incorporar + 3. Armazenar\nembeddings = OllamaEmbeddings(model=&quot;nomic-embed-text&quot;)\nstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Recuperar (top 4)\nretriever = store.as_retriever(search_kwargs={&quot;k&quot;: 4})\n\n# 5. Enriquecer + gerar\nllm = ChatOllama(model=&quot;qwen3:8b&quot;)\nquestion = &quot;Qual \u00e9 o prazo para reembolso?&quot;\ncontext = &quot;nn&quot;.join(d.page_content for d in retriever.invoke(question))\nprompt = (f&quot;Responda APENAS com base no contexto fornecido. Caso a informa\u00e7\u00e3o n\u00e3o esteja presente, diga isso.nn&quot;\n          f&quot;Contexto:n{context}nnPergunta: {question}&quot;)\nprint(llm.invoke(prompt).content)\n<\/code><\/pre>\n<p>Esse \u00e9 todo o ciclo. Para adicionar reordena\u00e7\u00e3o, insira um <code>ContextualCompressionRetriever<\/code> com um cross-encoder entre as etapas 4 e 5. Com o LlamaIndex 0.14.x, o mesmo fluxo geralmente exige menos c\u00f3digo gra\u00e7as \u00e0s suas abstra\u00e7\u00f5es de recupera\u00e7\u00e3o projetadas especificamente para esse fim \u2014 \u00e9 a melhor escolha para aplica\u00e7\u00f5es com forte \u00eanfase em recupera\u00e7\u00e3o, enquanto o runtime LangGraph da LangChain se destaca quando voc\u00ea precisa de agentes com estado e m\u00faltiplas etapas. (Escolher uma camada de orquestra\u00e7\u00e3o \u00e9 um t\u00f3pico \u00e0 parte; consulte nossa <a href=\"\/pt\/best-ai-agent-frameworks-2026\/\">compara\u00e7\u00e3o de frameworks para agentes de IA<\/a>.)<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_7_Evaluate_%E2%80%94_dont_skip_this\"><\/span>Etapa 7: Avalie \u2014 n\u00e3o pule esta etapa<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A diferen\u00e7a entre uma demonstra\u00e7\u00e3o e um produto real \u00e9 a medi\u00e7\u00e3o. A ferramenta padr\u00e3o \u00e9 <strong>RAGAS<\/strong>, que avalia fidelidade (a resposta permaneceu fiel ao contexto fornecido?), precis\u00e3o do contexto e recall do contexto, utilizando um modelo de linguagem como juiz. Crie um pequeno conjunto de 20 a 50 pares de perguntas e respostas extra\u00eddos de seus documentos reais e execute-o a cada altera\u00e7\u00e3o.<\/p>\n<p>\u00c9 assim tamb\u00e9m que voc\u00ea toma todas as decis\u00f5es anteriores de forma honesta. Deve migrar para fragmenta\u00e7\u00e3o sem\u00e2ntica? Adicionar um reranker? Aumentar o valor de k de 4 para 8? N\u00e3o chute \u2014 altere apenas uma vari\u00e1vel, execute novamente o RAGAS e mantenha a mudan\u00e7a somente se os resultados num\u00e9ricos melhorarem. Sem esse ciclo, voc\u00ea estar\u00e1 ajustando cegamente.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span>Perguntas frequentes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>Quanto custa executar um pipeline RAG?<\/h3>\n<p>Almost free to prototype. With local Ollama embeddings, Chroma, and a local LLM, your only cost is electricity. At scale, the main bills are the vector DB (a self-hosted Qdrant or pgvector instance on your own VM is dramatically cheaper than managed offerings, which can exceed $5,000\/month at 100M vectors) and, if you use APIs, embeddings (OpenAI text-embedding-3-large is $0.13 per million tokens) plus generation calls.<\/p>\n<h3>Preciso de um banco de dados vetorial ou posso usar um banco de dados convencional?<\/h3>\n<p>Voc\u00ea precisa de busca vetorial, mas n\u00e3o necessariamente de um produto dedicado. O pgvector adiciona essa funcionalidade ao PostgreSQL e lida com 1 milh\u00e3o de vetores com baixa lat\u00eancia p95 (na faixa de poucos milissegundos em NVMe, maior em SSDs na nuvem), portanto, se voc\u00ea j\u00e1 executa o PostgreSQL, pode evitar inteiramente a ado\u00e7\u00e3o de nova infraestrutura. Opte por um banco de dados dedicado, como o Qdrant, quando precisar de filtragem intensiva por metadados ou lidar com bilh\u00f5es de vetores.<\/p>\n<h3>Qual tamanho de fragmento devo usar?<\/h3>\n<p>Comece com cerca de 512 tokens e sobreposi\u00e7\u00e3o de 10\u201320%, usando um divisor recursivo. Uma avalia\u00e7\u00e3o de 2026 constatou que esse m\u00e9todo superou a fragmenta\u00e7\u00e3o sem\u00e2ntica em 69% contra 54% quanto \u00e0 precis\u00e3o de recupera\u00e7\u00e3o. Mude para t\u00e9cnicas de fragmenta\u00e7\u00e3o mais sofisticadas apenas se suas m\u00e9tricas de avalia\u00e7\u00e3o mostrarem ganhos concretos nos seus documentos espec\u00edficos.<\/p>\n<h3>Um reranker \u00e9 realmente necess\u00e1rio?<\/h3>\n<p>N\u00e3o para obter algo funcional, mas \u00e9 uma das melhorias de qualidade mais econ\u00f4micas dispon\u00edveis. Recupere um conjunto amplo (top 50), reordene com o Cohere Rerank 3.5 ou com o modelo de c\u00f3digo aberto BGE-reranker-v2-m3 e mantenha apenas os 5\u201310 melhores resultados. A maioria dos pipelines que apresentam trechos irrelevantes simplesmente omite esse passo.<\/p>\n<h3>Posso construir um sistema RAG sem usar LangChain ou LlamaIndex?<\/h3>\n<p>Sim. O ciclo principal \u2014 incorporar, pesquisar, formatar prompt, gerar \u2014 consiste em cerca de 40 linhas de Python puro, chamando diretamente seu modelo de incorpora\u00e7\u00e3o, cliente do banco de dados vetorial e modelo de linguagem. Os frameworks economizam tempo com carregadores, rerankers e orquestra\u00e7\u00e3o ag\u00eantica, mas s\u00e3o opcionais, e uma implementa\u00e7\u00e3o do zero oferece controle total sobre cada etapa.<\/p>\n<h3>Devo usar um modelo local ou uma API para gera\u00e7\u00e3o?<\/h3>\n<p>Um modelo local (via Ollama, com um modelo de 8B em 8\u201312 GB de VRAM) \u00e9 excelente para privacidade, controle de custos e uso offline. Uma API oferece um limite superior de qualidade e elimina totalmente a necessidade de opera\u00e7\u00f5es. Muitas equipes fazem prot\u00f3tipos localmente para iterar com baixo custo e depois escolhem, caso a caso, entre modelos locais e APIs conforme a sensibilidade dos dados e o or\u00e7amento.<\/p>\n<h3>Como manter o \u00edndice atualizado \u00e0 medida que os documentos mudam?<\/h3>\n<p>Reincorpore e insira apenas as altera\u00e7\u00f5es, em vez de reconstruir tudo. Registre um hash de conte\u00fado ou uma data de modifica\u00e7\u00e3o para cada documento-fonte e, ao atualizar, exclua os trechos antigos desse documento e insira os novos. A maioria dos bancos de dados vetoriais suporta inser\u00e7\u00f5es e exclus\u00f5es condicionais por filtro de metadados, tornando as atualiza\u00e7\u00f5es incrementais bastante diretas.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Bottom_line\"><\/span>Conclus\u00e3o<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Construir um pipeline RAG em 2026 \u00e9 genuinamente acess\u00edvel: seis etapas, um punhado de ferramentas maduras e cerca de 40 linhas de c\u00f3digo para um prot\u00f3tipo funcional. As armadilhas n\u00e3o est\u00e3o na arquitetura \u2014 est\u00e3o nas configura\u00e7\u00f5es padr\u00e3o. Use fragmentos simples de 512 tokens, garanta compatibilidade entre os modelos de incorpora\u00e7\u00e3o usados nas consultas e nos documentos, adicione um reranker e nunca realize ajustes sem o RAGAS integrado ao ciclo de avalia\u00e7\u00e3o. Comece local e gratuitamente com o nomic-embed-text, o Chroma e um modelo de 8B no Ollama; substitua componentes individualmente pelo pgvector, Qdrant, Voyage ou por uma API de ponta somente quando seus n\u00fameros de avalia\u00e7\u00e3o \u2014 e n\u00e3o um post de blog \u2014 indicarem essa necessidade. Acerte a recupera\u00e7\u00e3o e at\u00e9 mesmo um modelo pequeno o levar\u00e1 surpreendentemente longe.<\/p>\n<p><!--related-block--><\/p>\n<div class=\"convly-related\">\n<h2><span class=\"ez-toc-section\" id=\"Related_articles\"><\/span>Artigos relacionados<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/convly.ai\/pt\/how-to-run-llama-3-locally-on-snapdragon-8-gen-4\/\">How to Run Llama 3 Locally on Snapdragon 8 Gen 4 (Step-by-Step, 2026)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/pt\/90-day-ai-engineer-path\/\">Do zero ao engenheiro de IA: seu plano de aprendizado de 90 dias<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/pt\/ai-resume-screener-tutorial\/\">Criando um sistema de triagem de curr\u00edculos impulsionado por IA (tutorial completo)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/pt\/local-llm-ollama-setup\/\">Configurando seu primeiro LLM local com o Ollama<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>A practical, code-first walkthrough of building a retrieval-augmented generation pipeline in 2026 \u2014 from embeddings and chunking to vector storage, reranking, and generation, with verified tool versions and honest notes on what actually works.<\/p>","protected":false},"author":1,"featured_media":1115,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[9],"tags":[746,747,442,259,429,748,441],"class_list":["post-1105","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-embeddings","tag-langchain","tag-llm","tag-ollama","tag-rag","tag-tutorial","tag-vector-database"],"_links":{"self":[{"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/posts\/1105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/comments?post=1105"}],"version-history":[{"count":1,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1126,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/posts\/1105\/revisions\/1126"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/media\/1115"}],"wp:attachment":[{"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/media?parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/categories?post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/convly.ai\/pt\/wp-json\/wp\/v2\/tags?post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}