← Volver al blog

Programador web con IA: cómo la inteligencia artificial transforma el desarrollo

Descubre cómo la inteligencia artificial está transformando el trabajo del programador web. Casos de uso, nueva stack, oportunidades y el futuro del desarrollo con IA.

Jordi Morillo·25 de febrero de 2026·14 min lectura

Programador web con IA: cómo la inteligencia artificial transforma el desarrollo

La inteligencia artificial no va a reemplazar al programador web. Pero el programador web que use IA va a reemplazar al que no la use.

En 2026, la IA generativa ha transformado radicalmente cómo desarrollamos aplicaciones web. Desde asistentes de código hasta aplicaciones completas con capacidades inteligentes, la IA es ya ubicua.

En este artículo, exploraré cómo la IA está cambiando el rol del programador web, qué nuevas habilidades requiere, casos de uso reales que ya implemento, y hacia dónde vamos.

La IA como copiloto de desarrollo

El primer impacto: IA como asistente de programación.

GitHub Copilot y alternativas

Cómo funcionan:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Escribes comentario o firma de función&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// function calculateShippingCost(<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Y Copilot sugiere implementación completa:<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>calculateShippingCost<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>weight<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>number<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>destination<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>shippingMethod<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>standard<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> | <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>express<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> | <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>overnight<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>): <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>number<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> baseRate = shippingMethod === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>standard<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : shippingMethod === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>express<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>12<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>25<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> weightRate = weight * <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> destinationMultiplier = 
    destination === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>national<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : destination === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>europe<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>1.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>2.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (baseRate + weightRate) * destinationMultiplier
}

Impacto en productividad:

Según mi experiencia con GitHub Copilot:

  • +30-40% velocidad en código boilerplate
  • +50% velocidad en tests unitarios
  • +25% velocidad en funciones comunes

Pero: Requiere revisión crítica. Copilot sugiere, tú decides.

Alternativas actuales:

  • GitHub Copilot: El más maduro, integración VSCode perfecta
  • Amazon CodeWhisperer: Gratuito para uso individual
  • Tabnine: Enfoque en privacidad
  • Codeium: Alternativa open source

Mi uso diario:

  • Boilerplate: acepto ~80% sugerencias
  • Lógica de negocio: acepto ~30-40%
  • Tests: acepto ~60-70%
  • Documentación: acepto ~50%

Tiempo ahorrado: ~15-20 horas/semana

ChatGPT y Claude como consultores técnicos

Más allá de autocompletado, LLMs como asesores:

Casos de uso diarios:

  1. Debugging complejo

    • Pego error + contexto
    • LLM sugiere causas probables
    • Ahorro: 30min-2h por bug difícil
  2. Arquitectura y patrones

    • "¿Cómo estructurar sistema de notificaciones real-time?"
    • Recibo opciones: WebSockets, SSE, polling
    • Con pros/cons de cada una
  3. Optimización de código

    • Pego función lenta
    • LLM sugiere mejoras de performance
    • Valido con benchmarks
  4. Documentación

    • Generar JSDoc a partir de código
    • Escribir README completos
    • Crear guías de usuario

Limitaciones importantes:

⚠️ Los LLMs alucinan:

  • Inventan APIs que no existen
  • Citan documentación incorrecta
  • Mezclan versiones de librerías

Regla de oro: Siempre verificar sugerencias, especialmente en producción.

Mi workflow:

  1. Consultar LLM para ideas/opciones
  2. Validar con documentación oficial
  3. Testear exhaustivamente antes de integrar

Aplicaciones web con capacidades de IA

El segundo impacto: IA dentro de las aplicaciones.

Chatbots inteligentes

Los chatbots han evolucionado de scripts rígidos a asistentes contextuales:

Antes (2020):

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chatbot con if/else&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarMensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>mensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>if<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (mensaje.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;includes&lt;<span class="hljs-regexp">/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;horario&amp;#x27;&lt;/</span>span&gt;)) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Abrimos de 9 a 18h<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  }
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">if</span>&lt;<span class="hljs-regexp">/span&gt; (mensaje.&lt;span class=&quot;hljs-title function_&quot;&gt;includes&lt;/</span>span&gt;(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>precio<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>)) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Nuestros precios empiezan en 100€<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  }
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;No entiendo tu pregunta&amp;#x27;&lt;/</span>span&gt;
}

Ahora (2026):

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chatbot con GPT-4 y RAG&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chat_models&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { loadQAChain } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chains&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarMensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>mensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>historial<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Message<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>[]
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> llm = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>modelName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>temperature<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0.3<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Buscar info relevante en base de conocimiento&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> context = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> vectorStore.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;similaritySearch&lt;<span class="hljs-regexp">/span&gt;(mensaje, &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/</span>span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Generar respuesta contextual&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> response = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>question<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: mensaje,
    context,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>chat_history<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: historial
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; response.&lt;span class=&quot;hljs-property&quot;&gt;text&lt;/</span>span&gt;
}

Diferencia:

  • Antes: Solo responde preguntas exactas programadas
  • Ahora: Entiende intención, consulta conocimiento, responde naturalmente

He implementado chatbots con IA para:

  • Atención al cliente 24/7: Resolución de 70-80% consultas
  • Soporte técnico: Búsqueda en documentación
  • Ventas conversacionales: Recomendación de productos
  • Onboarding de usuarios: Guía interactiva

Coste desarrollo:

  • Chatbot tradicional: 2-3 semanas, features limitadas
  • Chatbot con IA: 1-2 semanas, capacidades mucho mayores

Sistemas RAG para conocimiento empresarial

RAG (Retrieval Augmented Generation) = LLM + tu información privada

Arquitectura típica:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// 1. Indexar documentación empresarial&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>embeddings&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>vectorstores&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>indexarDocumentos<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>docs<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Document<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>[]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> embeddings = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>()
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; vectorStore = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;fromDocuments&lt;/span&gt;(
    docs,
    embeddings,
    { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>collectionName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>empresa-docs<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> }
  )
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; vectorStore
}

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// 2. Consultar con contexto&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>preguntarDocumentos<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>pregunta<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vectorStore<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> llm = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({ <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>modelName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Buscar docs relevantes&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> docsRelevantes = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> vectorStore
    .&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;similaritySearch&lt;<span class="hljs-regexp">/span&gt;(pregunta, &lt;span class=&quot;hljs-number&quot;&gt;4&lt;/</span>span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// LLM responde basándose en docs reales&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>loadQAChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(llm)
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; response = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>input_documents<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: docsRelevantes,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>question<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: pregunta
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>respuesta<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: response.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;text&lt;/span&gt;,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>fuentes<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: docsRelevantes.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;map&lt;<span class="hljs-regexp">/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-params&quot;&gt;d&lt;/</span>span&gt; =&amp;gt;&lt;<span class="hljs-regexp">/span&gt; d.&lt;span class=&quot;hljs-property&quot;&gt;metadata&lt;/</span>span&gt;.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;source&lt;/span&gt;)
  }
}

Casos de uso reales que implemento:

  1. Consultas sobre políticas empresa

    • "¿Cuál es nuestra política de devoluciones para productos digitales?"
    • Sistema busca en docs, LLM genera respuesta
    • Incluye citas de documentos originales
  2. Soporte técnico con manuales

    • "¿Cómo configurar integración con Stripe?"
    • Consulta documentación interna
    • Respuesta paso a paso personalizada
  3. Knowledge base para equipos

    • "¿Cómo desplegamos a producción?"
    • Busca en wiki, runbooks, tickets cerrados
    • Responde con procedimientos actualizados
  4. Análisis de documentos legales

    • "¿Qué dice el contrato sobre SLAs?"
    • Extrae cláusulas relevantes
    • Resume en lenguaje claro

Ventajas vs búsqueda tradicional:

  • Búsqueda: Devuelve documentos, tú lees y extraes
  • RAG: Devuelve respuesta directa con fuentes

Mis proyectos de sistemas RAG típicos: 10.000-25.000€ según volumen de documentos e integraciones.

Agentes autónomos

El siguiente nivel: sistemas que actúan, no solo responden.

