Explora sugerencias de opiniones sobre productos con la IA del cliente

Maud Nalpas
Maud Nalpas

Fecha de publicación: 21 de octubre de 2024

Las tiendas en línea pueden obtener un aumento del 270% en las conversiones si muestran opiniones sobre los productos. Las opiniones negativas también son clave, ya que generan credibilidad. El 82% de los compradores en línea los busca antes de comprar.

Animar a los clientes a que dejen opiniones útiles sobre los productos, en especial cuando son negativas, puede ser complicado. Aquí, exploraremos cómo usar la IA generativa para ayudar a los usuarios a escribir opiniones informativas que ayuden a las decisiones de compra de otras personas.

Demostración y código

Prueba nuestra demostración de opinión sobre productos y, luego, investiga el código en GitHub.

Cómo lo hicimos

IA del cliente

En esta demostración, implementamos la función del cliente por las siguientes razones:

  • Latencia. Queremos brindar sugerencias con rapidez, en cuanto el usuario deja de escribir. Podemos ofrecer esto evitando los viajes de ida y vuelta del servidor.
  • Costo. Si bien esta es una demostración, si estás considerando lanzar una función similar en producción, es bueno experimentar sin costo del servidor hasta que puedas validar si la función tiene sentido para tus usuarios.

IA generativa de MediaPipe

Elegimos usar el modelo Gemma 2B a través de la API de inferencia de LLM de MediaPipe (paquete de GenAI de MediaPipe) por los siguientes motivos:

  • Precisión del modelo: Gemma 2B ofrece un gran equilibrio entre tamaño y precisión. Cuando se le hizo la pregunta correcta, proporcionó resultados que consideramos satisfactorios para esta demostración.
  • Compatibilidad con varios navegadores: MediaPipe es compatible con todos los navegadores que admiten WebGPU.

Experiencia del usuario

Aplica las prácticas recomendadas para mejorar el rendimiento.

Si bien Gemma 2B es un LLM pequeño, sigue siendo una descarga grande. Aplica las prácticas recomendadas de rendimiento, que incluyen el uso de un trabajador web.

Cómo hacer que la función sea opcional

Queremos que las sugerencias de opiniones basadas en IA mejoren el flujo de trabajo del usuario para publicar una opinión sobre un producto. En nuestra implementación, el usuario puede publicar una opinión incluso si el modelo no se cargó y, por lo tanto, no ofrece sugerencias de mejora.

Figura 1: Los usuarios pueden seguir publicando sus opiniones, incluso cuando la función de IA aún no está lista.

Estados y animaciones de la IU

Por lo general, la inferencia tarda más tiempo de lo que se siente inmediato, por lo que le indicamos al usuario que el modelo está ejecutando la inferencia o "pensando". Usamos animaciones para facilitar la espera y, al mismo tiempo, asegurarle al usuario que la aplicación funciona según lo previsto. Descubre los diferentes estados de la IU que implementamos en nuestra demostración, según el diseño de Adam Argyle.

Figura 2: Las animaciones demuestran que el modelo se está cargando, luego está “pensando” y, por último, está listo.

Otras consideraciones

En un entorno de producción, se recomienda lo siguiente:

  • Proporciona un mecanismo de comentarios. ¿Qué sucede si las sugerencias son mediocres o no tienen sentido? Implementa un mecanismo de comentarios rápidos (como Me gusta y No me gusta) y recurre a la heurística para determinar qué les resulta útil a los usuarios. Por ejemplo, evalúa cuántos de tus usuarios interactúan con la función y si la desactivan.
  • Permitir inhabilitar ¿Qué sucede si el usuario prefiere usar sus propias palabras sin asistencia de IA o considera que la función es molesta? Permite que el usuario inhabilite la opción y la vuelva a habilitar cuando lo desee.
  • Explica por qué existe esta función. Una explicación breve puede alentar a los usuarios a usar la herramienta de comentarios. Por ejemplo, "Los mejores comentarios ayudan a otros compradores a decidir qué comprar y a nosotros nos ayudan a crear los productos que deseas". Puedes agregar una explicación detallada de cómo funciona la función y por qué la proporcionaste, quizás como un vínculo para obtener más información.
  • Divulga el uso de IA cuando corresponda. Con la IA del cliente, el contenido del usuario no se envía a un servidor para su procesamiento, por lo que se puede mantener en privado. Sin embargo, si compilas un resguardo del servidor o recopilas información con IA, considera agregarlo a tu política de privacidad, condiciones del servicio o a otros lugares.

Implementación

Nuestra implementación del generador de sugerencias de opiniones sobre productos podría funcionar para una amplia variedad de casos de uso. Considera la siguiente información como base para tus futuras funciones de IA del cliente.

MediaPipe en un trabajador web

Con la inferencia de LLM de MediaPipe, el código de IA es de solo unas pocas líneas: crea un solucionador de archivos y un objeto de inferencia de LLM pasándole una URL de modelo y, luego, usa esa instancia de inferencia de LLM para generar una respuesta.

Sin embargo, nuestro ejemplo de código es un poco más extenso. Esto se debe a que se implementa en un trabajador web, por lo que pasa mensajes con la secuencia de comandos principal a través de códigos de mensajes personalizados. Obtén más información sobre este patrón.

// Trigger model preparation *before* the first message arrives
self.postMessage({ code: MESSAGE_CODE.PREPARING_MODEL });
try {
 
// Create a FilesetResolver instance for GenAI tasks
 
const genai = await FilesetResolver.forGenAiTasks(MEDIAPIPE_WASM);
 
// Create an LLM Inference instance from the specified model path
  llmInference
= await LlmInference.createFromModelPath(genai, MODEL_URL);
 
self.postMessage({ code: MESSAGE_CODE.MODEL_READY });
} catch (error) {
 
self.postMessage({ code: MESSAGE_CODE.MODEL_ERROR });
}

