技術資料

chakoshiで問合せフォームへの無差別営業メール対策に挑戦してみる

作成日:2025.03.09

新サービス「chakoshi」を実際に体験し、問合せフォームへの無差別営業メール対策としてどのように利用できるかを検証しました。プレイグラウンドでのカスタム検知項目の設定から、APIキーの取得、PHPによるAPI連携の実装手順まで、具体例とスクリーンショットを交えて解説します。

chakoshiとは

chakoshiは、NTTコミュニケーションズが提供する、日本語に特化したテキスト安全性評価モデルです。本来の用途としては、LLMを利用したアプリケーションにおいて、ユーザーの入力テキスト及びLLMによる生成テキストの安全性を評価するためのガードレールとしての使用を想定されているようです。

chakoshiはAPIを提供しており、そのAPIを利用することで、テキストの安全性を評価することができます。

参考: APIリファレンス | chakoshi

LLMを利用したアプリケーション開発において、プロンプトインジェクション等の対策は非常に面倒な問題なので、chakoshiを利用することで簡単に対策を施すことができるようになれば、大変ありがたいなあと思います。

ただ、今回はLLMを利用したアプリケーション開発ではなく、Webサイトの問合せフォームへの無差別な営業メール対策としてchakoshiのテキスト安全性評価APIを利用してみたいと思います。

ひとまずプレイグラウンドで試してみる

まずは、chakoshiのテキスト安全性評価APIをプレイグラウンドで試してみます。

chakoshiのアカウントを作成し、プレイグラウンドにログインします。

プレイグラウンドにログインすると、以下のような画面が表示されます。

無差別な営業メールを検知するために「カスタム検知項目」の追加を行ないます。「新しいカスタム検知項目の追加」をクリック。

「カスタム検知項目の追加」画面が表示されます。

続いて、「カスタム検知項目名」と「カスタム検知項目の定義」を入力します。今回は、以下のように設定しました。

カスタム検知項目名
営業メール
カスタム検知項目の定義
Webサイトの問い合わせフォームに入力された文章としてユーザーのテキストを評価し、以下の条件を満たしてるものは拒否します。
- 一方的な営業メール
- 仕事を融通して欲しいという内容
- 無差別送信のスパムだと思われる内容
ただし、以下の条件を満たしている場合は、許可します。
- 仕事を依頼したいという内容
- 問い合わせや質問など、通常のビジネスメール

「カスタム検知項目の定義」には、自然言語で定義を記述することができます。この定義に従って、chakoshiがテキストの安全性を評価してくれます。

「追加」をクリックすると、カスタム検知項目が追加されます。

続いて、テキストを入力して評価してみます。「入力テキスト」欄に、実際にうちの問い合わせフォームに送信された無差別営業メールを、固有名詞等を一部改変した上で入力し、「送信」してみます。

判定結果として「unsafe」「非安全性スコア:0.99」「該当検知項目:営業メール」が表示されました。無差別営業メールと思われるテキストがちゃんと拒否されたようです。

続いて、まっとうなビジネスメールと思われるテキストを入力して評価してみます。

判定結果として「safe」「非安全性スコア:0.01」「該当検知項目:なし」が表示されました。まっとうなビジネスメールと思われるテキストはちゃんと許可されたようです。

即席で書いた「カスタム検知項目の定義」のプロンプトでも思った以上にちゃんと判定してくれるので、これは便利そう。

とりあえず、ひとまずは「カスタム検知項目」の設定はこれで良さそうなので、この設定を「検知項目セット」として保存しておきます。

画面右下の「別名で保存」をクリック。

「保存する検知項目セットの名前」欄に「無差別営業メール対策」と入力して保存。

右上の「検知項目セット」欄に「無差別営業メール対策」の検知項目セットが追加されました。

続いて、その下の「選択中の検知項目セットIDをコピー」をクリックして、検知項目セットIDをコピーしておきます。これは、後ほどAPIを利用する際に必要になります。

APIキーの取得

続いて、APIキーを取得します。

画面右上の「設定」をクリック。

「APIキー」タブを開いて「APIキーの作成」をクリック。

適当に名前をつけて作成すると、APIキーが発行されます。

発行されたAPIキーをコピーしておきます。

PHPでAPIを利用してみる

続いて、PHPでchakoshiのテキスト安全性評価APIを利用してみます。

以下のようなPHPスクリプトを作成します。

<?php
define('API_URL','https://api.beta.chakoshi.ntt.com/');
define('API_KEY','input_your_chakoshi_api_key'); // 先ほど発行したchakoshiのAPIキーを設定
define('CATEGORY_SET_ID','input_your_category_set_id'); // 先ほど取得した検知項目セットIDを設定