Ejemplo: Agente de investigación de mercado

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; langchain.agents &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; initialize_agent, Tool
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; langchain.llms &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Definir herramientas que el agente puede usar&lt;/span&gt;</span>
tools = [
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Google Search&amp;quot;&lt;/span&gt;,
        func=google_search,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Busca información actualizada en internet&amp;quot;&lt;/span&gt;
    ),
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Web Scraper&amp;quot;&lt;/span&gt;,
        func=scrape_website,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Extrae contenido de una URL&amp;quot;&lt;/span&gt;
    ),
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Database Query&amp;quot;&lt;/span&gt;,
        func=query_database,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Consulta base de datos de competidores&amp;quot;&lt;/span&gt;
    )
]

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Inicializar agente&lt;/span&gt;</span>
agent = initialize_agent(
    tools,
    OpenAI(model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">4</span>&amp;quot;&lt;/span&gt;),
    agent=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;zero-shot-react-description&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Ejecutar tarea compleja&lt;/span&gt;</span>
result = agent.run(
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Investiga precios de competidores para producto X &amp;quot;&lt;/span&gt;
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;en mercado español, genera informe comparativo&amp;quot;&lt;/span&gt;
)

El agente:

  1. Planea qué herramientas usar
  2. Ejecuta búsquedas en Google
  3. Extrae precios de webs competidores
  4. Consulta histórico en base de datos
  5. Genera informe comparativo

Todo autónomamente.

Casos de uso empresariales:

  • Investigación de competencia: Precios, features, reviews
  • Monitoreo de marca: Menciones, sentimiento
  • Análisis de tendencias: Qué buscan usuarios
  • Due diligence: Investigación de proveedores/partners
  • Content research: Temas trending, keywords

He desarrollado agentes de IA para:

  • Automatizar research de mercado (ahorro 20h/semana humanas)
  • Monitorear menciones de marca 24/7
  • Analizar feedback de clientes en tiempo real

Análisis y generación de contenido

Procesamiento de Lenguaje Natural aplicado:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Clasificación automática de tickets de soporte&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;openai&amp;#x27;&lt;/</span>span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>clasificarTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>contenido<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> completion = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> openai.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;chat&lt;<span class="hljs-regexp">/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;completions&lt;/</span>span&gt;.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;create&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>model<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>messages<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: [
      {
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>role<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>system<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>content<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`Clasifica tickets en categorías:
          - bug_critico
          - bug_menor
          - solicitud_feature
          - pregunta_uso
          - queja_comercial
          
          Responde solo con la categoría.`<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
      },
      {
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>role<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>user<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>content<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: contenido
      }
    ],
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>temperature<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; completion.&lt;span class=&quot;hljs-property&quot;&gt;choices&lt;/</span>span&gt;[<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>].&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;message&lt;<span class="hljs-regexp">/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;content&lt;/</span>span&gt;
}

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Usar en pipeline de soporte&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>ticket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Ticket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> categoria = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>clasificarTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;contenido&lt;/span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Enrutar automáticamente&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>if<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (categoria === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>bug_critico<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>notificarEquipoUrgente<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket)
  } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">else</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/</span>span&gt; (categoria === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>pregunta_uso<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>intentarRespuestaAutomatica<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket)
  }
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">await</span>&lt;<span class="hljs-regexp">/span&gt; ticket.&lt;span class=&quot;hljs-title function_&quot;&gt;update&lt;/</span>span&gt;({ categoria })
}

Otros casos que implemento:

  • Análisis de sentimiento en reviews/comentarios
  • Extracción de entidades (nombres, fechas, productos mencionados)
  • Resumen automático de documentos largos
  • Traducción manteniendo contexto técnico
  • Generación de descripciones de productos para SEO

Ver mi portfolio completo de soluciones NLP.

Computer Vision para aplicaciones web

