1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenAI Privacy Filterを試す:オンプレでも動かせるPII検出・マスキング用モデル

1
Posted at

OpenAIが公開している OpenAI Privacy Filter は、テキスト中の個人情報・機密情報らしき箇所を検出し、マスキングするためのモデル/CLIツールです。

GitHubリポジトリには、ローカルでPrivacy Filterを実行・評価・ファインチューニングするためのコード、CLI、サンプルデータが含まれています。

AIアプリケーションやLLM連携システムでは、ログ、問い合わせ内容、社内文書、RAG用ドキュメントなどに個人情報が混ざることがあります。
Privacy Filterは、そうしたデータをモデル投入前・保存前・分析前にサニタイズする用途で使えそうです。

Privacy Filterとは

OpenAI Privacy Filterは、PII、つまり personally identifiable information の検出とマスキングを目的とした 双方向トークン分類モデル です。高スループットなデータサニタイズ用途を想定しており、オンプレミス環境でも動かせることが特徴です。

特徴として、以下が挙げられます。

  • Apache 2.0ライセンス
  • ローカル環境で実行可能
  • CLIから簡単に利用可能
  • 評価用コマンドを提供
  • 独自データでファインチューニング可能
  • 128,000トークンの長文コンテキストに対応
  • precision / recall のトレードオフをランタイムで調整可能

モデルは、テキスト生成ではなく、入力トークン列に対してプライバシー関連ラベルを一括で付与する仕組みです。トークンごとの分類結果から、Viterbiデコーダーによって一貫したスパンを復元します。

検出できるカテゴリ

READMEによると、Privacy Filterは以下の8カテゴリのプライバシースパンを検出します。

ラベル 内容のイメージ
account_number 口座番号、アカウント番号など
private_address 個人住所
private_email メールアドレス
private_person 個人名
private_phone 電話番号
private_url 個人に紐づくURL
private_date 生年月日などの個人に関係する日付
secret APIキー、トークン、認証情報など

単純な正規表現では拾いにくい「文脈上の個人情報」も対象にできる点が、一般的なルールベースのマスキング処理との大きな違いです。

インストール

リポジトリをcloneして、ローカルパッケージとしてインストールします。

git clone https://github.com/openai/privacy-filter.git
cd privacy-filter
pip install -e .

インストール後は、opf コマンド、または python -m opf で実行できます。

まずはワンショットで試す

opf "Alice was born on 1990-01-02."

デフォルトでは、OPF_CHECKPOINT 環境変数で指定されたディレクトリ、または ~/.opf/privacy_filter にあるモデルを探します。
モデルが見つからない場合は、デフォルトの場所にダウンロードされます。

CPUで実行したい場合は、次のようにします。

opf --device cpu "Alice was born on 1990-01-02."

任意のチェックポイントを使いたい場合は、--checkpoint を指定します。

opf --checkpoint /path/to/checkpoint_dir "Alice was born on 1990-01-02."

ファイルをまとめてマスキングする

ファイルを対象にする場合は、-f を使います。

opf -f /path/to/file

パイプにも対応しているため、既存のUNIXコマンドと組み合わせられます。

cat /path/to/file | grep -e 'some_pattern' | opf

この使い方は、ログ処理やバッチ処理に組み込みやすそうです。

たとえば、問い合わせログから特定条件の行だけ抽出して、その後に個人情報をマスクする、といったパイプラインを作れます。

cat app.log \
  | grep "support_request" \
  | opf \
  > sanitized_support_requests.log

評価もできる

Privacy Filterには、ラベル付きデータセットを使った評価モードも用意されています。

opf eval examples/data/sample_eval_five_examples.jsonl

サンプルデータは examples/data/ 以下に含まれています。
独自の業務データに対して導入する場合は、まず自社のデータ分布に近い評価データを作り、検出漏れ・過検出を確認するのがよさそうです。

ファインチューニングも可能

独自のラベル付きデータを使ってファインチューニングできます。

opf train /path/to/train.jsonl --output-dir /path/to/finetuned_checkpoint

デフォルトのラベルポリシーが自社の要件に合わない場合、たとえば「住所は必ず伏せたい」「日付は残したい」「社内IDもsecret扱いにしたい」といったケースでは、評価とファインチューニングを組み合わせる必要があります。

Python / Transformersから使う

Hugging Face上のモデルカードでは、transformerspipeline から使う例も紹介されています。

from transformers import pipeline

classifier = pipeline(
    task="token-classification",
    model="openai/privacy-filter",
)

result = classifier("My name is Alice Smith")
print(result)

AutoModelForTokenClassificationAutoTokenizer を直接使うこともできます。

