Caso real 07 · IA aplicada · WordPress

Un asistente con IA que responde solo con lo que dice el artículo

Un piloto de IA útil y barato: el lector pregunta en su idioma, el modelo responde únicamente con el contenido del artículo y el equipo ve qué preguntas se quedan sin respuesta.

Caso real, cliente anonimizado. El nombre del cliente, las personas y los datos internos se omiten por confidencialidad. Las cifras salen de logs, Search Console, GA4 y del propio código. Si un dato de negocio no se midió, no aparece.
~12.000caracteres de contexto máximo
~500tokens de salida máximo
24 hcaché de preguntas repetidas
0datos personales en logs
Contexto

El punto de partida.

La idea era probar IA en el blog sin montar un chatbot genérico que inventara respuestas sobre el producto ni disparara la factura de la API.

Requisitos de producción, no de demo: respuestas en el idioma del lector, preguntas fuera de tema, consentimiento, control de costes, registro anónimo para detectar huecos de contenido y un CTA suave tras una respuesta útil.

Síntomas observados

  • Riesgo de respuestas inventadas si el modelo usa su conocimiento general.
  • Coste imprevisible con tráfico real.
  • La REST API bloqueada para visitantes anónimos por el plugin de seguridad.
Diagnóstico

Hipótesis descartadas antes de tocar nada.

Lo que parecía obvio y no era. Descartar bien ahorra días de trabajo en la dirección equivocada.

Chatbot con RAG sobre todo el sitio

Más coste y más superficie de error para un piloto. El artículo actual ya es el contexto correcto.

Enviar el texto desde el navegador

Manipulable. El servidor obtiene el artículo por ID.

Abrir toda la REST API

Solo se permite la ruta del asistente.

Implementación

Qué hice, paso a paso.

Contexto cerrado

El backend carga el artículo en el servidor y lo pasa como único contexto. Si la respuesta no está, lo dice.

Control de costes

Contexto recortado, salida limitada, caché de 24 h por pregunta, límite por IP hasheada y tope diario global con interruptor.

Privacidad

Tabla propia sin IP, usuario ni cookies. El texto de la pregunta solo se guarda con consentimiento de analítica.

Huecos de contenido

Pantalla en el admin con preguntas sin respuesta y exportación CSV: ideas de artículos que salen de los lectores.

Seguridad quirúrgica

Excepción de autenticación solo para la ruta del asistente; el resto de la REST API sigue cerrada.

Alt text con revisión humana

Un plugin independiente sugiere textos alternativos con un modelo de visión y no toca el alt real hasta que una persona lo confirma.

Bajo el capó

El código que importa.

Fragmentos simplificados y sin datos del cliente, para que se vea el enfoque técnico real.

Excepción solo para la ruta del asistentephp
add_filter( 'rest_authentication_errors', function ( $result ) {
    $route = $GLOBALS['wp']->query_vars['rest_route'] ?? '';
    if ( str_starts_with( $route, '/site/v1/ask' ) ) {
        return true; // público, con su propio rate limit
    }
    return $result; // el resto sigue exigiendo autenticación
}, 99 );
Límites antes de llamar al modelophp
$key = 'ask_' . md5( $post_id . '|' . mb_strtolower( trim( $question ) ) );
if ( $cached = get_transient( $key ) ) return $cached;               // caché 24 h
if ( ip_rate_limited( hash( 'sha256', $ip . AUTH_SALT ) ) ) return error_429();
if ( daily_budget_exceeded() ) return error_503();                   // tope global
$context = mb_substr( wp_strip_all_tags( get_post_field( 'post_content', $post_id ) ), 0, 12000 );
Decisiones

Por qué así y no de otra forma.

Una pregunta, una respuesta

UI de chat pero sin memoria de conversación: coste plano y caché útil.

Clave de API en wp-config

Nunca en la base de datos ni en el front. Cada entorno con la suya.

Proveedor intercambiable

El plugin no depende de un proveedor concreto.

Resultado

Qué cambió, con datos verificables.

IndicadorAntesDespuésContexto
Contexto del modeloConocimiento generalSolo el artículodetecta fuera de tema
Gasto máximoSin límiteTope diariocaché + límite por IP
Datos personales en logs—Ningunotexto con consentimiento
Alt text con IA—100 % revisadonada sin confirmación

Cómo lo validé

  • Peticiones anónimas por HTTP: la ruta responde, el resto de la API sigue devolviendo 401.
  • Preguntas fuera de tema marcadas como no respondidas.
  • Registro en la tabla propia sin datos personales.
Lo que me llevo

En un piloto de IA lo difícil no es llamar al modelo, sino los límites, la privacidad y que alguien pueda aprovechar lo que pasa.

  • WordPress
  • REST API
  • PHP
  • LLM
  • Modelo de visión
  • MySQL
Para tu web

Checklist rápida: ¿te está pasando lo mismo?

  • ¿El modelo tiene un contexto cerrado?
  • ¿Hay caché, límite por IP y tope diario?
  • ¿Tus logs guardan datos personales?
  • ¿La IA publica algo sin revisión humana?
¿Te suena?

¿Tienes un problema parecido?

Preguntas frecuentes

Dudas habituales sobre este tipo de problema.

¿El asistente puede inventar?

Está limitado al artículo y se le indica que diga cuándo algo no aparece. Reduce mucho el riesgo.

¿Cuánto cuesta?

Depende del tráfico, pero con caché, límites y tope diario el máximo queda fijado de antemano.

¿Sirve cualquier proveedor?

Sí; el proveedor se elige en los ajustes.

WordPress · SEO técnico · IA

Cuéntame qué está frenando tu web.

Si ya tienes un WordPress en producción, reviso el contexto y te digo con honestidad si lo que necesitas es desarrollo, SEO técnico, rendimiento o automatización.