Visión artificial integrada:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; openai &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Análisis de imágenes con GPT-4 Vision&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;analizar_imagen&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">dict</span>&lt;/span&gt;:
    response = client.chat.completions.create(
        model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">4</span>-vision-preview&amp;quot;&lt;/span&gt;,
        messages=[
            {
                &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;,
                &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: [
                    {
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;<span class="hljs-built_in">type</span>&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;,
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Describe detalladamente esta imagen&amp;quot;&lt;/span&gt;
                    },
                    {
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;<span class="hljs-built_in">type</span>&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;image_url&amp;quot;&lt;/span&gt;,
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;image_url&amp;quot;&lt;/span&gt;: {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: imagen_url}
                    }
                ]
            }
        ]
    )
    
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; response.choices[&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;<span class="hljs-number">0</span>&lt;/span&gt;].message.content

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Casos de uso&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;moderacion_contenido&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">bool</span>&lt;/span&gt;:
    descripcion = analizar_imagen(imagen_url)
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Detectar contenido inapropiado&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">not</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">any</span>&lt;/span&gt;(word &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">in</span>&lt;/span&gt; descripcion.lower() 
                   &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">for</span>&lt;/span&gt; word &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">in</span>&lt;/span&gt; [&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;<span class="hljs-comment">#x27;violencia&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;desnudo&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;inapropiado&amp;#x27;&lt;/span&gt;])</span>

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;categorizar_producto&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;:
    descripcion = analizar_imagen(imagen_url)
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Clasificar automáticamente&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># (ropa, electrónica, hogar, etc.)&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; clasificar_por_descripcion(descripcion)

Aplicaciones reales:

  1. Ecommerce

    • Categorización automática de productos subidos
    • Detección de calidad de fotos
    • Búsqueda por similitud visual
  2. Moderación de contenido

    • Filtrar imágenes inapropiadas automáticamente
    • Detectar spam visual
    • Verificar guidelines de comunidad
  3. Accesibilidad

    • Generar alt text automático para imágenes
    • Describir contenido visual para lectores de pantalla
  4. Control de calidad

    • Detectar productos defectuosos en fotos
    • Verificar packaging correcto
    • Validar instalaciones

Portfolio completo: soluciones de Computer Vision.

Nuevas habilidades del programador web

Para aprovechar IA, el programador web necesita nuevas skills:

1. Prompt Engineering

Saber comunicarse con LLMs es crítico:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Prompt malo (resultados inconsistentes)&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> prompt = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;quot;</span>Resume este texto<span class="hljs-symbol">&amp;quot;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Prompt bueno (resultados consistentes)<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> prompt = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`
Resume el siguiente texto en exactamente 3 puntos clave.
Cada punto debe:
- Ser una oración completa
- Tener máximo 20 palabras
- Empezar con <span class="hljs-symbol">&amp;quot;</span><span class="hljs-symbol">&amp;quot;</span>

Texto:
<span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-subst&quot;</span>&gt;</span>${texto}<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>

Resume:
`<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

Técnicas que todo programador web debe conocer:

  • Few-shot learning: Dar ejemplos de input/output
  • Chain-of-thought: Pedir razonamiento paso a paso
  • Role prompting: "Actúa como experto en X"
  • Constraints: Especificar formato, longitud, estilo
  • Temperature tuning: Controlar creatividad vs consistencia

2. Vector Databases

Trabajar con embeddings y búsqueda semántica:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;<span class="hljs-regexp">/span&gt; { &lt;span class=&quot;hljs-title class_&quot;&gt;OpenAIEmbeddings&lt;/</span>span&gt; } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>embeddings&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>PineconeStore<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>vectorstores&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Crear embeddings de texto<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> embeddings = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>()

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; textoVector = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; embeddings.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;embedQuery&lt;/span&gt;(
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;quot;</span>Programador web especializado en Next.js<span class="hljs-symbol">&amp;quot;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
)
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Resultado: [0.023, -0.891, 0.445, ...] // 1536 dimensiones&lt;/span&gt;</span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Buscar similares<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> resultados = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> pinecone.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;query&lt;/span&gt;({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vector<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: textoVector,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>topK<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>includeMetadata<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-literal&quot;</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
})

Bases de datos vectoriales:

  • Pinecone: Managed, fácil de usar
  • Weaviate: Open source, potente
  • Chroma: Lightweight, buena para desarrollo
  • Qdrant: Alto rendimiento

3. LangChain y frameworks de IA

