ふくふくHukuhuku Inc.
EP.57Toolbox 12分公開:

日本語の投稿に注意を付けるAI「PolicyLM」。英語の規則で12件をローカル検証

PolicyLM-1.7Bに英語の規則を渡し、架空の日本語投稿12件をMacで実測。宣伝と個人攻撃の複数ラベル、引用報告を対象外にする条件を、生応答と教材で検収します。

#PolicyLM#判断モデル#日本語#投稿確認#ローカルAI
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

社内コミュニティの宣伝や個人攻撃を見つけたい。ただし、問題の投稿を引用して報告した人まで止めたくない。そんな境界を試せる小型モデル、が公開されました。

PolicyLMは、文章と自分で書いた規則を読み、複数のカテゴリへ0〜1のスコアを返します。編集部では英語の規則を2つ決め、架空の日本語投稿12件を手元のMacで試しました。今回は12投稿すべてで、両カテゴリの判定が事前の期待値と一致しました。 自動削除には接続せず、人が確認する候補を選べるかを検収しています。

確認日は2026年10月7日、対象はPolicyLM-1.7Bの公開版です。日本語を含む19言語のメッセージが公式評価の対象ですが、規則自体の評価は英語のみです。本試験でも規則は英語に固定し、日本語の規則への追随を試したことにはしません。公式の言語条件と限界

1. Jevのような判断モデルでも、得意な仕事が違う

に続き、文章を書かずに判断を返すモデルが増えています。PolicyLMの中心はコンテンツの確認です。カテゴリを「宣伝」「個人攻撃」のように定義して、それぞれに該当するかを同時に調べます。「経理か情シスか」のように担当を必ず1つ選ぶ使い方とは、出力の読み方が違います。

返り方例読み方
1つだけ選ぶ分類経理/情シス/総務候補の中から担当を選ぶ
PolicyLMの複数ラベル宣伝/個人攻撃両方が該当、片方だけ、両方とも対象外がある

Musubiは10月6日付で公式発表を掲載しました。確認したv1.2の配布コミットは日本時間10月6日7時21分です。翌朝のHN紹介時刻とは分けています。ダウンロード可能なコードと重みを固定して確認できる点が、今回取り上げた理由です。固定した配布版

「どんな社内規程でも読み込めば、そのまま正確に運用できる」という製品ではありません。まずは短いカテゴリと例外を決め、実際に通したい文と拾いたい文を用意します。画像、会話履歴を含めた判断、判断理由の文章生成は今回のモデルの対象ではありません。

2. 規則と正解を先に決める

教材は、架空の社内コミュニティを想定しました。宣伝は有料商品・サービスへの勧誘を対象とし、会社承認済みの無料勉強会は対象外にします。個人攻撃は特定のメンバー本人を貶める発言を対象とし、提案の費用や手順への具体的な批評は対象外です。

どちらの規則にも、引用による報告と注意喚起の例外を入れました。例えば「この勧誘を見つけたので運営へ報告します」は、投稿者自身の勧誘ではありません。この区別を入力に書いたうえで、実際に守れるかを確認します。

投稿の構成件数期待する分類
有料講座や紹介料付きサービスへの勧誘2宣伝だけ
特定メンバーへの侮辱2個人攻撃だけ
侮辱に加えて有料商品へ勧誘1両方
承認済み無料案内、提案への批評、設備予約3両方とも対象外
勧誘・侮辱を引用した報告や注意喚起4両方とも対象外

入力と期待値は7時6分に固定し、実行用の設定も推論前に保存しました。期待値は別ファイルに置き、モデルには英語の規則と1件の日本語投稿だけを渡しています。12件とも架空で、実在する社員や顧客の投稿は使っていません。

英語の規則では、対象、対象外、例外を分けました。公式ヘルパーの Category には violation_rule、not_violation_rule、exception_override があり、この3項目へ教材の文を対応付けています。読み手向けの日本語訳は説明用で、モデルに追加していません。公式ヘルパーの入力定義

3. 両方のラベルと、引用の対象外を確認できた

12件の応答に実行エラーはありませんでした。宣伝と個人攻撃を別々に数えた24判定も、期待値にすべて一致しました。注意を付けるべき6判定は拾い、対象外の18判定には注意を付けませんでした。

検収項目結果
両カテゴリとも期待どおりだった投稿12/12件
カテゴリ単位の一致24/24判定
対象の見逃し0判定
対象外への過剰な注意0判定
引用報告・注意喚起4投稿の完全一致4/4件

例えば、有料講座の購入をDMで勧めるP01は宣伝だけに該当しました。一方、有料講座への勧誘文を引用し、「私は申し込みを勧めていません。規則違反か確認をお願いします」と書いたP09は、両方とも対象外になりました。

入力宣伝スコア個人攻撃スコア返されたラベル
P01:自分の有料講座を購入するよう勧誘0.98900.0055宣伝
P05:個人を侮辱し、有料商品へ勧誘0.98840.9948宣伝・個人攻撃
P09:勧誘文を引用して運営へ報告0.00150.0001なし
P11:侮辱を引用し、賛同せずに報告0.00010.0009なし

値は生の応答を小数第4位へ丸めています。P05で両方を返し、P09やP11で両方を外せたことは、今回の規則と入力に対する観測です。引用すれば必ず外せる、引用の悪用にも強い、といった広い結論にはできません。

今回の12件では誤りを観測しませんでしたが、「日本語精度100%」とは言えません。 対象と例外を明瞭に書いた少数の架空例です。皮肉、婉曲な攻撃、前後の会話が必要な投稿、規則の変更後は試していません。結果を見てから難しい例を追加した場合は、今回と別の試験として記録する必要があります。

4. スコアは「正しい確率」として使わない

各カテゴリのスコアは0〜1ですが、合計が1になる必要はありません。宣伝も個人攻撃も高くなることがあり、両方とも低くなることもあります。最大のカテゴリだけを残すと、複数の問題を含む投稿の情報を落としてしまいます。

今回は公式の既定設定 precision を使い、独自規則のモードでは0.335以上を注意候補としました。これは編集部が日本語データで最適化した境界ではありません。balanced という別設定もありますが、結果を見て切り替えたり、都合のよい値を探したりはしていません。閾値を配布重みへ結び付けた公式定義

Python
# 仕組みを説明する架空の数値。製品の実測出力ではありませんscores = {"promotion": 0.72, "attack": 0.61}cutoff = 0.335attention_labels = [name for name, score in scores.items() if score >= cutoff]print(attention_labels)  # ['promotion', 'attack']

公式ヘルパーは、カテゴリの規則や組合せによってスコアが動くと説明しています。別カテゴリを追加しただけでも、元のカテゴリの値が変わり得ます。機材や数値の計算形式も影響するため、「0.8なら80%正しい」と読み替えず、業務側の期待値と合わせて確認します。

値の定義と実際の正しさを分ける考え方は、DoubtBenchの採点を再計算した記事にもつながります。PolicyLMのスコアを、別製品の confidence と同じ数値だと扱わないことが大切です。

5. 無料のローカル試用で確認できた範囲

試用したのはApple M2 Ultra・メモリ192GiB・macOS 27.0です。で動かし、計算形式はfloat32、8スレッドに固定しました。同じ端末で別のCPU検証も進行していたため、今回は処理時間を速さの評価には使っていません。

項目試用条件
公開モデルPolicyLM-1.7B、配布v1.2の固定コミット 4e5a98c…
Python環境Python 3.12.10、torch 2.14.1、transformers 4.57.6
判定設定precision、境界0.335、前処理あり、2カテゴリを同時に読む
試行12投稿を各1回、予熱なし、規則・期待値・境界の事後変更なし
初回取得量モデル関連約3.49GB。依存ライブラリと実行時メモリは別
利用条件コード・重みはApache-2.0。今回の試用に追加API料金なし

公式の導入条件はPython 3.10以上ですが、transformersは4.57.6指定で、5系には対応していません。ダウンロードできることと、どの小容量PCでも動くことは別です。今回の大容量Macでの成功から最低メモリ量を推定していません。公式の依存条件、ライセンス

公式には短文を高速に処理した測定がありますが、使用GPUやカテゴリ数を含む条件付きです。今回のMacの結果から、その数値を追試したことにはしません。また、発表記事にある1日100万件以上を扱う運用例は、個別に調整した版の説明です。公開モデルカードは実トラフィックでは未試験としており、配布版が同じ運用実績を持つとは書けません。

教材ZIPをダウンロードすると、入力・期待値・実際の応答・設定を確認できます。モデル本体は含みません。まず展開先で次を実行すれば、追加のライブラリやモデルなしで、編集部の結果を再集計できます。

Bash
python3 -B run_local.pypython3 -B -m unittest test_fixture.py -vpython3 -B evaluate_results.py observed

自分の端末で動かす場合は、同梱の RUNNING.md に従って新しい仮想環境と固定版モデルを用意します。初回の取得にはネット接続が必要です。準備後の推論は、次のように明示的に指定した場合だけ実行します。保存先は新しい名前にし、前の結果を上書きしません。

Bash
.venv/bin/python -B run_local.py --run --model-dir model --output-dir my-results.venv/bin/python -B evaluate_results.py my-results --save

教材はローカルの固定ファイルを照合し、推論時のオフライン設定を有効にします。編集部はさらにOS側で通信を拒否して試しました。上の一般用コマンドにはOS側の拒否は含まれません。モデルが返したラベルを使って、投稿を削除したり、人物へ処分を行ったりする機能もありません。

6. 実務へ持ち込むなら、まず確認担当者の候補一覧にする

最初は、注意候補の投稿に規則名とスコアを添え、人が確認する一覧にします。モデルが高い値を返した理由は文章では示されないので、引用や文脈の読み違いがないかは原文と規則を照合します。低い値だった投稿も一部確認し、見逃しが増えていないかを見ます。

規則の変更時には、問題なく通っていた文も含めて再検収します。例外を増やして過剰な注意が減っても、本来拾うべき勧誘を通すようになれば、別の失敗を作ってしまいます。検収用の少数例に合わせ切るのではなく、別の投稿で確認する段階を残してください。

汎用の担当振り分けを検討している場合は、Jiwoの日本語・英語問い合わせ試験と用途を分けると選びやすくなります。本記事の12件は、投稿確認の規則を検収する出発点です。

よくある質問

日本語の規則をそのまま渡せますか?
本稿は英語の規則と日本語の投稿を使いました。公式の19言語評価もメッセージ側の話で、規則は英語のみ評価されています。日本語の規則で同様に動くという確認はしていません。
スコアが高ければ自動削除してよいですか?
高い値は業務上の正しさを保証しません。まずは人が確認する候補抽出として使い、引用報告や注意喚起への誤検出と、問題投稿の見逃しを別々に記録します。
API契約やGPUが必要ですか?
今回の試用は公開重みを取得し、MacのCPUで行いました。追加の有料API契約は使っていません。初回の約3.49GBの取得、Python依存、実行時メモリなどは必要です。無料公開と、端末の運用費がかからないことは別です。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp