アプリ内チャットを含むアプリケーションは、ユーザーが交換できるメッセージを規制し、モデレートする何らかの方法が必要です。 人間のモデレーターですべての不適切なコンテンツをモデレートすることは不可能なので、モデレーション・システムは自動的でなければなりません。 ユーザーはモデレーションを回避しようとすることが多いので、機械学習、生成AI、大規模言語モデル(LLM)[およびGPT-3やGPT-4などのGPTモデル]は、コンテンツをモデレートする一般的な方法です。
モデレーションは複雑なトピックであり、PubNubはすべての開発者のユースケースを満たすために様々なソリューションを提供しています。
PubNubファンクションは、宛先に到達する前にメッセージをインターセプトして変更することができます。外部REST APIを呼び出すなど、Function内でカスタムロジックを適用することができ、メッセージモデレーションに任意の外部サービスを使用することができます。 この記事ではOpenAIと統合するためにこのアプローチを使用します。
PubNub Functionsは、Lasso Moderation、Tisane、RegExベースの冒涜フィルタ、Lexalytics、Community Siftなど、コンテンツモデレーションとセンチメント分析をサポートするカスタム統合を提供します。
PubNubのBizOps Workspaceは、メッセージの編集と削除を含む会話の監視とモデレーションを行うことができます。
Open AIモデレーション・エンドポイント
この記事では、OpenAIのModeration APIについて見ていく。このAPIは、人工知能(AI)を使用して、提供されたテキストに有害な用語が含まれているかどうかを判断するREST APIである。 このAPIの意図は、開発者が有害なコンテンツをフィルタリングまたは削除できるようにすることであり、執筆時点では、英語しかサポートしていないが、無料で提供されている。
Moderation APIの背後にあるモデルは、提供されたテキストを次のように分類します(APIドキュメントから引用):
ヘイト:人種、性別、民族、宗教、国籍、性的指向、障害の有無、カーストに基づくヘイトを表明、扇動、促進するコンテンツ。保護されていないグループ(例:チェスプレイヤー)に向けた憎悪のコンテンツは、ハラスメントです。
憎悪/脅迫:人種、性別、民族性、宗教、国籍、性的指向、障害の状態、またはカーストに基づき、対象となるグループに対する暴力または深刻な危害も含む憎悪的な内容。
ハラスメント:あらゆるターゲットに対して嫌がらせの言葉を表現、扇動、促進するコンテンツ。
ハラスメント/脅迫:暴力や深刻な危害を含むハラスメントコンテンツ。
自傷行為:自殺、切り傷、摂食障害などの自傷行為を助長、奨励、描写するコンテンツ。
自傷/意図:自殺、切断、摂食障害などの自傷行為に関与している、または関与する意思があることを表明するコンテンツ。
自傷/指示:自殺、切断、摂食障害などの自傷行為の実行を奨励する内容、またはそのような行為の実行方法について指示や助言を与える内容。
性的なもの:性行為の描写など性的興奮を喚起する内容、または性的サービスを宣伝する内容(性教育や健康増進を除く)。
性的/未成年:18歳未満の個人を含む性的コンテンツ。
暴力:死、暴力、身体的傷害を描写するコンテンツ。
暴力 / グラフィック:死、暴力、身体的傷害を生々しく描写したコンテンツ。
結果は以下のようなJSON構造で提供されます(これもAPIドキュメントから引用):
{
"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のドキュメントにはより多くの背景と詳細が記載されていますが、要約すると、"Before Publish or Fire "はメッセージまたはそのペイロードを変更できる同期呼び出しです。
PubNub関数を作成する
PubNub管理ポータルにログインし、モデレートしたいアプリのアプリケーションとキーセットを選択します。
Build'タブの下にある'Functions'を選択します。
CREATE NEW MODULE'を選択し、モジュールに名前と説明を付けます。
CREATE NEW FUNCTION'を選択し、関数に名前を付けます。
イベントタイプに'Before Publish or Fire'を選択する。
チャンネル名には「*」を入力します(このデモでは「*」を使用しますが、アプリケーションによってはここでモデレートしたいチャンネルのみを指定することもできます)。
PubNub関数を作成したら、Open AI APIキーをシークレットとして提供する必要があります。
MY SECRETS'を選択し、'OPENAI_API_KEY'という名前で新しいキーを作成します。
OpenAI APIキーを生成し、そのキーがmoderate APIにアクセスできることを確認します。
生成したAPIキーを先ほど作成したPubNub関数のsecretに渡します。
PubNub関数の本体は以下のようになります:
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を使用するReactアプリケーションであるChat Demoを使用して、アプリケーション内でモデレーションペイロードを処理するために必要なものを考えてみましょう。
潜在的に有害なメッセージを表示すべきかどうかを追跡する属性を設定します:
const [showHarmfulMessage, setShowHarmfulMessage] = useState(false)
また、有害な可能性のあるメッセージをデフォルトで表示しないようにするためのロジックを、この場合はmessage.tsx内に追加します:
{(
!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>
}
これらの変更はチャットデモの ホストされたバージョンには存在しませんが、ReadMe にはチャットデモをビルドし、自分のキーセットから実行するための完全なインストラクションが含まれています。
まとめ
これで、Open AI を使ってアプリケーションにモデレーションとセンチメント分析の両方を追加する手軽で簡単な(そして無料の)方法ができました。
Open AIとPubNubの統合の詳細については、以下の他のリソースをチェックしてください:
PubNubとChatGPTでチャットボットを構築する(PubNubショーケースにチャットボットを追加する)
あなたのPubNub開発のどのような側面についても、devrel@pubnub.com、お気軽にDevRelチームに連絡するか、または私たちのサポートチームにお問い合わせください。
PubNubはどのようにお役に立ちますか?
この記事はPubNub.comに掲載されたものです。
私たちのプラットフォームは、開発者がWebアプリ、モバイルアプリ、およびIoTデバイスのためのリアルタイムのインタラクティブ性を構築、配信、管理するのに役立ちます。
私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。
PubNubを体験
ライブツアーをチェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する
セットアップ
PubNubアカウントにサインアップすると、PubNubキーに無料ですぐにアクセスできます。
始める
PubNubのドキュメントは、ユースケースやSDKに関係なく、あなたを立ち上げ、実行することができます。
Top comments (0)