Sugestie dotyczące opinii o produktach z wykorzystaniem AI po stronie klienta

Maud Nalpas
Maud Nalpas

Opublikowano: 21 października 2024 r.

Sklepy internetowe mogą odnotować wzrost liczby konwersji270% dzięki wyświetlaniu opinii o produktach. Negatywne opinie są również ważne, ponieważ budują wiarygodność. 82% kupujących online szuka ich przed zakupem.

Zachęcanie klientów do zamieszczania przydatnych opinii o produktach, zwłaszcza negatywnych, może być trudne. Dowiesz się, jak wykorzystać generatywną AI, aby pomóc użytkowników piszą przydatne opinie, które pomagają innym decyzji o zakupie.

Wersja demonstracyjna i kod

Wypróbuj nasze prezentacja opinii o produktach i przeanalizować w GitHubie.

Jak to powstało

AI po stronie klienta

Na potrzeby tej prezentacji wdrożyliśmy tę funkcję po stronie klienta z tych powodów:

  • Czas oczekiwania. Chcemy szybko wyświetlać sugestie, gdy tylko użytkownik przestanie pisać. Możemy to zapewnić, unikając przesyłania danych z serwerów w obie strony.
  • Koszt. To jest wersja demonstracyjna, ale jeśli rozważasz wdrożenie podobnej funkcji w wersji produkcyjnej, możesz przeprowadzić eksperyment bez żadnych kosztów po stronie serwera, dopóki nie upewnisz się, że ta funkcja jest przydatna dla użytkowników.

Generatywne AI w MediaPipe

Zdecydowaliśmy się na użycie Gemma 2B za pomocą funkcji Interfejs MediaPipe LLM Inference API (pakiet MediaPipe GenAI), z następujących powodów:

  • Dokładność modelu: Gemma 2B zapewnia doskonały balans między rozmiarem a dokładnością. Gdy został odpowiednio skonfigurowany, uzyskał wyniki, które w przypadku tego pokazu są wystarczające.
  • Obsługa w różnych przeglądarkach: MediaPipe jest obsługiwany we wszystkich przeglądarkach, które obsługują WebGPU.

Interfejs użytkownika

Stosowanie sprawdzonych metod dotyczących skuteczności

Gemma 2B to mały model LLM, ale nadal zajmuje dużo miejsca. Stosuj sprawdzone metody dotyczące wydajności, które obejmują używanie web workera.

Uczynić funkcję opcjonalną

Chcemy, aby sugestie opinii oparte na AI ułatwiały użytkownikom publikowanie opinii o produktach. W naszym przypadku użytkownik może opublikować opinię, nawet jeśli model nie został wczytany i dlatego nie oferuje wskazówek dotyczących poprawy.

Rysunek 1. Użytkownicy mogą nadal publikować opinie, nawet jeśli funkcja AI nie jest jeszcze gotowa.

Stany i animacja interfejsu

Interpretacja zajmuje zwykle więcej czasu niż natychmiastowa, dlatego sygnalizujemy użytkownikowi, że model wykonuje interpretację, czyli „myśli”. Używamy animacji, aby uprzyjemnić użytkownikom czas oczekiwania i zapewnić im, że aplikacja działa zgodnie z oczekiwaniami. Poznaj różne stany interfejsu, które wdrożyliśmy w naszej wersji demonstracyjnej według projektu Adama Argyle'a.

Rysunek 2. Animacje pokazują, że model się wczytuje, a potem „myślenie”, i w końcu.

Inne uwagi

W środowisku produkcyjnym warto:

  • Zapewnij mechanizm przesyłania opinii. Co zrobić, jeśli sugestie są przeciętne lub nie mają sensu? wdrożyć mechanizm szybkiego przekazywania opinii (np. kciuk w górę). i nie), a za pomocą heurystyki określamy, co znajdują przydatne. Oszacuj na przykład, ilu użytkowników wchodzi w interakcję z reklamami a także czy są wyłączone.
  • Zezwól na rezygnację. Co zrobić, jeśli użytkownik woli używać własnych słów bez pomocy AI czy uważasz, że dana funkcja jest irytująca? Zezwalaj użytkownikowi na rezygnację z usługi i powrót do niej.
  • Wyjaśnij, dlaczego ta funkcja istnieje. Krótkie wyjaśnienie może zachęcić użytkowników do korzystania z narzędzia do przesyłania opinii. Na przykład „Lepsze opinie pomagają innym decydują o zakupie i pomaga nam tworzyć te produkty, na których Ci zależy”. Ty możesz dodać obszerne wyjaśnienie sposobu działania tej funkcji i wyjaśniania, dlaczego podał je na przykład w postaci linków z dodatkowymi informacjami.
  • W stosownych przypadkach informuj o korzystaniu z AI. W przypadku AI po stronie klienta treści użytkownika nie są wysyłane na serwer do przetworzenia, dzięki czemu mogą pozostać prywatne. Jeśli jednak tworzysz alternatywę po stronie serwera lub gromadzisz informacje za pomocą AI, rozważ dodanie informacji o tym do polityki prywatności, warunków korzystania z usługi lub w innych miejscach.

Implementacja

Nasza implementacja podpowiadającego recenzje produktów może sprawdzić się przypadków użycia. Poniższe informacje mogą Ci się przydać w przyszłości funkcje AI po stronie klienta.

MediaPipe w instancji roboczej

W przypadku MediaPipe LLM inference kod AI składa się tylko z kilku linii: tworzysz resolver plików i obiekt LLM inference, przekazując mu URL modelu, a następnie używasz instancji LLM inference do generowania odpowiedzi.

