<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Inteligencia Artificial · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/tags/inteligencia-artificial/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Thu, 30 Jul 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/tags/inteligencia-artificial/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>RAG: Pipeline de Indexación con Chunking, Embeddings y FAISS</title><link>https://blog.dacadev.com/generative-ai/rag/pipeline-de-indexacion/</link><pubDate>Thu, 30 Jul 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/rag/pipeline-de-indexacion/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Aprende a construir el pipeline de indexación de un RAG en Python: carga de datos, chunking, embeddings y almacenamiento en una base vectorial.</description><media:content url="https://blog.dacadev.com/images/generative-ai/rag/03-pipeline-de-indexacion/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#carga-de-datos"&gt;Carga de datos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#segmentación-en-chunks"&gt;Segmentación en chunks&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#métodos-de-chunking"&gt;Métodos de chunking&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conversión-a-embeddings"&gt;Conversión a embeddings&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cómo-se-mide-la-similitud"&gt;Cómo se mide la similitud&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#almacenamiento-en-una-base-de-datos-vectorial"&gt;Almacenamiento en una base de datos vectorial&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pipeline-completo"&gt;Pipeline completo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#verificación-rápida"&gt;Verificación rápida&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión-y-próximos-pasos"&gt;Conclusión y próximos pasos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En el &lt;a href="https://blog.dacadev.com/generative-ai/rag/arquitectura-de-un-rag/"



 


&gt;artículo anterior de esta serie&lt;/a&gt; vimos que el &lt;strong&gt;indexing pipeline&lt;/strong&gt; se compone de cuatro etapas: carga, fragmentación, conversión y almacenamiento. Hoy vamos a construir cada una de esas etapas con código real, usando como hilo conductor el ejemplo del &lt;a href="https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/"



 