$text = '今日はいい天気ですね。'; // 安全性を評価するテキスト
$text = mb_substr($text, 0, 2000); // テキストを2000文字以内に制限

// リクエストデータの作成
$data = array(
    'input' => $text,
    'model' => 'chakoshi-moderation-241223',
    'category_set_id' => CATEGORY_SET_ID,
);
$json_data = json_encode($data);
$url = API_URL . 'v1/judge/text';
$headers = array(
    'Content-Type: application/json',
    'accept: application/json',
    'Authorization: Bearer '. API_KEY
);

// リクエストの送信
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);

$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// エラーチェック
if($response === false){
    echo 'Curl error: ' . curl_error($ch);
    exit;
}
if($httpcode != 200){
    echo 'HTTP status code: ' . $httpcode;
    exit;
}
curl_close($ch);

$apiresult = json_decode($response);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'JSON decode error: ' . json_last_error_msg();
    exit;
}

// レスポンスの表示
print "入力テキスト: " . $text . "<br>";
print "非安全性フラグ(unsafe_flag): " . $apiresult->results->unsafe_flag . "<br>";
print "ラベル(label_str): " . $apiresult->results->label_str . "<br>";
print "非安全性スコア(unsafe_score): " . $apiresult->results->unsafe_score . "<br>";
print "非安全性カテゴリ(unsafe_category): " . $apiresult->results->unsafe_category . "<br>";

?>

上記のスクリプトは、chakoshiのテキスト安全性評価APIを利用して、テキストの安全性を評価するPHPスクリプトです。

$textに問合せフォームに入力されたテキストを代入すれば、概ねそのまま利用できるかと思います。

mb_substrで2000文字以内に制限しているのは、APIの仕様による文字数制限があるためです。

レスポンスは、以下のような形式で返ってきます。

非安全性フラグ(unsafe_flag)
非安全性が検出された場合は1、検出されなかった場合は0
※ややこしいですが、非安全性が検出された場合は1、つまり「unsafe_flag」が1の場合が「安全ではない」ということです。
ラベル(label_str)
「safe」か「unsafe」の文字列。
非安全性スコア(unsafe_score)
0に近いほど安全、1に近いほど非安全です。
非安全性カテゴリ(unsafe_category)
非安全性が検出された場合は、検出された非安全性の検知項目が文字列で返ってきます。
先ほど「営業メール」というカスタム検知項目を追加したので、そのカスタム検知項目が表示されるはずです。
そのほかに、デフォルトの検知項目もオンにしていれば、それらに引っかかった場合は、そちらも表示されるはずです。

参考: Judge text API | chakoshi

問合せフォームに実装する際には、unsafe_categoryに「営業メール」が入っている場合には送信を拒否するようにすれば、無差別な営業メールを防ぐことができるかと思います。

とはいえ、誤検出の可能性は捨てきれないので、実際に運用する際には、単純に拒否するだけでなく、何らかの方法で検出されたテキストを確認する仕組みを用意しておくことが望ましいかと思います。

この記事を書いた人

※上が私です。

奈良市を拠点に、25年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールWeb制作会社様向け業務案内一般企業様向け業務案内もご覧くださいね。

Response APIのWeb Search機能をPHPで実装:最新情報を取得できるチャットボットの作り方

2025.03.17

Response APIの新機能"Web Search"を使って、インターネット上の最新情報を取得できるチャットボットを作ります。PHPによる実装方法や、APIレスポンスの処理方法など、実用的な内容をコード例とともに解説していきます

OpenAI API PHP

OpenAIの新APIを使ってみた:Response APIによるチャットボットをPHPで実装

2025.03.16

OpenAIが新たに発表したResponse APIを使用して、PHPでシンプルなチャットボットを実装してみました。Chat Completions APIとの違いや、実装時のポイントを、実際のコード例と共に解説します。特に会話履歴の管理方法の違いに注目して、両APIの特徴を比較しています。

OpenAI API PHP

SimpleSAMLphpを使ったPHPアプリケーションのSSO対応ガイド

2025.02.11

SimpleSAMLphpを使ってPHPアプリケーションにSSO機能を追加する方法を紹介します。Microsoft Entra IDとの連携方法や、認証情報の取得方法について詳しく解説します。

Microsoft Entra ID PHP SAML認証 SimpleSAMLphp

Microsoft Entra IDとSimpleSAMLphpを利用したSAML認証SSO構築ガイド

2025.01.26

ローカル環境でMicrosoft Entra IDと連携したSAML認証のシングルサインオンを実現するための手順を紹介します。SimpleSAMLphpを利用した設定方法や、Microsoft側の構成変更について詳しく解説しています。

Microsoft Entra ID PHP SAML認証 SimpleSAMLphp

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP