Vorschläge für Rezensionen mit clientseitiger KI ansehen

Maud Nalpas
Maud Nalpas

Veröffentlicht: 21. Oktober 2024

Onlineshops können durch die Präsentation von Produktrezensionen einen Anstieg der Conversions um 270 % verzeichnen. Negative Rezensionen sind ebenfalls wichtig, da sie Glaubwürdigkeit schaffen. 82 % der Onlinekäufer suchen vor dem Kauf nach Rezensionen.

Kunden dazu zu bewegen, hilfreiche Produktrezensionen zu hinterlassen, kann schwierig sein, insbesondere wenn sie negativ sind. Hier erfahren Sie, wie Sie generative KI nutzen können, um Nutzern dabei zu helfen, informative Rezensionen zu schreiben, die anderen bei der Kaufentscheidung helfen.

Demo und Code

Sehen Sie sich unsere Demo für Rezensionen an und sehen Sie sich den Code auf GitHub an.

So haben wir das Tool entwickelt

Clientseitige KI

Für diese Demo haben wir die Funktion aus folgenden Gründen clientseitig implementiert:

  • Latenz. Wir möchten schnell Vorschläge machen, sobald der Nutzer aufhört zu tippen. Das ist möglich, weil wir Server-Roundtrips vermeiden.
  • Kosten. Auch wenn dies eine Demo ist, können Sie mit dieser Funktion ohne serverseitige Kosten experimentieren, bis Sie herausgefunden haben, ob die Funktion für Ihre Nutzer sinnvoll ist.

Generative KI von MediaPipe

Wir haben uns aus folgenden Gründen für das Gemma 2B-Modell über die MediaPipe LLM Inference API (MediaPipe GenAI-Paket) entschieden:

  • Modellgenauigkeit: Gemma 2B bietet ein ausgewogenes Verhältnis zwischen Größe und Genauigkeit. Bei passenden Prompts hat das System Ergebnisse geliefert, die wir für diese Demo zufriedenstellend fanden.
  • Browserübergreifende Unterstützung: MediaPipe wird in allen Browsern unterstützt, die WebGPU unterstützen.

Nutzererfahrung

Best Practices für die Leistung anwenden

Gemma 2B ist zwar ein kleines LLM, aber dennoch ein großer Download. Best Practices für die Leistung anwenden, einschließlich der Verwendung eines Webworkers.

Funktion optional machen

Die KI-basierten Rezensionsvorschläge sollen den Workflow des Nutzers beim Posten einer Produktrezension verbessern. In unserer Implementierung kann der Nutzer auch dann eine Rezension veröffentlichen, wenn das Modell nicht geladen wurde, und bietet daher keine Optimierungstipps an.

Abbildung 1. Nutzer können ihre Rezension auch dann posten, wenn die KI-Funktion noch nicht verfügbar ist.

UI-Status und ‑Animationen

Inferenzen dauern in der Regel länger als eine sofortige Inferenz. Daher signalisieren wir dem Nutzer, dass das Modell eine Inferenz ausführt, also „denkt“. Mithilfe von Animationen wird die Wartezeit verkürzt und der Nutzer wird gleichzeitig beruhigt, dass die Anwendung wie vorgesehen funktioniert. Sehen Sie sich die verschiedenen UI-Zustände an, die wir in unserer Demo implementiert haben, die von Adam Argyle entworfen wurde.

Abbildung 2. Animationen zeigen, dass das Modell erst geladen wird, dann „denkt“ und schließlich fertig ist.

Weitere Hinweise

In einer Produktionsumgebung können Sie Folgendes tun:

  • Bieten Sie einen Feedbackmechanismus. Was ist, wenn die Vorschläge nicht gut sind oder keinen Sinn ergeben? Implementieren Sie einen Mechanismus für schnelles Feedback (z. B. „Mag ich“ und „Mag ich nicht“) und nutzen Sie Heuristiken, um zu ermitteln, was Nutzer nützlich finden. Beurteilen Sie beispielsweise, wie viele Ihrer Nutzer mit der Funktion interagieren und ob sie sie deaktivieren.
  • Sie müssen die Möglichkeit zum Deaktivieren der Funktion anbieten. Was ist, wenn der Nutzer lieber seine eigenen Worte ohne KI-Unterstützung verwenden möchte oder die Funktion als störend empfindet? Der Nutzer muss die Möglichkeit haben, die Funktion jederzeit zu deaktivieren und wieder zu aktivieren.
  • Erkläre, warum es diese Funktion gibt. Eine kurze Erklärung kann Nutzer dazu anregen, das Feedback-Tool zu verwenden. Beispiel: „Besseres Feedback hilft anderen Käufern bei der Kaufentscheidung und uns dabei, die Produkte zu entwickeln, die Sie sich wünschen.“ Sie könnten eine ausführliche Erklärung dazu hinzufügen, wie die Funktion funktioniert und warum Sie sie anbieten. Vielleicht als Link, über den weitere Informationen zu finden sind.
  • Offenlegen Sie gegebenenfalls die KI-Nutzung. Bei der clientseitigen KI werden die Inhalte des Nutzers nicht zur Verarbeitung an einen Server gesendet und können daher privat bleiben. Wenn Sie jedoch einen serverseitigen Fallback erstellen oder anderweitig Informationen mit KI erheben, sollten Sie dies in Ihrer Datenschutzerklärung, in den Nutzungsbedingungen oder an anderer Stelle angeben.

Implementierung

Unsere Implementierung für das Tool zum Vorschlagen von Rezensionen kann für viele verschiedene Anwendungsfälle geeignet sein. Die folgenden Informationen können Sie als Grundlage für Ihre zukünftigen clientseitigen KI-Funktionen verwenden.

