Chat-Moderation mit OpenAI
Published: 2024-07-03 15:37:11

Jede Anwendung, die einen [In-App-Chat](https://www.pubnub.com/solutions/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) enthält, benötigt eine Möglichkeit, die Nachrichten, die Nutzer austauschen können, zu regulieren und zu moderieren. Da es nicht möglich ist, alle unangemessenen Inhalte durch menschliche Moderatoren zu moderieren, muss das Moderationssystem automatisch sein. Da Nutzer häufig versuchen werden, die Moderation zu umgehen, sind maschinelles Lernen, generative KI und große Sprachmodelle (LLMs) \[und GPT-Modelle wie GPT-3 und GPT-4\] beliebte Methoden zur Moderation von Inhalten.

Moderation ist ein komplexes Thema, und PubNub bietet verschiedene Lösungen, um alle Anwendungsfälle unserer Entwickler zu erfüllen.

-   [PubNub-Funktionen](https://www.pubnub.com/docs/serverless/functions/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) können Nachrichten abfangen und verändern, bevor sie ihr Ziel erreichen. Sie können innerhalb einer Funktion benutzerdefinierte Logik anwenden, einschließlich des Aufrufs einer externen REST-API, so dass Sie jeden externen Dienst für die Nachrichtenmoderation nutzen können. Dieser Ansatz wird in diesem Artikel für die Integration mit OpenAI verwendet.
    
-   PubNub-Funktionen bieten [benutzerdefinierte Integrationen](https://www.pubnub.com/integrations/?page=1&sortBy=Most%20recent&utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), die Inhaltsmoderation und Stimmungsanalyse unterstützen, darunter [Lasso Moderation](https://www.pubnub.com/integrations/lasso-moderation/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), [Tisane](https://www.pubnub.com/integrations/tisane-labs-nlp/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), [ein RegEx-basierter Profanitätsfilter](https://www.pubnub.com/integrations/chat-message-profanity-filter/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), [Lexalytics](https://www.pubnub.com/integrations/lexalytics/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) und [Community Sift](https://www.pubnub.com/integrations/communitysift/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de).
    
-   Der BizOps Workspace von PubNub kann [Konversationen überwachen und moderieren](https://www.pubnub.com/how-to/monitor-and-moderate-conversations-with-bizops-workspace/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), einschließlich der Möglichkeit, Nachrichten zu bearbeiten und zu löschen.
    

Der Open AI Moderationsendpunkt
-------------------------------

Dieser Artikel befasst sich mit [der Moderation API von OpenAI](https://platform.openai.com/docs/guides/moderation/overview), einer REST-API, die mithilfe von künstlicher Intelligenz (KI) feststellt, ob der bereitgestellte Text potenziell schädliche Begriffe enthält. Die API soll es Entwicklern ermöglichen, schädliche Inhalte zu filtern oder zu entfernen, und wird zum Zeitpunkt der Erstellung dieses Artikels **kostenlos** zur Verfügung gestellt, unterstützt jedoch nur Englisch.

Das Modell hinter der Moderations-API kategorisiert den bereitgestellten Text wie folgt (aus der [API-Dokumentation](https://platform.openai.com/docs/guides/moderation/overview)):

-   **Hass:** Inhalte, die Hass aufgrund von Rasse, Geschlecht, ethnischer Zugehörigkeit, Religion, Nationalität, sexueller Orientierung, Behinderungsstatus oder Kaste ausdrücken, dazu auffordern oder fördern. Hassvolle Inhalte, die sich gegen nicht geschützte Gruppen richten (z. B. Schachspieler), gelten als Belästigung.
    
-   **Hass / Bedrohung:** Hassvolle Inhalte, die auch Gewalt oder ernsthaften Schaden gegenüber der Zielgruppe aufgrund von Rasse, Geschlecht, ethnischer Herkunft, Religion, Nationalität, sexueller Orientierung, Behinderung oder Kaste beinhalten.
    
-   **Belästigung:** Inhalte, die eine belästigende Sprache gegenüber einer beliebigen Zielperson ausdrücken, dazu auffordern oder fördern.
    
-   **Belästigung/Bedrohung:** Belästigende Inhalte, die auch Gewalt oder ernsthaften Schaden für eine beliebige Zielgruppe beinhalten.
    
-   **Selbstbeschädigung**: Inhalte, die zu selbstbeschädigenden Handlungen wie Selbstmord, Schneiden und Essstörungen auffordern, ermutigen oder diese darstellen.
    
-   **Selbstbeschädigung/Absicht:** Inhalte, in denen der Sprecher zum Ausdruck bringt, dass er selbstschädigende Handlungen wie Selbstmord, Schneiden und Essstörungen vornimmt oder vorhat, diese vorzunehmen.
    
-   **Selbstbeschädigung/Anweisungen:** Inhalte, die zu selbstschädigenden Handlungen wie Selbstmord, Schneiden und Essstörungen ermutigen oder Anweisungen oder Ratschläge geben, wie man solche Handlungen vornimmt.
    
-   **Sexuell:** Inhalte, die sexuelle Erregung hervorrufen sollen, wie z. B. die Beschreibung sexueller Aktivitäten, oder die für sexuelle Dienstleistungen werben (ausgenommen Sexualerziehung und Wellness).
    
-   **Sexuell / Minderjährige:** Sexuelle Inhalte, die eine Person unter 18 Jahren zeigen.
    
-   **Gewalttätigkeit:** Inhalte, in denen Tod, Gewalt oder körperliche Verletzungen dargestellt werden.
    
-   **Gewalt/Grafik:** Inhalte, die Tod, Gewalt oder Körperverletzung in grafischen Details darstellen.
    

Die Ergebnisse werden in einer JSON-Struktur wie folgt bereitgestellt (wiederum aus der API-Dokumentation entnommen):

```js
{
  "id": "modr-XXXXX",
  "model": "text-moderation-007",
  "results": [
    {
      "flagged": true,
      "categories": {
        "sexual": false,
        "hate": false,
        "harassment": false,
        "self-harm": false,
        "sexual/minors": false,
        "hate/threatening": false,
        "violence/graphic": false,
        "self-harm/intent": false,
        "self-harm/instructions": false,
        "harassment/threatening": true,
        "violence": true
      },
      "category_scores": {
        //  Out of scope for this article
      }
    }
  ]
}
```

Aufrufen der Open AI Moderation API von PubNub
----------------------------------------------

Die**Integration der Moderations-API in eine beliebige PubNub-Anwendung ist mit Hilfe von PubNub-Funktionen ganz einfach**, wenn Sie dieser Schritt-für-Schritt-Anleitung folgen:

Funktionen ermöglichen es Ihnen, Echtzeit-Ereignisse auf der PubNub-Plattform zu erfassen, z. B. gesendete und empfangene Nachrichten; Sie können dann innerhalb dieser Funktionen benutzerdefinierten serverlosen Code schreiben, um Nachrichten nach Bedarf zu ändern, umzuleiten, zu ergänzen oder zu filtern.

Sie müssen den Ereignistyp "Before Publish or Fire" verwenden; dieser Funktionstyp wird aufgerufen _, bevor_ die Nachricht zugestellt wird, und muss seine Ausführung beenden, bevor die Nachricht zur Zustellung an die Empfänger freigegeben wird. Die [PubNub-Dokumentation](https://www.pubnub.com/docs/serverless/functions/overview#what-function-type-to-use?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) bietet weitere Hintergründe und Details, aber zusammenfassend lässt sich sagen: "Before Publish or Fire" ist ein synchroner Aufruf, der _eine Nachricht oder ihre Nutzlast ändern_ kann _._

### Erstellen Sie die PubNub-Funktion

1.  Loggen Sie sich in das [PubNub-Administrationsportal](https://admin.pubnub.com?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) ein und wählen Sie die Anwendung und das Keyset für die App aus, die Sie moderieren möchten.
    
2.  Wählen Sie "Funktionen", die Sie unter dem Reiter "Erstellen" finden.
    
3.  Wählen Sie '+ CREATE NEW MODULE' und geben Sie dem Modul einen Namen und eine Beschreibung
    
4.  Wählen Sie "+ NEUE FUNKTION ERSTELLEN" und geben Sie der Funktion einen Namen.
    
5.  Wählen Sie für den Ereignistyp "Vor Veröffentlichung oder Feuer".
    
6.  Geben Sie für den Kanalnamen **\*** ein (in dieser Demo wird **\*** verwendet, aber Ihre Anwendung kann hier nur die Kanäle angeben, die Sie moderieren möchten)
    

Nachdem Sie die PubNub-Funktion erstellt haben, müssen Sie Ihren Open AI API-Schlüssel als Geheimnis angeben.

1.  Wählen Sie 'MY SECRETS' und erstellen Sie einen neuen Schlüssel mit dem Namen 'OPENAI\_API\_KEY'.
    
2.  [Generieren Sie einen Open AI API-Schlüssel](https://platform.openai.com/account/api-keys) und stellen Sie sicher, dass dieser Schlüssel Zugriff auf die moderate API hat.
    
3.  Geben Sie den generierten API-Schlüssel an das gerade erstellte PubNub-Funktionsgeheimnis weiter.
    

Der Körper der PubNub-Funktion sieht wie folgt aus:

```js
const xhr  = require('xhr');
const vault = require('vault');

export default request => {
  if (request.message && request.message.text)
  {
    let messageText = request.message.text
    return getOpenaiApiKey().then(apiKey => {
      return openAIModeration(messageText).then(aiResponse => {
        //  Append the response to the message
        request.message.openAiModeration = aiResponse;
        //  If the message was harmful, you might also choose to report the message here.
        return request.ok();
      })
    })
  }
  return request.ok();
};

let OPENAI_API_KEY = null;
function getOpenaiApiKey() {
  // Use cached key
  if (OPENAI_API_KEY) {
      return new Promise(resolve => resolve(OPENAI_API_KEY));
  }
  // Fetch key from vault
  return vault.get("OPENAI_API_KEY").then(apikey => {
      OPENAI_API_KEY = apikey;
      return new Promise(resolve => resolve(OPENAI_API_KEY));
  });
}

function openAIModeration(messageText) {
  const url = 'https://api.openai.com/v1/moderations';
  const http_options = {
    'method': 'POST',
    'headers': {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${OPENAI_API_KEY}`,
    },
    'body': JSON.stringify({
      "input": messageText
    }),
    timeout: 9500,
    retries: 0
  };
  return xhr.fetch(url, http_options)
    .then((resp) => {
      const body = JSON.parse(resp.body);
      return body;
    })
    .catch((err) => {
      console.log(err);
      return "Open AI Timed out";
    });
}
```

Die Funktion selbst ist recht einfach:

Für jede empfangene Nachricht:

-   Übergeben Sie sie an die Open AI-Moderationsfunktion
    
-   Fügen Sie das zurückgegebene Moderationsobjekt als neuen Schlüssel an das Message (JSON) Objekt an.
    

**Speichern Sie Ihre Funktion und stellen Sie sicher, dass Ihr Modul gestartet ist.**

### Latenzzeit

Die PubNub-Funktion, die Sie soeben erstellt haben, wird jedes Mal synchron ausgeführt, wenn eine Nachricht gesendet wird, und die Nachricht wird erst ausgeliefert, wenn die Funktion fertig ausgeführt ist. Da die Funktion einen Aufruf an eine externe API enthält, hängt die Auslieferungslatenz davon ab, wie schnell der API-Aufruf an Open AI zurückkommt, was außerhalb der Kontrolle von PubNub liegt und ziemlich hoch sein kann.

Es gibt mehrere Möglichkeiten, die Beeinträchtigung des Benutzererlebnisses abzumildern. Die meisten Implementierungen geben dem Absender eine sofortige Rückmeldung, dass die Nachricht gesendet wurde und verlassen sich dann auf Lesebestätigungen, um anzuzeigen, dass die Nachricht zugestellt (oder gemeldet) wurde.

### Aktualisieren der Client-Anwendung

Betrachten wir, was erforderlich wäre, um den Moderations-Payload innerhalb Ihrer Anwendung zu handhaben, indem wir die [Chat-Demo](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) verwenden, die eine React-Anwendung ist, die das [PubNub Chat SDK](https://www.pubnub.com/docs/chat/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) verwendet, um die meisten Funktionen einer typischen Chat-Anwendung zu zeigen.

Richten Sie ein Attribut ein, um zu verfolgen, ob eine potenziell schädliche Nachricht angezeigt werden soll oder nicht:

```js
 const [showHarmfulMessage, setShowHarmfulMessage] = useState(false)
```

Und fügen Sie eine Logik hinzu, um eine potenziell schädliche Nachricht standardmäßig nicht anzuzeigen, in diesem Fall in [message.tsx](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/90447262583c251c983f04f23ffb23adcbbd6d25/chat-sdk-demo-web/app/chat/ui-components/message.tsx):

```js
{(
  !message.content.openAiModeration || 
  !message.content.openAiModeration?.results[0].flagged || 
  showHarmfulMessage) && (message.content.text
)}
{
  !showHarmfulMessage && 
  message.content.openAiModeration?.results[0].flagged && 
  <span>Message contains potentially harmful content 
    <span className="text-blue-400 cursor-pointer" 
    onClick={() => {setShowHarmfulMessage(true)}}>(Reveal)
    </span>
  </span>
}
```

![Chat Moderation with OpenAI - Image](https://www.pubnub.com/cdn/3prze68gbwl1/1qmBAFCDiDwwKdp7TLSCaw/516d3b1de50c22784996f1e43a65fdc7/Screenshot_2024-07-01_at_10.59.58.png "Chat Moderation with OpenAI - Image 01")

Beachten Sie, dass diese Änderungen nicht in der **gehosteten** Version der [Chat-Demo](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) enthalten sind, aber die [ReadMe enthält vollständige Anweisungen](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/main/README.md), um sie selbst zu erstellen und von Ihrem eigenen Keyset aus auszuführen.

Einpacken
---------

Und da haben Sie es, eine schnelle und einfache (und kostenlose) Möglichkeit, Ihrer Anwendung mit Open AI sowohl Moderation als auch Sentiment-Analyse hinzuzufügen.

Um mehr über die Integration von Open AI mit PubNub zu erfahren, schauen Sie sich diese anderen Ressourcen an:

-   [OpenAI GPT API Integration mit Funktionen](https://www.pubnub.com/blog/openai-gpt-api-integration-with-functions/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de)
    
-   [Erstellen Sie einen Chatbot mit PubNub und ChatGPT](https://www.pubnub.com/blog/build-a-chatbot-with-pubnub-and-chatgpt-openai/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) (Hinzufügen eines Chatbots zu unserem PubNub-Showcase)
    
-   [Erweitern Sie eine Geo-App mit PubNub & Chat GPT / OpenAI](https://www.pubnub.com/blog/enhance-geo-app-with-pubnub-and-openai-chatgpt/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de)
    

Wenden Sie sich an das DevRel-Team unter [devrel@pubnub.com](mailto:devrel@pubnub.com) oder an unser [Support-Team](https://support.pubnub.com/hc/en-us?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de), wenn Sie Hilfe zu einem beliebigen Aspekt Ihrer PubNub-Entwicklung benötigen.

Wie kann PubNub Ihnen helfen?
=============================

Dieser Artikel wurde ursprünglich auf [PubNub.com](https://www.pubnub.com/blog/chat-moderation-with-openai/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) veröffentlicht.

Unsere Plattform hilft Entwicklern bei der Erstellung, Bereitstellung und Verwaltung von Echtzeit-Interaktivität für Webanwendungen, mobile Anwendungen und IoT-Geräte.

Die Grundlage unserer Plattform ist das größte und am besten skalierbare Echtzeit-Edge-Messaging-Netzwerk der Branche. Mit über 15 Points-of-Presence weltweit, die 800 Millionen monatlich aktive Nutzer unterstützen, und einer Zuverlässigkeit von 99,999 % müssen Sie sich keine Sorgen über Ausfälle, Gleichzeitigkeitsgrenzen oder Latenzprobleme aufgrund von Verkehrsspitzen machen.

PubNub erleben
--------------

Sehen Sie sich die [Live Tour](https://www.pubnub.com/tour/introduction/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) an, um in weniger als 5 Minuten die grundlegenden Konzepte hinter jeder PubNub-gestützten App zu verstehen

Einrichten
----------

Melden Sie sich für einen [PubNub-Account](https://admin.pubnub.com/signup/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) an und erhalten Sie sofort kostenlosen Zugang zu den PubNub-Schlüsseln

Beginnen Sie
------------

Mit den [PubNub-Dokumenten](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de) können Sie sofort loslegen, unabhängig von Ihrem Anwendungsfall oder [SDK](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=de)