// Trigger inference upon receiving a message from the main script
self.onmessage = async function (message) {
 
// Run inference = Generate an LLM response
  let response
= null;
 
try {
    response
= await llmInference.generateResponse(
     
// Create a prompt based on message.data, which is the actual review
     
// draft the user has written. generatePrompt is a local utility function.
      generatePrompt
(message.data),
   
);
 
} catch (error) {
   
self.postMessage({ code: MESSAGE_CODE.INFERENCE_ERROR });
   
return;
 
}
 
// Parse and process the output using a local utility function
 
const reviewHelperOutput = generateReviewHelperOutput(response);
 
// Post a message to the main thread
 
self.postMessage({
    code
: MESSAGE_CODE.RESPONSE_READY,
    payload
: reviewHelperOutput,
 
});
};
export const MESSAGE_CODE ={
  PREPARING_MODEL
: 'preparing-model',
  MODEL_READY
: 'model-ready',
  GENERATING_RESPONSE
: 'generating-response',
  RESPONSE_READY
: 'response-ready',
  MODEL_ERROR
: 'model-error',
  INFERENCE_ERROR
: 'inference-error',
};

INPUT y OUTPUT

Figura 3: Un diagrama en el que se muestra el procesamiento de la instrucción a través de la inferencia a una salida sin procesar de LLM, que luego se analiza como una recomendación de lectura a pantalla.

Nuestro prompt completo se compiló con instrucciones con varios ejemplos. Incluye la entrada del usuario o, en otras palabras, el borrador de la opinión que escribió.

Para generar la instrucción basada en la entrada del usuario, llamamos a la función de utilidad generatePrompt en el tiempo de ejecución.

Los modelos y las bibliotecas de IA del cliente suelen tener menos utilidades que la IA del servidor. Por ejemplo, el modo JSON a menudo no está disponible. Esto significa que debemos proporcionar la estructura de salida deseada dentro de la instrucción. Esto es menos claro, mantenible y confiable que proporcionar un esquema a través de la configuración del modelo. Además, los modelos del lado del cliente suelen ser más pequeños, lo que significa que tienen más probabilidades de generar errores estructurales en el resultado.

En la práctica, observamos que Gemma 2B hace un mejor trabajo al proporcionar una salida estructurada como texto en comparación con JSON o JavaScript. Por lo tanto, para esta demostración, optamos por un formato de salida basado en texto. El modelo genera texto, que luego analizamos en un objeto JavaScript para procesarlo en nuestra app web.

Mejoramos nuestra instrucción

Mi instrucción y la respuesta en la interfaz de Gemini Chat.
Figura 4. Le pedimos a Gemini Chat que mejore nuestra instrucción, y nos responde junto con una explicación de las mejoras realizadas y una advertencia sobre la eficacia.

Usamos un LLM para iterar en nuestra instrucción.

  • Instrucciones con varios ejemplos. Para generar los ejemplos de nuestras instrucciones con varios ejemplos, nos basamos en Gemini Chat. Gemini Chat usa los modelos de Gemini más potentes. Esto garantizó que generaríamos ejemplos de alta calidad.
  • Pulido de la instrucción. Una vez que la estructura de la instrucción estaba lista, también usamos Gemini Chat para definirla mejor. Esto mejoró la calidad del resultado.

Usa el contexto para aumentar la calidad

Incluir el tipo de producto en nuestra instrucción ayudó al modelo a proporcionar sugerencias más relevantes y de mejor calidad. En esta demostración, el tipo de producto es estático. En una aplicación real, puedes incluir el producto de forma dinámica en tu instrucción, según la página que visite el usuario.

Review: "I love these."
Helpful: No  
Fix: Be more specific, explain why you like these **socks**.
Example: "I love the blend of wool in these socks. Warm and not too heavy."

Uno de los ejemplos de la sección de algunas imágenes de nuestra consigna: el tipo de producto ("calcetines") se incluye en la solución sugerida y en la opinión de ejemplo.

Errores y correcciones de LLM

Por lo general, Gemma 2B requiere más ingeniería de instrucciones que un modelo más potente y más grande del servidor.

Encontramos algunos desafíos con Gemma 2B. A continuación, te mostramos cómo mejoramos los resultados:

  • Demasiado agradable. Gemma 2B tuvo dificultades para marcar las opiniones como "poco útiles", por lo que parece reacio a juzgar. Intentamos que el lenguaje de las etiquetas fuera más neutral ("específico" y "no específico", en lugar de "útil" y "no útil") y agregamos ejemplos, pero esto no mejoró los resultados. Lo que mejoró los resultados fue la insistencia y la repetición en la instrucción. Es probable que un enfoque de cadena de pensamiento también genere mejoras.
  • Las instrucciones no son claras. A veces, el modelo interpretó demasiado la instrucción. En lugar de evaluar la opinión, continuó con la lista de ejemplos. Para solucionar esto, incluimos una transición clara en la instrucción:

    I'll give you example reviews and outputs, and then give you one review
    to analyze. Let'
    s go:
    Examples:
    <... Examples>

    Review to analyze:
    <... User input>

    Estructurar claramente la instrucción ayuda al modelo a diferenciar entre la lista de ejemplos (pocas tomas) y la entrada real.

  • Objetivo incorrecto. En ocasiones, el modelo sugería cambios en el producto en lugar del texto de la opinión. Por ejemplo, para una opinión que dice "Odio estos calcetines", el modelo podría sugerir "Considera reemplazar los calcetines por una marca o un estilo diferente", que no es el efecto deseado. Dividir la instrucción ayudó a aclarar la tarea y mejoró el enfoque del modelo en la revisión.