概要
趣味で作成しているサービスでレビュー機能を実装する機会があった。
その際に初めて OpenAI の Moderation API
を使ってみたが、思いのほか使い勝手が良いと感じたので紹介。
Moderation APIとは?
OpenAI が提供する APIで、テキストまたは画像に対して危険・不適切な内容が含まれていないかを判定できる。
判定したい情報を渡すと、以下のようなレスポンスが返ってくる。
カテゴリーごとにフラグが立ち、どの分類で問題があるかが分かる。
※以下の例では violence = true
となっており、暴力的な内容が含まれているため NG 判定となる。
{ "id": "modr-970d409ef3bef3b70c73d8232df86e7d", "model": "omni-moderation-latest", "results": [ { "flagged": true, "categories": { "sexual": false, "sexual/minors": false, "harassment": false, "harassment/threatening": false, "hate": false, "hate/threatening": false, "illicit": false, "illicit/violent": false, "self-harm": false, "self-harm/intent": false, "self-harm/instructions": false, "violence": true, "violence/graphic": false } } ] }
モチベーション
- 簡単なレビュー機能を実装したい
- そこまで厳密なフィルタリングは不要だが、ノーガードで公開するのは怖い
- 運用コストは出来るだけ抑えたい
上記の条件で調べたところ、Moderation API で omni-moderation-latest
モデルを使用する場合、無料で利用できることが分かり採用した。
公式ドキュメントにも以下のように記載がある。
Our omni-moderation models are made available free of charge ✌️
ただし、判定ロジックのカスタマイズは基本的に出来ないため、その点は注意が必要。
実装
OpenAI の API Key 作成
Moderation API 自体は無料だが、クライアント初期化時に API Key が必要。
Node.jsでの実装
まず openai パッケージをインストール。
$ npm install openai
環境変数に API Key を設定。
■ .env
OPENAI_API_KEY=sk-****************************
コード側でクライアントを初期化し、Moderation API を呼び出す。
import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); export async function moderateText(text) { try { const response = await client.moderations.create({ model: "omni-moderation-latest", input: text, }); return { flagged: response.results[0].flagged }; } catch (error) { // API障害時は安全側に倒す return { flagged: true }; } }
あとは moderateText に投稿内容を渡し、flagged === true の場合は 「不適切な内容のため投稿できません」といったメッセージを表示すれば良い。
まとめ
これまで「ユーザーが自由にテキスト入力できて、かつパブリックに公開される機能」は、 管理方法を慎重に考える必要があり、気軽には実装しづらかった。
しかし Moderation API を使うことで、
- 雑にガードを入れる
- 人力運用をほぼゼロにする
- コストを抑える
といったことで実装のハードルが、かなり低くなった。
レスポンスも非常に速いため、リアルタイム判定でもほぼ問題ないレベル。
「厳密な審査までは不要だが、最低限の安全対策は入れたい」というケースには、かなりおすすめできる API だと感じた。