MediaPipe in einem Webworker

Mit der MediaPipe-LLM-Inferenz besteht der KI-Code aus nur wenigen Zeilen: Sie erstellen einen Datei-Resolver und ein LLM-Inferenzobjekt, indem Sie ihm eine Modell-URL übergeben. Später verwenden Sie dann diese LLM-Inferenzinstanz, um eine Antwort zu generieren.

Unser Codebeispiel ist jedoch etwas umfassender. Das liegt daran, dass es in einem Webworker implementiert ist und Nachrichten mit dem Hauptscript über benutzerdefinierte Nachrichtencodes weitergibt. Weitere Informationen zu diesem Muster

// 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',
};

Eingabe und Ausgabe

Abbildung 3. Ein Diagramm, das die Verarbeitung des Prompts durch Inferenz einer LLM-Rohausgabe veranschaulicht, die dann zu einer Read-to-Display-Empfehlung geparst wird.

Unser vollständiger Prompt wurde mit Few-Shot-Prompting erstellt. Sie enthält die Eingaben des Nutzers, also den von ihm verfassten Rezensionsentwurf.

Um unseren Prompt basierend auf der Nutzereingabe zu generieren, rufen wir zur Laufzeit die Dienstprogrammfunktion generatePrompt auf.

Clientseitige KI-Modelle und ‑Bibliotheken bieten in der Regel weniger Funktionen als serverseitige KI. So ist der JSON-Modus oft nicht verfügbar. Das bedeutet, dass wir die gewünschte Ausgabestruktur in unserem Prompt angeben müssen. Das ist weniger übersichtlich, wartungsfreundlich und zuverlässig als die Bereitstellung eines Schemas über die Modellkonfiguration. Außerdem sind clientseitige Modelle in der Regel kleiner, was bedeutet, dass sie anfälliger für strukturelle Fehler in der Ausgabe sind.

In der Praxis haben wir festgestellt, dass Gemma 2B im Vergleich zu JSON oder JavaScript eine bessere strukturierte Ausgabe als Text liefert. Für diese Demo haben wir uns daher für ein textbasiertes Ausgabeformat entschieden. Das Modell generiert Text, den wir dann zur weiteren Verarbeitung in unserer Webanwendung in ein JavaScript-Objekt parsen.

Verbesserung des Prompts

Mein Prompt und die Antwort in der Gemini Chat-Benutzeroberfläche.
Abbildung 4: Wir haben Gemini Chat gebeten, unseren Prompt zu verbessern. Die Antwort enthält eine Erklärung der vorgenommenen Verbesserungen und einen Hinweis zur Effektivität.

Wir haben einen LLM verwendet, um unseren Prompt zu iterieren.

  • Prompting mit wenigen Schritten Für die Beispiele für unsere Few-Shot-Prompts haben wir Gemini Chat verwendet. Gemini Chat verwendet die leistungsstärksten Gemini-Modelle. So konnten wir qualitativ hochwertige Beispiele generieren.
  • Prompt-Optimierung. Sobald die Struktur des Prompts fertig war, haben wir ihn auch mit Gemini Chat optimiert. Dadurch wurde die Ausgabequalität verbessert.

Kontext verwenden, um die Qualität zu verbessern

Durch die Aufnahme des Produkttyps in den Prompt konnte das Modell relevantere und hochwertigere Vorschläge liefern. In dieser Demo ist der Produkttyp statisch. In einer echten Anwendung könnten Sie das Produkt basierend auf der vom Nutzer besuchten Seite dynamisch in Ihre Eingabeaufforderung aufnehmen.

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

Ein Beispiel im Abschnitt „Few-Shots“ unseres Prompts: Der Produkttyp („Socken“) ist in der vorgeschlagenen Korrektur und in der Beispielrezension enthalten.

LLM-Probleme und ‑Korrekturen

Gemma 2B erfordert in der Regel mehr Prompt-Engineering als ein leistungsfähigeres, größeres serverseitiges Modell.

Bei Gemma 2B sind einige Herausforderungen aufgetreten. So haben wir die Ergebnisse verbessert:

  • Zu nett. Gemma 2B hatte Schwierigkeiten, Rezensionen als „nicht hilfreich“ zu kennzeichnen, da sie scheinbar zögerlich bewertet wurde. Wir haben versucht, die Sprache der Labels neutraler zu gestalten („spezifisch“ und „unspezifisch“ anstelle von „hilfreich“ und „nicht hilfreich“) und Beispiele hinzuzufügen. Die Ergebnisse haben sich dadurch jedoch nicht verbessert. Was die Ergebnisse verbesserte, war die Beharrlichkeit und Wiederholung im Prompt. Auch ein Chain-of-Thought-Ansatz würde wahrscheinlich zu Verbesserungen führen.
  • Die Anleitung war unklar. Das Modell hat den Prompt manchmal überinterpretiert. Anstatt die Rezension zu bewerten, wurde die Beispielliste fortgesetzt. Um das zu beheben, haben wir einen klaren Übergang in den Prompt aufgenommen:

    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>

    Eine klare Strukturierung des Prompts hilft dem Modell, zwischen der Beispielliste (wenige Aufnahmen) und der tatsächlichen Eingabe zu unterscheiden.

  • Falsches Ziel. Gelegentlich schlug das Modell Änderungen am Produkt anstelle des Rezensionstextes vor. Bei einer Rezension mit dem Satz „Ich hasse diese Socken“ könnte das Modell beispielsweise vorschlagen: „Ersetzen Sie die Socken durch eine andere Marke oder einen anderen Stil.“ Das ist nicht der gewünschte Effekt. Durch das Aufteilen des Prompts konnte die Aufgabe geklärt und der Fokus des Modells auf die Überprüfung verbessert werden.