Todo lo que querrías saber antes de instalar.
Una mirada detallada a cómo funciona DataFirefly Enlazado Interno Semántico IA — Embeddings vectoriales, similitud coseno e inserción semiautomática con anclas inteligentes para PrestaShop 8 & 9 (Mistral, OpenAI), por qué lo construimos así y la lógica detrás de las características anteriores.
Por qué el enlazado interno semántico es superior al enlazado por palabras clave
Los módulos de enlazado interno clásicos funcionan con reglas palabra clave hacia URL. Introduces alfombra bereber y asocias la URL de la categoría alfombra-bereber. El motor hace luego un find-replace en el HTML de tus artículos, productos o páginas. Este enfoque tiene dos limitaciones grandes. Es rígido: solo dispara un enlace cuando la palabra clave exacta aparece, lo que excluye todas las páginas donde el tema se trata con otra formulación (alfombra marroquí, kilim, alfombra tradicional). Y es ciego al contexto semántico: el motor no sabe si la página destino es realmente relevante para el contenido fuente, solo hace coincidencia de cadenas. El enlazado semántico funciona de otra forma: cada contenido se representa por un vector de varios cientos de dimensiones que codifica su significado — producto, categoría, página CMS, blog. Dos contenidos están vinculados si están cerca en este espacio vectorial, independientemente de las palabras usadas. El módulo detecta así oportunidades de enlazado que un motor por palabras clave nunca vería, y evita los falsos positivos donde una palabra clave aparece en un contexto no relevante.
Embeddings IA: cómo funciona en la práctica
En la primera indexación, el módulo recorre todas las entidades activas de tu tienda para los tipos habilitados (productos, categorías, páginas CMS). Para cada entidad, el contenido textual se extrae y se limpia: título, meta_title, meta_description, descripción corta y descripción larga (el HTML se elimina correctamente). El texto limpio se envía entonces en lote al proveedor de IA configurado (Mistral u OpenAI), que devuelve un vector de embedding por elemento — una lista de números flotantes que representa la semántica del texto. Este vector se almacena en la base como BLOB float32 empaquetado en little-endian, con su norma L2 precalculada para acelerar los cálculos posteriores de similitud. La similitud entre dos contenidos se calcula entonces en PHP por producto escalar normalizado (similitud coseno), una operación extremadamente rápida una vez precalculadas las normas. En un catálogo de 5.000 entidades, el cálculo completo de todos los pares en un idioma solo tarda unos segundos.
Por qué dos proveedores y no uno solo
Cada proveedor tiene su sweet spot. Mistral mistral-embed es la opción por defecto recomendada: 1024 dimensiones, latencia muy baja, alojamiento en Europa (soberanía UE para tiendas sensibles), coste de unos 10 céntimos por millón de tokens — muy por debajo de un euro para indexar un catálogo de varios miles de entidades multiidioma. OpenAI text-embedding-3-small es la alternativa: 1536 dimensiones (espacio vectorial más rico), excelente en idiomas no europeos, coste de unos 2 centavos por millón de tokens (cinco veces más barato que Mistral en USD). El módulo unifica los dos proveedores tras una interfaz común: mismo formato de retorno, mismo mecanismo de lote, misma gestión de errores con PrestaShopLogger. Puedes pasar de un proveedor a otro desde el desplegable de configuración — el módulo detectará que las dimensiones han cambiado e invitará a reindexar (un solo clic en Reindexar todo).
El generador de anclas, la verdadera pieza maestra del módulo
Es el punto que marca la diferencia con un módulo de sugerencias bruto. Para cada par (fuente, destino) por encima del umbral de similitud, el generador de anclas aplica el siguiente algoritmo: extrae el título del destino, lo divide en n-gramas de 2 a 6 palabras, retira los stopwords (francés e inglés), y busca cada uno de estos n-gramas literalmente en el cuerpo de la fuente. Los n-gramas encontrados se ordenan por longitud decreciente (los más largos son más discriminativos y están más optimizados SEO) y se presentan en el desplegable del backoffice. El ancla por defecto seleccionada es la más larga encontrada — lo que da típicamente un ancla de 3 o 4 palabras que incluye las palabras clave principales del título destino. Si ningún n-grama del título destino aparece en la fuente, el módulo propone el título destino bruto (modo fallback). Mantienes por supuesto el control: desplegable editable, opción Personalizar para escribir cualquier texto de ancla. En el momento de la inserción, el módulo elige la primera ocurrencia del texto del ancla en el cuerpo de la fuente que no esté ya en una etiqueta a, code o pre — cero riesgo de romper un enlace existente o de volver a enlazar un texto ya enlazado.
Reversión quirúrgica mediante marcador único
Es la función que tranquiliza a todos los comerciantes prudentes con sus descripciones. Cada enlace insertado recibe un atributo HTML data-dfasl que lleva un identificador único de 36 caracteres generado aleatoriamente en la inserción (formato tipo UUID). El identificador también se guarda en la base de datos en la tabla dfasl_inserted_link, junto con la entidad fuente, el destino, el ancla, la fecha de inserción y el ID del empleado que validó. Para retirar un enlace, vas a la pestaña Enlaces insertados, haces clic en Retirar junto a la fila correspondiente: el módulo ejecuta una regex que coincide exactamente con el patrón de ancla a data-dfasl con este identificador único, retira la etiqueta a manteniendo intacto el texto del ancla, y marca el enlace como retirado en la base de datos. Ninguna otra etiqueta de la descripción se ve afectada, ningún enlace manual corre peligro. Sobre 500 enlaces insertados por el módulo en 200 fichas de producto, puedes retirar uno solo en un clic sin tocar los otros 499.
Worker CLI y estrategia de procesamiento para catálogos grandes
En un catálogo de unas decenas de productos, todo se puede hacer desde el backoffice: Reindexar todo y luego Procesar lote es suficiente. Más allá de algunos miles de entidades, la interfaz se vuelve lenta y el usuario no quiere dejar el navegador abierto durante horas. El módulo expone un worker CLI (bin/analyze.php) que se lanza por línea de comandos PHP con cuatro opciones. --shop para apuntar a una tienda concreta en un entorno multitienda. --enqueue-all para volver a encolar todas las entidades activas antes de procesar — útil para una reindexación completa tras un cambio de proveedor o modelo. --loop para seguir iterando mientras queden elementos por procesar. --max-batches para limitar el número de lotes procesados en una sola ejecución (seguridad anti-runaway). --sleep para intercalar una pausa entre lotes (útil para mantenerse bajo los rate limits API). El comando típico para un cron cada 15 minutos es: php modules/dfaisemanticlinks/bin/analyze.php --loop --max-batches=50 --sleep=1. El worker reinicia automáticamente las entradas bloqueadas en estado En proceso desde hace más de 30 minutos (caso en que un worker anterior se habría caído), gestiona los errores API marcando los elementos afectados en estado Error con el mensaje, y sigue procesando los elementos sanos del lote.
Reindexación automática y frescura del índice
Un índice que se desincroniza del catálogo pierde todo su valor. El módulo gestiona la frescura vía hooks nativos de PrestaShop. En cada cambio de un producto, una categoría o una página CMS (hooks actionObjectProductUpdateAfter, actionObjectCategoryUpdateAfter, actionObjectCmsUpdateAfter), la entidad afectada vuelve a la cola con estado Pendiente, en todos los idiomas activos — el siguiente worker la procesará automáticamente. En la eliminación (hooks actionObjectProductDeleteAfter, actionObjectCategoryDeleteAfter, actionObjectCmsDeleteAfter), los embeddings y sugerencias asociadas se purgan en cascada. El módulo incluye también un hash de contenido (SHA-256 del texto limpio): si una entidad vuelve a la cola sin que su contenido real haya cambiado (por ejemplo porque un empleado solo ha tocado el stock), el lote de indexación detecta el hash sin cambios y omite la llamada API — ahorro de tokens. La reindexación automática es conmutable desde Configuración (opción DFASL_AUTO_INDEX), útil para pausarla durante una importación CSV masiva y reanudarla con un Reindexar todo una vez terminada la importación.
Multitienda y multiidioma nativos
El módulo es nativamente multitienda y multiidioma. Los embeddings tienen scope por el triplete (entidad, idioma, tienda) — un mismo producto en dos tiendas tendrá dos embeddings independientes si las descripciones difieren, y un mismo producto en francés e inglés tendrá dos embeddings diferentes aunque la ficha sea la misma. Las sugerencias nunca cruzan fronteras lingüísticas: un producto francés nunca recibirá una sugerencia de enlace a un producto inglés (lo que no tendría ningún sentido SEO). Las fronteras de tienda se respetan de la misma forma. La configuración puede diferir por tienda (clave API, umbral de similitud, tipos indexados, hook de visualización) — útil cuando tienes una tienda B2B con contenido técnico y una tienda B2C con contenido para el gran público en la misma infraestructura.
Casos de uso típicos
Tienda de moda multiidioma con catálogo de 2.000 productos — el enlazado semántico detecta pares de productos visualmente o estilísticamente cercanos (por ejemplo dos variaciones de un corte de vestido) que las reglas por palabras clave perderían sistemáticamente. Tienda B2B técnica con descripciones densas — el enlazado semántico conecta productos que comparten un mismo caso de uso industrial sin que el vocabulario sea idéntico. Blog de e-commerce — cada artículo puede referenciar automáticamente los productos, categorías y otros artículos más relevantes por significado, con anclas extraídas literalmente del texto del artículo (lo contrario de un find-replace mecánico). Renovación de catálogo — tras una importación masiva o una reorganización, un Reindexar todo reconstruye el enlazado en unos minutos donde una estrategia manual habría llevado semanas de trabajo editorial. Catálogo con vocabulario muy especializado (cosmética bio, equipo médico, productos técnicos) — el módulo detecta proximidades semánticas que los no expertos no verían, y permite al equipo SEO descubrir oportunidades de enlazado no evidentes.
Arquitectura interna y compatibilidad PrestaShop 8 y 9
El módulo está construido en PHP 8.1+ con tipos estrictos, clases readonly y características modernas (match, enums). La carga automática es PSR-4 bajo el namespace DataFirefly/AiSemanticLinks/ mapeado en src/. Los controllers admin están en legacy ModuleAdminController (no Symfony Grid) — elección deliberada para garantizar una compatibilidad estable entre PrestaShop 8.0 y 9.x sin tener que mantener dos variantes del código. Un mini-contenedor de servicios casero (ServiceContainer) conecta los repositorios y servicios de negocio — esto aísla al módulo de las diferencias del contenedor Symfony entre versiones de PrestaShop, y evita una dependencia que se rompería en cada actualización mayor. Cinco tablas SQL con prefijo dfasl_: embedding (vectores y hashes), queue (cola de trabajo), suggestion (pares propuestos), inserted_link (enlaces activos), job (operaciones de bulk). La desinstalación elimina limpiamente las 5 tablas y purga todas las variables de configuración DFASL_*. El código fuente se entrega sin cifrar, conforme PSR — puedes override, auditar o extender a tu gusto.
No hay valoraciones aún.