
OpenAI Privacy Filterの逆: 同じ1.5Bモデルを用い、マスキングの代わりにPIIを構造化スパンとして返します。
OpenAI は Privacy Filter を公開しました — テキスト内の PII を隠すモデルです。防御側はデータが漏洩しないようにこれを使います。
しかし、あらゆる防御にはもう一つの側面があります。攻撃者も PII を必要とします。ログ、ダンプ、放置された S3 バケット、盗まれた受信トレイから。同じタスク: テキストの山から個人情報をすべて見つけ出すことです。
Privacy Filter はマスクします。Privacy Parser は抽出します。
同じモデル、同じラベル分類、同じ重みです。<REDACTED> の代わりに構造化されたスパン — 何が、どこに、どのタイプかを取得できます。
防御: 漏洩する前に自社データを監査する。 攻撃: 漏洩した後に他人のデータを解析する。
このツールはどちらの立場かを知りません。単に優れたパーサーです。
uv venv
uv pip install -e ./privacy-filter
uv pip install -e ./pii_parser
初回実行時、opf 1.5B チェックポイント(約3 GB)が ~/.opf/privacy_filter/ にダウンロードされます。
from pii_parser.hybrid import HybridPIIParser
parser = HybridPIIParser(device="cpu")
result = parser.parse(
"Hi Quindle Testwick ([email protected] / +1-415-555-0102), "
"account 40702810500001234567, 14 Beautiful Ct, Anytown USA, "
"password Priv4cy-Filt3r-2026."
)
for s in result.spans:
print(f"{s.label:18} {s.text}")
private_person Quindle Testwick
private_email [email protected]
private_phone +1-415-555-0102
account_number 40702810500001234567
private_address 14 Beautiful Ct, Anytown USA
secret Priv4cy-Filt3r-2026
python -m pii_parser.cli_model "Alice paid 40702810500001234567 on 2026-05-17."
ハイブリッド = モデル + スパン結合 + 正規表現バックストップ。これを採用しましょう。
opf v2 分類体系 — 8カテゴリ:
private_person · private_email · private_phone · private_address ·
private_url · private_date · account_number · secret
text
↓
opf 1.5B → BIOES logits → Viterbi (tuned) → char spans
↓
span-merge (glues Quindle + Testwick)
↓
regex backstop (URL, secret, account — where the model misses)
↓
spans[]
python pii_parser/tests/test_hybrid.py
Fixture F1: 0.929
Scenarios: 8/8 passed
Latency: ~600 ms CPU
Apache-2.0.
| バックエンド | 重み | 速度 | F1 |
|---|
PIIParser | none | µs | 1.000 |
ModelPIIParser | 1.5B | 500 ms CPU | 0.733 |
HybridPIIParser | 1.5B | 600 ms CPU | 0.929 |