NLP en el dispositivo: privacidad, velocidad y la frontera del navegador
Cuando un usuario habla con un asistente virtual, el camino más rápido hacia una respuesta es aquel que nunca abandona el dispositivo. El NLP en el dispositivo elimina el viaje de ida y vuelta a un servidor remoto, reduciendo la latencia percibida de cientos de milisegundos a casi cero. Más importante aún, significa que las palabras que el usuario escribe o pronuncia se procesan localmente y se descartan localmente: nunca se transmiten, nunca se registran y nunca quedan a merced de la política de retención de datos de un tercero. Para aplicaciones que manejan dominios sensibles como la salud, las finanzas o la productividad personal, esto no es un lujo; es un requisito fundamental.
Ejecutar modelos de inferencia en el navegador o en un dispositivo móvil es genuinamente difícil. El sandbox del navegador restringe el acceso a hilos nativos, el cómputo en GPU está limitado por WebGL o la todavía inmadura API WebGPU, y los presupuestos de memoria son ajustados. En móvil, se compite con el sistema operativo, los procesos en segundo plano y el throttling térmico. Las bibliotecas NLP tradicionales diseñadas para Node.js o Python del lado del servidor arrastran dependencias transitivas que inflan el tamaño del bundle más allá de lo que un WebView móvil puede cargar cómodamente. El reto de ingeniería no es solo hacer que un modelo funcione, sino hacerlo lo suficientemente rápido, pequeño y fiable como para que los usuarios nunca noten su presencia.
El motor NLP de Actor.dev, @noondra/nlp, fue diseñado desde el principio teniendo en cuenta estas restricciones. Es un paquete TypeScript puro con una única dependencia en tiempo de ejecución (budoux, para la segmentación de límites de palabras en japonés). No hay ningún addon nativo, ningún blob WASM descargado desde una CDN ni ninguna superficie de la API de Node.js: funciona de forma idéntica en V8, JavaScriptCore y Hermes. El motor gestiona la clasificación de intenciones, la extracción de entidades, el relleno de slots y la gestión del estado del diálogo íntegramente en proceso. Los pesos del modelo se serializan como estructuras JSON compactas que se cargan una vez y se mantienen en memoria durante la sesión, lo que garantiza tiempos de primera respuesta deterministas independientemente de las condiciones de red.
La disyuntiva honesta es precisión frente a tamaño. Un clasificador de intenciones basado en transformers superará a un modelo TF-IDF con ingeniería de características en entradas fuera de distribución, pero también implica entre 50 y 200 MB de pesos que hay que descargar y mantener en RAM de forma ineludible. Para la mayoría de los casos de uso de asistentes conversacionales, la distribución de las entradas del usuario está acotada por el dominio que cubre el asistente. Un modelo superficial bien entrenado con buena cobertura de ese dominio supera a un modelo general de gran tamaño que destina su capacidad a temas que el usuario nunca planteará. El enfoque de Actor.dev apuesta por esto: los proyectos NLP se entrenan por agente, los modelos resultantes son pequeños y específicos del dominio, y la precisión en entradas dentro del dominio es competitiva con arquitecturas mucho más grandes. Cuando una consulta cae genuinamente por debajo del umbral de confianza del modelo, el runtime cede el paso de forma elegante a un modelo LLM de respaldo, manteniendo la vía rápida y preservando la calidad donde importa.