はじめに
OpenAIがPII(Personally Identifiable Information:個人を特定できる情報)の検出・マスキング専用モデル「Privacy Filter」をHugging FaceにてApache 2.0ライセンスで公開しました。本稿では、このモデルの仕組みと特徴、PythonおよびJavaScriptでの実装方法について解説します。
参考記事
- タイトル: openai/privacy-filter Model Card
- 著者: OpenAI
- 発行元: Hugging Face
- URL: https://huggingface.co/openai/privacy-filter
関連記事



要点
- Privacy FilterはPII(個人情報)の検出・マスキングに特化した双方向トークン分類モデルであり、Apache 2.0ライセンスで商用利用・改変が可能である
- 総パラメータ数は1.5B、アクティブパラメータは50Mと軽量で、ブラウザやノートPCでの動作を想定した設計である
- 128,000トークンのコンテキストウィンドウにより、長文書をチャンク分割なしで処理できる
- 氏名・住所・メールアドレス・電話番号・URLなど8カテゴリのPIIスパンを検出し、精度(Precision)と再現率(Recall)のトレードオフを実行時に調整できる
- 完全な匿名化を保証するものではなく、多層的なプライバシー設計の一部として活用することが推奨されている
詳細解説
モデルの概要とアーキテクチャ
Privacy FilterはOpenAIが開発したPII検出・マスキング専用の双方向トークン分類モデルです。OpenAIによれば、高スループットなデータサニタイズ(sanitization:テキストから個人情報を取り除く前処理)ワークフローを想定して設計されており、オンプレミス(社内サーバー上での自社運用)でも動作します。
アーキテクチャ上の特徴として注目されるのは、gpt-ossと同系列のオートリグレッシブ事前学習チェックポイントをベースに、双方向のバンドアテンション(Band Attention)付きトークン分類モデルへ変換・追加学習されている点です。通常の自己回帰モデルがトークンを1つずつ生成するのと異なり、Privacy Filterは入力シーケンス全体を1回の順伝播(フォワードパス)でラベリングするため、高速なバッチ処理に適しています。
主な仕様は以下のとおりです。
- パラメータ数: 総計1.5B、アクティブ50M(スパース MoE 構成)
- コンテキスト長: 128,000トークン
- 注意機構: グループクエリアテンション(クエリヘッド14、KVヘッド2)+ RoPE(回転位置エンコーディング)
- FFN: 128エキスパート、トークンごとに上位4エキスパートを選択する MoE(Mixture of Experts:混合エキスパート)構成
- ライセンス: Apache 2.0
検出カテゴリとラベル設計
OpenAIのモデルカードによれば、Privacy Filterは以下の8カテゴリのPIIスパンを検出します。
- account_number ── 口座番号等
- private_address ── 住所
- private_email ── メールアドレス
- private_person ── 個人氏名
- private_phone ── 電話番号
- private_url ── 個人URL
- private_date ── 個人に紐付く日付情報
- secret ── APIキー・パスワード等の機密情報
各カテゴリには BIOES タグ(Begin/Inside/Outside/End/Single:スパンの境界位置を示す記号)が付与され、スパン境界を正確に表現します。出力はトークン数 T に対して [T, 33] の形状(33はラベルクラス数)で、最終的に Viterbi デコーダー(全体的に最も整合性の高いラベル列を求める動的計画法)によって一貫したスパンへ変換されます。
実行時にはデコーダーのパラメータを調整することで、精度と再現率のトレードオフを制御できます。たとえば、スパン検出の閾値を下げれば見逃しが減る一方で過剰マスキングが増えるといった調整が、モデルを再学習することなく行えます。
前提条件と環境構築
Privacy Filter を Python で利用するには、以下が必要です。
- Python 3.8以上(python –version で確認)
- pip(Pythonのパッケージ管理ツール)
- transformers ライブラリ(Hugging Face 製のモデル読み込みライブラリ)
- torch(PyTorch。GPU 利用の場合はCUDA対応版を推奨)
以下のコマンドでインストールします。
# transformers と PyTorch をインストールします
pip install transformers torch注意: GPU 環境で GPU を活用したい場合は、別途 CUDA 対応の PyTorch をインストールしてください。インストール手順は PyTorch 公式サイト(https://pytorch.org)で環境に合わせて確認できます。
Pythonでの実装例
パイプラインAPIを使う方法(最も簡単)
pipeline API は、Hugging Face のモデルを最小限のコードで試せる高レベルなインターフェースです。以下のコードで個人情報の検出が実行できます(参考記事のサンプルコードをもとにしています)。
from transformers import pipeline # HuggingFace の pipeline をインポート
# トークン分類タスク用の pipeline を作成し、Privacy Filter モデルを指定します
classifier = pipeline(
task="token-classification", # タスク種別: トークンレベルの分類
model="openai/privacy-filter", # 使用するモデルのID(HuggingFace上の識別子)
)
# 個人情報を含む英語テキストを入力して分類します
classifier("My name is Alice Smith")このコードを実行すると、”Alice Smith” が private_person として検出されます。
AutoModelを使う方法(詳細制御)
より細かく制御したい場合は、AutoModelForTokenClassification を直接利用します。
import torch
from transformers import AutoModelForTokenClassification, AutoTokenizer
# AutoTokenizer: テキストをトークン(数値列)に変換するクラス
# AutoModelForTokenClassification: トークン分類モデルを読み込むクラス
# モデルとトークナイザーを HuggingFace からダウンロードして読み込みます
tokenizer = AutoTokenizer.from_pretrained("openai/privacy-filter")
model = AutoModelForTokenClassification.from_pretrained(
"openai/privacy-filter",
device_map="auto" # GPU/CPU を自動で選択します
)
# テキストをトークンに変換し、PyTorch テンソル形式に変換します
inputs = tokenizer("My name is Alice Smith", return_tensors="pt").to(model.device)
# 勾配計算を無効化(推論時はメモリ節約のため)して予測を実行します
with torch.no_grad():
outputs = model(**inputs)
# 各トークンに対して最も確率の高いラベル ID を取得します(argmax = 確率最大値のインデックス)
predicted_token_class_ids = outputs.logits.argmax(dim=-1)
# ラベル ID をラベル名("private_person" 等)に変換します
predicted_token_classes = [
model.config.id2label[token_id.item()]
for token_id in predicted_token_class_ids[0]
]
print(predicted_token_classes)
device_map=”auto” を指定することで、GPU が利用可能であれば自動的に GPU が使用されます。
注意: 初回実行時はモデルの重みファイル(約3GB程度)のダウンロードが発生します。ネットワーク環境によっては時間がかかる場合があります。
JavaScriptでの実装例(ブラウザ・Node.js)
Privacy Filter は Transformers.js を通じてブラウザや Node.js 環境でも動作します。まず @huggingface/transformers パッケージをインストールします。
# npm(Node.js のパッケージ管理ツール)でインストールします
npm install @huggingface/transformers以下のコードで PII 検出が実行できます(参考記事のサンプルコードをもとにしています)。
import { pipeline } from "@huggingface/transformers";
// @huggingface/transformers から pipeline 関数をインポート
// WebGPU(ブラウザの GPU 活用機能)を使い、4ビット量子化(q4)で軽量動作させます
// q4 = 4bit 量子化(通常の 32bit に比べてモデルサイズを大幅削減)
const classifier = await pipeline(
"token-classification",
"openai/privacy-filter",
{ device: "webgpu", dtype: "q4" },
);
const input = "My name is Harry Potter and my email is [email protected].";
// aggregation_strategy: "simple" でトークン単位の結果をスパン単位にまとめます
const output = await classifier(input, { aggregation_strategy: "simple" });
console.dir(output, { depth: null });
上記コードの出力例は以下のとおりです。氏名とメールアドレスがそれぞれ別カテゴリとして検出されています。
[
{
entity_group: 'private_person',
score: 0.9999957978725433, // 信頼スコア(1.0 に近いほど確実)
word: ' Harry Potter'
},
{
entity_group: 'private_email',
score: 0.9999990728166368,
word: ' [email protected]'
}
]注意: WebGPU は Chrome 113以降のモダンブラウザで利用可能です。未対応環境では { device: “wasm” } に変更してください。
利用時の注意点と限界
OpenAIのモデルカードには、いくつかの重要な制約が明示されています。
まず、過信のリスクです。Privacy Filter はデータ最小化(必要最小限の情報のみ保持する原則)の補助ツールであり、完全な匿名化や法的なコンプライアンス保証を意図したものではないとOpenAIは述べています。医療・法務・金融・人事・教育・行政といった高感度領域では、見逃し(false negative)も過剰マスキング(false positive)も大きなコストにつながる可能性があり、人間によるレビューと組み合わせた多層的な運用が推奨されています。
また、英語以外の言語や非ラテン文字、あるいはトレーニングデータに少ない地域固有の命名規則に対してはパフォーマンスが低下する場合があると考えられます。カスタム要件がある場合はファインチューニングによる対応が推奨されていますが、ラベルポリシーの変更はランタイムでは行えず、再学習が必要な点に注意が必要です。
まとめ
OpenAIが公開したPrivacy Filterは、1.5Bパラメータ・128Kコンテキストの軽量PIIマスキングモデルで、数行のコードから利用できます。Apache 2.0ライセンスで商用利用・改変が自由な点も、エンタープライズ採用を後押しすると思います。ただし完全な匿名化ではなく、多層的なプライバシー設計の一要素として活用することが重要です。ベースとなる gpt-oss アーキテクチャについては、過去記事でも整理していますので、あわせてご覧いただければと思います。