Nasz przykładowy kod jest jednak nieco bardziej rozbudowany. Dzieje się tak, ponieważ jest ona implementowana w procesie web worker, więc przekazuje wiadomości z głównego skryptu za pomocą kodów wiadomości niestandardowych. Więcej informacji o tego wzoru.

// Trigger model preparation *before* the first message arrives
self.postMessage({ code: MESSAGE_CODE.PREPARING_MODEL, payload: null });
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, payload: null });
} catch (error) {
  self.postMessage({ code: MESSAGE_CODE.MODEL_ERROR, payload: null });
}

// Trigger inference upon receiving a message from the main script
self.onmessage = function (message) {
  if (!llmInference) {
    // Just in case. This condition shouldn't normally be hit because
    // the inference UI button is disabled until the model is ready
    throw new Error("Can't run inference, the model is not ready yet");
  }
  (async function () {
    // Run inference = Generate an LLM response
    try {
    const 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, payload: null });
    }
    // 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',
};

Dane wejściowe i wyjściowe

Rysunek 3. Diagram prezentujący przetwarzanie promptu przez wnioskowanie na podstawie nieprzetworzonych danych wyjściowych LLM, które są następnie analizowane w formie rekomendacji odczytu na potrzeby wyświetlania.

Nasz pełny prompt powstał w prompt „few-shot”. Zawiera dane wejściowe użytkownika, czyli wersję roboczą opinii napisane.

Aby wygenerować prompt na podstawie danych wejściowych użytkownika, wywołujemy w czasie wykonywania funkcję pomocniczą generatePrompt.

Modele i biblioteki AI po stronie klienta zwykle mają mniej narzędzi niż AI po stronie serwera. Na przykład tryb JSON często jest niedostępny. Oznacza to, że w promptzie musimy podać żądaną strukturę danych wyjściowych. Ta metoda jest mniej przejrzysta, mniej niezawodna i trudniejsza do utrzymania niż podanie schematu w ramach konfiguracji modelu. Dodatkowo modele po stronie klienta są zazwyczaj mniejsze, co oznacza, że są bardziej podatne na błędy strukturalne w wyjściu.

W praktyce zauważyliśmy, że Gemma 2B lepiej radzi sobie z wygenerowaniem danych wyjściowych w postaci tekstu uporządkowanego niż w przypadku formatu JSON czy JavaScript. W tej prezentacji wybraliśmy format tekstowy. Model generuje tekst, który następnie przetwarzamy na obiekt JavaScript do dalszego przetwarzania w naszej aplikacji internetowej.

ulepszanie prompta,

Mój prompt i odpowiedź w interfejsie Gemini Chat.
Rysunek 4. Poprosimy Gemini Chat o ulepszanie promptu. W odpowiedzi znajdziesz wyjaśnienie, jakie zmiany zostały wprowadzone, oraz ostrzeżenie dotyczące skuteczności.

Do iteracji promptu użyliśmy LLM.

  • Prompty „few-shot”. Aby wygenerować przykłady promptów typu „few-shot”, korzystało z Gemini Chat. Gemini Chat korzysta z najbardziej zaawansowanych modeli Gemini. Dzięki temu udało nam się wygenerować przykłady wysokiej jakości.
  • Dopracowywanie promptów. Gdy struktura promptu była gotowa, użyliśmy Gemini Chat, aby go dopracować. Poprawiło to jakość danych wyjściowych.

Używaj kontekstu, aby poprawić jakość

Uwzględnienie typu produktu w promptach pomogło modelowi generować bardziej trafne sugestie o wyższej jakości. W tej wersji demonstracyjnej typ usługi jest statyczny. W prawdziwej aplikacji możesz dynamicznie dodawać produkt do promptu na podstawie strony, którą przegląda użytkownik.

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."

Jednym z przykładów w sekcji „kilka ujęć” naszego promptu jest nazwa „Typ produktu”. („skarpetki”) są uwzględnione w sugerowanej poprawce i przykładowej opinii.

Problemy z modelami LLM i ich poprawki

Gemma 2B zwykle wymaga innych metod inżynierii promptów po stronie serwera.

Wystąpiły pewne problemy z Gemma 2B. Oto, jak udało nam się poprawić wyniki:

  • Za miły. Gemma 2B miała problemy z oznaczeniem opinii jako „nieprzydatne”, ponieważ nie była pewna, jaką ocenę wystawić. Staraliśmy się, aby język etykiet był bardziej neutralny („konkretne” i „nieprecyzyjne”, zamiast „przydatne” i „nieprzydatne”) oraz dodano przykłady, ale nie poprawiło to wyników. Co wpłynęło na poprawę wyników: naległości i powtórzeń w prompcie. Podejście oparte na ciągu myśli również może przynieść poprawę.
  • Niejasne instrukcje. Model czasami nadinterpretował prompt. Zamiast oceny opinia została kontynuowana z listy przykładów. Aby rozwiązać ten problem: w prompcie zawarliśmy wyraźne przejście:

    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>
    

    Jasne ustrukturyzowanie promptu pomaga modelowi odróżnić listę przykładów (kilka ujęć) od rzeczywistego wejścia.

  • Nieprawidłowy cel. Czasami model sugerował zmiany w produkcie, a nie w tekście recenzji. Na przykład dla opinii zawierającej „Nienawidzę tych skarpetki”, model może zasugerować: „Zastąp skarpetki innym, „marka lub styl”, co nie jest pożądanym efektem. Podzielenie prompta pomogło wyjaśnić zadanie i skupić model na weryfikacji.