&gt;primer artículo&lt;/a&gt;: un LLM que no sabe qué equipos jugarán la semifinal del Mundial 2026 porque su conocimiento no llega hasta esa fecha.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este es el tercer artículo de la serie &lt;strong&gt;RAGs&lt;/strong&gt;. Vamos a implementar el &lt;strong&gt;indexing pipeline&lt;/strong&gt; completo en Python: carga de datos, chunking, embeddings y una base de datos vectorial con &lt;strong&gt;FAISS&lt;/strong&gt;. El código se irá acumulando en cada sección hasta terminar en un script único, listo para usar. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="carga-de-datos"&gt;Carga de datos&lt;/h2&gt;
&lt;p&gt;El primer paso es traer la información desde su fuente original, sin importar si esta es una página web, un PDF o una API. Aunque suena trivial, esta etapa suele resolver varios problemas antes de entregar texto limpio: conexión y autenticación con la fuente, límites de &lt;em&gt;rate limit&lt;/em&gt;, paginación y el formato en el que llegan los datos.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 S[&amp;#34;📂 Fuente&amp;#34;] --&amp;gt; C[&amp;#34;🔌 Conector&amp;lt;br/&amp;gt;conexión y auth&amp;#34;]
 C --&amp;gt; E[&amp;#34;📑 Extractor&amp;lt;br/&amp;gt;parseo de texto&amp;#34;]
 E --&amp;gt; M[&amp;#34;🏷️ Metadatos&amp;lt;br/&amp;gt;añade/actualiza&amp;#34;]
 M --&amp;gt; T[&amp;#34;🧹 Transformador&amp;lt;br/&amp;gt;limpieza y formato&amp;#34;]
 T --&amp;gt; OUT[&amp;#34;📄 Texto plano&amp;#34;]
&lt;/pre&gt;

&lt;p&gt;Para nuestro ejemplo usaremos la página de Wikipedia de la &lt;a href="https://es.wikipedia.org/wiki/Copa_Mundial_de_F%C3%BAtbol_de_2026"




 target="_blank"
 


&gt;&lt;em&gt;Copa Mundial de Fútbol de 2026&lt;/em&gt;&lt;/a&gt;. Con &lt;a href="https://python.langchain.com/"




 target="_blank"
 


&gt;LangChain&lt;/a&gt; podemos descargar el HTML de forma asíncrona y transformarlo a texto plano en pocas líneas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;asyncio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typing&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Final&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_loaders&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AsyncHtmlLoader&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_loaders.async_html&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;default_header_template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_transformers&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Html2TextTransformer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;URL_OBJETIVO&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Final&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;https://es.wikipedia.org/wiki/Copa_Mundial_de_F%C3%BAtbol_de_2026&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;async&lt;/span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cargar_y_limpiar_documento&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;url&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;URL_OBJETIVO&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Descarga el contenido HTML de una URL de forma asíncrona
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; y lo transforma a texto plano.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Wikipedia exige identificar el User-Agent en las peticiones (https://w.wiki/4wJS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;dict&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;default_header_template&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt;[&lt;span style="color:#98c379"&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;DacaDev/0.0 (mi_correo@gmail.com)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;cargador_html&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AsyncHtmlLoader&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;url&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;header_template&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_html&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargador_html&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;load&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;transformador_html_a_texto&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Html2TextTransformer&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_texto_plano&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;transformador_html_a_texto&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;transform_documents&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;documentos_texto_plano&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;]&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;page_content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Dependencias usadas en esta sección: &lt;code&gt;langchain&lt;/code&gt;, &lt;code&gt;langchain-community&lt;/code&gt;, &lt;code&gt;bs4&lt;/code&gt; y &lt;code&gt;html2text&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="segmentación-en-chunks"&gt;Segmentación en chunks&lt;/h2&gt;
&lt;p&gt;Con el texto limpio en mano, el siguiente problema es que no podemos meter un documento entero en cada consulta al LLM. Dividirlo en fragmentos —&lt;strong&gt;chunks&lt;/strong&gt;— ataca tres limitaciones que ya vimos en el &lt;a href="https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/"



 


&gt;primer artículo&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Context window limitado&lt;/strong&gt;: si llenamos el contexto con un documento completo para usar solo una parte, desperdiciamos capacidad del modelo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lost in the middle&lt;/strong&gt;: en documentos largos, el modelo tiende a perder información ubicada en la mitad del texto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precisión de la búsqueda semántica&lt;/strong&gt;: chunks pequeños y enfocados producen coincidencias más relevantes que un documento gigante.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El proceso de chunking sigue siempre la misma lógica, sin importar la herramienta que uses:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 D[&amp;#34;📄 Documento&amp;lt;br/&amp;gt;cargado&amp;#34;] --&amp;gt; P1[&amp;#34;1️⃣ Dividir en&amp;lt;br/&amp;gt;unidades pequeñas&amp;#34;]
 P1 --&amp;gt; P2[&amp;#34;2️⃣ Fusionar en&amp;lt;br/&amp;gt;chunks de tamaño objetivo&amp;#34;]
 P2 --&amp;gt; P3[&amp;#34;3️⃣ Agregar overlap&amp;lt;br/&amp;gt;entre chunks&amp;#34;]
 P3 --&amp;gt; CH[(&amp;#34;🧩 Chunks&amp;#34;)]
&lt;/pre&gt;

&lt;p&gt;El &lt;strong&gt;overlap&lt;/strong&gt; (solapamiento) repite un pequeño trozo del chunk anterior al inicio del siguiente, para no cortar una idea justo en la frontera entre dos fragmentos.&lt;/p&gt;
&lt;h3 id="métodos-de-chunking"&gt;Métodos de chunking&lt;/h3&gt;
&lt;p&gt;No todos los métodos dividen el texto de la misma forma. Estos son los más comunes:&lt;/p&gt;



&lt;div class="tab" data-tab-group=""&gt;
 &lt;ul class="tab-nav" data-tab-nav&gt;
 
 &lt;li
 class="tab-nav-item active"
 data-tab="ancho-fijo" tabindex="0"&gt;
 Ancho fijo
 &lt;/li&gt;
 
 &lt;li
 class="tab-nav-item "
 data-tab="recursivo" tabindex="-1"&gt;
 Recursivo
 &lt;/li&gt;
 
 &lt;li
 class="tab-nav-item "
 data-tab="por-tokens" tabindex="-1"&gt;
 Por tokens
 &lt;/li&gt;
 
 &lt;li
 class="tab-nav-item "
 data-tab="estructural" tabindex="-1"&gt;
 Estructural
 &lt;/li&gt;
 
 &lt;/ul&gt;
 &lt;div class="tab-content" data-tab-content&gt;
 
 &lt;div
 class="tab-content-panel active"
 data-tab-panel="ancho-fijo"&gt;
 &lt;p&gt;Corta por un carácter específico (&lt;code&gt;\n&lt;/code&gt;, por ejemplo) y mide el tamaño en caracteres. Es el método más simple y predecible.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_text_splitters&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CharacterTextSplitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;separador&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CharacterTextSplitter&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separator&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_size&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_overlap&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;separador&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;create_documents&lt;/span&gt;([&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div
 class="tab-content-panel "
 data-tab-panel="recursivo"&gt;
 &lt;p&gt;Prueba una lista de separadores en orden de jerarquía (párrafos, líneas, oraciones, palabras) hasta lograr chunks del tamaño deseado. Es el método recomendado para texto genérico.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_text_splitters&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;separador&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separators&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;[&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_size&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_overlap&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;separador&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;create_documents&lt;/span&gt;([&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div
 class="tab-content-panel "
 data-tab-panel="por-tokens"&gt;
 &lt;p&gt;Igual que el ancho fijo o el recursivo, pero mide &lt;code&gt;chunk_size&lt;/code&gt; y &lt;code&gt;chunk_overlap&lt;/code&gt; en tokens en vez de caracteres, usando el encoder de un tokenizer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;separador&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;from_tiktoken_encoder&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;encoding_name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;cl100k_base&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_size&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_overlap&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div
 class="tab-content-panel "
 data-tab-panel="estructural"&gt;
 &lt;p&gt;Divide según la estructura del documento (encabezados HTML, tablas) en vez de un tamaño fijo. Útil cuando el formato original aporta información.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_text_splitters&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HTMLSectionSplitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;secciones&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [(&lt;span style="color:#98c379"&gt;&amp;#34;h1&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Encabezado 1&amp;#34;&lt;/span&gt;), (&lt;span style="color:#98c379"&gt;&amp;#34;h2&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Encabezado 2&amp;#34;&lt;/span&gt;), (&lt;span style="color:#98c379"&gt;&amp;#34;table&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;Tabla&amp;#34;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;segmentador&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HTMLSectionSplitter&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;secciones&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;segmentador&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;split_text&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;contenido_html&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;/div&gt;
&lt;/div&gt;





 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;No existe un método &amp;ldquo;correcto&amp;rdquo; universal: depende del tipo de contenido, del tamaño esperado de las consultas y del modelo de embeddings que uses. Para nuestro caso —texto genérico proveniente de Wikipedia— el splitter &lt;strong&gt;recursivo&lt;/strong&gt; es la mejor opción por defecto.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Sumamos esta etapa a nuestro flujo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_core.documents&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_text_splitters&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;dividir_texto_en_fragmentos&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Divide un texto intentando mantener oraciones y párrafos completos.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separador_recursivo&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separators&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;[&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_size&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_overlap&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;separador_recursivo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;create_documents&lt;/span&gt;([&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Dependencia añadida: &lt;code&gt;langchain-text-splitters&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="conversión-a-embeddings"&gt;Conversión a embeddings&lt;/h2&gt;
&lt;p&gt;Ya tenemos los chunks, pero un motor de búsqueda no entiende texto: entiende números. Los &lt;strong&gt;embeddings&lt;/strong&gt; son la solución — representaciones vectoriales donde textos con significado similar quedan ubicados cerca entre sí en el espacio vectorial.&lt;/p&gt;
&lt;p&gt;Con una sola dimensión apenas podemos ordenar palabras en una línea, lo que deja fuera relaciones de significado más ricas:&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/03-pipeline-de-indexacion/embeddings-1d_hu_6726d71a48d96ace.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Al aumentar las dimensiones ganamos flexibilidad para ubicar cada palabra según su relación real con las demás:&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/03-pipeline-de-indexacion/embeddings-2d_hu_50fd3deb604c414c.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Un &lt;strong&gt;modelo de embeddings&lt;/strong&gt; generaliza esta idea a &lt;em&gt;n&lt;/em&gt; dimensiones: convierte cada texto en un vector numérico que captura su significado.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/03-pipeline-de-indexacion/embeddings-modelo_hu_9990c60bb0e1390d.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Estos modelos se entrenan sobre grandes corpus de texto usando arquitecturas como Word2Vec, GloVe o BERT. Algunos de los modelos preentrenados más usados hoy:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Proveedor&lt;/th&gt;
 &lt;th&gt;Modelo&lt;/th&gt;
 &lt;th&gt;Dimensiones&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenAI&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;text-embedding-3-small/large&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1536 / 3072&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Google&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;text-embedding-004&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;hasta 768&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Voyage AI&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;voyage-large-2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1536&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cohere&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;embed-multilingual-v3.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1024&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Open source (HF)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sentence-transformers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;varía (ej. 768)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cómo-se-mide-la-similitud"&gt;Cómo se mide la similitud&lt;/h3&gt;
&lt;p&gt;Una vez que dos textos son vectores, ¿cómo sabemos si son &amp;ldquo;parecidos&amp;rdquo;? La métrica más usada es la &lt;strong&gt;similitud coseno&lt;/strong&gt;: el coseno del ángulo entre dos vectores. Cuanto más cercano a &lt;code&gt;1&lt;/code&gt;, más similares son; cercano a &lt;code&gt;0&lt;/code&gt; implica que no están relacionados, y cercano a &lt;code&gt;-1&lt;/code&gt; indica significados opuestos.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/03-pipeline-de-indexacion/similitud-coseno_hu_8d07583fc6c433a5.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Para nuestro pipeline usaremos un modelo open source de &lt;a href="https://www.sbert.net/"




 target="_blank"
 


&gt;sentence-transformers&lt;/a&gt; vía LangChain, que genera embeddings de 768 dimensiones sin depender de una API externa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_huggingface&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;crear_modelo_embeddings&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Instancia el modelo de embeddings que convertirá cada chunk en un vector.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;model_name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;sentence-transformers/all-mpnet-base-v2&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;También podrías usar modelos privados como los de OpenAI (&lt;code&gt;OpenAIEmbeddings&lt;/code&gt;) o Voyage AI simplemente cambiando esta función; el resto del pipeline no cambia.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Dependencias añadidas: &lt;code&gt;langchain-huggingface&lt;/code&gt;, &lt;code&gt;sentence-transformers&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="almacenamiento-en-una-base-de-datos-vectorial"&gt;Almacenamiento en una base de datos vectorial&lt;/h2&gt;
&lt;p&gt;Ya tenemos vectores; ahora necesitamos guardarlos en algún lugar donde se puedan buscar por similitud de forma rápida. Ahí entran las &lt;strong&gt;bases de datos vectoriales&lt;/strong&gt;, optimizadas para indexar y consultar vectores de alta dimensión.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Categoría&lt;/th&gt;
 &lt;th&gt;Ejemplos&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Índices vectoriales&lt;/td&gt;
 &lt;td&gt;FAISS, ANNOY, ScaNN&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bases especializadas&lt;/td&gt;
 &lt;td&gt;Pinecone, Chroma, Qdrant, Milvus, Weaviate&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Plataformas de búsqueda&lt;/td&gt;
 &lt;td&gt;Elasticsearch, OpenSearch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SQL con soporte vectorial&lt;/td&gt;
 &lt;td&gt;PostgreSQL (&lt;code&gt;pgvector&lt;/code&gt;), Azure SQL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NoSQL con soporte vectorial&lt;/td&gt;
 &lt;td&gt;MongoDB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Para este ejemplo usaremos &lt;a href="https://faiss.ai/"




 target="_blank"
 


&gt;&lt;strong&gt;FAISS&lt;/strong&gt;&lt;/a&gt; (Facebook AI Similarity Search): una librería ligera, local y suficiente para un prototipo o un proyecto pequeño.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.vectorstores&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;construir_base_vectorial&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Genera el embedding de cada chunk y los indexa en una base vectorial FAISS.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;from_documents&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;FAISS se puede persistir en disco con &lt;code&gt;base_vectorial.save_local(ruta)&lt;/code&gt; y recuperar después con &lt;code&gt;FAISS.load_local(ruta, modelo_embeddings)&lt;/code&gt;, sin necesidad de recalcular los embeddings cada vez que arranca la aplicación.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Al elegir una base de datos vectorial para producción, más allá de FAISS, vale la pena evaluar:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Factor&lt;/th&gt;
 &lt;th&gt;Qué implica&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Precisión vs. velocidad&lt;/td&gt;
 &lt;td&gt;Índices más precisos suelen ser más lentos de consultar.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Local vs. cloud&lt;/td&gt;
 &lt;td&gt;Acceso rápido y control total vs. escalabilidad y redundancia administradas.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Costo&lt;/td&gt;
 &lt;td&gt;Autohospedado con costo de infraestructura vs. servicio administrado con costo por uso.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pipeline-completo"&gt;Pipeline completo&lt;/h2&gt;
&lt;p&gt;Con las cuatro etapas listas, así queda el script completo: descarga la página, la limpia, la fragmenta, genera los embeddings y los indexa en FAISS.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;asyncio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;typing&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Final&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_loaders&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AsyncHtmlLoader&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_loaders.async_html&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;default_header_template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.document_transformers&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Html2TextTransformer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_community.vectorstores&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_core.documents&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_huggingface&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;langchain_text_splitters&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;URL_OBJETIVO&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Final&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;https://es.wikipedia.org/wiki/Copa_Mundial_de_F%C3%BAtbol_de_2026&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;RUTA_INDICE&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Final&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;indice_mundial_2026&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;async&lt;/span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;cargar_y_limpiar_documento&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;url&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;URL_OBJETIVO&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Descarga el contenido HTML de una URL de forma asíncrona
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; y lo transforma a texto plano.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;dict&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;default_header_template&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt;[&lt;span style="color:#98c379"&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;DacaDev/0.0 (mi_correo@gmail.com)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;cargador_html&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AsyncHtmlLoader&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;url&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;header_template&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;encabezados&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_html&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargador_html&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;load&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;transformador_html_a_texto&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Html2TextTransformer&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_texto_plano&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;transformador_html_a_texto&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;transform_documents&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;documentos_html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;documentos_texto_plano&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;]&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;page_content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;dividir_texto_en_fragmentos&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;str&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Divide un texto intentando mantener oraciones y párrafos completos.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separador_recursivo&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;separators&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;[&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_size&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;chunk_overlap&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;separador_recursivo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;create_documents&lt;/span&gt;([&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;crear_modelo_embeddings&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Instancia el modelo de embeddings que convertirá cada chunk en un vector.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;model_name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;sentence-transformers/all-mpnet-base-v2&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;construir_base_vectorial&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Document&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;HuggingFaceEmbeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Genera el embedding de cada chunk y los indexa en una base vectorial FAISS.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;from_documents&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;async&lt;/span&gt; &lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;ejecutar_flujo_indexacion&lt;/span&gt;() &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; Flujo principal: carga, fragmenta, convierte a embeddings e indexa.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#98c379"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;Iniciando la descarga y procesamiento del documento...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;contenido_limpio&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;await&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargar_y_limpiar_documento&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;dividir_texto_en_fragmentos&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;contenido_limpio&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;Se crearon &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;)&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt; fragmentos&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;crear_modelo_embeddings&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;base_vectorial&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;construir_base_vectorial&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;fragmentos&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;modelo_embeddings&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;base_vectorial&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;save_local&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;RUTA_INDICE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;Se indexaron &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e06c75"&gt;base_vectorial&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;index&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;ntotal&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt; fragmentos en &amp;#39;&lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e06c75"&gt;RUTA_INDICE&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;__name__&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;==&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;asyncio&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;run&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;ejecutar_flujo_indexacion&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="verificación-rápida"&gt;Verificación rápida&lt;/h3&gt;
&lt;p&gt;Con la base vectorial ya construida, podemos comprobar que la indexación funcionó haciendo una búsqueda por similitud directamente sobre FAISS, sin pasar todavía por un LLM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;base_vectorial&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FAISS&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;load_local&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;RUTA_INDICE&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;crear_modelo_embeddings&lt;/span&gt;(), &lt;span style="color:#e06c75"&gt;allow_dangerous_deserialization&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;resultados&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;base_vectorial&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;similarity_search&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;¿Qué equipos jugarán la semifinal de la Copa del Mundo 2026?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;resultados&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;]&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;page_content&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si todo salió bien, el chunk más relevante debería contener información sobre las semifinales del torneo — justo lo que el LLM no podía responder en el &lt;a href="https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/"



 


&gt;primer artículo&lt;/a&gt; de la serie.&lt;/p&gt;
&lt;h2 id="conclusión-y-próximos-pasos"&gt;Conclusión y próximos pasos&lt;/h2&gt;
&lt;p&gt;Ya tenemos un &lt;strong&gt;indexing pipeline&lt;/strong&gt; funcional de punta a punta: carga los datos, los fragmenta en chunks manejables, los convierte en embeddings y los almacena en una base vectorial lista para consultarse. Esa base es exactamente lo que el &lt;strong&gt;retriever&lt;/strong&gt; necesita para hacer su trabajo.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo construiremos el &lt;strong&gt;retrieval pipeline&lt;/strong&gt;: cómo el retriever consulta esta base vectorial, arma el contexto y lo combina con el prompt del usuario antes de llegar al LLM.&lt;/p&gt;</content:encoded></item><item><title>Arquitectura de un RAG: Indexing y Retrieval Pipeline</title><link>https://blog.dacadev.com/generative-ai/rag/arquitectura-de-un-rag/</link><pubDate>Tue, 14 Jul 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/rag/arquitectura-de-un-rag/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Descubre la arquitectura de un sistema RAG: el indexing pipeline, el retrieval pipeline y cómo evaluar su calidad con el RAG Triad.</description><media:content url="https://blog.dacadev.com/images/generative-ai/rag/02-arquitectura-de-un-rag/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#los-dos-pipelines-de-un-sistema-rag"&gt;Los dos pipelines de un sistema RAG&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-indexing-pipeline"&gt;El indexing pipeline&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-retrieval-pipeline"&gt;El retrieval pipeline&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#arquitectura-completa"&gt;Arquitectura completa&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#evaluación"&gt;Evaluación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión-y-próximos-pasos"&gt;Conclusión y próximos pasos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En el &lt;a href="https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/"



 


&gt;artículo anterior de esta serie&lt;/a&gt; se habló de qué es un RAG y cómo ayuda a proveer de conocimiento privado y actualizado a los &lt;strong&gt;LLMs&lt;/strong&gt;. Ahora abordemos el tema de &lt;em&gt;&amp;ldquo;cómo se estructura internamente un &lt;strong&gt;sistema RAG (Retrieval Augmented Generation)&lt;/strong&gt;&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este es el segundo artículo de la serie &lt;strong&gt;RAGs&lt;/strong&gt;. Al terminar comprenderás la arquitectura de un RAG: el &lt;strong&gt;indexing pipeline&lt;/strong&gt; que prepara el conocimiento, el &lt;strong&gt;retrieval pipeline&lt;/strong&gt; que responde en tiempo real, y el componente de &lt;strong&gt;evaluación&lt;/strong&gt; que garantiza la calidad en producción. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="los-dos-pipelines-de-un-sistema-rag"&gt;Los dos pipelines de un sistema RAG&lt;/h2&gt;
&lt;p&gt;Un sistema RAG se puede descomponer en dos pipelines complementarios: el &lt;strong&gt;indexing pipeline&lt;/strong&gt; (pipeline de indexación) y el &lt;strong&gt;retrieval pipeline&lt;/strong&gt; (pipeline de recuperación).&lt;/p&gt;
&lt;p&gt;La distinción es fundamentalmente temporal. El indexing pipeline se ejecuta de forma &lt;strong&gt;offline o asíncrona&lt;/strong&gt;, preparando la base de conocimiento. El retrieval pipeline se ejecuta en &lt;strong&gt;tiempo real&lt;/strong&gt; y es el encargado de responder a cada petición del usuario consumiendo el conocimiento ya indexado.&lt;/p&gt;
&lt;h2 id="el-indexing-pipeline"&gt;El indexing pipeline&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;indexing pipeline&lt;/strong&gt; es el responsable de tomar los datos crudos, dividirlos en fragmentos procesables, convertirlos en vectores numéricos —los &lt;strong&gt;embeddings&lt;/strong&gt;— y almacenarlos en una base de datos, típicamente una &lt;strong&gt;base de datos vectorial&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El flujo parte de la fuente de datos y encadena cuatro etapas de procesamiento hasta almacenar el conocimiento en la base de datos vectorial:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 F[&amp;#34;📄 Fuente de datos&amp;#34;] --&amp;gt; CA[&amp;#34;📥 Carga&amp;#34;]
 CA --&amp;gt; FR[&amp;#34;✂️ Fragmentación&amp;#34;]
 FR --&amp;gt; CO[&amp;#34;🧮 Conversión&amp;#34;]
 CO --&amp;gt; AL[(&amp;#34;🗄️ Almacenamiento&amp;#34;)]
&lt;/pre&gt;

&lt;p&gt;Cada nodo del diagrama se corresponde con una etapa lógica bien definida:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuente de datos&lt;/strong&gt;: el origen de la información cruda —bases de datos, APIs, archivos o páginas web— que alimenta el sistema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carga&lt;/strong&gt;: se conecta a las fuentes externas, extrae los documentos y parsea su contenido a texto plano.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fragmentación&lt;/strong&gt;: divide los documentos extensos en piezas más pequeñas y manejables, denominadas &lt;strong&gt;chunks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversión&lt;/strong&gt;: transforma cada chunk en un vector numérico —el &lt;strong&gt;embedding&lt;/strong&gt;— que captura su significado semántico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Almacenamiento&lt;/strong&gt;: persiste los embeddings en una &lt;strong&gt;base de datos vectorial&lt;/strong&gt;, lista para la fase de recuperación.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El indexing pipeline no se ejecuta en cada consulta. Su activación depende de la volatilidad de la fuente de datos y suele responder a &lt;strong&gt;disparadores&lt;/strong&gt; concretos: la carga de un documento nuevo, la actualización de un registro o una reindexación programada. Al ser un proceso offline, podemos permitirnos operaciones costosas sin afectar la latencia de respuesta al usuario.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Tanto la estrategia de &lt;strong&gt;chunking&lt;/strong&gt; como la generación de &lt;strong&gt;embeddings&lt;/strong&gt; son decisiones de diseño con un impacto directo en la calidad del sistema. Las abordaremos en profundidad más adelante en la serie.&lt;/p&gt;
&lt;h2 id="el-retrieval-pipeline"&gt;El retrieval pipeline&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;retrieval pipeline&lt;/strong&gt; es el que opera en tiempo real. Su responsabilidad es analizar la petición del usuario, recuperar de la base de datos vectorial los fragmentos de información más relacionados con ella, inyectarlos en el prompt junto con la consulta original, enviar el resultado al LLM y devolver la respuesta.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 U[&amp;#34;👤 Usuario&amp;lt;br/&amp;gt;(prompt)&amp;#34;] --&amp;gt; R[&amp;#34;🔎 Retriever&amp;#34;]
 R --&amp;gt;|&amp;#34;search query&amp;#34;| DB[(&amp;#34;🗄️ Vector DB&amp;lt;br/&amp;gt;memoria no paramétrica&amp;#34;)]
 DB --&amp;gt;|&amp;#34;fetch information&amp;#34;| R
 R --&amp;gt;|&amp;#34;prompt + contexto&amp;#34;| L[&amp;#34;🧠 LLM&amp;lt;br/&amp;gt;memoria paramétrica&amp;#34;]
 L --&amp;gt; RESP[&amp;#34;💬 Respuesta&amp;#34;]
&lt;/pre&gt;

&lt;p&gt;Este flujo introduce una distinción conceptual relevante entre dos tipos de memoria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memoria paramétrica&lt;/strong&gt;: el conocimiento codificado en los pesos del LLM durante su entrenamiento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria no paramétrica&lt;/strong&gt;: el conocimiento externo almacenado en la base de datos vectorial, que el sistema consulta dinámicamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El retrieval pipeline es, en esencia, el mecanismo que combina ambas memorias para producir una respuesta fundamentada y este se organiza en tres fases secuenciales, cada una soportada por un componente:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[&amp;#34;🔎 Retrieval&amp;lt;br/&amp;gt;recupera contexto&amp;#34;] --&amp;gt; B[&amp;#34;🧩 Augmentation&amp;lt;br/&amp;gt;construye el prompt&amp;#34;]
 B --&amp;gt; G[&amp;#34;🧠 Generation&amp;lt;br/&amp;gt;genera la respuesta&amp;#34;]
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retrieval&lt;/strong&gt;: el &lt;strong&gt;Retriever&lt;/strong&gt; es el componente central del RAG. Busca en la base de conocimiento y recupera los fragmentos relevantes para la consulta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Augmentation&lt;/strong&gt;: la capa de &lt;strong&gt;gestión de prompts&lt;/strong&gt; combina la información recuperada con la petición original para construir el prompt final.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generation&lt;/strong&gt;: el &lt;strong&gt;componente LLM&lt;/strong&gt; genera la respuesta definitiva. Puede apoyarse en modelos fundacionales o afinados, de código abierto o cerrado.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La calidad de la respuesta está acotada por la fase de &lt;em&gt;Retrieval&lt;/em&gt;. Si el Retriever recupera fragmentos irrelevantes, ninguna capacidad del LLM compensará ese contexto deficiente. Optimizar la recuperación suele rendir más que cambiar a un modelo más potente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="arquitectura-completa"&gt;Arquitectura completa&lt;/h2&gt;
&lt;p&gt;Ambos pipelines no operan de forma aislada; convergen en la &lt;strong&gt;base de conocimiento&lt;/strong&gt;. El indexing pipeline la construye y la mantiene actualizada, mientras que el retrieval pipeline la consulta para fundamentar cada respuesta.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/02-arquitectura-de-un-rag/rag-architecture_hu_d6115f518ece95d9.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Esta arquitectura desacoplada es lo que confiere al patrón RAG su principal ventaja operativa: actualizar el conocimiento del sistema no requiere reentrenar el modelo, sino únicamente ejecutar el indexing pipeline sobre los nuevos datos.&lt;/p&gt;
&lt;h2 id="evaluación"&gt;Evaluación&lt;/h2&gt;
&lt;p&gt;Hasta aquí hemos descrito los dos componentes estructurales del sistema. Sin embargo, en un entorno de producción es crucial incorporar un tercer componente: la &lt;strong&gt;evaluación&lt;/strong&gt;, encargada de medir si las respuestas que entrega el sistema son correctas y relevantes.&lt;/p&gt;
&lt;p&gt;Un punto de partida sólido es el &lt;strong&gt;RAG Triad&lt;/strong&gt; propuesto por &lt;a href="https://truera.com/ai-quality-education/generative-ai-rags/what-is-the-rag-triad/"




 target="_blank"
 


&gt;TruEra&lt;/a&gt;, un marco que evalúa la coherencia entre las tres piezas de una interacción: la consulta del usuario, el contexto recuperado y la respuesta generada.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/02-arquitectura-de-un-rag/rag-triad_hu_81bc0f3ab1929222.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;El marco define tres validaciones, una por cada arista del triángulo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Context relevance&lt;/strong&gt;: ¿el contexto recuperado de la base de conocimiento es relevante para la consulta del usuario? Evalúa la calidad de la fase de &lt;em&gt;Retrieval&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groundedness&lt;/strong&gt;: ¿la respuesta del LLM se apoya fielmente en el contexto recuperado, en lugar de alucinar? Evalúa que el modelo utilice la información proporcionada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Answer relevance&lt;/strong&gt;: ¿la respuesta final responde efectivamente a la consulta del usuario? Evalúa la utilidad del resultado.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Un sistema RAG sin evaluación es un sistema opaco. Sin medir &lt;em&gt;context relevance&lt;/em&gt;, &lt;em&gt;groundedness&lt;/em&gt; y &lt;em&gt;answer relevance&lt;/em&gt; no podrás distinguir si un fallo proviene de una recuperación deficiente o de una generación defectuosa, lo que vuelve la depuración prácticamente imposible.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión-y-próximos-pasos"&gt;Conclusión y próximos pasos&lt;/h2&gt;
&lt;p&gt;La arquitectura de un RAG se sostiene sobre dos pipelines desacoplados —indexación offline y recuperación en tiempo real— que convergen en una base de conocimiento vectorial, más un componente transversal de evaluación que garantiza su fiabilidad en producción.&lt;/p&gt;
&lt;p&gt;Con este mapa arquitectónico claro, las próximas entregas de la serie &lt;strong&gt;RAGs&lt;/strong&gt; profundizarán en cada pieza:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estrategias de &lt;strong&gt;chunking&lt;/strong&gt;: cómo fragmentar los documentos sin perder contexto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embeddings&lt;/strong&gt;: qué son, cómo se generan y cómo capturan el significado semántico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bases de datos vectoriales&lt;/strong&gt;: indexación y búsqueda por similitud.&lt;/li&gt;
&lt;li&gt;Métricas y herramientas para evaluar sistemas RAG de forma rigurosa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En el siguiente artículo comenzaremos a construir el indexing pipeline, empezando por la fase de carga y fragmentación de datos.&lt;/p&gt;</content:encoded></item><item><title>RAG: Qué es y Cómo Funciona Retrieval Augmented Generation</title><link>https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/</link><pubDate>Mon, 13 Jul 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/rag/que-es-un-rag/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Descubre qué es un RAG, cómo Retrieval Augmented Generation resuelve las alucinaciones de los LLMs y por qué es clave en la IA generativa.</description><media:content url="https://blog.dacadev.com/images/generative-ai/rag/01-que-es-un-rag/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#las-limitaciones-estructurales-de-los-llms"&gt;Las limitaciones estructurales de los LLMs&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#alucinaciones"&gt;Alucinaciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conocimiento-con-fecha-de-corte"&gt;Conocimiento con fecha de corte&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ausencia-de-conocimiento-privado"&gt;Ausencia de conocimiento privado&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#alternativas-antes-de-llegar-a-rag"&gt;Alternativas antes de llegar a RAG&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#agentes"&gt;Agentes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fine-tuning"&gt;Fine-tuning&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#qué-es-un-rag-retrieval-augmented-generation"&gt;Qué es un RAG (Retrieval Augmented Generation)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-funciona-un-rag-a-alto-nivel"&gt;Cómo funciona un RAG a alto nivel&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ventajas-de-adoptar-un-rag"&gt;Ventajas de adoptar un RAG&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Supongamos que debemos desplegar un asistente conversacional sobre la documentación interna de una organización: manuales técnicos, contratos y políticas que se actualizan cada semana. El modelo base responde con fluidez sobre conocimiento general, pero desconoce por completo esos documentos privados e inventa respuestas con total seguridad cuando se le pregunta por ellos. Aquí es donde &lt;strong&gt;RAG (Retrieval Augmented Generation)&lt;/strong&gt; se convierte en la aproximación arquitectónica más rentable para dotar a un &lt;strong&gt;LLM&lt;/strong&gt; de información precisa, privada y actualizada.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este es el primer artículo de la serie &lt;strong&gt;RAGs&lt;/strong&gt;. Al terminar podrás explicar qué es un RAG, cómo funciona a alto nivel y por qué se ha vuelto una pieza central en el diseño de aplicaciones de IA generativa. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="las-limitaciones-estructurales-de-los-llms"&gt;Las limitaciones estructurales de los LLMs&lt;/h2&gt;
&lt;p&gt;Antes de definir qué es un RAG, es crucial entender las limitaciones de los LLMs que esta técnica resuelve. Un modelo de lenguaje, por potente que sea, arrastra tres restricciones inherentes a la forma en que fue entrenado.&lt;/p&gt;
&lt;h3 id="alucinaciones"&gt;Alucinaciones&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;alucinaciones&lt;/strong&gt; son uno de los problemas más severos de los LLMs. Consisten en que el modelo responde con información incorrecta o inventada, pero con un nivel de confianza que induce al usuario a asumirla como válida.&lt;/p&gt;
&lt;p&gt;En aplicaciones comerciales esto representa un riesgo directo: si la información de entrada es incorrecta, todo el proceso que dependa de ella heredará el error. Consideremos un asistente en el dominio médico; una respuesta errónea sobre la dosificación de un medicamento puede tener consecuencias fatales. La confianza aparente del modelo no es un indicador de veracidad.&lt;/p&gt;
&lt;h3 id="conocimiento-con-fecha-de-corte"&gt;Conocimiento con fecha de corte&lt;/h3&gt;
&lt;p&gt;Los LLMs se entrenan con grandes volúmenes de datos públicos —libros, artículos, páginas web— hasta una &lt;strong&gt;fecha de corte&lt;/strong&gt; determinada. Todo evento posterior a esa fecha queda fuera de su conocimiento.&lt;/p&gt;
&lt;p&gt;Si un modelo fue entrenado con datos hasta 2025, no dispone de información sobre hechos ocurridos después. Ante una consulta de este tipo, el modelo o bien reconoce su desconocimiento, o bien alucina para completar la respuesta.&lt;/p&gt;
&lt;h3 id="ausencia-de-conocimiento-privado"&gt;Ausencia de conocimiento privado&lt;/h3&gt;
&lt;p&gt;Al entrenarse sobre datos públicos, los LLMs no tienen acceso a datos privados: manuales internos, contratos, bases de conocimiento corporativas o historiales de clientes. Esta es una limitación esperada, pero decisiva.&lt;/p&gt;
&lt;p&gt;La alternativa que uno creeria de adjuntar todos los documentos privados en cada conversación no es técnicamente viable, implica un consumo desmedido de tokens y latencia en cada llamada, además de chocar contra los límites de la ventana de contexto.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 L[🧠 LLM entrenado con datos públicos]
 L --&amp;gt; A[❌ Alucinaciones&amp;lt;br/&amp;gt;respuestas inventadas]
 L --&amp;gt; B[❌ Fecha de corte&amp;lt;br/&amp;gt;sin datos recientes]
 L --&amp;gt; C[❌ Sin conocimiento privado&amp;lt;br/&amp;gt;manuales, contratos, datos internos]
&lt;/pre&gt;

&lt;h2 id="alternativas-antes-de-llegar-a-rag"&gt;Alternativas antes de llegar a RAG&lt;/h2&gt;
&lt;p&gt;RAG no es la única técnica para inyectar conocimiento en un LLM. Es importante situarla frente a otras dos aproximaciones habituales y comprender sus contrapartidas.&lt;/p&gt;
&lt;h3 id="agentes"&gt;Agentes&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;agentes&lt;/strong&gt; han ganado tracción gracias a las amplias ventanas de contexto actuales, que permiten al modelo procesar grandes cantidades de información para resolver tareas complejas de manera autonoma. Sin embargo, cuando el volumen documental es elevado, el agente debería leer toda la información en cada ejecución.&lt;/p&gt;
&lt;p&gt;Incluso apoyándose en mecanismos de caché, el costo en tokens y tiempo escala de forma prohibitiva. Procesar íntegramente un manual extenso solo para resolver una consulta puntual es análogo a recorrer una biblioteca completa para responder una única pregunta: funciona, pero es ineficiente.&lt;/p&gt;
&lt;h3 id="fine-tuning"&gt;Fine-tuning&lt;/h3&gt;
&lt;p&gt;El &lt;strong&gt;fine-tuning&lt;/strong&gt; consiste en reentrenar un LLM sobre datos específicos para ajustar sus pesos y especializarlo en un dominio. Esta técnica genera una nueva versión del modelo con el conocimiento incorporado directamente en sus parámetros.&lt;/p&gt;
&lt;p&gt;El problema es su costo operativo: requiere tiempo, recursos y datos de entrenamiento cuidados. Además, cada vez que la información cambia, es necesario reentrenar. En un escenario donde los datos se actualizan cada semana, o cada día, el fine-tuning se vuelve inviable como estrategia principal.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Estas alternativas no son deficientes; simplemente resuelven problemas distintos. Los &lt;strong&gt;agentes&lt;/strong&gt; son idóneos para explorar código o ejecutar flujos de trabajo dinámicos, y el &lt;strong&gt;fine-tuning&lt;/strong&gt; brilla cuando el conocimiento es estable y muy específico. RAG destaca precisamente donde estas fallan: conocimiento amplio, cambiante y verificable.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-un-rag-retrieval-augmented-generation"&gt;Qué es un RAG (Retrieval Augmented Generation)&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;RAG (Retrieval Augmented Generation)&lt;/strong&gt; es una técnica que recupera información relevante desde una fuente de datos externa y la incorpora al contexto del LLM en tiempo de inferencia, de modo que el modelo pueda responder con información verídica y actualizada.&lt;/p&gt;
&lt;p&gt;La idea central es desacoplar el conocimiento del modelo. En lugar de codificar los datos en los pesos, como hace el fine-tuning, o de arrastrar todo el corpus en cada llamada, como hace un agente, el RAG selecciona únicamente los fragmentos pertinentes para cada consulta y los añade al prompt.&lt;/p&gt;
&lt;p&gt;Analicemos un caso concreto. Supongamos un modelo cuyo conocimiento llega hasta mayo de 2026 y le preguntamos por un evento posterior a esa fecha:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prompt: ¿Qué equipos jugarán la semifinal de la Copa del Mundo 2026?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LLM: Lo siento, no dispongo de información sobre los equipos que jugarán
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; la semifinal de la Copa del Mundo 2026. Mi conocimiento está
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; actualizado hasta mayo de 2026.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora enriquezcamos ese mismo prompt con un bloque de contexto recuperado desde una fuente externa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prompt: ¿Qué equipos jugarán la semifinal de la Copa del Mundo 2026?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;----- contexto inyectado -----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Contexto: Los equipos que disputarán la semifinal de la Copa del Mundo 2026 son:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Francia
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- España
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Inglaterra
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Argentina
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;----- fin del contexto -----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LLM: Los equipos que jugarán la semifinal de la Copa del Mundo 2026 son
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Francia, España, Inglaterra y Argentina.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La diferencia está en el campo de &lt;strong&gt;contexto&lt;/strong&gt;. Ese bloque, recuperado dinámicamente, es lo que permite al modelo responder con precisión sin haber sido entrenado con esa información. En esto consiste, en esencia, un RAG: obtener el conocimiento relevante desde una fuente de datos y aumentar con él el contexto del LLM.&lt;/p&gt;
&lt;p&gt;Si pensamos esto en el caso de la documentación extensa, un RAG permite extraer las secciones pertinentes de un manual o contrato y añadirlas al prompt, de modo que el modelo pueda responder con información verídica y actualizada sin necesidad de reentrenar ni de procesar todo el documento en cada consulta. Es decir que solo cargamos una parte del documento y no todo su contenido.&lt;/p&gt;
&lt;h2 id="cómo-funciona-un-rag-a-alto-nivel"&gt;Cómo funciona un RAG a alto nivel&lt;/h2&gt;
&lt;p&gt;Su nombre describe con exactitud las tres fases del proceso: &lt;strong&gt;Retrieval&lt;/strong&gt; (recuperación), &lt;strong&gt;Augmented&lt;/strong&gt; (aumento) y &lt;strong&gt;Generation&lt;/strong&gt; (generación).&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/rag/01-que-es-un-rag/rag-diagram_hu_ae75a4373e1dc204.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retrieval (Recuperación)&lt;/strong&gt;: ante una consulta del usuario, el sistema busca en una base de conocimiento externa los fragmentos de información más relevantes. Esta búsqueda suele apoyarse en similitud semántica, un mecanismo que abordaremos en detalle más adelante en la serie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Augmented (Aumento)&lt;/strong&gt;: los fragmentos recuperados se combinan con la consulta original para construir un prompt enriquecido. El modelo recibe así, junto a la pregunta, el contexto necesario para responderla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generation (Generación)&lt;/strong&gt;: el LLM genera la respuesta final apoyándose en el contexto inyectado, no solo en su conocimiento paramétrico.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La calidad de un RAG depende directamente de la fase de recuperación. Si los fragmentos recuperados son irrelevantes o incompletos, el modelo generará una respuesta pobre por muy capaz que sea. En RAG, la máxima &amp;ldquo;basura entra, basura sale&amp;rdquo; aplica con especial fuerza.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="ventajas-de-adoptar-un-rag"&gt;Ventajas de adoptar un RAG&lt;/h2&gt;
&lt;p&gt;Más allá de mitigar las limitaciones descritas, el patrón RAG ofrece beneficios concretos de ingeniería:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia y costo&lt;/strong&gt;: aporta conocimiento profundo y específico al modelo sin el costo de reentrenar ni de procesar el documento completo en cada llamada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Información verificable&lt;/strong&gt;: al recuperar fragmentos de fuentes reales, el modelo puede &lt;strong&gt;citar&lt;/strong&gt; su origen, de modo que el usuario contraste la respuesta con la fuente original.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actualización simple&lt;/strong&gt;: mantener el sistema al día se reduce a actualizar la base de conocimiento, sin tocar el modelo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reducción de alucinaciones&lt;/strong&gt;: al fundamentar la respuesta en datos recuperados, disminuye de forma significativa la probabilidad de que el modelo invente información.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Un RAG reduce las alucinaciones, pero no las elimina por completo. El modelo aún puede malinterpretar el contexto recuperado o combinarlo con su conocimiento paramétrico de forma incorrecta. El diseño del prompt y la evaluación rigurosa siguen siendo responsabilidad del ingeniero.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Agentes Especializados: Colaboración Multi-Agente y Nuevas Fronteras</title><link>https://blog.dacadev.com/generative-ai/agents/agentes-especializados-multi-agente/</link><pubDate>Thu, 21 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/agentes-especializados-multi-agente/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Descubre las fronteras de la IA con agentes especializados. Aprende sobre colaboración multi-agente, agentes multimodales, coding agents y agentes ultra-eficientes (Tiny Agents).</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/03-agentes-especializados/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-universo-de-los-agentes-especializados"&gt;El Universo de los Agentes Especializados&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#colaboración-multi-agente-agente-único-vs-multi-agente"&gt;Colaboración Multi-Agente: Agente Único vs. Multi-Agente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-arquitectura-del-agente-supervisor-supervisor-agent"&gt;La Arquitectura del Agente Supervisor (Supervisor Agent)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-agente-multimodal"&gt;El Agente Multimodal&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-coding-agent-agente-de-programación"&gt;El Coding Agent (Agente de Programación)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tiny-agents-resolviendo-la-eficiencia-y-los-costos"&gt;Tiny Agents: Resolviendo la Eficiencia y los Costos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-creación-de-modelos-más-pequeños-distillation"&gt;1. Creación de Modelos más Pequeños (Distillation)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-arquitecturas-de-llm-más-eficientes-moe-y-ssm"&gt;2. Arquitecturas de LLM más Eficientes (MoE y SSM)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-disminución-del-costo-de-inferencia-speculative-decoding"&gt;3. Disminución del Costo de Inferencia (Speculative Decoding)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#4-modelos-con-mayor-performance-en-razonamiento-hierarchical-decoding"&gt;4. Modelos con Mayor Performance en Razonamiento (Hierarchical Decoding)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando un solo agente de &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; intenta hacerlo todo —desde buscar en internet y escribir código hasta redactar correos o gestionar la base de datos—, suele toparse con un cuello de botella. Al igual que en un equipo de desarrollo de software no le pedirías a un diseñador UX que configure el cluster de Kubernetes, en la &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; el futuro pertenece a los &lt;strong&gt;Agentes Especializados&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿Cómo logramos que múltiples agentes colaboren entre sí de forma armoniosa?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Qué nuevas capacidades traen los agentes multimodales y de programación?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Y cómo resolvemos el gran problema del costo y consumo de tokens de estos sistemas?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo profundizaremos enlos agentes especializados. Exploraremos la arquitectura de colaboración &lt;strong&gt;Multi-Agente&lt;/strong&gt;, descubriremos el potencial de los &lt;strong&gt;Agentes Multimodales&lt;/strong&gt; y &lt;strong&gt;Coding Agents&lt;/strong&gt;, y analizaremos las estrategias para construir &lt;strong&gt;Tiny Agents&lt;/strong&gt; sumamente eficientes. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="el-universo-de-los-agentes-especializados"&gt;El Universo de los Agentes Especializados&lt;/h2&gt;
&lt;p&gt;A medida que las necesidades de automatización se vuelven más complejas, los desarrolladores de IA hemos aprendido a fragmentar los problemas en lugar de crear un único agente monolítico. Esto nos lleva a cuatro categorías principales de especialización:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 %% Categorías de Agentes Especializados
 Root[🧬 Agentes Especializados]

 Root --&amp;gt; MAC[🤝 Colaboración Multi-Agente]
 Root --&amp;gt; MM[👁️ Agentes Multimodales]
 Root --&amp;gt; CA[💻 Coding Agents]
 Root --&amp;gt; TA[&amp;#34;⚡ Tiny Agents (Eficiencia)&amp;#34;]

 MAC --&amp;gt; MAC_Desc[&amp;#34;Agentes que dividen tareas y colaboran entre sí&amp;#34;]
 MM --&amp;gt; MM_Desc[&amp;#34;Comprenden y generan texto, audio, imagen y video&amp;#34;]
 CA --&amp;gt; CA_Desc[&amp;#34;Escriben, ejecutan y auto-depuran código&amp;#34;]
 TA --&amp;gt; TA_Desc[&amp;#34;Modelos compactos optimizados para bajo costo e inferencia rápida&amp;#34;]
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="colaboración-multi-agente-agente-único-vs-multi-agente"&gt;Colaboración Multi-Agente: Agente Único vs. Multi-Agente&lt;/h2&gt;
&lt;p&gt;En un sistema de &lt;strong&gt;Agente Único (Single Agent)&lt;/strong&gt;, un solo LLM generalista se encarga de procesar la consulta, gestionar la memoria, seleccionar las herramientas y generar el plan final. Aunque es un diseño sencillo y efectivo para tareas contenidas, genera una enorme presión sobre la ventana de contexto del modelo y aumenta drásticamente el riesgo de alucinaciones a medida que sumamos más herramientas al arsenal.&lt;/p&gt;
&lt;p&gt;Por el contrario, un &lt;strong&gt;Sistema Multi-Agente (Multi-Agent System)&lt;/strong&gt; divide las responsabilidades entre varios agentes especializados que interactúan entre sí. Cada agente cuenta con un rol definido, una memoria local ajustada a su función y un conjunto limitado de herramientas específicas. Esto reduce el ruido, optimiza el tamaño de los prompts y permite estructurar flujos de trabajo altamente modulares.&lt;/p&gt;
&lt;p&gt;Comparemos estas dos aproximaciones de manera visual:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Multi[&amp;#34;Sistema Multi-Agente (Multi-Agent)&amp;#34;]
 direction TB
 Q2[👤 Consulta] --&amp;gt; Supervisor[👑 Agente Supervisor]
 Supervisor &amp;lt;--&amp;gt; AgentA[💻 Agente de Código]
 Supervisor &amp;lt;--&amp;gt; AgentB[💬 Agente de Mensajería]
 Supervisor &amp;lt;--&amp;gt; AgentC[🔍 Agente de Búsqueda]
 AgentA &amp;amp; AgentB &amp;amp; AgentC --&amp;gt; Ans2[🎯 Respuesta]
 end

 subgraph Single[&amp;#34;Un Solo Agente (Single Agent)&amp;#34;]
 direction TB
 Q1[👤 Consulta] --&amp;gt; SA[🧠 Agente Generalista]
 subgraph SABrain[&amp;#34;Cerebro Complejo&amp;#34;]
 direction LR
 LLM1[Reasoning LLM] --- Mem1[(Memoria)]
 LLM1 --- Tools1[🔧 Herramientas]
 LLM1 --- Plan1[📋 Planificación]
 end
 SA --&amp;gt; Ans1[🎯 Respuesta]
 end
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="la-arquitectura-del-agente-supervisor-supervisor-agent"&gt;La Arquitectura del Agente Supervisor (Supervisor Agent)&lt;/h2&gt;
&lt;p&gt;Uno de los patrones de diseño más exitosos en sistemas multi-agente es el de &lt;strong&gt;Agente Supervisor (Supervisor Agent)&lt;/strong&gt;. En este patrón, el supervisor actúa como el &amp;ldquo;director de orquesta&amp;rdquo; o el gestor principal del equipo de desarrollo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El &lt;strong&gt;Supervisor&lt;/strong&gt; recibe la consulta compleja del usuario.&lt;/li&gt;
&lt;li&gt;Analiza qué sub-tareas se necesitan resolver para cumplir la meta y descompone el problema general.&lt;/li&gt;
&lt;li&gt;Asigna cada sub-tarea al agente especialista correspondiente (el Agente de Código, de Búsqueda o de Mensajería), tratándolos prácticamente como si fueran &amp;ldquo;herramientas avanzadas&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Los agentes especialistas procesan las sub-tareas utilizando sus &lt;strong&gt;herramientas específicas&lt;/strong&gt; y devuelven el resultado al supervisor.&lt;/li&gt;
&lt;li&gt;El supervisor consolida las respuestas parciales y, si es necesario, replanifica el flujo antes de entregar la respuesta definitiva al usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En este modelo, el &lt;strong&gt;Agente Supervisor&lt;/strong&gt; suele estar respaldado por el LLM más potente debido a la complejidad que requiere la planificación y asignación de tareas, mientras que los especialistas pueden funcionar perfectamente con modelos más rápidos y económicos.&lt;/p&gt;
&lt;p&gt;Observemos esta sofisticada estructura jerárquica en acción:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Query[👤 Consulta / Query] --&amp;gt; Sup[👑 Agente Supervisor]

 subgraph SupTools[&amp;#34;Agentes como Herramientas (Supervisor)&amp;#34;]
 Sup --- ToolC[💻 Coding Tool]
 Sup --- ToolM[💬 Messaging Tool]
 Sup --- ToolS[🔍 Search Tool]
 end

 Sup &amp;lt;--&amp;gt; CA[💻 Coding Agent]
 Sup &amp;lt;--&amp;gt; MA[💬 Messaging Agent]
 Sup &amp;lt;--&amp;gt; SA[🔍 Search Agent]

 subgraph CATools[&amp;#34;Herramientas del Agente de Código&amp;#34;]
 CA --- T_Py[🐍 python]
 CA --- T_VS[💻 vscode]
 CA --- T_GH[🐙 github]
 end

 subgraph MATools[&amp;#34;Herramientas de Mensajería&amp;#34;]
 MA --- T_Sl[💬 slack]
 MA --- T_Ds[👾 discord]
 end

 subgraph SATools[&amp;#34;Herramientas de Búsqueda&amp;#34;]
 SA --- T_Go[🔍 google]
 SA --- T_Ar[📄 ArXiv]
 SA --- T_Wi[🌐 Wikipedia]
 end
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="el-agente-multimodal"&gt;El Agente Multimodal&lt;/h2&gt;
&lt;p&gt;El mundo real y la web digital no se componen únicamente de texto plano. Para interactuar plenamente con nuestro entorno, necesitamos agentes capaces de operar en múltiples formatos de datos. Aquí es donde los &lt;strong&gt;Agentes Multimodales&lt;/strong&gt; están ganando un enorme terreno.&lt;/p&gt;
&lt;p&gt;La capacidad de que un agente sea multimodal depende enteramente del LLM que actúe como su &amp;ldquo;cerebro&amp;rdquo;. Definimos a un agente como multimodal cuando su modelo subyacente es capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comprender múltiples modalidades (Entrada/Input)&lt;/strong&gt;: El modelo procesa de forma nativa imágenes, archivos PDF estructurados, diagramas, flujos de audio o incluso video sin necesidad de convertirlos previamente a texto mediante software secundario OCR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generar múltiples modalidades (Salida/Output)&lt;/strong&gt;: El agente puede responder dibujando diagramas, generando archivos de audio estructurados, creando código visual interactivo o interactuando directamente en interfaces visuales de usuario (mediante herramientas de &lt;em&gt;Computer Use&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="el-coding-agent-agente-de-programación"&gt;El Coding Agent (Agente de Programación)&lt;/h2&gt;
&lt;p&gt;Uno de los tipos de agentes especializados más populares es el &lt;strong&gt;Coding Agent&lt;/strong&gt;. A diferencia de los asistentes de chat tradicionales (que se limitan a dar sugerencias de código en una ventana de conversación estática), un Coding Agent opera de forma activa sobre entornos de desarrollo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lectura e investigación&lt;/strong&gt;: Lee el código fuente del repositorio y comprende la arquitectura general.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planificación y desarrollo&lt;/strong&gt;: Escribe nuevas funciones, modifica archivos específicos y gestiona el flujo de control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ejecución y pruebas&lt;/strong&gt;: Ejecuta compiladores y motores de pruebas unitarias locales para validar sus cambios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-depuración (Self-debugging)&lt;/strong&gt;: Si el compilador o las pruebas devuelven un error, el agente analiza el mensaje de salida, actualiza su plan, corrige su código y vuelve a ejecutar las pruebas hasta lograr que todo compile y funcione de forma exitosa.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tiny-agents-resolviendo-la-eficiencia-y-los-costos"&gt;Tiny Agents: Resolviendo la Eficiencia y los Costos&lt;/h2&gt;
&lt;p&gt;Aunque los sistemas agénticos son sumamente potentes, tienen un gran inconveniente oculto: &lt;strong&gt;el costo&lt;/strong&gt;. Un agente autónomo puede tomar docenas de pasos secuenciales para resolver una tarea, consumiendo millones de tokens en el proceso sin que el desarrollador o usuario puedan anticipar la cantidad exacta de antemano.&lt;/p&gt;
&lt;p&gt;Para evitar que el uso y costo de agentes se salga de control, la comunidad científica de IA ha desarrollado los &lt;strong&gt;Tiny Agents&lt;/strong&gt;: agentes ultra-eficientes y veloces basados en modelos pequeños optimizados para tareas muy puntuales.&lt;/p&gt;
&lt;p&gt;Existen cuatro categorías clave donde podemos buscar optimizaciones para nuestros agentes:&lt;/p&gt;
&lt;h3 id="1-creación-de-modelos-más-pequeños-distillation"&gt;1. Creación de Modelos más Pequeños (Distillation)&lt;/h3&gt;
&lt;p&gt;Mediante técnicas de &lt;strong&gt;destilación de conocimiento (knowledge distillation)&lt;/strong&gt;, podemos entrenar un modelo pequeño (ej. de 1.5B o 3B parámetros) utilizando las respuestas detalladas y las trayectorias de razonamiento generadas por modelos gigantes (ej. de 405B parámetros). De esta manera, el modelo compacto conserva una alta tasa de acierto en tareas específicas pero a una fracción del costo y tamaño.&lt;/p&gt;
&lt;h3 id="2-arquitecturas-de-llm-más-eficientes-moe-y-ssm"&gt;2. Arquitecturas de LLM más Eficientes (MoE y SSM)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixture of Experts (MoE)&lt;/strong&gt;: Modelos que solo activan una pequeña porción de sus redes neuronales (los &amp;ldquo;expertos&amp;rdquo;) para procesar un token específico, logrando una altísima velocidad de inferencia a bajo costo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Space Models (SSM)&lt;/strong&gt;: Arquitecturas alternativas a los &lt;em&gt;Transformers&lt;/em&gt; tradicionales (como &lt;em&gt;Mamba&lt;/em&gt;) que eliminan el crecimiento cuadrático del costo computacional de la atención en textos extremadamente largos, ideales para procesar enormes repositorios o históricos de conversación.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-disminución-del-costo-de-inferencia-speculative-decoding"&gt;3. Disminución del Costo de Inferencia (Speculative Decoding)&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;decodificación especulativa (speculative decoding)&lt;/strong&gt; utiliza un modelo &amp;ldquo;asistente&amp;rdquo; sumamente pequeño y rápido para predecir (borrador) secuencialmente varios tokens de respuesta de manera rápida. Luego, el LLM principal (más grande y preciso) evalúa y valida estos tokens especulados en un solo paso paralelo, acelerando drásticamente el tiempo de generación final.&lt;/p&gt;
&lt;h3 id="4-modelos-con-mayor-performance-en-razonamiento-hierarchical-decoding"&gt;4. Modelos con Mayor Performance en Razonamiento (Hierarchical Decoding)&lt;/h3&gt;
&lt;p&gt;Consiste en implementar patrones lógicos jerárquicos y recursivos donde el agente descompone internamente el problema de forma recursiva antes de generar texto, evitando la generación redundante de tokens innecesarios y optimizando cada paso de inferencia al máximo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El camino de los sistemas monolíticos hacia las redes de &lt;strong&gt;Agentes Especializados&lt;/strong&gt; es una evolución natural y sumamente emocionante. Al combinar la orquestación modular de &lt;strong&gt;sistemas multi-agente&lt;/strong&gt;, la flexibilidad de las capacidades &lt;strong&gt;multimodales&lt;/strong&gt; y las optimizaciones de costo de los &lt;strong&gt;Tiny Agents&lt;/strong&gt;, podemos diseñar soluciones de Inteligencia Artificial que no solo parezcan sacadas de la ciencia ficción, sino que sean escalables, rentables y robustas en el mundo real.&lt;/p&gt;
&lt;p&gt;¡Con este artículo cerramos nuestra trilogía introductoria sobre la teoría y arquitectura de agentes de Inteligencia Artificial! En los próximos tutoriales prácticos empezaremos a picar código y a construir nuestros propios agentes colaborativos. ¡Manos a la obra!&lt;/p&gt;</content:encoded></item><item><title>Sistemas Agénticos: El Espectro de Autonomía y Desarrollo Responsable</title><link>https://blog.dacadev.com/generative-ai/agents/sistemas-agenticos-autonomia/</link><pubDate>Mon, 18 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/sistemas-agenticos-autonomia/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Aprende qué es un sistema agéntico, explora el espectro de autonomía desde prompting hasta agentes autónomos, y descubre cómo evaluarlos y desarrollarlos con seguridad.</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/02-sistemas-agenticos/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-un-sistema-agéntico"&gt;¿Qué es un Sistema Agéntico?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-espectro-de-autonomía"&gt;El Espectro de Autonomía&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#nivel-1-prompting-estándar-baja-autonomía"&gt;Nivel 1: Prompting Estándar (Baja Autonomía)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nivel-2-pasos-fijos-autonomía-orquestada--rag"&gt;Nivel 2: Pasos Fijos (Autonomía Orquestada / RAG)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nivel-3-agente-autónomo-alta-autonomía"&gt;Nivel 3: Agente Autónomo (Alta Autonomía)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#casos-de-uso-del-mundo-real"&gt;Casos de Uso del Mundo Real&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#desarrollo-y-uso-responsable-de-agentes-ia"&gt;Desarrollo y Uso Responsable de Agentes IA&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-humano-en-el-bucle-human-in-the-loop"&gt;1. Humano en el Bucle (Human-in-the-Loop)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-guardrails-límites-y-barreras-técnicas"&gt;2. Guardrails (Límites y Barreras Técnicas)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-mitigación-de-desinformación-y-sesgos"&gt;3. Mitigación de Desinformación y Sesgos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#evaluando-sistemas-agénticos-un-desafío-complejo"&gt;Evaluando Sistemas Agénticos: Un Desafío Complejo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando empezamos a programar con &lt;strong&gt;LLMs&lt;/strong&gt; (Large Language Models), a menudo nos quedamos en la fase de &amp;ldquo;pregunta-respuesta&amp;rdquo;. Le envías un prompt al modelo y este te devuelve una respuesta inmediata. Pero el verdadero poder de la &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; (IA) surge cuando le damos libertad al modelo para actuar por sí mismo, tomar decisiones y corregir su camino.&lt;/p&gt;
&lt;p&gt;Aquí es donde entramos al tema de los &lt;strong&gt;Sistemas Agénticos&lt;/strong&gt;. Te has preguntado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿cuánta libertad debería tener realmente una IA?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Cómo nos aseguramos de que no tome acciones destructivas?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Cómo medimos si está haciendo bien su trabajo?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás qué define a un sistema agéntico, exploraremos el espectro de autonomía desde un simple prompt hasta agentes 100% autónomos, y analizaremos las mejores prácticas de desarrollo responsable y evaluación de sistemas agénticos. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="qué-es-un-sistema-agéntico"&gt;¿Qué es un Sistema Agéntico?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Un sistema se considera &lt;strong&gt;agéntico&lt;/strong&gt; en la medida en que el LLM tiene el control para tomar decisiones, elegir herramientas y definir los pasos a seguir para alcanzar un objetivo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A diferencia de un software tradicional basado puramente en reglas rígidas y flujos de control fijos (&lt;code&gt;if/else&lt;/code&gt;), un sistema agéntico exhibe un &lt;strong&gt;comportamiento orientado a metas&lt;/strong&gt; (goal-directed behavior). Nosotros le decimos el &lt;em&gt;qué&lt;/em&gt; (el objetivo final) y el agente decide el &lt;em&gt;cómo&lt;/em&gt; (el plan de ejecución).&lt;/p&gt;
&lt;p&gt;No obstante, la autonomía no es un interruptor binario de &amp;ldquo;todo o nada&amp;rdquo;. Existe un amplio espectro de control que podemos otorgar a nuestros agentes, dependiendo de la criticidad de la tarea y de los límites que queramos establecer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-espectro-de-autonomía"&gt;El Espectro de Autonomía&lt;/h2&gt;
&lt;p&gt;Dependiendo del diseño del sistema, un agente de IA puede tener diferentes grados de libertad. En la práctica, podemos clasificar la autonomía en tres grandes niveles:&lt;/p&gt;
&lt;h3 id="nivel-1-prompting-estándar-baja-autonomía"&gt;Nivel 1: Prompting Estándar (Baja Autonomía)&lt;/h3&gt;
&lt;p&gt;Es el nivel básico. El usuario envía un prompt, el LLM procesa la solicitud utilizando únicamente su conocimiento interno y genera una respuesta directa. No hay uso de herramientas externas ni toma de decisiones sobre el flujo de ejecución. El control es 100% del usuario.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 P[User Prompt] --&amp;gt; LLM[🧠 LLM Tradicional] --&amp;gt; Ans1[Respuesta Directa]
&lt;/pre&gt;

&lt;h3 id="nivel-2-pasos-fijos-autonomía-orquestada--rag"&gt;Nivel 2: Pasos Fijos (Autonomía Orquestada / RAG)&lt;/h3&gt;
&lt;p&gt;En este nivel, el agente está integrado dentro de un flujo de trabajo predefinido (orquestado). Por ejemplo, un sistema &lt;strong&gt;RAG&lt;/strong&gt; (Generación Aumentada por Recuperación) primero ejecuta una búsqueda vectorial en una base de datos de manera obligatoria (Paso 1) y luego le pasa ese contexto al LLM para que redacte la respuesta final (Paso 2). El modelo tiene cierta autonomía para elegir herramientas locales o resumir la información, pero no puede alterar el flujo global de los pasos.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 P2[User Prompt] --&amp;gt; S1[🔍 Paso 1: Búsqueda Vectorial]
 S1 --&amp;gt; S2[🧠 Paso 2: Razonamiento y Herramientas]
 S2 --&amp;gt; Ans2[Respuesta Final]
&lt;/pre&gt;

&lt;h3 id="nivel-3-agente-autónomo-alta-autonomía"&gt;Nivel 3: Agente Autónomo (Alta Autonomía)&lt;/h3&gt;
&lt;p&gt;Aquí el agente tiene total libertad dentro de un bucle de ejecución interactivo. El LLM recibe una meta, genera un plan inicial, ejecuta una acción (como llamar a una API o ejecutar código), observa el resultado del entorno, actualiza su plan y decide de forma autónoma si ha logrado cumplir el objetivo o si necesita seguir iterando.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 P3[User Prompt] --&amp;gt; RLLM[🧠 LLM - Memoria y Herramientas]
 RLLM --&amp;gt; Plan[📋 Generar Plan]
 Plan --&amp;gt; Action[⚙️ Ejecutar Acción]
 Action --&amp;gt; Observe[👁️ Observar Resultado]
 Observe --&amp;gt; Decision{¿Meta cumplida?}
 Decision --&amp;gt;|No: Re-planificar| Update[🔄 Actualizar Plan]
 Update --&amp;gt; RLLM
 Decision --&amp;gt;|Sí| Ans3[Respuesta Final]
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="casos-de-uso-del-mundo-real"&gt;Casos de Uso del Mundo Real&lt;/h2&gt;
&lt;p&gt;Los sistemas agénticos ya están transformando múltiples industrias. Algunos de los ejemplos más destacados son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Coding Agents (Agentes de Programación)&lt;/strong&gt;: Herramientas que no solo sugieren código, sino que pueden leer repositorios enteros, escribir pruebas unitarias, ejecutar programas en entornos de prueba seguros (sandboxes) y depurar errores por sí mismos hasta que el código funcione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Búsqueda Profunda (DeepSearch)&lt;/strong&gt;: Agentes de investigación que realizan búsquedas web iterativas, cruzando múltiples fuentes de información, validando datos contradictorios y redactando reportes completos de manera autónoma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatización de Procesos de Negocio&lt;/strong&gt;: Agentes capaces de interactuar con software de facturación, responder correos electrónicos de clientes resolviendo problemas complejos y actualizar bases de datos sin intervención humana constante.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="desarrollo-y-uso-responsable-de-agentes-ia"&gt;Desarrollo y Uso Responsable de Agentes IA&lt;/h2&gt;
&lt;p&gt;Darle autonomía a un agente digital conlleva grandes riesgos. Si le permites a un agente ejecutar comandos en tu terminal o enviar correos a tus clientes, un pequeño error de razonamiento o una alucinación podría causar pérdidas de información o daños reputacionales.&lt;/p&gt;
&lt;p&gt;Por ello, el desarrollo ético y seguro de agentes requiere la implementación de tres pilares fundamentales:&lt;/p&gt;
&lt;h3 id="1-humano-en-el-bucle-human-in-the-loop"&gt;1. Humano en el Bucle (Human-in-the-Loop)&lt;/h3&gt;
&lt;p&gt;Consiste en diseñar puntos de control donde el agente deba detener su ejecución y solicitar la aprobación explícita de un ser humano antes de realizar acciones críticas o irreversibles.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;strong&gt;Regla de oro:&lt;/strong&gt; Si una acción del agente tiene efectos directos en el mundo físico o digital real (ej. realizar un pago, enviar un email a un cliente, o borrar un archivo), &lt;strong&gt;siempre&lt;/strong&gt; debes implementar una aprobación humana previa. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="2-guardrails-límites-y-barreras-técnicas"&gt;2. Guardrails (Límites y Barreras Técnicas)&lt;/h3&gt;
&lt;p&gt;Los guardrails son capas de software que rodean al agente y restringen lo que puede y no puede hacer. Algunas estrategias eficaces incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Validación Estricta de Entradas y Salidas&lt;/strong&gt;: Analizar y limpiar los prompts enviados al LLM y las llamadas a herramientas generadas por este.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presupuesto de Tokens y Pasos&lt;/strong&gt;: Limitar el número de iteraciones máximas del bucle autónomo para evitar bucles infinitos muy costosos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entornos Seguros (Sandboxing)&lt;/strong&gt;: Ejecutar cualquier herramienta de código o comando del sistema dentro de contenedores aislados (como Docker) para proteger la máquina anfitriona.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-mitigación-de-desinformación-y-sesgos"&gt;3. Mitigación de Desinformación y Sesgos&lt;/h3&gt;
&lt;p&gt;Los agentes pueden propagar información falsa rápidamente si no se controlan sus fuentes de datos. Es vital dotar al agente de capacidades de contraste y verificación de datos cuando trabaja en entornos abiertos como internet, además de que de por si un LLM puede alucinar, dando respuestas que suenan plausibles pero son completamente inventadas.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="evaluando-sistemas-agénticos-un-desafío-complejo"&gt;Evaluando Sistemas Agénticos: Un Desafío Complejo&lt;/h2&gt;
&lt;p&gt;Si evaluar un LLM tradicional (que solo produce texto) ya es difícil, evaluar un agente es considerablemente más complejo. Un agente interactúa con su entorno, ejecuta múltiples pasos lógicos y toma decisiones secuenciales donde cada acción influye en el siguiente estado del sistema.&lt;/p&gt;
&lt;p&gt;Al evaluar sistemas agénticos, no podemos limitarnos a verificar si el texto final &amp;ldquo;se lee bien&amp;rdquo;. Debemos evaluar el &lt;strong&gt;sistema completo&lt;/strong&gt; bajo múltiples dimensiones:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Dimensión de Evaluación&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Qué mide&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Cómo se evalúa&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Tasa de Éxito de la Tarea&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Si el agente logró resolver la meta propuesta correctamente.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Pruebas de integración automatizadas con metas claras y verificables.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Eficiencia de la Trayectoria&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;El número de pasos y tokens utilizados. Un agente que resuelve el problema en 3 pasos es mejor que uno que toma 20.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Análisis de logs de ejecución y costos asociados.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Alineación y Cumplimiento&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Si el agente respetó las políticas de seguridad y las barreras técnicas durante su ejecución.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Inyección de prompts maliciosos de prueba (Red Teaming).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Resiliencia ante Errores&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Cómo reacciona el agente cuando una herramienta falla o una API devuelve un código de error.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Simulación de caídas de servicios y análisis de la capacidad de replanificación del agente.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La evaluación constante es la única forma de garantizar que el agente sea seguro, confiable y verdaderamente útil antes de desplegarlo en un entorno de producción crítico.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La autonomía de los agentes de IA abre un mundo lleno de posibilidades, pero también exige un alto nivel de responsabilidad de nuestra parte como desarrolladores. Al comprender el &lt;strong&gt;espectro de autonomía&lt;/strong&gt;, diseñar e implementar &lt;strong&gt;guardrails&lt;/strong&gt; técnicos sólidos e implementar metodologías de &lt;strong&gt;evaluación robustas&lt;/strong&gt;, podemos construir herramientas agénticas que asombren a nuestros usuarios a la vez que se mantienen totalmente seguras.&lt;/p&gt;
&lt;p&gt;En la próxima entrega de esta serie, exploraremos cómo podemos escalar estos sistemas haciendo que múltiples agentes con especialidades únicas colaboren entre sí. ¡Nos vemos en el próximo artículo!&lt;/p&gt;</content:encoded></item><item><title>Agentes IA: ¿Qué es un Agente de Inteligencia Artificial?</title><link>https://blog.dacadev.com/generative-ai/agents/que-es-un-agente-ia/</link><pubDate>Fri, 15 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/que-es-un-agente-ia/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Descubre qué es un agente de inteligencia artificial, cómo funciona un LLM como cerebro del agente, y los módulos clave: memoria, herramientas y planificación.</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#definición-formal-de-un-agente"&gt;Definición formal de un Agente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-agente-basado-en-llm"&gt;El Agente basado en LLM&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#large-language-models-llms"&gt;Large Language Models (LLMs)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#tokenización"&gt;Tokenización&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#autoregresión"&gt;Autoregresión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#llms-con-razonamiento"&gt;LLMs con Razonamiento&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#ejemplo-de-razonamiento"&gt;Ejemplo de razonamiento&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#aumentando-las-capacidades-del-llm"&gt;Aumentando las capacidades del LLM&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#memoria"&gt;Memoria&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#herramientas-tools"&gt;Herramientas (Tools)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#planificación-y-reflexión"&gt;Planificación y Reflexión&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#descomposición-de-tareas"&gt;Descomposición de tareas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejecución-iterativa-con-razonamiento"&gt;Ejecución iterativa con razonamiento&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#reflexión"&gt;Reflexión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En el mundo de la Inteligencia Artificial, los términos aparecen y se mezclan con una velocidad que a veces marea. Uno de los conceptos más poderosos —y más incomprendidos— es el de &lt;strong&gt;Agente de IA&lt;/strong&gt;. Seguro has escuchado el término, pero ¿qué significa realmente? ¿Qué hace que un sistema deje de ser un simple chatbot y se convierta en un agente capaz de percibir, razonar y actuar sobre su entorno?&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás qué es un agente de IA desde su definición formal, cómo un LLM actúa como su &amp;ldquo;cerebro&amp;rdquo;, y los módulos fundamentales que lo potencian: memoria, herramientas y planificación. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="definición-formal-de-un-agente"&gt;Definición formal de un Agente&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;An agent is anything that can be viewed as perceiving its environment through sensors and acting upon that environment through actuators.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Russell &amp;amp; Norvig, AI: A Modern Approach&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Podemos descomponer esta definición en los componentes fundamentales que están en el corazón de todo agente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Environment (Entorno)&lt;/strong&gt;: El mundo con el que el agente interactúa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensors (Sensores)&lt;/strong&gt;: Componentes que el agente usa para observar su entorno&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actuators (Actuadores)&lt;/strong&gt;: Herramientas que el agente usa para actuar sobre el entorno&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effector (Efector)&lt;/strong&gt;: El &amp;ldquo;cerebro&amp;rdquo; o las reglas que deciden cómo pasar de observaciones a acciones&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 E[🌍 Entorno] --&amp;gt;|percibe| S[📡 Sensores]
 S --&amp;gt;|observaciones| EF[🧠 Efector]
 EF --&amp;gt;|decisiones| A[🔧 Actuadores]
 A --&amp;gt;|actúa sobre| E
&lt;/pre&gt;

&lt;p&gt;Imagina un robot aspiradora: sus sensores detectan obstáculos y suciedad (entorno), su &amp;ldquo;cerebro&amp;rdquo; decide qué dirección tomar (efector), y sus motores y cepillos ejecutan la acción (actuadores). Un agente de IA funciona con la misma lógica, pero en un entorno digital.&lt;/p&gt;
&lt;h2 id="el-agente-basado-en-llm"&gt;El Agente basado en LLM&lt;/h2&gt;
&lt;p&gt;En la práctica, el &lt;strong&gt;Efector&lt;/strong&gt; o cerebro del agente tiende a ser un LLM con capacidad de razonamiento. A través de módulos adicionales —memoria, herramientas y planificación— este LLM es capaz de interactuar con su entorno.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los &lt;strong&gt;Actuadores&lt;/strong&gt; son las herramientas del LLM (APIs, funciones, búsquedas)&lt;/li&gt;
&lt;li&gt;Los &lt;strong&gt;Sensores&lt;/strong&gt; son las capacidades multimodales del LLM (texto, imágenes, audio)&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;Usuario&lt;/strong&gt; forma parte del entorno e influye directamente en cómo se inicia el agente&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 U[👤 Usuario] --&amp;gt;|prompt| LLM[🧠 LLM - Cerebro del Agente]
 LLM --&amp;gt;|usa| T[🔧 Herramientas / Tools]
 LLM --&amp;gt;|consulta| M[💾 Memoria]
 LLM --&amp;gt;|genera| P[📋 Plan]
 T --&amp;gt;|resultados| LLM
 M --&amp;gt;|contexto| LLM
 P --&amp;gt;|siguiente paso| LLM
 LLM --&amp;gt;|respuesta| U
 T --&amp;gt;|modifica| ENV[🌍 Entorno Digital]
 ENV --&amp;gt;|datos| LLM
&lt;/pre&gt;

&lt;p&gt;Sin ninguna interacción del usuario, el LLM no tomará ninguna acción. El agente está fuertemente influenciado por cómo el usuario inicia la conversación.&lt;/p&gt;
&lt;h2 id="large-language-models-llms"&gt;Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;El LLM es considerado el &amp;ldquo;cerebro&amp;rdquo; del agente. Tradicionalmente, un LLM es un modelo que no hace más que &lt;strong&gt;predecir la siguiente palabra&lt;/strong&gt; basándose en un texto de entrada.&lt;/p&gt;
&lt;h3 id="tokenización"&gt;Tokenización&lt;/h3&gt;
&lt;p&gt;El LLM primero descompone la consulta de entrada en &lt;strong&gt;tokens&lt;/strong&gt;, que son sub-componentes de palabras que permiten al modelo generalizar a palabras que no ha visto antes. El modelo procesa estos tokens y hace una predicción sobre cuál podría ser el siguiente.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/tokenizacion_hu_ecaeedb330f63e63.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;h3 id="autoregresión"&gt;Autoregresión&lt;/h3&gt;
&lt;p&gt;El LLM predice el siguiente token, usa ese token predicho para actualizar su entrada, y luego continúa las predicciones. Al hacer esto de forma iterativa —lo que se llama &lt;strong&gt;autoregresión&lt;/strong&gt;— puede crear respuestas completas a la consulta del usuario.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant Input as Texto de entrada
 participant LLM as LLM
 participant Output as Texto generado

 Input-&amp;gt;&amp;gt;LLM: &amp;#34;El gato está&amp;#34;
 LLM-&amp;gt;&amp;gt;Output: &amp;#34;sentado&amp;#34;
 Note over Input,Output: Se agrega al input
 Input-&amp;gt;&amp;gt;LLM: &amp;#34;El gato está sentado&amp;#34;
 LLM-&amp;gt;&amp;gt;Output: &amp;#34;en&amp;#34;
 Note over Input,Output: Se agrega al input
 Input-&amp;gt;&amp;gt;LLM: &amp;#34;El gato está sentado en&amp;#34;
 LLM-&amp;gt;&amp;gt;Output: &amp;#34;la silla&amp;#34;
 Note over Output: Respuesta completa generada
&lt;/pre&gt;

&lt;p&gt;Cada predicción se alimenta de las anteriores, construyendo la respuesta palabra por palabra.&lt;/p&gt;
&lt;h2 id="llms-con-razonamiento"&gt;LLMs con Razonamiento&lt;/h2&gt;
&lt;p&gt;El campo de los agentes de IA descubrió que las capacidades de los LLMs aumentarían sustancialmente si pudieran &lt;strong&gt;razonar&lt;/strong&gt;. En lugar de que el modelo &amp;ldquo;piense&amp;rdquo; en silencio (a través de sus parámetros internos), ahora se entrenan para &amp;ldquo;pensar en voz alta&amp;rdquo; generando &lt;strong&gt;trazas de razonamiento&lt;/strong&gt; antes de derivar la respuesta.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Q[📝 Consulta del usuario] --&amp;gt; T[💭 Pensamientos / Razonamiento]
 T --&amp;gt; R[✅ Respuesta final]
&lt;/pre&gt;

&lt;p&gt;La idea principal es que al escribir sus pensamientos primero mediante su comportamiento autoregresivo, el LLM puede dedicar cómputo adicional a estructurar su razonamiento antes de generar la respuesta. Como los humanos, al estructurar sus pensamientos, las consultas complejas que requieren razonamiento multi-paso son más fáciles de resolver.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En la práctica, estos &amp;ldquo;pensamientos&amp;rdquo; están ocultos para el usuario. La respuesta que ves generalmente representa un resumen del razonamiento interno del modelo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="ejemplo-de-razonamiento"&gt;Ejemplo de razonamiento&lt;/h3&gt;
&lt;p&gt;Veamos cómo un LLM con razonamiento aborda un problema complejo:&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/reasoning-example_hu_600adf9fb2790942.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;El modelo genera una cadena de pensamientos internos, evalúa opciones y finalmente produce una respuesta bien fundamentada.&lt;/p&gt;
&lt;h2 id="aumentando-las-capacidades-del-llm"&gt;Aumentando las capacidades del LLM&lt;/h2&gt;
&lt;p&gt;Aunque los LLMs con razonamiento son vitales para los agentes de IA, siguen siendo incompletos. Como entidades estáticas de texto-a-texto, los LLMs no tienen control sobre su entorno, ni recuerdan sus interacciones, ni aprenden de ellas.&lt;/p&gt;
&lt;p&gt;Para convertir un LLM en un verdadero agente, necesitamos proveerlo de tres módulos fundamentales:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 LLM[🧠 LLM con Razonamiento]
 MEM[💾 Memoria]
 TOOLS[🔧 Herramientas]
 PLAN[📋 Planificación y Reflexión]

 MEM --&amp;gt; LLM
 TOOLS --&amp;gt; LLM
 PLAN --&amp;gt; LLM

 LLM --&amp;gt; AGENT[🤖 Agente de IA]
&lt;/pre&gt;

&lt;h3 id="memoria"&gt;Memoria&lt;/h3&gt;
&lt;p&gt;Sin memoria, los LLMs operan en conversaciones de &lt;strong&gt;&amp;ldquo;single-turn&amp;rdquo;&lt;/strong&gt;: una sola pregunta y una sola respuesta. La información no persiste entre llamadas.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant L as LLM

 U-&amp;gt;&amp;gt;L: ¿Cuál es la capital de Francia?
 L-&amp;gt;&amp;gt;U: París
 Note over U,L: ❌ Sin contexto previo
 U-&amp;gt;&amp;gt;L: ¿Y su población?
 L-&amp;gt;&amp;gt;U: ¿De qué ciudad hablas?
 Note over L: No recuerda la conversación anterior
&lt;/pre&gt;

&lt;p&gt;Afortunadamente, hay muchas formas de agregar módulos de memoria. La forma más común es simplemente añadir la conversación previa al prompt actual:&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant M as Memoria
 participant L as LLM

 U-&amp;gt;&amp;gt;L: ¿Cuál es la capital de Francia?
 L-&amp;gt;&amp;gt;U: París
 L-&amp;gt;&amp;gt;M: Guardar contexto
 U-&amp;gt;&amp;gt;L: ¿Y su población?
 M-&amp;gt;&amp;gt;L: Contexto: hablamos de París
 L-&amp;gt;&amp;gt;U: París tiene ~2.1 millones de habitantes
 Note over L: ✅ Recuerda el contexto
&lt;/pre&gt;





 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Los módulos de memoria pueden ser complejos. Si recibimos demasiada información, se vuelve difícil de procesar, lo que puede llevar a malas decisiones. Esto se llama &lt;strong&gt;sobrecarga de información&lt;/strong&gt; y es un problema real incluso para los LLMs. Se necesita un balance entre la cantidad y calidad de la información en el prompt — esto es lo que se conoce como &lt;strong&gt;context engineering&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los sistemas de memoria comparten similitudes con nuestros sistemas de memoria humana:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memoria a corto plazo&lt;/strong&gt;: La conversación actual, las últimas interacciones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria a largo plazo&lt;/strong&gt;: Hechos persistentes, preferencias del usuario, conocimiento acumulado&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="herramientas-tools"&gt;Herramientas (Tools)&lt;/h3&gt;
&lt;p&gt;Con la memoria, los LLMs recuerdan sus conversaciones previas, pero aún no son capaces de &lt;strong&gt;interactuar con su entorno&lt;/strong&gt;. Los LLMs pueden interactuar con su entorno digital a través de herramientas externas que amplían sus capacidades: calculadoras, motores de búsqueda, APIs, shells de comandos, y más.&lt;/p&gt;
&lt;p&gt;Sin embargo, los LLMs &lt;strong&gt;no son capaces de usar herramientas por sí mismos&lt;/strong&gt;. Fundamentalmente, un LLM es una función de texto-entrada/texto-salida. Solo puede &lt;em&gt;describir o expresar la intención&lt;/em&gt; de tomar una acción.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant L as LLM
 participant R as Runtime / Orquestador
 participant T as Herramienta

 U-&amp;gt;&amp;gt;L: ¿Cuánto es 847 × 392?
 L-&amp;gt;&amp;gt;R: {&amp;#34;tool&amp;#34;: &amp;#34;calculator&amp;#34;, &amp;#34;params&amp;#34;: {&amp;#34;expr&amp;#34;: &amp;#34;847 * 392&amp;#34;}}
 Note over L,R: El LLM expresa INTENCIÓN
 R-&amp;gt;&amp;gt;T: Ejecutar cálculo
 T-&amp;gt;&amp;gt;R: 331,824
 R-&amp;gt;&amp;gt;L: Resultado: 331,824
 L-&amp;gt;&amp;gt;U: El resultado es 331,824
&lt;/pre&gt;





 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El LLM puede expresar la intención de usar una herramienta, pero depende de nosotros convertir esa intención en una llamada real. Necesitamos escribir software que interprete el output del LLM (generalmente JSON) para elegir la herramienta correcta y completar sus parámetros.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las herramientas varían en complejidad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simples&lt;/strong&gt;: Calculadoras, conversor de unidades&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intermedias&lt;/strong&gt;: Búsqueda web, consultas a bases de datos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complejas&lt;/strong&gt;: Acceso a terminal, entornos de código, APIs de GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="planificación-y-reflexión"&gt;Planificación y Reflexión&lt;/h3&gt;
&lt;p&gt;El ingrediente final para ir de un LLM &amp;ldquo;regular&amp;rdquo; a un Agente de IA es su capacidad de &lt;strong&gt;planificar y reflexionar&lt;/strong&gt;. Estas capacidades son fundamentales, ya que el agente necesita decidir qué pasos tomar, cómo tomarlos y cuándo.&lt;/p&gt;
&lt;h4 id="descomposición-de-tareas"&gt;Descomposición de tareas&lt;/h4&gt;
&lt;p&gt;Aquí es donde entra la planificación: descomponer una tarea grande en pasos más pequeños y ejecutables. Esto se conoce como &lt;strong&gt;task decomposition&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Q[📝 Query: Investiga papers recientes sobre RAG] --&amp;gt; P[📋 Plan]
 P --&amp;gt; T1[1. Buscar en Google Scholar]
 P --&amp;gt; T2[2. Buscar en ArXiv]
 P --&amp;gt; T3[3. Filtrar por fecha 2024-2025]
 P --&amp;gt; T4[4. Leer abstracts relevantes]
 P --&amp;gt; T5[5. Generar resumen comparativo]

 T1 --&amp;gt; E[⚡ Ejecución secuencial]
 T2 --&amp;gt; E
 T3 --&amp;gt; E
 T4 --&amp;gt; E
 T5 --&amp;gt; E
&lt;/pre&gt;

&lt;h4 id="ejecución-iterativa-con-razonamiento"&gt;Ejecución iterativa con razonamiento&lt;/h4&gt;
&lt;p&gt;Al referirse continuamente a su plan, el LLM ejecuta cada tarea una por una. Hacerlas todas a la vez rara vez es eficiente, ya que cada tarea puede influir en otra. Después de completar una tarea específica, el LLM razona sobre qué pasos tomar a continuación.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 START[🎯 Objetivo] --&amp;gt; PLAN[📋 Crear Plan]
 PLAN --&amp;gt; EXEC[⚡ Ejecutar Tarea]
 EXEC --&amp;gt; REASON[🤔 Razonar sobre resultado]
 REASON --&amp;gt;|siguiente tarea| EXEC
 REASON --&amp;gt;|plan completo| DONE[✅ Resultado Final]
 REASON --&amp;gt;|ajustar plan| REFLECT[🔄 Reflexionar]
 REFLECT --&amp;gt;|plan mejorado| PLAN
&lt;/pre&gt;

&lt;h4 id="reflexión"&gt;Reflexión&lt;/h4&gt;
&lt;p&gt;Crear un plan no es suficiente. El LLM puede descubrir a mitad del camino que algunos pasos no son apropiados. Por ejemplo, podría descubrir que Google y ArXiv son insuficientes y decidir agregar Semantic Scholar y PubMed como recursos adicionales.&lt;/p&gt;
&lt;p&gt;Este comportamiento &lt;strong&gt;reflexivo&lt;/strong&gt; hace que los agentes parezcan humanos: intentan descubrir sus fallos y hacer intentos por corregirlos. Al reflexionar sobre comportamiento pasado, el plan inicial puede mejorarse continuamente.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La planificación y reflexión crean un &lt;strong&gt;ciclo iterativo&lt;/strong&gt;: planificar tareas → ejecutar acciones → reflexionar sobre el resultado → ajustar el plan. Este ciclo es lo que diferencia a un verdadero agente de un simple modelo que responde preguntas. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Un agente de IA no es simplemente un LLM que responde preguntas. Es un sistema compuesto por:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Un LLM con razonamiento&lt;/strong&gt; como cerebro central&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria&lt;/strong&gt; para mantener contexto entre interacciones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Herramientas&lt;/strong&gt; para interactuar con el entorno digital&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planificación y reflexión&lt;/strong&gt; para abordar tareas complejas de forma iterativa&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph AGENT[🤖 Agente de IA]
 direction TB
 BRAIN[🧠 LLM con Razonamiento]
 MEM[💾 Memoria&amp;lt;br/&amp;gt;Corto y largo plazo]
 TOOLS[🔧 Herramientas&amp;lt;br/&amp;gt;APIs, búsqueda, código]
 PLAN[📋 Planificación&amp;lt;br/&amp;gt;Descomposición + Reflexión]

 MEM &amp;lt;--&amp;gt; BRAIN
 TOOLS &amp;lt;--&amp;gt; BRAIN
 PLAN &amp;lt;--&amp;gt; BRAIN
 end

 USER[👤 Usuario] &amp;lt;--&amp;gt;|interacción| AGENT
 AGENT &amp;lt;--&amp;gt;|percibe y actúa| ENV[🌍 Entorno]
&lt;/pre&gt;

&lt;p&gt;La próxima vez que interactúes con un asistente de IA que busca información, ejecuta código y ajusta su enfoque basándose en los resultados, estarás interactuando con un agente. Y ahora entiendes la maquinaria que lo hace posible.&lt;/p&gt;</content:encoded></item><item><title>Skills vs. MCP</title><link>https://blog.dacadev.com/generative-ai/skills-vs-mcp/</link><pubDate>Wed, 29 Apr 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/skills-vs-mcp/</guid><dc:creator>Dacadev</dc:creator><category>IA generativa</category><description>Descubre la diferencia entre Skills y MCP (Model Context Protocol), dos conceptos clave en el desarrollo moderno de agentes de IA. Analizamos cómo trabajan en capas distintas, cuándo usar cada uno y por qué son complementarios y no competidores en la construcción de agentes inteligentes.</description><media:content url="https://blog.dacadev.com/images/generative-ai/skills-vs-mcp/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-mcp-model-context-protocol-el-enchufe-universal"&gt;El MCP (Model Context Protocol): el &amp;ldquo;enchufe&amp;rdquo; universal&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#los-skills-relacionado-con-el-comportamiento"&gt;Los Skills: relacionado con el &amp;ldquo;comportamiento&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-analogía-del-restaurante"&gt;La analogía del restaurante&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#visualizando-la-arquitectura"&gt;Visualizando la arquitectura&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cuándo-usar-uno-y-cuándo-usar-el-otro"&gt;Cuándo usar uno y cuándo usar el otro&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cuándo-usar-mcp"&gt;¿Cuándo usar MCP?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cuándo-usar-skills"&gt;¿Cuándo usar Skills?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#los-skills-reemplazan-al-mcp"&gt;¿Los Skills reemplazan al MCP?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En el mundo de la &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt;, los términos aparecen y se mezclan con una velocidad que a veces marea incluso a los desarrolladores más experimentados. Dos conceptos de estos conceptos son &lt;strong&gt;Skills&lt;/strong&gt; (habilidades) y &lt;strong&gt;MCP&lt;/strong&gt; (Model Context Protocol).&lt;/p&gt;
&lt;p&gt;¿Son lo mismo? ¿Vienen los &lt;strong&gt;Skills&lt;/strong&gt; a reemplazar al &lt;strong&gt;MCP&lt;/strong&gt;? En este post vamos a desglosar estas tecnologías para entender que, lejos de competir, están diseñadas para trabajar en &lt;strong&gt;capas distintas&lt;/strong&gt; del ecosistema de agentes.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este artículo busca aclarar estos dos conceptos, sobre todo para quienes están empezando a construir sus primeros agentes y se enfrentan a esta decisión arquitectónica.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="el-mcp-model-context-protocol-el-enchufe-universal"&gt;El MCP (Model Context Protocol): el &amp;ldquo;enchufe&amp;rdquo; universal&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, impulsado originalmente por &lt;strong&gt;Anthropic&lt;/strong&gt;, es una capa de &lt;strong&gt;infraestructura&lt;/strong&gt;. Su objetivo es estandarizar cómo un LLM se conecta con el mundo exterior: bases de datos, APIs de Google Drive, Slack, GitHub, etc.&lt;/p&gt;
&lt;p&gt;Imagina que quieres que tu IA lea tus correos. Antes, tenías que escribir un código específico para conectar esa IA con la API de Gmail. Si luego querías usar otra IA, debías repetir el proceso. El &lt;strong&gt;MCP&lt;/strong&gt; actúa como un puerto &lt;strong&gt;USB-C&lt;/strong&gt;: una vez que un servidor (como Gmail) implementa el protocolo &lt;strong&gt;MCP&lt;/strong&gt;, cualquier cliente (un LLM como Claude o GPT) que hable &lt;strong&gt;MCP&lt;/strong&gt; puede conectarse instantáneamente.&lt;/p&gt;
&lt;p&gt;Lo que el &lt;strong&gt;MCP&lt;/strong&gt; resuelve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conectividad de datos.&lt;/li&gt;
&lt;li&gt;Exposición de herramientas (Tools).&lt;/li&gt;
&lt;li&gt;Estandarización de recursos externos.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si te suena familiar, es porque el &lt;strong&gt;MCP&lt;/strong&gt; sigue una filosofía similar a la de protocolos como &lt;strong&gt;HTTP&lt;/strong&gt; o &lt;strong&gt;LSP&lt;/strong&gt; (Language Server Protocol). La idea es siempre la misma: estandarizar para no reinventar la rueda en cada integración.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="los-skills-relacionado-con-el-comportamiento"&gt;Los Skills: relacionado con el &amp;ldquo;comportamiento&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Si el &lt;strong&gt;MCP&lt;/strong&gt; es el cable que conecta la computadora a la corriente, un &lt;strong&gt;Skill&lt;/strong&gt; es el programa especializado que corre en esa computadora.&lt;/p&gt;
&lt;p&gt;Un &lt;strong&gt;Skill&lt;/strong&gt; es una unidad modular de &lt;strong&gt;lógica de ejecución&lt;/strong&gt;. No se trata solo de &amp;ldquo;tener acceso a una base de datos&amp;rdquo;, sino de saber &lt;strong&gt;cómo procesar&lt;/strong&gt; esa información para cumplir un objetivo específico de negocio. Por ejemplo, &amp;ldquo;Procesar una devolución en un e-commerce&amp;rdquo; es un &lt;strong&gt;Skill&lt;/strong&gt;. Este &lt;strong&gt;Skill&lt;/strong&gt; puede usar varias herramientas &lt;strong&gt;MCP&lt;/strong&gt; para lograr su fin, pero la &amp;ldquo;inteligencia&amp;rdquo; del proceso reside en el &lt;strong&gt;Skill&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Lo que los &lt;strong&gt;Skills&lt;/strong&gt; resuelven:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encapsulación de flujos de trabajo (Workflows).&lt;/li&gt;
&lt;li&gt;Definición de &amp;ldquo;tono de voz&amp;rdquo; y reglas de negocio.&lt;/li&gt;
&lt;li&gt;Orquestación de múltiples herramientas para una tarea compleja.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-analogía-del-restaurante"&gt;La analogía del restaurante&lt;/h2&gt;
&lt;p&gt;Para entenderlo de forma sencilla, imagina un restaurante de alta cocina:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;El sistema de pedidos (MCP):&lt;/strong&gt; Es la infraestructura que permite que la orden llegue de la mesa a la cocina. Es el protocolo que asegura que el camarero y el chef hablen el mismo idioma. No cocina, solo transporta la necesidad y los ingredientes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El chef especializado (Skill):&lt;/strong&gt; Es quien tiene el conocimiento para transformar los ingredientes en un plato específico (un &amp;ldquo;Skill de Repostería&amp;rdquo; o un &amp;ldquo;Skill de Parrilla&amp;rdquo;). El chef usa las herramientas (cuchillos, hornos, que serían las herramientas expuestas vía MCP) siguiendo una técnica específica para entregar un resultado de calidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;El &lt;strong&gt;MCP&lt;/strong&gt; le da a la IA las &lt;strong&gt;&amp;ldquo;manos&amp;rdquo;&lt;/strong&gt; y el &lt;strong&gt;&amp;ldquo;acceso&amp;rdquo;&lt;/strong&gt;, mientras que el &lt;strong&gt;Skill&lt;/strong&gt; le da el &lt;strong&gt;&amp;ldquo;entrenamiento&amp;rdquo;&lt;/strong&gt; y la &lt;strong&gt;&amp;ldquo;lógica&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="visualizando-la-arquitectura"&gt;Visualizando la arquitectura&lt;/h2&gt;
&lt;p&gt;Para los que prefieren ver el flujo de datos, aquí tenemos un diagrama de secuencia que muestra cómo un &lt;strong&gt;Skill&lt;/strong&gt; orquestador utiliza el protocolo &lt;strong&gt;MCP&lt;/strong&gt; para interactuar con el mundo.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant LLM as LLM (Cerebro)
 participant S as Skill (Lógica de Negocio)
 participant MCP as MCP Client / Server
 participant DB as Mundo Exterior (API/DB)

 U-&amp;gt;&amp;gt;LLM: &amp;#34;Quiero devolver mi pedido #123&amp;#34;
 LLM-&amp;gt;&amp;gt;S: Activa &amp;#34;Skill de Devoluciones&amp;#34;
 S-&amp;gt;&amp;gt;S: Valida reglas (¿Está en fecha?, ¿Es premium?)
 Note over S: El Skill decide qué acción tomar
 S-&amp;gt;&amp;gt;MCP: Llama a Tool: get_order_details(id: 123)
 MCP-&amp;gt;&amp;gt;DB: Consulta a la base de datos
 DB--&amp;gt;&amp;gt;MCP: Retorna datos del pedido
 MCP--&amp;gt;&amp;gt;S: Envía JSON del pedido
 S-&amp;gt;&amp;gt;S: Procesa lógica final
 S--&amp;gt;&amp;gt;LLM: Confirmación de proceso exitoso
 LLM--&amp;gt;&amp;gt;U: &amp;#34;Tu devolución ha sido procesada con éxito.&amp;#34;
&lt;/pre&gt;

&lt;p&gt;Fíjate en algo importante: el &lt;strong&gt;Skill&lt;/strong&gt; es quien &lt;strong&gt;toma decisiones&lt;/strong&gt;. El &lt;strong&gt;MCP&lt;/strong&gt; solo ejecuta lo que se le pide. Esa diferencia, aunque parezca sutil, es la clave para entender por qué uno no reemplaza al otro.&lt;/p&gt;
&lt;h2 id="cuándo-usar-uno-y-cuándo-usar-el-otro"&gt;Cuándo usar uno y cuándo usar el otro&lt;/h2&gt;
&lt;p&gt;No es una elección de &amp;ldquo;uno u otro&amp;rdquo;, sino de &lt;strong&gt;en qué parte del problema estás trabajando&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Característica&lt;/th&gt;
 &lt;th&gt;MCP (Protocolo)&lt;/th&gt;
 &lt;th&gt;Skill (Habilidad)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Nivel&lt;/td&gt;
 &lt;td&gt;Bajo / Infraestructura&lt;/td&gt;
 &lt;td&gt;Alto / Cognitivo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Propósito&lt;/td&gt;
 &lt;td&gt;Integración y acceso&lt;/td&gt;
 &lt;td&gt;Ejecución y decisión&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Reutilización&lt;/td&gt;
 &lt;td&gt;Conectar la IA a cualquier API&lt;/td&gt;
 &lt;td&gt;Aplicar la misma lógica a diferentes IAs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ejemplo&lt;/td&gt;
 &lt;td&gt;Conector de base de datos SQL&lt;/td&gt;
 &lt;td&gt;Procesador de reclamos de clientes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cuándo-usar-mcp"&gt;¿Cuándo usar MCP?&lt;/h3&gt;
&lt;p&gt;Úsalo cuando tu problema es de &lt;strong&gt;acceso a la información&lt;/strong&gt;. Si necesitas que tu IA &amp;ldquo;vea&amp;rdquo; archivos locales, consulte una base de datos en tiempo real o use una herramienta externa de forma estandarizada, ahí es donde el &lt;strong&gt;MCP&lt;/strong&gt; brilla.&lt;/p&gt;
&lt;h3 id="cuándo-usar-skills"&gt;¿Cuándo usar Skills?&lt;/h3&gt;
&lt;p&gt;Úsalo cuando tu problema es de &lt;strong&gt;comportamiento&lt;/strong&gt;. Si necesitas definir cómo debe reaccionar tu agente ante un cliente enfadado, cómo debe seguir un protocolo de seguridad o cómo debe estructurar un reporte complejo combinando datos.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Una buena regla mental: si la respuesta a &amp;ldquo;¿qué hace falta para resolver esto?&amp;rdquo; es &lt;strong&gt;&amp;ldquo;que la IA pueda hablar con X sistema&amp;rdquo;&lt;/strong&gt;, necesitas &lt;strong&gt;MCP&lt;/strong&gt;. Si la respuesta es &lt;strong&gt;&amp;ldquo;que la IA sepa qué hacer cuando pase Y&amp;rdquo;&lt;/strong&gt;, necesitas un &lt;strong&gt;Skill&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="los-skills-reemplazan-al-mcp"&gt;¿Los Skills reemplazan al MCP?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Definitivamente no.&lt;/strong&gt; Los &lt;strong&gt;Skills&lt;/strong&gt; se apoyan sobre el &lt;strong&gt;MCP&lt;/strong&gt;. Sin &lt;strong&gt;MCP&lt;/strong&gt; (o una capa de herramientas similar), un &lt;strong&gt;Skill&lt;/strong&gt; sería una lógica &amp;ldquo;ciega&amp;rdquo; que no puede tocar el mundo real. Sin &lt;strong&gt;Skills&lt;/strong&gt;, el &lt;strong&gt;MCP&lt;/strong&gt; es solo un montón de cables conectados que no saben qué construir.&lt;/p&gt;
&lt;p&gt;En el desarrollo moderno de agentes, el objetivo es construir una &lt;strong&gt;librería de Skills&lt;/strong&gt; que definan la identidad y eficiencia de tu empresa, mientras utilizas el ecosistema &lt;strong&gt;MCP&lt;/strong&gt; para asegurar que esos &lt;strong&gt;Skills&lt;/strong&gt; tengan los mejores datos y herramientas disponibles sin tener que reinventar la rueda de la conectividad.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; y &lt;strong&gt;MCP&lt;/strong&gt; no son rivales: son piezas complementarias del mismo rompecabezas. El &lt;strong&gt;MCP&lt;/strong&gt; resuelve el problema de la &lt;strong&gt;conectividad universal&lt;/strong&gt;, dándole a tu agente acceso estandarizado al mundo. Los &lt;strong&gt;Skills&lt;/strong&gt;, por su parte, encapsulan la &lt;strong&gt;lógica de negocio&lt;/strong&gt; y el &lt;strong&gt;comportamiento&lt;/strong&gt; que hacen único a tu agente.&lt;/p&gt;
&lt;p&gt;Cuando construyes un agente robusto, lo ideal es pensar en capas: una capa de &lt;strong&gt;infraestructura (MCP)&lt;/strong&gt; que te da acceso a las herramientas, y una capa &lt;strong&gt;cognitiva (Skills)&lt;/strong&gt; que decide qué hacer con esas herramientas. Si dominas esta separación, estarás mucho mejor preparado para construir agentes mantenibles, escalables y alineados con las necesidades reales de tu negocio.&lt;/p&gt;</content:encoded></item><item><title>GitHub Copilot: Beneficios, Desventajas y Precauciones</title><link>https://blog.dacadev.com/programacion/github-copilot-beneficios-desventajas-precauciones/</link><pubDate>Mon, 27 May 2024 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/github-copilot-beneficios-desventajas-precauciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre cómo GitHub Copilot puede revolucionar tu forma de programar. Aprende sobre sus funcionalidades, beneficios, desventajas y precauciones en esta guía completa.</description><media:content url="https://blog.dacadev.com/images/programming/github-copilot-beneficios-desventajas-precauciones/banner.jpg" medium="image" type="image/jpeg"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-github-copilot"&gt;¿Qué es GitHub Copilot?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#debo-preocuparme-por-el-manejo-de-datos"&gt;¿Debo preocuparme por el manejo de datos?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cuáles-son-los-alcances-de-copilot"&gt;¿Cuáles son los alcances de Copilot?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#es-acertado-copilot-en-sus-predicciones"&gt;¿Es acertado Copilot en sus predicciones?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#beneficios-de-usar-copilot"&gt;Beneficios de usar Copilot&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#precauciones-y-desventajas-de-copilot"&gt;Precauciones y desventajas de Copilot&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;p&gt;Este artículo nace como una iniciativa para centralizar el conocimiento que he adquirido en el manejo de la herramienta de &lt;strong&gt;GitHub Copilot&lt;/strong&gt; gracias a su uso diario, cursos y consejos que he encontrado en diversos recursos.&lt;/p&gt;
&lt;p&gt;La herramienta la puedes encontrar en el siguiente enlace: &lt;a href="https://github.com/features/copilot"




 target="_blank"
 


&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; es una herramienta de inteligencia artificial que nos ofrece toda la potencia de los modelos de lenguaje a gran escala (LLM, por sus siglas en inglés) enfocada específicamente en el campo del desarrollo de software y programación. Es una herramienta que ha revolucionado la manera de escribir código y aún tiene mucho más por aportar. Veamos algunas de sus funcionalidades y beneficios, así como desventajas y riesgos de usar esta herramienta.&lt;/p&gt;
&lt;h2 id="qué-es-github-copilot"&gt;¿Qué es GitHub Copilot?&lt;/h2&gt;
&lt;p&gt;Mi definición de lo que es &lt;strong&gt;Copilot&lt;/strong&gt; sería:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; es una herramienta de programación de pair programming que extiende las habilidades de los desarrolladores permitiendo enfocarse en el diseño, delegando la “carpintería” al copiloto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adicionalmente, si queremos ser un poco más técnicos al respecto y definir qué es &lt;strong&gt;Copilot&lt;/strong&gt; técnicamente, debemos decir que &lt;strong&gt;Copilot&lt;/strong&gt; trabaja sobre las mismas bases de los LLMs como ChatGPT, con la salvedad de que fue afinado para que su enfoque sea 100% en la escritura de código.&lt;/p&gt;
&lt;p&gt;Los datos usados para ajustar el modelo que alimenta a &lt;strong&gt;GitHub Copilot&lt;/strong&gt; fueron todos los repositorios públicos que se encuentran en GitHub, siendo esta la plataforma más usada para alojar proyectos alrededor del mundo. Esto significa que el conjunto de datos de entrenamiento es inmenso y muy completo.&lt;/p&gt;
&lt;p&gt;Por último, como &lt;strong&gt;Copilot&lt;/strong&gt; está basado en la tecnología de los LLMs, en general lo que busca es predecir, a partir de probabilidades, cuál sería el código que seguiría a medida que vas escribiendo.&lt;/p&gt;
&lt;h2 id="debo-preocuparme-por-el-manejo-de-datos"&gt;¿Debo preocuparme por el manejo de datos?&lt;/h2&gt;
&lt;p&gt;Una de las principales dudas al momento de usar &lt;strong&gt;Copilot&lt;/strong&gt;, incluso podría pensar que la primera duda, es ¿&lt;strong&gt;Copilot&lt;/strong&gt; usará mis datos y mi código para futuras sugerencias? o en palabras más simples ¿&lt;strong&gt;Copilot&lt;/strong&gt; va a robar mi código?&lt;/p&gt;
&lt;p&gt;La respuesta es un NO rotundo. &lt;strong&gt;Copilot&lt;/strong&gt; no usará tu código o el código generado con la herramienta para reentrenar el modelo, ya que, como mencioné antes, esta herramienta solo es entrenada con datos públicos que se obtienen de los repositorios públicos de GitHub.&lt;/p&gt;
&lt;p&gt;Además, el código generado a partir de &lt;strong&gt;Copilot&lt;/strong&gt; no es alojado para realizar una futura realimentación del modelo, por lo que puedes estar seguro de la privacidad de tu código y de tu negocio a fin de cuentas.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este punto debo mencionar algo y es la propiedad intelectual. Puede que &lt;strong&gt;Copilot&lt;/strong&gt; no respete la propiedad intelectual si esta es en un repositorio público, por lo que si quieres tener este tipo de protección y a la vez tener un código abierto, es mejor asesorarte.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="cuáles-son-los-alcances-de-copilot"&gt;¿Cuáles son los alcances de Copilot?&lt;/h2&gt;
&lt;p&gt;Como mencionamos antes, &lt;strong&gt;Copilot&lt;/strong&gt; es tu compañero de programación en pareja, esto significa que te ayudará a escribir código brindando sugerencias durante la escritura del mismo, pero aquí puede surgir una pregunta muy importante: &lt;strong&gt;¿Puede Copilot ayudarme sin importar el lenguaje?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La respuesta a esta pregunta es ambigua, sí y no. Es un sí porque recuerda que el modelo fue entrenado usando todo el código público alojado en GitHub, y entre estos encontramos una diversidad inmensa de lenguajes, frameworks, estilos, prácticas, etc. Sin embargo, también debemos tener en cuenta que los lenguajes más populares como JavaScript o Python son los que más proyectos tienen alojados en GitHub, lo que significa que el modelo aprendió más de estos lenguajes, haciéndolo mucho más eficiente para estos tipos de lenguajes o frameworks.&lt;/p&gt;
&lt;p&gt;Si intentas utilizar &lt;strong&gt;Copilot&lt;/strong&gt; con algún lenguaje que no es tan popular como COBOL, es posible que &lt;strong&gt;Copilot&lt;/strong&gt; no haga un muy buen trabajo, pero lo intentará.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si tienes miedo de que la IA te pueda arrebatar el trabajo, tiene sentido buscar aquello en lo que la IA no es realmente buena&amp;hellip; ¿aún? Esto es solo una opinión que podría ser una buena discusión, ¿qué opinas?&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="es-acertado-copilot-en-sus-predicciones"&gt;¿Es acertado Copilot en sus predicciones?&lt;/h2&gt;
&lt;p&gt;Esta es una pregunta que muchas personas se hacen, sin importar el nivel de experiencia que tengan, y volviendo a retomar la idea de antes, sus predicciones mejorarán a medida que sea usado para escribir código de lenguajes o contextos populares, ya que tendrá más conocimiento de dónde echar mano.&lt;/p&gt;
&lt;p&gt;Dado lo anterior, es MUY IMPORTANTE que tú, como desarrollador, supervises siempre el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;. No importa qué tan sencillo o simple sea, hazlo como una nueva práctica para el uso de esta herramienta ya que &lt;strong&gt;Copilot&lt;/strong&gt; solo predice, no piensa realmente&amp;hellip; ¿aún? 🤔&lt;/p&gt;
&lt;p&gt;Aquí quiero hacer un énfasis que es mandatorio, y es el de la supervisión. Tu responsabilidad como programador es supervisar el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;, y esto se puede hacer eficientemente solamente si:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conoces la tecnología, lenguaje, frameworks, etc. que &lt;strong&gt;Copilot&lt;/strong&gt; te está ayudando a construir.&lt;/li&gt;
&lt;li&gt;Entiendes lo que estás construyendo y el propósito, la lógica de negocio.&lt;/li&gt;
&lt;li&gt;Entiendes a nivel macro el impacto de tu trabajo, &lt;strong&gt;Copilot&lt;/strong&gt; te ayudará con lo micro.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Debes ser siempre consciente de lo que estás construyendo, siempre recuérdalo porque con el uso de &lt;strong&gt;Copilot&lt;/strong&gt; es fácil caer en la tentación de dejar pasar algunas cosas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="beneficios-de-usar-copilot"&gt;Beneficios de usar Copilot&lt;/h2&gt;
&lt;p&gt;Hablemos ahora de cuáles son los beneficios de usar &lt;strong&gt;Copilot&lt;/strong&gt;. ¡Hay muchos!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incrementa la productividad, ya que no gastarás tiempo escribiendo y reescribiendo código, sobre todo si son piezas pequeñas pero tediosas.&lt;/li&gt;
&lt;li&gt;Reduce los errores en el código, aunque debamos supervisar el resultado de &lt;strong&gt;Copilot&lt;/strong&gt;, este siempre nos ayudará a reducir errores comunes como los typos o referencias mal realizadas.&lt;/li&gt;
&lt;li&gt;Permite tener una gran diversidad de código, ya que puedes pedirle a &lt;strong&gt;Copilot&lt;/strong&gt; que te dé no solo una, sino más sugerencias, permitiéndonos ahondar en múltiples estilos o diseños de código.&lt;/li&gt;
&lt;li&gt;Soporta múltiples lenguajes, con mejor rendimiento en unos más que en otros.&lt;/li&gt;
&lt;li&gt;Te permite aprender y desarrollar al mismo tiempo. Cuando &lt;strong&gt;Copilot&lt;/strong&gt; te ayuda a escribir código, puede implementar técnicas o ideas nuevas para ti y te permitirá aprender de ellas. Para ello, debes ser consciente y supervisar el resultado, no confíes 100% en su respuesta. Valida en la documentación o en recursos de confianza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot&lt;/strong&gt; se ajustará a tu tipo de código. A medida que lo uses, entenderá cuál es el estilo de código en base a lo ya escrito en el proyecto. Tú lo orientas en base a cómo escribas código. Esto significa que si cambias de proyecto y este tiene otras reglas, &lt;strong&gt;Copilot&lt;/strong&gt; se adaptará. Él no aprende de ti.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="precauciones-y-desventajas-de-copilot"&gt;Precauciones y desventajas de Copilot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Su precisión es variable dependiendo del contexto del prompt y del mismo código que tienes en ese archivo. Esto depende del tiempo de trabajo en el proyecto con &lt;strong&gt;Copilot&lt;/strong&gt;, los archivos abiertos y el código de referencia.&lt;/li&gt;
&lt;li&gt;Riesgos de seguridad potenciales. Debes supervisar el resultado, sobre todo si trabajas con partes sensibles del código como SQL, ORMs, código de lógica de negocio, etc. Valida el código que propone &lt;strong&gt;Copilot&lt;/strong&gt; y, si no lo conocías, valida su uso en la documentación o un recurso de confianza.&lt;/li&gt;
&lt;li&gt;Depender demasiado de la herramienta. Para que esto no suceda, debes conocer bien la tecnología, lenguaje y sistema que estás construyendo, para tener el criterio y confianza de que lo que estás haciendo lo podrías hacer sin ayuda de &lt;strong&gt;Copilot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Una “desventaja” es que tiene un costo, no tiene opción de uso gratuito o similar, y es más costoso a medida que se implementa en organizaciones. Esto, en algunos casos como personas/empresas que están empezando, puede ser un valor difícil de asumir. Debes tener claro el valor que agrega en el equipo y ese gasto adicional incluirlo en tus cuentas.&lt;/li&gt;
&lt;li&gt;Límite en el contexto de la herramienta. Esta es una desventaja de los LLMs en general y, aunque es algo que está en constante mejora, es muy difícil (por lo menos hasta ahora) incluir todo un proyecto en el contexto de un LLM y adicionalmente compartir qué es lo que se busca hacer. Por lo que para tareas muy grandes con un código fuente enorme, tiende a no ser tan preciso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; ha revolucionado la forma en que los desarrolladores escriben código, ofreciendo beneficios significativos como el aumento de la productividad y la reducción de errores. Sin embargo, es crucial supervisar sus sugerencias y estar consciente de sus limitaciones y riesgos. A medida que la tecnología avanza, &lt;strong&gt;Copilot&lt;/strong&gt; seguirá mejorando, pero siempre será necesario el criterio humano para garantizar la calidad y la seguridad del código.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este artículo se actualiza periódicamente conforme evolucionan las funcionalidades de &lt;strong&gt;GitHub Copilot&lt;/strong&gt;. Si tienes experiencias o consejos adicionales, no dudes en compartirlos a través de la &lt;a href="https://blog.dacadev.com/contacto"



 


&gt;página de contacto&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item></channel></rss>