Orquestar aplicaciones complejas con LLMs:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;<span class="hljs-regexp">/span&gt; { &lt;span class=&quot;hljs-title class_&quot;&gt;PromptTemplate&lt;/</span>span&gt; } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>prompts&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>LLMChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chains&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Template reutilizable<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> template = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>PromptTemplate<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>template<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`
    Eres un asistente de {rol}.
    
    Contexto: {contexto}
    
    Pregunta del usuario: {pregunta}
    
    Proporciona una respuesta {tono}.
  `<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>inputVariables<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: [<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>rol<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>contexto<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>pregunta<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>tono<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>]
})

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chain que usa el template&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>LLMChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>llm<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(),
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>prompt<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: template
})

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Ejecutar&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> response = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>rol<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>programador web senior<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>contexto<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>El usuario está construyendo un ecommerce<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>pregunta<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>¿Qué stack recomiendas?<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>tono<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>profesional pero accesible<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
})

Por qué LangChain:

  • Abstracts complejidad de llamadas a LLMs
  • Chains para workflows complejos
  • Agents para tareas autónomas
  • Memoria para conversaciones stateful
  • Integraciones con 50+ servicios

4. MLOps y deployment de modelos

Llevar modelos a producción de forma confiable:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Ejemplo: Fine-tuning de modelo custom&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; openai &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 1. Preparar dataset&lt;/span&gt;</span>
training_data = [
    {
        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;messages&amp;quot;&lt;/span&gt;: [
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;system&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Clasificador de urgencia&amp;quot;&lt;/span&gt;},
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;El sistema está caído&amp;quot;&lt;/span&gt;},
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;assistant&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;URGENTE&amp;quot;&lt;/span&gt;}
        ]
    },
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># ... más ejemplos&lt;/span&gt;</span>
]

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 2. Subir dataset&lt;/span&gt;</span>
file = client.files.create(
    file=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">open</span>&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;training_data.jsonl&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;),
    purpose=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;fine-tune&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 3. Fine-tune&lt;/span&gt;</span>
job = client.fine_tuning.jobs.create(
    training_file=file.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">id</span>&lt;/span&gt;,
    model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">3.5</span>-turbo&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 4. Usar modelo custom&lt;/span&gt;</span>
completion = client.chat.completions.create(
    model=job.fine_tuned_model,
    messages=[
        {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;La app va lenta&amp;quot;&lt;/span&gt;}
    ]
)

Aspectos clave de MLOps:

  • Versionado de modelos: Tracking de experimentos
  • Monitoreo: Accuracy, latencia, costes
  • A/B testing: Comparar modelos en producción
  • Rollback: Volver a versión anterior si necesario
  • Caching: Reducir llamadas redundantes a APIs

Portfolio completo: servicios MLOps.

Costes y ROI de IA en desarrollo web

¿Vale la pena económicamente?

Costes de APIs de IA

OpenAI GPT-4 (enero 2026):

  • Input: $0.03 / 1K tokens (~750 palabras)
  • Output: $0.06 / 1K tokens

Ejemplo real: Chatbot atención cliente

  • 1.000 conversaciones/día
  • ~500 tokens por conversación (entrada + salida)
  • Coste: $25-30/día = $750-900/mes

Alternativa humana:

  • 1 agente humano: 2.000€/mes
  • Cubre ~500 conversaciones/día en 8h
  • Para 1.000 conversaciones: 2 agentes = 4.000€/mes

Ahorro: ~3.000€/mes con chatbot IA

Costes de desarrollo

Chatbot tradicional vs IA:

Aspecto Tradicional Con IA
Desarrollo inicial 3-4 semanas 1-2 semanas
Coste desarrollo 6.000-10.000€ 4.000-8.000€
Features Limitadas Amplias
Mantenimiento Alto (agregar respuestas) Bajo (solo ajustar prompts)

ROI típico: 3-6 meses para recuperar inversión.

Productividad del programador web

Mi experiencia personal con GitHub Copilot:

  • Coste: $10/mes (despreciable)
  • Ahorro tiempo: 15-20h/mes
  • Equivale a: 3-5 días laborables/mes
  • ROI: 150-200x el coste

No usar IA en 2026 = competir con una mano atada.

El futuro: hacia dónde vamos

Predicciones para 2027-2030

1. IA como junior developer

En 2-3 años, los LLMs podrán:

  • Implementar features completas desde especificación
  • Escribir tests automáticamente
  • Refactorizar código legacy
  • Documentar exhaustivamente

Rol del programador web evolucionará a:

  • Arquitecto de sistemas
  • Reviewer de código generado por IA
  • Product manager técnico
  • Prompt engineer especializado

2. No-code/low-code potenciado por IA

  • Describir aplicación en lenguaje natural
  • IA genera código completo
  • Programador solo ajusta y personaliza

Esto eliminará: Código boilerplate tedioso Esto NO eliminará: Necesidad de entender arquitectura, testing, security

3. Aplicaciones 100% conversacionales

  • Interfaces naturales (voz + texto)
  • Apps que entienden contexto completo
  • "Crea informe de ventas del último trimestre" → hecho
  • Programador web debe diseñar estas experiencias

4. IA especializada por dominio

  • Modelos fine-tuned para ecommerce, healthcare, finanzas
  • No programadores web generalistas
  • programadores web + expertos dominio + IA

Habilidades que seguirán siendo críticas

Lo que IA NO reemplazará:

Entender el negocio del cliente

  • IA no sabe cuáles son tus objetivos reales
  • Traducir necesidades de negocio a specs técnicas

Arquitectura de sistemas

  • Decisiones de escalabilidad
  • Trade-offs de tecnología
  • Patrones para problemas complejos

Seguridad y privacidad

  • Auditar código para vulnerabilidades
  • Implementar security best practices
  • Cumplimiento legal (GDPR, etc.)

Testing y calidad

  • Diseñar estrategia de tests
  • Casos edge que IA no considera
  • Refactoring estructural

Empatía y comunicación

  • Entender frustración de usuario
  • Explicar decisiones técnicas a no técnicos
  • Gestionar expectativas

El mejor programador web del futuro:

  • Domina fundamentos (algoritmos, arquitectura, patterns)
  • Usa IA para acelerar ejecución
  • Enfoca su tiempo en problemas complejos y strategy

Mi enfoque como programador web + IA

Combino 33 años de experiencia con IA moderna:

Qué uso IA para:

  • ✅ Código boilerplate (tests, types, migrations)
  • ✅ Documentación inicial
  • ✅ Sugerencias de optimización
  • ✅ Research de tecnologías

Qué hago personalmente siempre:

  • ✅ Arquitectura de sistemas
  • ✅ Decisiones técnicas críticas
  • ✅ Code review exhaustivo
  • ✅ Security audit
  • ✅ Tests de integración y E2E

Resultado: +40% productividad sin sacrificar calidad.

Servicios que ofrezco con IA:

Garantía: TDD obligatorio, código documentado, garantía de por vida.

Conclusión: adaptarse o quedarse atrás

La IA no va a eliminar al programador web. Va a:

  1. Eliminar tareas tediosas (boilerplate, documentación básica)
  2. Elevar el nivel de competencia requerido
  3. Permitir crear aplicaciones más sofisticadas con menos tiempo
  4. Democratizar capacidades antes solo en empresas grandes

El programador web que prospera en 2026:

  • Domina fundamentos sólidos
  • Abraza IA como herramienta, no amenaza
  • Se especializa en integrar IA en aplicaciones reales
  • Entiende límites y capacidades de LLMs
  • Nunca deja de aprender

Lo que no cambia:

  • Necesidad de entender el negocio
  • Importancia de arquitectura sólida
  • Testing y calidad no negociables
  • Comunicación y empatía con clientes

Con 33 años desarrollando, he visto docenas de "revoluciones tecnológicas". La IA es real, pero no cambia los principios fundamentales del buen desarrollo.

¿Quieres integrar IA en tu negocio? Cuéntame tu caso de uso y recibe:

  • Análisis de viabilidad
  • Propuesta técnica
  • Estimación de ROI
  • Presupuesto detallado

Todo en menos de 24 horas.


Jordi Morillo - Programador Web + AI Engineering | 33 años de experiencia | Portfolio completo de IA