Modération de chat avec OpenAI
Published: 2024-07-03 15:42:12

Toute application contenant un [chat in-app](https://www.pubnub.com/solutions/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) a besoin d'un moyen de réguler et de modérer les messages que les utilisateurs peuvent échanger. Comme il n'est pas possible de modérer tous les contenus inappropriés avec des modérateurs humains, le système de modération doit être automatique. Comme les utilisateurs essaieront fréquemment de contourner la modération, l'apprentissage automatique, l'IA générative et les grands modèles de langage (LLM) \[et les modèles GPT tels que GPT-3 et GPT-4\] sont des moyens populaires de modérer le contenu.

La modération est un sujet complexe, et PubNub offre diverses solutions pour répondre à tous les cas d'utilisation de nos développeurs.

-   Les[fonctions PubNub](https://www.pubnub.com/docs/serverless/functions/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) peuvent intercepter et modifier les messages avant qu'ils n'atteignent leur destination. Vous pouvez appliquer une logique personnalisée au sein d'une fonction, y compris en appelant une API REST externe, ce qui vous permet d'utiliser n'importe quel service externe pour la modération des messages. Cette approche est utilisée dans cet article pour intégrer OpenAI.
    
-   Les fonctions PubNub offrent des [intégrations personnalisées](https://www.pubnub.com/integrations/?page=1&sortBy=Most%20recent&utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) qui supportent la modération de contenu et l'analyse de sentiment, y compris [Lasso Moderation](https://www.pubnub.com/integrations/lasso-moderation/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), [Tisane](https://www.pubnub.com/integrations/tisane-labs-nlp/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), [un filtre de blasphème basé sur RegEx](https://www.pubnub.com/integrations/chat-message-profanity-filter/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), [Lexalytics](https://www.pubnub.com/integrations/lexalytics/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), et [Community Sift](https://www.pubnub.com/integrations/communitysift/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr).
    
-   L'espace de travail BizOps de PubNub peut [surveiller et modérer les conversations](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=fr), y compris la possibilité d'éditer et de supprimer des messages.
    

Le point final de modération d'Open AI
--------------------------------------

Cet article se penche sur l'[API de modération d'OpenAI](https://platform.openai.com/docs/guides/moderation/overview), une API REST qui utilise l'intelligence artificielle (IA) pour déterminer si le texte fourni contient des termes potentiellement préjudiciables. L'objectif de l'API est de permettre aux développeurs de filtrer ou de supprimer le contenu préjudiciable et, au moment de la rédaction de cet article, elle est fournie **gratuitement**, mais ne prend en charge que l'anglais.

Le modèle qui sous-tend l'API de modération classera le texte fourni comme suit (extrait de la [documentation de l'API](https://platform.openai.com/docs/guides/moderation/overview)) :

-   **Haine :** contenu qui exprime, incite ou encourage la haine basée sur la race, le sexe, l'ethnicité, la religion, la nationalité, l'orientation sexuelle, le handicap ou la caste. Les contenus haineux visant des groupes non protégés (par exemple, les joueurs d'échecs) relèvent du harcèlement.
    
-   **Haine / Menace :** Contenu haineux qui comprend également des actes de violence ou des préjudices graves à l'encontre du groupe ciblé en raison de sa race, de son sexe, de son appartenance ethnique, de sa religion, de sa nationalité, de son orientation sexuelle, de son statut de handicapé ou de sa caste.
    
-   **Harcèlement :** Contenu qui exprime, incite ou promeut un langage de harcèlement à l'égard d'une cible.
    
-   **Harcèlement / Menace :** Contenu de harcèlement qui inclut également des actes de violence ou de graves préjudices à l'encontre d'une cible.
    
-   **Automutilation :** contenu qui promeut, encourage ou dépeint des actes d'automutilation, tels que le suicide, les coupures et les troubles de l'alimentation.
    
-   **Automutilation / Intention :** Contenu dans lequel le locuteur exprime qu'il se livre ou a l'intention de se livrer à des actes d'automutilation, tels que le suicide, la mutilation et les troubles de l'alimentation.
    
-   **Automutilation / Instructions :** Contenu qui encourage la réalisation d'actes d'automutilation, tels que le suicide, la mutilation et les troubles alimentaires, ou qui donne des instructions ou des conseils sur la manière de commettre de tels actes.
    
-   **Sexuel :** Contenu destiné à susciter une excitation sexuelle, comme la description d'une activité sexuelle, ou qui fait la promotion de services sexuels (à l'exclusion de l'éducation sexuelle et du bien-être).
    
-   **Sexuel / mineurs :** Contenu à caractère sexuel mettant en scène une personne âgée de moins de 18 ans.
    
-   **Violence :** Contenu décrivant la mort, la violence ou les blessures physiques.
    
-   **Violence / graphique :** Contenu décrivant la mort, la violence ou les blessures physiques de manière graphique.
    

Les résultats sont fournis dans une structure JSON comme suit (encore une fois, tirée de la documentation de l'API) :

```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
      }
    }
  ]
}
```

Appel de l'API de modération Open AI à partir de PubNub
-------------------------------------------------------

L'**intégration de l'API de modération dans n'importe quelle application PubNub est facile en utilisant les fonctions PubNub** en suivant ce tutoriel étape par étape :

Les fonctions vous permettent de capturer des événements en temps réel qui se produisent sur la plateforme PubNub, tels que des messages envoyés et reçus ; vous pouvez ensuite écrire du code serverless personnalisé dans ces fonctions pour modifier, réacheminer, augmenter ou filtrer les messages selon les besoins.

Vous devrez utiliser le type d'événement "Before Publish or Fire" ; ce type de fonction sera invoqué _avant que_ le message ne soit livré et doit finir de s'exécuter avant que le message ne soit libéré pour être livré à ses destinataires. La [documentation](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=fr) PubNub fournit plus de contexte et de détails, mais en résumé : "Before Publish or Fire" est un appel synchrone qui peut _modifier un message ou sa charge utile_.

### Créer la fonction PubNub

1.  Connectez-vous au [portail d'administration de](https://admin.pubnub.com?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) PubNub et sélectionnez l'application et le jeu de clés de l'application que vous souhaitez modérer.
    
2.  Sélectionnez 'Functions', qui se trouve sous l'onglet 'Build'.
    
3.  Sélectionnez '+ CREATE NEW MODULE' et donnez un nom et une description au module.
    
4.  Sélectionnez "+ CREATE NEW FUNCTION" et donnez un nom à la fonction.
    
5.  Pour le type d'événement, sélectionnez "Before Publish or Fire".
    
6.  Pour le nom du canal, entrez **\*** (cette démo utilisera **\***, mais votre application peut choisir de ne spécifier ici que les canaux que vous souhaitez modérer).
    

Après avoir créé la fonction PubNub, vous devez fournir votre clé API Open AI comme secret.

1.  Sélectionnez "MES SECRETS" et créez une nouvelle clé avec le nom "OPENAI\_API\_KEY".
    
2.  [Générez une clé API Open AI](https://platform.openai.com/account/api-keys) et assurez-vous qu'elle a accès à l'API modérée.
    
3.  Fournissez la clé API générée au secret de la fonction PubNub que vous venez de créer.
    

Le corps de la fonction PubNub se présente comme suit :

```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";
    });
}
```

La fonction elle-même est assez simple :

Pour chaque message reçu :

-   Le transmettre à la fonction de modération d'Open AI
    
-   Ajouter l'objet de modération retourné comme une nouvelle clé sur l'objet Message (JSON)
    

**Sauvegardez votre fonction et assurez-vous que votre module est démarré.**

### Temps de latence

La fonction PubNub que vous venez de créer sera exécutée de manière synchrone à chaque fois qu'un message est envoyé, et ce message ne sera pas délivré tant que la fonction n'aura pas fini de s'exécuter. Comme la fonction contient un appel à une API externe, la latence de délivrance dépendra de la vitesse de retour de l'appel API à Open AI, qui est hors du contrôle de PubNub et qui pourrait être assez élevée.

Il existe plusieurs façons d'atténuer toute dégradation de l'expérience utilisateur. La plupart des déploiements fournissent à l'expéditeur un retour immédiat indiquant que le message a été envoyé et s'appuient ensuite sur les accusés de réception pour indiquer que le message a été délivré (ou signalé).

### Mise à jour de l'application client

Examinons ce qui serait nécessaire pour gérer la charge utile de modération dans votre application en utilisant la [démo Chat](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), qui est une application React qui utilise le [PubNub Chat SDK](https://www.pubnub.com/docs/chat/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) pour montrer la plupart des fonctionnalités d'une application de chat typique.

Configurez un attribut pour savoir si un message potentiellement dangereux doit être affiché ou non :

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

Et ajouter une certaine logique pour ne pas afficher un message potentiellement nuisible par défaut, dans ce cas dans [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")

Notez que ces changements ne sont pas présents dans la version **hébergée** de la [démo de chat](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr), mais le [ReadMe contient des instructions complètes](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/main/README.md) pour la construire et l'exécuter vous-même à partir de votre propre jeu de clés.

Récapitulation
--------------

Et voilà, un moyen rapide et facile (et gratuit) d'ajouter à la fois la modération et l'analyse des sentiments à votre application en utilisant Open AI.

Pour en savoir plus sur l'intégration d'Open AI avec PubNub, consultez ces autres ressources :

-   [Intégration de l'API OpenAI GPT avec les fonctions](https://www.pubnub.com/blog/openai-gpt-api-integration-with-functions/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr)
    
-   [Construire un Chatbot avec PubNub et 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=fr) (Ajouter un Chatbot à notre vitrine PubNub)
    
-   [Améliorer une Geo App avec 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=fr)
    

N'hésitez pas à contacter l'équipe DevRel à [devrel@pubnub.com](mailto:devrel@pubnub.com) ou à contacter notre équipe de [support](https://support.pubnub.com/hc/en-us?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) pour obtenir de l'aide sur n'importe quel aspect de votre développement PubNub.

Comment PubNub peut-il vous aider ?
===================================

Cet article a été publié à l'origine sur [PubNub.com](https://www.pubnub.com/blog/chat-moderation-with-openai/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr)

Notre plateforme aide les développeurs à construire, fournir et gérer l'interactivité en temps réel pour les applications web, les applications mobiles et les appareils IoT.

La base de notre plateforme est le réseau de messagerie en temps réel le plus grand et le plus évolutif de l'industrie. Avec plus de 15 points de présence dans le monde, 800 millions d'utilisateurs actifs mensuels et une fiabilité de 99,999 %, vous n'aurez jamais à vous soucier des pannes, des limites de concurrence ou des problèmes de latence causés par les pics de trafic.

Découvrez PubNub
----------------

Découvrez le [Live Tour](https://www.pubnub.com/tour/introduction/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) pour comprendre les concepts essentiels de chaque application alimentée par PubNub en moins de 5 minutes.

S'installer
-----------

Créez un [compte PubNub](https://admin.pubnub.com/signup/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) pour un accès immédiat et gratuit aux clés PubNub.

Commencer
---------

La [documentation PubNub](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr) vous permettra de démarrer, quel que soit votre cas d'utilisation ou votre [SDK](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=fr).