Moderacja czatu za pomocą OpenAI
Published: 2024-07-03 15:17:47

Każda aplikacja zawierająca [czat w aplikacji](https://www.pubnub.com/solutions/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) musi w jakiś sposób regulować i moderować wiadomości, które użytkownicy mogą wymieniać. Ponieważ nie jest możliwe moderowanie wszystkich nieodpowiednich treści za pomocą ludzkich moderatorów, system moderacji musi być automatyczny. Ponieważ użytkownicy często próbują obejść moderację, uczenie maszynowe, generatywna sztuczna inteligencja i duże modele językowe (LLM) \[oraz modele GPT, takie jak GPT-3 i GPT-4\] są popularnymi sposobami moderowania treści.

Moderacja to złożony temat, a PubNub oferuje różne rozwiązania spełniające wszystkie przypadki użycia naszych deweloperów.

-   [Funkcje](https://www.pubnub.com/docs/serverless/functions/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub mogą przechwytywać i modyfikować wiadomości, zanim dotrą one do miejsca docelowego. W ramach funkcji można stosować niestandardową logikę, w tym wywoływanie zewnętrznego interfejsu API REST, co pozwala na korzystanie z dowolnej zewnętrznej usługi do moderowania wiadomości. To podejście zostało wykorzystane w tym artykule do integracji z OpenAI.
    
-   Funkcje PubNub oferują [niestandardowe integracje](https://www.pubnub.com/integrations/?page=1&sortBy=Most%20recent&utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), które obsługują moderację treści i analizę nastrojów, w tym [Lasso Moderation](https://www.pubnub.com/integrations/lasso-moderation/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), [Tisane](https://www.pubnub.com/integrations/tisane-labs-nlp/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), [filtr wulgaryzmów oparty na RegEx](https://www.pubnub.com/integrations/chat-message-profanity-filter/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), [Lexalytics](https://www.pubnub.com/integrations/lexalytics/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) i [Community Sift](https://www.pubnub.com/integrations/communitysift/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).
    
-   BizOps Workspace firmy PubNub może [monitorować i moderować konwersacje](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=pl), w tym edytować i usuwać wiadomości.
    

Punkt końcowy moderowania Open AI
---------------------------------

W tym artykule przyjrzymy się [OpenAI Moderation API](https://platform.openai.com/docs/guides/moderation/overview), interfejsowi API REST, który wykorzystuje sztuczną inteligencję (AI) do określenia, czy dostarczony tekst zawiera potencjalnie szkodliwe terminy. Intencją API jest umożliwienie programistom filtrowania lub usuwania szkodliwych treści, a w chwili pisania tego tekstu jest on udostępniany **bezpłatnie**, choć obsługuje tylko język angielski.

Model stojący za Moderation API będzie kategoryzował dostarczony tekst w następujący sposób (zaczerpnięty z [dokumentacji API](https://platform.openai.com/docs/guides/moderation/overview)):

-   **Nienawiść**: Treści, które wyrażają, podżegają lub promują nienawiść ze względu na rasę, płeć, pochodzenie etniczne, religię, narodowość, orientację seksualną, niepełnosprawność lub kastę. Nienawistne treści skierowane do grup nieobjętych ochroną (np. szachistów) stanowią nękanie.
    
-   **Nienawiść / Groźby:** Nienawistne treści, które obejmują również przemoc lub poważne obrażenia wobec grupy docelowej w oparciu o rasę, płeć, pochodzenie etniczne, religię, narodowość, orientację seksualną, status niepełnosprawności lub kastę.
    
-   **Nękanie:** Treści, które wyrażają, podżegają lub promują napastliwy język wobec dowolnej grupy docelowej.
    
-   **Nękanie/groźby:** Treści nękające, które obejmują również przemoc lub poważne obrażenia wobec dowolnej osoby.
    
-   **Samookaleczenie**: Treści, które promują, zachęcają lub przedstawiają akty samookaleczenia, takie jak samobójstwo, cięcie się i zaburzenia odżywiania.
    
-   **Samookaleczenie / zamiar:** Treści, w których osoba mówiąca wyraża, że angażuje się lub zamierza angażować się w akty samookaleczenia, takie jak samobójstwo, cięcie się i zaburzenia odżywiania.
    
-   **Samookaleczenie / Instrukcje:** Treści, które zachęcają do dokonywania aktów samookaleczenia, takich jak samobójstwo, cięcie się i zaburzenia odżywiania, lub które zawierają instrukcje lub porady dotyczące popełniania takich aktów.
    
-   **Seksualne:** Treści mające na celu wzbudzenie podniecenia seksualnego, takie jak opisy aktywności seksualnej lub promujące usługi seksualne (z wyłączeniem edukacji seksualnej i dobrego samopoczucia).
    
-   **Seksualne / Nieletni:** Treści o charakterze seksualnym przedstawiające osoby poniżej 18 roku życia.
    
-   **Przemoc:** Treści przedstawiające śmierć, przemoc lub obrażenia fizyczne.
    
-   **Przemoc / Grafika:** Treści przedstawiające śmierć, przemoc lub obrażenia fizyczne w szczegółach graficznych.
    

Wyniki są dostarczane w strukturze JSON w następujący sposób (ponownie zaczerpnięte z dokumentacji 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
      }
    }
  ]
}
```

Wywoływanie Open AI Moderation API z PubNub
-------------------------------------------

**Integracja interfejsu API Moderation z dowolną aplikacją PubNub jest łatwa przy użyciu funkcji PubNub**, postępując zgodnie z tym samouczkiem krok po kroku:

Funkcje umożliwiają przechwytywanie zdarzeń w czasie rzeczywistym zachodzących na platformie PubNub, takich jak wysyłane i odbierane wiadomości; można następnie napisać niestandardowy kod bezserwerowy w ramach tych funkcji, aby modyfikować, przekierowywać, rozszerzać lub filtrować wiadomości w razie potrzeby.

Będziesz musiał użyć typu zdarzenia "Before Publish or Fire"; ten typ funkcji zostanie wywołany _przed_ dostarczeniem wiadomości i musi zakończyć wykonywanie, zanim wiadomość zostanie zwolniona, aby mogła zostać dostarczona do odbiorców. [Dokumentacja](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=pl) PubNub zawiera więcej informacji i szczegółów, ale w skrócie: "Before Publish or Fire" to wywołanie synchroniczne, które może _zmienić wiadomość lub jej ładunek_.

### Tworzenie funkcji PubNub

1.  Zaloguj się do [portalu administracyjnego](https://admin.pubnub.com?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub i wybierz aplikację oraz zestaw kluczy dla aplikacji, którą chcesz moderować.
    
2.  Wybierz "Functions", które można znaleźć w zakładce "Build".
    
3.  Wybierz "+ CREATE NEW MODULE" i nadaj modułowi nazwę i opis.
    
4.  Wybierz "+ CREATE NEW FUNCTION" i nadaj funkcji nazwę.
    
5.  Jako typ zdarzenia wybierz "Before Publish or Fire".
    
6.  Jako nazwę kanału wpisz **\*** (w tym demo użyjemy **\***, ale twoja aplikacja może określić tutaj tylko kanały, które chcesz moderować).
    

Po utworzeniu funkcji PubNub musisz podać swój klucz API Open AI jako sekret.

1.  Wybierz "MOJE SEKRETY" i utwórz nowy klucz o nazwie "OPENAI\_API\_KEY".
    
2.  Wygeneruj[klucz](https://platform.openai.com/account/api-keys) API Open AI i upewnij się, że klucz ma dostęp do umiarkowanego API.
    
3.  Podaj wygenerowany klucz API do właśnie utworzonego sekretu funkcji PubNub.
    

Treść funkcji PubNub będzie wyglądać następująco:

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

Sama funkcja jest dość prosta:

Dla każdej otrzymanej wiadomości:

-   Przekaż ją do funkcji moderacji Open AI
    
-   Dołącz zwrócony obiekt moderacji jako nowy klucz do obiektu Message (JSON).
    

**Zapisz funkcję i upewnij się, że moduł jest uruchomiony.**

### Opóźnienie

Funkcja PubNub, którą właśnie utworzyłeś, będzie wykonywana synchronicznie za każdym razem, gdy wiadomość zostanie wysłana, a wiadomość ta nie zostanie dostarczona, dopóki funkcja nie zakończy wykonywania. Ponieważ funkcja zawiera wywołanie zewnętrznego interfejsu API, opóźnienie dostarczenia będzie zależeć od szybkości powrotu wywołania API do Open AI, co jest poza kontrolą PubNub i może być dość wysokie.

Istnieje kilka sposobów na złagodzenie pogorszenia wrażeń użytkownika. Większość wdrożeń zapewnia natychmiastową informację zwrotną dla nadawcy, że wiadomość została wysłana, a następnie polega na potwierdzeniach odczytu, aby wskazać, że wiadomość została dostarczona (lub zgłoszona).

### Aktualizacja aplikacji klienckiej

Rozważmy, co byłoby wymagane do obsługi ładunku moderacji w aplikacji przy użyciu [Chat Demo](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), która jest aplikacją React wykorzystującą [PubNub Chat SDK](https://www.pubnub.com/docs/chat/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) do pokazania większości funkcji typowej aplikacji czatu.

Skonfiguruj atrybut, aby śledzić, czy potencjalnie szkodliwa wiadomość powinna zostać wyświetlona:

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

I dodać trochę logiki, aby domyślnie nie wyświetlać potencjalnie szkodliwej wiadomości, w tym przypadku w [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")

Zauważ, że te zmiany nie są obecne w **hostowanej** wersji [Chat Demo](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), ale [ReadMe zawiera pełne instrukcje](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/main/README.md), jak ją zbudować i uruchomić z własnego zestawu kluczy.

Podsumowanie
------------

Oto szybki i łatwy (oraz darmowy) sposób na dodanie zarówno moderacji, jak i analizy sentymentu do aplikacji przy użyciu Open AI.

Aby dowiedzieć się więcej o integracji Open AI z PubNub, zapoznaj się z innymi zasobami:

-   [Integracja API OpenAI GPT z funkcjami](https://www.pubnub.com/blog/openai-gpt-api-integration-with-functions/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl)
    
-   [Tworzenie Chatbota z PubNub i 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=pl) (Dodawanie Chatbota do naszej prezentacji PubNub)
    
-   [Ulepszanie aplikacji geograficznej za pomocą PubNub i 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=pl)
    

Zachęcamy do skontaktowania się z zespołem DevRel pod adresem [devrel@pubnub.com](mailto:devrel@pubnub.com) lub z naszym zespołem [pomocy](https://support.pubnub.com/hc/en-us?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) technicznej w celu uzyskania pomocy w dowolnym aspekcie rozwoju PubNub.

Jak PubNub może ci pomóc?
=========================

Ten artykuł został pierwotnie opublikowany na [PubNub.com](https://www.pubnub.com/blog/chat-moderation-with-openai/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl)

Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT.

Fundamentem naszej platformy jest największa w branży i najbardziej skalowalna sieć przesyłania wiadomości w czasie rzeczywistym. Dzięki ponad 15 punktom obecności na całym świecie obsługującym 800 milionów aktywnych użytkowników miesięcznie i niezawodności na poziomie 99,999%, nigdy nie będziesz musiał martwić się o przestoje, limity współbieżności lub jakiekolwiek opóźnienia spowodowane skokami ruchu.

Poznaj PubNub
-------------

Sprawdź [Live Tour](https://www.pubnub.com/tour/introduction/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację
-----------------------

Załóż [konto](https://admin.pubnub.com/signup/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij
----------

[Dokumenty](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub [zestawu SDK](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).