He estado experimentando con los LLM locales dentro de Salesforce y me gustaría contarles sobre el componente que desarrollé como resultado. Tiene la interfaz de chat ya conocida que utiliza los registros de Salesforce como contexto. Funciona localmente en su computadora, por lo que los datos procesados no se envían a ningún servicio de terceros.
La introducción de Agentforce fue lo que me inspiró a desarrollar el componente. Agentforce utiliza agentes: sistemas que pueden tomar decisiones y realizar diversas acciones. Los asistentes, en cambio, solo procesan la información de forma reactiva. Aunque creo que es posible crear un agente local con Pico LLM, requeriría un esfuerzo enorme. Por lo tanto, decidí desarrollar un asistente.
Como es de esperar, un LLM genera respuestas sobre cualquier tema, ya que está preentrenado con un amplio conjunto de datos. Además, puede usar registros de Salesforce para obtener contexto adicional. Las características del componente son:
Desde la perspectiva del usuario final, el proceso es sencillo: se carga un modelo, se selecciona una solicitud del sistema, se seleccionan los registros, se escribe una solicitud de usuario y se observa el resultado generado.
Ejecutar LLM en un navegador consume muchos recursos debido al tamaño del modelo, los requisitos de ancho de banda y la memoria RAM. Por ello, el equipo de Pico desarrolló su técnica de compresión picoLLM, que optimiza considerablemente el uso local de LLM en los ordenadores. Proporcionaron el motor de inferencia picoLLM, como SDK de JavaScript, para que los desarrolladores frontend puedan ejecutar LLM localmente en todos los navegadores. Es compatible con todos los navegadores modernos, como Chrome, Safari, Edge, Firefox y Opera. Para saber más sobre el funcionamiento del motor de inferencia picoLLM, puedes leer su artículo .
El componente sirve de puente entre el usuario y la interfaz de PicoLLM. En el núcleo del componente se encuentra una página de Visualforce incrustada como iframe. La página carga el SDK de PicoLLM y se comunica con el LWC, lo que permite a este último utilizar el SDK mediante mensajes de publicación. La combinación completa de elementos gestiona lo siguiente:
System_Prompt__c
. Al pulsar el botón, se muestra una ventana emergente con los mensajes del sistema existentes para elegir.En el backend, no hay nada sofisticado. El código Apex se encarga de todo el trabajo pesado relacionado con la detección de las relaciones entre los objetos mediante un ID de registro de la página de registro. Además, realiza un par de consultas SOQL, cumpliendo así su función.
Anteriormente, usaba la herramienta unpkg para ejecutar código desde el módulo de nodo en el componente LWC. Este método requería pasos de configuración adicionales y era una forma menos segura de hacerlo funcionar. Esta vez, quería ejecutar el módulo PicoLLM directamente desde Salesforce, no solo desde el sitio de Experience Cloud, como ya había hecho, sino también desde la interfaz de Lightning Experience.
Internamente, PicoLLM utiliza web workers para el procesamiento paralelo, y este era el principal problema porque no se permitía ejecutarlos desde LWC. Por suerte, nadie nos impidió ejecutar web workers desde una página de Visualforce, y ese fue el enfoque que utilicé.
Descargué el código PicoLLM sin procesar y lo agregué como recurso estático a la página de Visualforce. En LWC, usé un iframe que contenía la página de Visualforce. La comunicación entre LWC y la página dentro del iframe me permitió usar web workers. La página activa el código relacionado con PicoLLM desde el componente web Lightning.
Copia y pega registros de Salesforce en formato JSON o CSV, introdúcelos en cualquier LLM en línea y observa. Utilizará los registros, los usará para contexto adicional y generará una respuesta. Resultó que no es tan fácil usar modelos comprimidos para el procesamiento local.
Al principio, simplemente introducía los registros en formato JSON directamente en la solicitud del usuario. Después, esperaba que el sistema fuera lo suficientemente inteligente como para distinguir la solicitud del contexto adicional que proporcionaba. Utilicé diferentes modelos de distintos tamaños y no entendía por qué no usaba el JSON para generar respuestas. Principalmente, se trataba de rechazos a responder a mi solicitud o de la generación de datos ficticios no relacionados con lo que le pedía. Empecé a experimentar con diferentes formatos de datos de contexto: usando CSV, JSON, divisores de solicitudes para diferenciar estrictamente la solicitud del contexto; nada funcionó.
Casi abandoné la idea porque la función clave no funcionaba. Después de un par de meses, se me ocurrió una idea genial. ¿Y si simplemente invertía el orden de las partes del mensaje? De primero el mensaje del usuario y después el contexto, a luego el contexto y después el mensaje. Para mi sorpresa, funcionó, y cualquier modelo que usara empezó a interpretar los registros de Salesforce como contexto.
La funcionalidad del componente se probó en estas máquinas:
La parte más lenta del uso del componente es la carga inicial del modelo. Podrías esperar que el 9900X supere fácilmente al Snapdragon X-Elite, pero te equivocas. Para mi sorpresa, este último es más rápido. Dado que tiene una memoria más rápida, supongo que cuanto más rápida sea la RAM, más rápido se cargará el modelo. Aquí tienes una tabla comparativa de la velocidad de carga del modelo como referencia:
Lo mismo ocurre con la velocidad de generación de respuestas. Según tengo entendido, se necesita una combinación rápida de CPU y RAM para obtener la generación más rápida posible. Dado que la generación de respuestas varía con el mismo mensaje, no realicé pruebas de velocidad precisas. Sin embargo, la velocidad de generación es extremadamente rápida, casi tan rápida como las alternativas en línea.
De hecho, usar una GPU para generar respuestas sería mucho más eficiente. Si bien es posible usar una GPU con PicoLLM, no he probado esa configuración personalmente. Hay un par de razones para ello. Primero, creo que usa la función WebGPU, que no está habilitada por defecto en la mayoría de los navegadores (excepto Edge). Segundo, probablemente requiere varios gigabytes de VRAM para cargar el modelo, que no tengo.
Desarrollar este asistente ha sido una fascinante aventura de exploración. Desde afrontar las limitaciones de los trabajadores web hasta descubrir el papel crucial del orden de los avisos para proporcionar contexto, los desafíos han sido estimulantes y gratificantes. El resultado es un componente web Lightning que ofrece un enfoque único para aprovechar el potencial de los grandes modelos de lenguaje dentro del ecosistema de Salesforce.
Si bien el tiempo de carga inicial del modelo puede ser un factor a considerar, especialmente para modelos más grandes, la capacidad de procesar datos localmente ofrece ventajas significativas en términos de seguridad, capacidad de respuesta y rentabilidad. Los posibles casos de uso, desde la automatización de la generación de contenido hasta la prestación de asistencia inteligente, son numerosos y esperan ser explorados.
Consulte el repositorio de GitHub .