import torch
from transformers import AutoModelForTokenClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("openai/privacy-filter")
model = AutoModelForTokenClassification.from_pretrained(
    "openai/privacy-filter",
    device_map="auto",
)

inputs = tokenizer("My name is Alice Smith", return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model(**inputs)

predicted_token_class_ids = outputs.logits.argmax(dim=-1)
predicted_token_classes = [
    model.config.id2label[token_id.item()]
    for token_id in predicted_token_class_ids[0]
]

print(predicted_token_classes)

JavaScript / ブラウザ実行の可能性

Hugging Faceのモデルカードでは、@huggingface/transformers を使ったTransformers.jsの例も掲載されています。

import { pipeline } from "@huggingface/transformers";

const classifier = await pipeline(
  "token-classification",
  "openai/privacy-filter",
  { device: "webgpu", dtype: "q4" },
);

const input = "My name is Harry Potter and my email is harry.potter@hogwarts.edu.";
const output = await classifier(input, { aggregation_strategy: "simple" });

console.dir(output, { depth: null });

サーバー側で処理するだけでなく、ブラウザ上で事前マスキングする構成も検討できそうです。

たとえば、以下のような使い方が考えられます。

  • 問い合わせフォーム送信前に個人情報を検出
  • 社内AIチャットに送る前にブラウザ側でマスキング
  • ローカルファイルをアップロードする前にサニタイズ
  • RAG用ドキュメント登録前にPIIを検出

リポジトリ構成

READMEによると、主な構成は以下の通りです。

opf/__main__.py
  CLIエントリポイント

opf/_api.py
  Python向けAPI

opf/_cli/
  CLI引数やターミナル表示まわり

opf/_core/
  ランタイム読み込み、スパン変換、デコード処理

opf/_eval/
  評価用データ読み込み、前処理、メトリクス、評価ランナー

opf/_train/
  ファインチューニング用処理

opf/_model/
  Transformer実装、チェックポイント設定、重み読み込み

examples/data/
  評価・ファインチューニング用サンプルデータ

examples/scripts/finetuning/
  ファインチューニング用デモスクリプト

単なるモデル配布ではなく、CLI、評価、学習、出力スキーマまで含まれているため、検証から運用設計まで進めやすい構成になっています。

使いどころ

個人的には、以下のような場面で特に有用だと感じました。

1. LLMに送る前の入力マスキング

ユーザー入力や問い合わせ本文をLLMに送る前に、メールアドレス、電話番号、氏名、住所などを伏せる用途です。

ユーザー入力
  ↓
Privacy Filter
  ↓
マスキング済みテキスト
  ↓
LLM / RAG / 分析基盤

2. ログのサニタイズ

アプリケーションログやサポートログに個人情報が混入することがあります。
ログ保存前、または分析基盤投入前にPrivacy Filterを挟むことで、不要な個人情報の保存を減らせます。

3. RAG用ドキュメントの前処理

社内文書をベクトルDBに投入する前に、個人名、メールアドレス、電話番号、APIキーなどを検出できます。

4. データセット作成時の匿名化補助

機械学習や分析用のデータセットを作る際に、個人情報の除去・確認の補助として使えます。

ただし、READMEでも注意されている通り、Privacy Filterは匿名化やコンプライアンスを保証するものではありません。
高リスクな用途では、ルールベース検出、DLP、レビュー工程、アクセス制御などと組み合わせるべきです。

注意点

Privacy Filterは便利ですが、万能ではありません。

特に以下の点には注意が必要です。

  • 検出対象は定義済みのラベル分類に依存する
  • 組織固有のポリシーに合わせるには評価・調整・ファインチューニングが必要
  • 英語以外、非ラテン文字、特殊な名前、ドメイン固有IDでは性能が落ちる可能性がある
  • APIキーやシークレットの形式が独自の場合、検出漏れが起きる可能性がある
  • 医療、法律、金融、人事、教育、政府系など高感度領域では人間のレビューが重要

「これを通せば安全」ではなく、「プライバシー・バイ・デザインの一層」として組み込むのが現実的です。

まとめ

OpenAI Privacy Filterは、テキスト内の個人情報やシークレットを検出・マスキングするための実用的なOSSです。

特に良いと感じた点は以下です。

  • CLIですぐ試せる
  • ローカル/オンプレで実行できる
  • Apache 2.0で商用利用しやすい
  • 評価・ファインチューニングの導線がある
  • LLMアプリケーションの前処理に組み込みやすい

LLM活用が進むほど、「どのデータをモデルに渡してよいか」「ログやRAG基盤に何を残してよいか」という設計が重要になります。
Privacy Filterは、その前処理レイヤーとしてかなり有力な選択肢になりそうです。

参考

  • OpenAI Privacy Filter GitHub Repository
  • Hugging Face: openai/privacy-filter
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?