{"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\/es\/how-to-build-a-rag-pipeline-2026\/","title":{"rendered":"C\u00f3mo construir una canalizaci\u00f3n RAG en 2026 (paso a paso)"},"content":{"rendered":"<p>La generaci\u00f3n aumentada por recuperaci\u00f3n dej\u00f3 de ser una curiosidad investigadora hace a\u00f1os. En 2026 es el m\u00e9todo predeterminado para integrar un modelo de lenguaje grande (LLM) con sus propios documentos sin tener que pagar por ajuste fino del modelo ni arriesgarse a que genere respuestas inventadas con confianza. El patr\u00f3n es sencillo de describir, pero est\u00e1 lleno de complejidades pr\u00e1cticas: encontrar el texto adecuado, pas\u00e1rselo al modelo y dejar que este redacte la respuesta.<\/p>\n<p>Esta es una gu\u00eda pr\u00e1ctica de implementaci\u00f3n, no una revisi\u00f3n bibliogr\u00e1fica. Al finalizarla, sabr\u00e1 exactamente qu\u00e9 componentes necesita una canalizaci\u00f3n RAG funcional en 2026, qu\u00e9 herramientas y versiones espec\u00edficas utilizar, y contar\u00e1 con un esquema de c\u00f3digo m\u00ednimo que puede ejecutar localmente o mediante una API. Hemos verificado cada n\u00famero de versi\u00f3n, precio y resultado de benchmark indicado a continuaci\u00f3n contra fuentes actuales, porque el peor error en RAG es aquel que copia de una entrada de blog escrita para las bibliotecas del a\u00f1o pasado.<\/p>\n<div class=\"convly-tldr\">\n<h3>Conclusiones clave<\/h3>\n<ul>\n<li><strong>Seis etapas, en orden:<\/strong> dividir, incrustar, almacenar, recuperar, reordenar y generar. Si omite el reordenador, los resultados superiores empeoran notablemente; si omite la evaluaci\u00f3n, nunca sabr\u00e1 si su sistema funciona correctamente.<\/li>\n<li><strong>La divisi\u00f3n simple y aburrida es la ganadora.<\/strong> La divisi\u00f3n recursiva en bloques de aproximadamente 512 tokens con una superposici\u00f3n del 10\u201320 % supera a la divisi\u00f3n sem\u00e1ntica avanzada (69 % frente a 54 % de precisi\u00f3n) seg\u00fan una comparativa de 2026. Empiece por ah\u00ed.<\/li>\n<li><strong>Incrustaciones (embeddings):<\/strong> nomic-embed-text (768 dimensiones, gratuito, local) para prototipos; text-embedding-3-large de OpenAI (0,13 USD por mill\u00f3n de tokens, 3072 dimensiones) o Voyage-3.5 para calidad a escala.<\/li>\n<li><strong>Base de datos vectorial:<\/strong> pgvector si ya utiliza PostgreSQL; Qdrant v1.18 (licencia Apache 2.0, desarrollado en Rust) cuando necesite b\u00fasquedas filtradas r\u00e1pidas; Chroma para trabajos locales r\u00e1pidos.<\/li>\n<li><strong>Frameworks:<\/strong> LangChain 1.x (con runtime LangGraph) para flujos basados en agentes; LlamaIndex 0.14.x para aplicaciones centradas en la recuperaci\u00f3n; y puede ejecutar una canalizaci\u00f3n \u00fatil en aproximadamente 40 l\u00edneas de c\u00f3digo sin necesidad de ninguno de ellos.<\/li>\n<li><strong>Incorpore un reordenador (reranker).<\/strong> Cohere Rerank 3.5 (2 USD por 1.000 b\u00fasquedas) o BGE-reranker-v2-m3 de c\u00f3digo abierto (gratuito, ~50\u2013100 ms en GPU) mejoran significativamente la relevancia de los resultados superiores de forma econ\u00f3mica.<\/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-6a38a000a5e82\" 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-6a38a000a5e82\"  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\/es\/how-to-build-a-rag-pipeline-2026\/#How_a_RAG_pipeline_actually_works\" >C\u00f3mo funciona realmente una canalizaci\u00f3n RAG<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_1_Chunk_your_documents\" >Paso 1: Divida sus documentos<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_2_Choose_an_embedding_model\" >Paso 2: Elija un modelo de incrustaci\u00f3n<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_3_Store_vectors_in_a_vector_database\" >Paso 3: Almacene los vectores en una base de datos vectorial<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_4_Retrieve_and_rerank\" >Paso 4: Recupere y reordene<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_5_Augment_the_prompt_and_generate\" >Paso 5: Enriquezca el prompt y genere<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_6_A_minimal_code_sketch\" >Paso 6: Un esquema de c\u00f3digo m\u00ednimo<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Step_7_Evaluate_%E2%80%94_dont_skip_this\" >Paso 7: Eval\u00fae \u2014 no omita este paso<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#FAQ\" >Preguntas frecuentes<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Bottom_line\" >Conclusi\u00f3n<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/convly.ai\/es\/how-to-build-a-rag-pipeline-2026\/#Related_articles\" >Art\u00edculos relacionados<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"How_a_RAG_pipeline_actually_works\"><\/span>C\u00f3mo funciona realmente una canalizaci\u00f3n RAG<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Un sistema RAG consta de dos fases. <strong>Indexaci\u00f3n<\/strong> ocurre una vez (o cada vez que sus documentos cambien): divide los archivos fuente en fragmentos, convierte cada fragmento en un vector mediante un modelo de incrustaci\u00f3n y almacena dichos vectores en una base de datos. <strong>Consulta<\/strong> ocurre en cada solicitud: incrusta la pregunta del usuario, encuentra los fragmentos m\u00e1s similares, opcionalmente los reordena, inserta los mejores en un prompt y llama a un modelo de lenguaje grande (LLM).<\/p>\n<p>Esa es toda la idea. La ingenier\u00eda radica en los detalles: tama\u00f1o de los fragmentos, qu\u00e9 modelo de incrustaci\u00f3n usar, cu\u00e1ntos resultados recuperar, si reordenarlos y c\u00f3mo medir si todo funciona. Si desea comprender los fundamentos conceptuales antes de construir, nuestra <a href=\"\/es\/rag-retrieval-augmented-generation-explained\/\">explicaci\u00f3n de RAG<\/a> cubre la teor\u00eda; este art\u00edculo se centra en su implementaci\u00f3n pr\u00e1ctica. Y si a\u00fan est\u00e1 decidiendo entre RAG y personalizar directamente el modelo, la <a href=\"\/es\/fine-tuning-vs-rag\/\">comparaci\u00f3n entre ajuste fino y RAG<\/a> es el punto de partida adecuado: para la mayor\u00eda de los equipos que alimentan datos privados y cambiantes a un LLM, RAG es la soluci\u00f3n m\u00e1s econ\u00f3mica y mantenible.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_1_Chunk_your_documents\"><\/span>Paso 1: Divida sus documentos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Los modelos de incrustaci\u00f3n tienen un l\u00edmite de contexto y, lo que es m\u00e1s importante, pierden precisi\u00f3n en pasajes largos. Por tanto, se dividen los documentos en fragmentos. El consenso de 2026, respaldado por comparativas t\u00e9cnicas y no por percepciones subjetivas, es poco llamativo: utilice un divisor recursivo por caracteres orientado a aproximadamente <strong>512 tokens con una superposici\u00f3n del 10\u201320 %<\/strong> (50\u2013100 tokens).<\/p>\n<p>Una evaluaci\u00f3n realizada en febrero de 2026 sobre 50 documentos reales revel\u00f3 que la divisi\u00f3n recursiva ingenua en fragmentos de 512 tokens obtuvo una precisi\u00f3n de recuperaci\u00f3n del 69 %, mientras que la segmentaci\u00f3n sem\u00e1ntica \u2014que intenta dividir en los l\u00edmites de significado\u2014 alcanz\u00f3 solo un 54 %. La raz\u00f3n es sencilla: la segmentaci\u00f3n sem\u00e1ntica gener\u00f3 fragmentos con un promedio de 43 tokens, demasiado peque\u00f1os para proporcionar al modelo suficiente contexto como para responder adecuadamente. Por otro lado, un estudio independiente realizado en enero de 2026, que utiliz\u00f3 la recuperaci\u00f3n SPLADE, encontr\u00f3 que a\u00f1adir solapamiento incrementaba el costo de indexaci\u00f3n sin aportar beneficio medible alguno en su conjunto de datos. La conclusi\u00f3n honesta es esta: comience con fragmentos recursivos de tama\u00f1o fijo y solo recurrir a la segmentaci\u00f3n sem\u00e1ntica o por p\u00e1ginas si sus m\u00e9tricas de evaluaci\u00f3n demuestran, de forma inequ\u00edvoca, que las necesita para sus documentos espec\u00edficos.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_2_Choose_an_embedding_model\"><\/span>Paso 2: Elija un modelo de incrustaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Esta es la decisi\u00f3n m\u00e1s trascendental de toda la canalizaci\u00f3n, y la diferencia entre las opciones es real. A continuaci\u00f3n se presentan las alternativas dignas de considerarse a mediados de 2026, con cifras verificadas.<\/p>\n<table class=\"convly-vs\">\n<thead>\n<tr>\n<th>Modelo<\/th>\n<th>Dimensiones<\/th>\n<th>Contexto<\/th>\n<th>Precio por 1 mill\u00f3n de tokens<\/th>\n<th>Notas<\/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>Gratis (local)<\/td>\n<td>274 MB; la opci\u00f3n local predeterminada<\/td>\n<\/tr>\n<tr>\n<td>mxbai-embed-large<\/td>\n<td>1024<\/td>\n<td>512<\/td>\n<td>Gratis (local)<\/td>\n<td>670 MB; mayor calidad, contexto corto<\/td>\n<\/tr>\n<tr>\n<td>BGE-M3<\/td>\n<td>1024 + disperso<\/td>\n<td>8,192<\/td>\n<td>Gratis (local)<\/td>\n<td>Licencia MIT, m\u00e1s 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>Referencia econ\u00f3mica mediante 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>0,065 USD mediante la API por lotes (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 aproximadamente un 8 % a text-embedding-3-large en tareas de recuperaci\u00f3n<\/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 en MTEB v2 (~68,3)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para un prototipo, comience localmente con <strong>nomic-embed-text<\/strong> \u2014es r\u00e1pido, gratuito, cabe en una laptop con 16 GB de RAM y, seg\u00fan informes, supera a <code>text-embedding-ada-002<\/code>de OpenAI. Para entornos productivos, el campo de c\u00f3digo abierto ha alcanzado realmente a los l\u00edderes comerciales: BGE-M3 es el motor de referencia con licencia MIT que la mayor\u00eda de las pilas autoalojadas adoptan por defecto, mientras que Voyage-3.5 y Gemini Embedding lideran las pruebas de rendimiento entre los servicios gestionados mediante API. Existe una \u00fanica regla fundamental: <strong>cualquiera que sea el modelo que use para incrustar sus documentos, debe emplear exactamente el mismo modelo para incrustar sus consultas.<\/strong> Mezclar modelos de forma silenciosa destruye por completo la recuperaci\u00f3n.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_3_Store_vectors_in_a_vector_database\"><\/span>Paso 3: Almacene los vectores en una base de datos vectorial<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Una vez que tenga las incrustaciones, deben almacenarse en alg\u00fan lugar que soporte b\u00fasquedas r\u00e1pidas de vecinos m\u00e1s cercanos. En 2026 dispone de tres niveles razonables.<\/p>\n<div class=\"convly-procons\">\n<div class=\"pros\">\n<h4>Elija estos<\/h4>\n<ul>\n<li><strong>pgvector 0.8<\/strong> si ya utiliza PostgreSQL. Con un \u00edndice HNSW ofrece latencias p95 de un d\u00edgito a bajos dos d\u00edgitos (milisegundos) para 1 mill\u00f3n de vectores. La versi\u00f3n 0.8 incorpor\u00f3 escaneos iterativos, lo que permite que las consultas filtradas devuelvan suficientes resultados. No requiere nueva infraestructura.<\/li>\n<li><strong>Qdrant v1.18<\/strong> (licencia Apache 2.0, desarrollado en Rust) cuando los filtros son fundamentales. Su algoritmo ACORN (incorporado en la versi\u00f3n 1.16) resuelve el cl\u00e1sico problema de que \u00ablos filtros reducen dr\u00e1sticamente mi capacidad de recuperaci\u00f3n\u00bb, ampliando din\u00e1micamente la b\u00fasqueda HNSW bajo filtros restrictivos, y constituye una de las mejores opciones disponibles para b\u00fasquedas filtradas. Se autoaloja con un \u00fanico comando Docker.<\/li>\n<li><strong>Chroma<\/strong> para prototipos locales. Mejor experiencia de desarrollo, modo integrado (embedded), cero operaciones \u2014ideal hasta que necesite escalar.<\/li>\n<\/ul>\n<\/div>\n<div class=\"cons\">\n<h4>Tenga cuidado con<\/h4>\n<ul>\n<li>Los servicios gestionados facturan seg\u00fan el uso y pueden sorprender: con 100 millones de vectores, Pinecone puede costar m\u00e1s de 5.000 USD\/mes, frente a una soluci\u00f3n mucho m\u00e1s econ\u00f3mica basada en Qdrant o pgvector autoalojados en sus propias m\u00e1quinas virtuales. Audite antes de escalar.<\/li>\n<li>La construcci\u00f3n de \u00edndices HNSW es lenta a gran escala, y el \u00edndice puede ocupar ~8 GB para 1 mill\u00f3n de vectores de 1536 dimensiones (puede reducirse aproximadamente a la mitad usando halfvec).<\/li>\n<li>El hardware de almacenamiento domina el rendimiento: la misma configuraci\u00f3n de pgvector logr\u00f3 ~410 QPS en SSD en la nube frente a 2.150 QPS en NVMe.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Un an\u00e1lisis m\u00e1s detallado figura en nuestra <a href=\"\/es\/what-is-a-vector-database-2026\/\">gu\u00eda de bases de datos vectoriales<\/a>, pero para la mayor\u00eda de los equipos el \u00e1rbol de decisiones es breve: ya usa PostgreSQL \u2192 pgvector; necesita filtrado intensivo o miles de millones de vectores \u2192 Qdrant o Milvus; solo est\u00e1 experimentando \u2192 Chroma.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_4_Retrieve_and_rerank\"><\/span>Paso 4: Recupere y reordene<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La recuperaci\u00f3n en s\u00ed consiste en una sola llamada: incruste la consulta, luego solicite a la base de datos los k fragmentos m\u00e1s cercanos (un valor t\u00edpico de k oscila entre 20 y 50). Sin embargo, la similitud vectorial pura es una herramienta tosca. Un <strong>reordenador (reranker)<\/strong> \u2014un codificador cruzado que punt\u00faa individualmente cada par consulta-documento\u2014 vuelve a ordenar esos candidatos y eleva los realmente relevantes antes de que lleguen al modelo.<\/p>\n<p>El patr\u00f3n est\u00e1ndar consiste en recuperar los 50 mejores resultados con su codificador bi-direccional, aplicar el reordenamiento y conservar los 5\u201310 mejores. Cohere Rerank 3.5 cuesta 0,002 USD por b\u00fasqueda (2 USD por 1.000 b\u00fasquedas) y normalmente a\u00f1ade una latencia del orden de 100\u2013300 ms. Si dispone de una GPU y desea eliminar por completo el costo por consulta, el modelo de c\u00f3digo abierto <strong>BGE-reranker-v2-m3<\/strong> se ejecuta en ~50\u2013100 ms y admite contenido multiling\u00fce. El reordenamiento es una de las mejoras de mayor impacto y menor esfuerzo que puede implementar: la mayor\u00eda de las canalizaciones que \u00abrecuperan basura\u00bb simplemente omiten este paso.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_5_Augment_the_prompt_and_generate\"><\/span>Paso 5: Enriquezca el prompt y genere<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ahora ensamble el prompt: una breve instrucci\u00f3n del sistema que indique al modelo responder \u00fanicamente a partir del contexto suministrado, los fragmentos reordenados y la pregunta del usuario. Luego invoque su modelo de lenguaje grande (LLM).<\/p>\n<p>Para el modelo de generaci\u00f3n puede optar por una soluci\u00f3n local o mediante API. Localmente, mediante <a href=\"\/es\/what-is-ollama-complete-guide-2026\/\">Ollama<\/a>Ollama, el punto \u00f3ptimo en 2026 es un modelo de clase 8B \u2014Qwen3 8B o Llama 3.1 8B cuantizados a Q4_K_M\u2014, que ocupa 8\u201312 GB de VRAM y alcanza velocidades superiores a 40 tokens\/segundo en una GPU moderna. Qwen3 14B (~8\u20139 GB en cuantizaci\u00f3n Q4) representa un salto notable en rendimiento, con una ventana de contexto de 128K tokens que permite incluir m\u00e1s texto recuperado. Para una opci\u00f3n alojada con mayor potencial, un modelo fronterizo mediante API funciona muy bien; nuestro <a href=\"\/es\/build-ai-chatbot-claude-api\/\">tutorial sobre chatbots con la API de Claude<\/a> explica ese flujo de principio a fin. Un recordatorio \u00fatil de los profesionales: en RAG, la calidad de la recuperaci\u00f3n suele importar m\u00e1s que el tama\u00f1o del modelo \u2014fragmentos limpios m\u00e1s un buen incrustador m\u00e1s un LLM peque\u00f1o superan a un modelo gigantesco alimentado con un contexto deficiente.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_6_A_minimal_code_sketch\"><\/span>Paso 6: Un esquema de c\u00f3digo m\u00ednimo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A continuaci\u00f3n se presenta una canalizaci\u00f3n completa local basada en LangChain 1.x, Chroma y Ollama. Indexa un documento y responde una pregunta \u2014sin necesidad de claves 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. Cargar + segmentar (~512 tokens, ~15 % de solapamiento; los tama\u00f1os est\u00e1n en caracteres)\ndocs = TextLoader(&quot;handbook.txt&quot;).load()\nchunks = RecursiveCharacterTextSplitter(\n    chunk_size=2000, chunk_overlap=300\n).split_documents(docs)\n\n# 2. Incrustar + 3. Almacenar\nembeddings = OllamaEmbeddings(model=&quot;nomic-embed-text&quot;)\nstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Recuperar (los 4 mejores)\nretriever = store.as_retriever(search_kwargs={&quot;k&quot;: 4})\n\n# 5. Enriquecer + generar\nllm = ChatOllama(model=&quot;qwen3:8b&quot;)\nquestion = &quot;\u00bfCu\u00e1l es el plazo para solicitar una devoluci\u00f3n?&quot;\ncontext = &quot;nn&quot;.join(d.page_content for d in retriever.invoke(question))\nprompt = (f&quot;Responda \u00daNICAMENTE usando el contexto proporcionado. Si no aparece all\u00ed, ind\u00edquelo.nn&quot;\n          f&quot;Contexto:n{context}nnPregunta: {question}&quot;)\nprint(llm.invoke(prompt).content)\n<\/code><\/pre>\n<p>Ese es todo el ciclo. Para a\u00f1adir reordenamiento, inserte un <code>ContextualCompressionRetriever<\/code> con un cross-encoder entre los pasos 4 y 5. Con LlamaIndex 0.14.x, el mismo flujo suele requerir menos c\u00f3digo gracias a sus abstracciones de recuperaci\u00f3n dise\u00f1adas espec\u00edficamente para ese prop\u00f3sito: es la mejor opci\u00f3n para aplicaciones centradas en la recuperaci\u00f3n, mientras que el entorno de ejecuci\u00f3n LangGraph de LangChain brilla cuando se necesitan agentes con estado y varios pasos. (La elecci\u00f3n de una capa de orquestaci\u00f3n es, por s\u00ed misma, un tema aparte; v\u00e9ase nuestra <a href=\"\/es\/best-ai-agent-frameworks-2026\/\">comparaci\u00f3n 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>Paso 7: Eval\u00fae \u2014 no omita este paso<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La diferencia entre una demostraci\u00f3n y un producto radica en la medici\u00f3n. La herramienta est\u00e1ndar es <strong>RAGAS<\/strong>, que eval\u00faa la fidelidad (\u00bfse mantuvo la respuesta fiel al contexto?), la precisi\u00f3n del contexto y la recuperaci\u00f3n del contexto, utilizando un modelo de lenguaje grande (LLM) como juez. Cree un peque\u00f1o conjunto de 20 a 50 pares de pregunta-respuesta a partir de sus documentos reales y ejecute RAGAS tras cada cambio.<\/p>\n<p>Esto tambi\u00e9n le permite tomar todas las decisiones anteriores con honestidad. \u00bfDebe cambiar al particionado sem\u00e1ntico? \u00bfAgregar un reranker? \u00bfAumentar k de 4 a 8? No lo adivine: modifique una sola variable, vuelva a ejecutar RAGAS y conserve el cambio \u00fanicamente si los resultados num\u00e9ricos mejoran. Sin este ciclo, estar\u00e1 ajustando el sistema a ciegas.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span>Preguntas frecuentes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>\u00bfCu\u00e1nto cuesta ejecutar una canalizaci\u00f3n 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>\u00bfNecesito una base de datos vectorial o puedo usar una convencional?<\/h3>\n<p>Necesita b\u00fasqueda vectorial, pero no necesariamente un producto especializado. pgvector a\u00f1ade esta funcionalidad a PostgreSQL y gestiona eficazmente hasta 1 mill\u00f3n de vectores con baja latencia p95 (de unos pocos milisegundos en unidades NVMe, algo mayor en SSD en la nube); por tanto, si ya emplea PostgreSQL, puede evitar por completo la incorporaci\u00f3n de nueva infraestructura. Opte por una base de datos especializada como Qdrant cuando requiera filtros avanzados por metadatos o deba manejar miles de millones de vectores.<\/p>\n<h3>\u00bfQu\u00e9 tama\u00f1o de fragmento (chunk) debo usar?<\/h3>\n<p>Comience con aproximadamente 512 tokens y un solapamiento del 10\u201320 % mediante un divisor recursivo. Una evaluaci\u00f3n realizada en 2026 hall\u00f3 que este enfoque superaba al particionado sem\u00e1ntico en precisi\u00f3n de recuperaci\u00f3n en un 69 % frente al 54 %. Solo pase a t\u00e9cnicas de particionado m\u00e1s sofisticadas si sus m\u00e9tricas de evaluaci\u00f3n demuestran que mejoran efectivamente el rendimiento sobre sus documentos espec\u00edficos.<\/p>\n<h3>\u00bfEs realmente necesario un reranker?<\/h3>\n<p>No para lograr una versi\u00f3n funcional b\u00e1sica, pero constituye una de las mejoras de calidad m\u00e1s econ\u00f3micas disponibles. Recupere un conjunto amplio (los primeros 50 resultados), realice una nueva clasificaci\u00f3n con Cohere Rerank 3.5 o con el modelo de c\u00f3digo abierto BGE-reranker-v2-m3, y conserve solo los 5\u201310 mejores. La mayor\u00eda de las canalizaciones que muestran fragmentos irrelevantes simplemente omiten este paso.<\/p>\n<h3>\u00bfPuedo construir una soluci\u00f3n RAG sin LangChain ni LlamaIndex?<\/h3>\n<p>S\u00ed. El bucle central \u2014incrustar, buscar, formular el prompt y generar\u2014 consta de aproximadamente 40 l\u00edneas de Python est\u00e1ndar que invocan directamente su modelo de incrustaciones, el cliente de la base de datos vectorial y el modelo de lenguaje grande (LLM). Los frameworks ahorran tiempo en cargadores, rerankers y orquestaci\u00f3n agente, pero son opcionales, y una implementaci\u00f3n desde cero le otorga control total sobre cada etapa.<\/p>\n<h3>\u00bfDebo usar un modelo local o una API para la generaci\u00f3n?<\/h3>\n<p>Un modelo local (mediante Ollama, con un modelo de 8B en 8\u201312 GB de VRAM) es excelente para garantizar privacidad, control de costos y uso sin conexi\u00f3n. Una API ofrece un techo de calidad superior y cero operaciones. Muchos equipos prototipan localmente para iterar a bajo costo y luego eligen, seg\u00fan cada despliegue, entre ambas opciones bas\u00e1ndose en la sensibilidad de los datos y el presupuesto disponible.<\/p>\n<h3>\u00bfC\u00f3mo mantengo actualizado el \u00edndice conforme cambian los documentos?<\/h3>\n<p>Vuelva a incrustar e inserte \u00fanicamente los cambios, sin reconstruir todo el \u00edndice. Registre un hash del contenido o la fecha de modificaci\u00f3n para cada documento fuente y, al actualizarlo, elimine los fragmentos antiguos asociados a dicho documento e inserte los nuevos. La mayor\u00eda de las bases de datos vectoriales admiten operaciones de inserci\u00f3n condicional (upserts) y eliminaci\u00f3n mediante filtros por metadatos, lo que simplifica considerablemente las actualizaciones incrementales.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Bottom_line\"><\/span>Conclusi\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Construir una canalizaci\u00f3n RAG en 2026 es verdaderamente accesible: seis etapas, un pu\u00f1ado de herramientas maduras y aproximadamente 40 l\u00edneas de c\u00f3digo para obtener un prototipo funcional. Las trampas no residen en la arquitectura, sino en las configuraciones predeterminadas. Use fragmentos sencillos de 512 tokens, aseg\u00farese de que los modelos de incrustaci\u00f3n para consultas y documentos coincidan, incluya un reranker y nunca realice ajustes sin tener a RAGAS integrado en el ciclo de validaci\u00f3n. Comience de forma local y gratuita con nomic-embed-text, Chroma y un modelo de 8B de Ollama; sustituya componentes individuales por pgvector, Qdrant, Voyage o una API de vanguardia \u00fanicamente cuando sus propias m\u00e9tricas de evaluaci\u00f3n \u2014y no un art\u00edculo de blog\u2014 as\u00ed lo indiquen. Si logra dominar la recuperaci\u00f3n, incluso un modelo peque\u00f1o le llevar\u00e1 mucho m\u00e1s lejos de lo que podr\u00eda imaginar.<\/p>\n<p><!--related-block--><\/p>\n<div class=\"convly-related\">\n<h2><span class=\"ez-toc-section\" id=\"Related_articles\"><\/span>Art\u00edculos relacionados<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/convly.ai\/es\/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\/es\/90-day-ai-engineer-path\/\">De cero a ingeniero en IA: su ruta de aprendizaje de 90 d\u00edas<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/es\/ai-resume-screener-tutorial\/\">Creaci\u00f3n de un sistema de selecci\u00f3n de curr\u00edculums impulsado por IA (tutorial completo)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/es\/local-llm-ollama-setup\/\">Configuraci\u00f3n de su primer modelo de lenguaje local con 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\/es\/wp-json\/wp\/v2\/posts\/1105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/comments?post=1105"}],"version-history":[{"count":1,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1126,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/posts\/1105\/revisions\/1126"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/media\/1115"}],"wp:attachment":[{"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/media?parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/categories?post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/convly.ai\/es\/wp-json\/wp\/v2\/tags?post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}