OpenAIによるチャット・モデレーション
Published: 2024-07-03 15:27:08

[アプリ内チャットを](https://www.pubnub.com/solutions/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)含むアプリケーションは、ユーザーが交換できるメッセージを規制し、モデレートする何らかの方法が必要です。 人間のモデレーターですべての不適切なコンテンツをモデレートすることは不可能なので、モデレーション・システムは自動的でなければなりません。 ユーザーはモデレーションを回避しようとすることが多いので、機械学習、生成AI、大規模言語モデル（LLM）［およびGPT-3やGPT-4などのGPTモデル］は、コンテンツをモデレートする一般的な方法です。

モデレーションは複雑なトピックであり、PubNubはすべての開発者のユースケースを満たすために様々なソリューションを提供しています。

-   [PubNubファンクションは](https://www.pubnub.com/docs/serverless/functions/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、宛先に到達する前にメッセージをインターセプトして変更することができます。外部REST APIを呼び出すなど、Function内でカスタムロジックを適用することができ、メッセージモデレーションに任意の外部サービスを使用することができます。 この記事ではOpenAIと統合するためにこのアプローチを使用します。
    
-   PubNub Functionsは、[Lasso Moderation](https://www.pubnub.com/integrations/lasso-moderation/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、[Tisane](https://www.pubnub.com/integrations/tisane-labs-nlp/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、[RegExベースの冒涜フィルタ](https://www.pubnub.com/integrations/chat-message-profanity-filter/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、[Lexalytics](https://www.pubnub.com/integrations/lexalytics/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、[Community Siftなど](https://www.pubnub.com/integrations/communitysift/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、コンテンツモデレーションとセンチメント分析をサポートする[カスタム統合を](https://www.pubnub.com/integrations/?page=1&sortBy=Most%20recent&utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)提供します。
    
-   PubNubのBizOps Workspaceは、メッセージの編集と削除を含む[会話の監視とモデレーションを](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=ja)行うことができます。
    

Open AIモデレーション・エンドポイント
----------------------

この記事では、[OpenAIのModeration APIについて見て](https://platform.openai.com/docs/guides/moderation/overview)いく。このAPIは、人工知能（AI）を使用して、提供されたテキストに有害な用語が含まれているかどうかを判断するREST APIである。 このAPIの意図は、開発者が有害なコンテンツをフィルタリングまたは削除できるようにすることであり、執筆時点では、英語しかサポートしていないが、**無料で**提供されている。

Moderation APIの背後にあるモデルは、提供されたテキストを次のように分類します（[APIドキュメントから](https://platform.openai.com/docs/guides/moderation/overview)引用）：

-   **ヘイト：**人種、性別、民族、宗教、国籍、性的指向、障害の有無、カーストに基づくヘイトを表明、扇動、促進するコンテンツ。保護されていないグループ（例：チェスプレイヤー）に向けた憎悪のコンテンツは、ハラスメントです。
    
-   **憎悪／脅迫：**人種、性別、民族性、宗教、国籍、性的指向、障害の状態、またはカーストに基づき、対象となるグループに対する暴力または深刻な危害も含む憎悪的な内容。
    
-   **ハラスメント：**あらゆるターゲットに対して嫌がらせの言葉を表現、扇動、促進するコンテンツ。
    
-   **ハラスメント／脅迫：**暴力や深刻な危害を含むハラスメントコンテンツ。
    
-   **自傷行為：**自殺、切り傷、摂食障害などの自傷行為を助長、奨励、描写するコンテンツ。
    
-   **自傷／意図：**自殺、切断、摂食障害などの自傷行為に関与している、または関与する意思があることを表明するコンテンツ。
    
-   **自傷／指示：**自殺、切断、摂食障害などの自傷行為の実行を奨励する内容、またはそのような行為の実行方法について指示や助言を与える内容。
    
-   **性的なもの：**性行為の描写など性的興奮を喚起する内容、または性的サービスを宣伝する内容（性教育や健康増進を除く）。
    
-   **性的／未成年：**18歳未満の個人を含む性的コンテンツ。
    
-   **暴力：**死、暴力、身体的傷害を描写するコンテンツ。
    
-   **暴力 / グラフィック：**死、暴力、身体的傷害を生々しく描写したコンテンツ。
    

結果は以下のようなJSON構造で提供されます（これも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
      }
    }
  ]
}
```

PubNubからOpen AI Moderation APIを呼び出す
-----------------------------------

**モデレーションAPIを任意のPubNubアプリケーションに統合するには**、このステップバイステップのチュートリアルに従って**PubNub Functionsを使用して簡単に**できます：

関数を使用すると、メッセージの送受信など、PubNubプラットフォームで発生するリアルタイムのイベントをキャプチャできます。その後、必要に応じてメッセージを変更、再ルーティング、補強、またはフィルタリングするために、これらの関数内にカスタムサーバーレスコードを記述できます。

この関数タイプはメッセージが配信される_前に_呼び出され、メッセージが受信者に配信されるようにリリースされる前に実行を終了する必要があります。 PubNubの[ドキュメントには](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=ja)より多くの背景と詳細が記載されていますが、要約すると、"Before Publish or Fire "は_メッセージまたはそのペイロードを変更_できる同期呼び出しです。

### PubNub関数を作成する

1.  PubNub[管理ポータルに](https://admin.pubnub.com?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ログインし、モデレートしたいアプリのアプリケーションとキーセットを選択します。
    
2.  Build'タブの下にある'Functions'を選択します。
    
3.  CREATE NEW MODULE'を選択し、モジュールに名前と説明を付けます。
    
4.  CREATE NEW FUNCTION'を選択し、関数に名前を付けます。
    
5.  イベントタイプに'Before Publish or Fire'を選択する。
    
6.  チャンネル名には「**\*」を**入力します（このデモでは**「\*」を**使用しますが、アプリケーションによってはここでモデレートしたいチャンネルのみを指定することもできます）。
    

PubNub関数を作成したら、Open AI APIキーをシークレットとして提供する必要があります。

1.  MY SECRETS'を選択し、'OPENAI\_API\_KEY'という名前で新しいキーを作成します。
    
2.  Open[AI APIキーを生成](https://platform.openai.com/account/api-keys)し、そのキーがmoderate APIにアクセスできることを確認します。
    
3.  生成したAPIキーを先ほど作成したPubNub関数のsecretに渡します。
    

PubNub関数の本体は以下のようになります：

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

関数自体は非常に簡単です：

受信した各メッセージに対して

-   受け取った各メッセージをOpen AIモデレーション関数に渡す
    
-   返されたモデレーションオブジェクトをメッセージ(JSON)オブジェクトの新しいキーとして追加する。
    

**関数を保存し、モジュールが起動していることを確認します。**

### 遅延

今作成したPubNub関数はメッセージが送信されるたびに同期的に実行され、関数の実行が終了するまでそのメッセージは配信されません。 関数には外部APIへの呼び出しが含まれているため、配信レイテンシはOpen AIへのAPI呼び出しが返す速度に依存します。

ユーザーエクスペリエンスの低下を軽減する方法はいくつかある。ほとんどのデプロイメントでは、メッセージが送信されたことを送信者に即座にフィードバックし、メッセージが配信された（または報告された）ことを示すリードレシートに依存しています。

### クライアント・アプリケーションの更新

典型的なチャットアプリのほとんどの機能を表示するために[PubNub Chat SDKを](https://www.pubnub.com/docs/chat/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用するReactアプリケーションである[Chat Demoを](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用して、アプリケーション内でモデレーションペイロードを処理するために必要なものを考えてみましょう。

潜在的に有害なメッセージを表示すべきかどうかを追跡する属性を設定します：

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

また、有害な可能性のあるメッセージをデフォルトで表示しないようにするためのロジックを、この場合は[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")

これらの変更は[チャットデモの](https://www.pubnub.com/demos/chat/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja) **ホストされた**バージョンには存在しませんが、[ReadMe には](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/main/README.md)チャットデモをビルドし、自分のキーセットから実行するための[完全なインストラクションが含まれて](https://github.com/PubNubDevelopers/Chat-SDK-Demo-Web/blob/main/README.md)います。

まとめ
---

これで、Open AI を使ってアプリケーションにモデレーションとセンチメント分析の両方を追加する手軽で簡単な（そして無料の）方法ができました。

Open AIとPubNubの統合の詳細については、以下の他のリソースをチェックしてください：

-   [OpenAI GPT APIと関数の統合](https://www.pubnub.com/blog/openai-gpt-api-integration-with-functions/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)
    
-   [PubNubと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=ja)する（PubNubショーケースにチャットボットを追加する）
    
-   [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=ja)
    

あなたのPubNub開発のどのような側面についても、[devrel@pubnub.com](mailto:devrel@pubnub.com)、お気軽にDevRelチームに連絡するか、または私たちの[サポート](https://support.pubnub.com/hc/en-us?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)チームにお問い合わせください。

PubNubはどのようにお役に立ちますか？
=====================

この記事は[PubNub.comに](https://www.pubnub.com/blog/chat-moderation-with-openai/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)掲載されたものです。

私たちのプラットフォームは、開発者がWebアプリ、モバイルアプリ、およびIoTデバイスのためのリアルタイムのインタラクティブ性を構築、配信、管理するのに役立ちます。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、ユースケースや[SDKに](https://www.pubnub.com/docs?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)関係なく、あなたを立ち上げ、実行することができます。