paint-brush
Un desarrollador de Salesforce crea un asistente LLM que se ejecuta localmente en su máquinapor@akutishevsky
548 lecturas
548 lecturas

Un desarrollador de Salesforce crea un asistente LLM que se ejecuta localmente en su máquina

por Anton Kutishevsky7m2025/03/17
Read on Terminal Reader

Demasiado Largo; Para Leer

Creé un componente web Lightning de Salesforce que te permite ejecutar potentes modelos de lenguaje de IA (LLM) directamente en tu ordenador dentro de Salesforce. Utiliza la tecnología Pico LLM para procesar datos localmente, manteniendo tu información segura y respondiendo rápidamente. Puedes usarlo para generar correos electrónicos, redactar contenido, analizar datos de clientes y mucho más, todo sin depender de servicios externos. ¡Consulta el vídeo de demostración y el repositorio de GitHub para obtener más información!
featured image - Un desarrollador de Salesforce crea un asistente LLM que se ejecuta localmente en su máquina
Anton Kutishevsky HackerNoon profile picture

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.

Características

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:


  • Compatible con varios modelos. Se puede usar cualquier modelo de código abierto del sitio web de Pico, como Gemma, Llama o Phi. La única limitación es la cantidad de RAM de tu ordenador. Cuanto mayor sea el peso del modelo, mayor será el consumo de RAM.
  • Funciona con un solo registro. Al colocar el componente en una página de registro, puede acceder a él para obtener contexto. Por ejemplo, al estar en la página de detalles de un registro de cuenta, puede generar una respuesta basada en los valores de sus campos.
  • Admite registros relacionados. Cuando un registro tiene registros relacionados, el componente puede consultarlos e incorporarlos en las respuestas.
  • Configurable. El componente se puede configurar sobre la marcha mediante la ventana emergente de configuración. Permite cambiar las opciones de generación, como el límite de tokens de finalización, la temperatura y el P superior.

Cómo funciona

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.

¿Qué es Pico LLM?

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 .

La parte LWC

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:


  • Cargando un modelo. El LWC cuenta con un botón que permite cargar el modelo que se desee. Este botón activa un elemento de entrada de archivo oculto dentro del iframe. Una vez cargado el modelo, el SDK de Pico crea web workers y el componente está listo para procesar la entrada del usuario.
  • Configuración de un mensaje del sistema. No es necesario escribir un mensaje del sistema cada vez; es fácil seleccionar cualquier registro guardado del objeto System_Prompt__c . Al pulsar el botón, se muestra una ventana emergente con los mensajes del sistema existentes para elegir.
  • Aceptación de entradas del usuario. Hay un área de texto redimensionable para recopilar las entradas del usuario. Una vez recopiladas, se envían al iframe como carga útil y se añaden al historial de conversaciones.
  • Acceso a los registros de Salesforce. Hay dos botones: Seleccionar campos y Seleccionar registros relacionados. El primero recopila los valores de campo del registro en una página de registro donde reside el LWC. El segundo permite seleccionar un objeto relacionado y consultar sus registros junto con los valores de campo seleccionados. Esta información también se envía al iframe como carga útil.
  • Modificación de las opciones de generación. Si se desea, se pueden modificar el límite del token de finalización, la temperatura y las opciones de P máximo mediante un botón específico en el componente. Esta información también se envía como carga útil al iframe.
  • Generando un resultado. Cuando el iframe recibe la carga útil, utiliza el SDK de Pico para utilizar el modelo cargado y generar un resultado. Si se proporcionaron opciones de generación, se tienen en cuenta. Además, el cuadro de diálogo se actualiza constantemente, por lo que el LLM recordará su historial.
  • Representación de mensajes de chat. El LWC puede representar los mensajes salientes, que son los proporcionados por el usuario. Los mensajes entrantes, que contienen la respuesta generada, se representan dinámicamente una vez que el componente tiene algo que decir al usuario, como los resultados generados o los mensajes de información y error.

Un poco de código Apex

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.

Desafíos del desarrollo

Trabajadores web

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.

Uso de registros de Salesforce para el contexto

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.

Actuación

La funcionalidad del componente se probó en estas máquinas:

  • PC con procesador AMD Ryzen 9 9900X y 32GB de RAM (5600 MT/s).
  • Microsoft Surface Laptop 7 equipado con el procesador Snapdragon X-Elite ARM con 16 GB de RAM (8448 MT/s).

La velocidad de carga del modelo: todo es cuestión de memoria

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:


Velocidad de generación de respuestas

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.

¿Qué tal usar una GPU?

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.

Conclusión

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 .