パート 2: 合成 PII データと決定論的トークン化
実践的な学習パスを進める場合は、データ拡張ワークショップから始めてください。この章では、既存の実装と運用上の契約について説明します。
2026-09-15 の CPU による再生成では、過去のハッシュが維持され、NFC 正規化したソースの厳密な重複も確認されました。train/validation 間で共有されるソースは 22 件、train/test 間は 36 件、validation/test 間は 9 件で、51 個の一意なソースグループが 2 つ以上の split にまたがっています。新しいワークショップでは、別の例として、学習データのみを拡張する前にファミリー単位で split します。この過去のコーパスをリークのないものとして再分類するわけではありません。
実装とドキュメントのレビュー日: 2026-09-12。Generator 1.0.0、seed 42、および既存のデータセットハッシュを維持しています。
抽出と置換は別の処理
モデルは、候補となる TYPE<TAB>ORIGINAL の行を出力します。
PERSON Taylor Sample
EMAIL synthetic.en.1494@example.comこれらは合成例です。モデルがソース文書を編集することはありません。型とソース一致のチェックによって一部の無効な候補は除外されますが、値が PII であること、その型が正しいこと、あるいはすべての PII エンティティが見つかったことを証明するものではありません。置換マッピングは機密情報として扱ってください。
データセットと評価の対象範囲
データセットは 2,200 件のレコードで構成され、各 partition で韓国語と英語の割合は 80/20 です。実装変更後の再生成でも、すべてのマニフェストハッシュが維持されました。
| Split | レコード数 | 韓国語 | 英語 | SHA-256 |
|---|---|---|---|---|
| train | 1,600 | 1,280 | 320 | b98429fef0b103f24e8eaded069cbd2f6def5fbf8c083a5c7baf366c9fc1d21a |
| validation | 200 | 160 | 40 | 25ca38198d38e04be181e15b4e21a3c96d672f46f775ae1bc6c422ee4514f820 |
| test | 400 | 320 | 80 | 6f6ef9a6b42297738b292d5149f2e6e323f7bcd6f2325b6bfbc04ae6d9d0ec21 |
| ラベル | この実験での意味 |
|---|---|
| PERSON | 人名 |
| RRN | 韓国の住民登録番号形式の識別子 |
| DOB | 生年月日 |
| REL | 家族または関係性を表す表現 |
| ADDRESS | 住所 |
| PHONE | 電話番号 |
| メールアドレス | |
| ACCOUNT | 銀行口座番号 |
| CARD | 決済カード番号 |
これらは、この実験に固有のアノテーションルールです。たとえば、関係性を表す語が陽性となる場合がある一方、企業の代表電話番号は陰性文書に含まれます。これは普遍的な機密性分類ではありません。
Generator は、固定テンプレート、小規模な名前語彙、合成数値を使用します。RRN/CARD の値は、この例で使用するチェックサム関数を通過しません。ただし、それだけで公的な識別子としての有効性や、実際に割り当てられていないことが証明されるわけではありません。PHONE の値は合成プレースホルダーであり、国内の形式や公式な予約範囲に照らして検証されたものではありません。顧客データは使用していませんが、それは権威ある識別子検証とは異なります。
レコードとハッシュが異なっていても、train/validation/test 間でテンプレートやエンティティ語彙が独立しているとは限りません。このデータセットを、実際のワークロードに対する汎化性能のベンチマークとして提示しないでください。その目的には、独立したホールドアウトデータとレビュー済みのアノテーションを使用してください。
元の表記を復元可能な置換
実装は次の手順に従うようになりました。
- ソースと値を NFC に正規化し、型と値の前後の空白を除去します。
- 完全な
<think>...</think>ブロックを削除してから、許可された型と空でない値をタブ区切りで読み取ります。 - 候補の重複を除去し、リテラルまたは限定的な変形がソースと一致することを要求します。 解析と置換では、同じ数値境界を使用します。
- 他の予測から生成された変形よりも、リテラル予測を優先します。 1 つの値に複数の型がある場合は、固定された型の優先順位で解決します。これは意味的な正しさを推論するものではありません。
- より長いパターンを先にして、ソースを一度だけ走査します。
- 実際のソース上の順序で、型と一致した NFC 表記に基づいてトークンを割り当てます。 同一表記は同じトークンを再利用しますが、空白や区切り文字が異なる場合は別々のトークンを割り当てます。
- 元のソースにすでに存在するトークン名はスキップします。
- 実際に一致した表記をマッピングに保存し、NFC ソース上の座標で半開区間
[start, end)の置換スパンを記録します。
Source: 김가상 / 김 가 상 / [PERSON_1]
Candidate: PERSON 김가상
Masked: [PERSON_2] / [PERSON_3] / [PERSON_1]元のマーカーは変更されず、各ソース表記を復元できます。トークン番号は 1 から始まるとは限りません。トークンが等しいことは、実世界のエンティティ同一性を解決したことを意味しません。
PERSON の変形では、空白を取り除いた後の長さが 2~6 文字の名前について、均一な空白・タブ・改行の限定的な形式を扱います。数値の変形では、許可された数字・空白・区切り文字のみを正規化します。ソースとの一致を捏造するために、存在しない英字を取り除くことはなくなりました。ソースに存在しない alias123456 は、123456 がソース内にあるというだけでは受け入れられません。英数字を含む元の値も、リテラルであれば一致することがあります。これらのルールは、公式な電話番号・口座番号・身元確認の検証ではありません。
reassemble_text は、既知のトークンを 1 回の置換処理で復元し、未知のトークンはそのまま保持します。評価器はラウンドトリップを検査します。一致判定の対象は NFC ソーステキストであり、元の NFD 表現のバイト単位での復元ではありません。
プレースホルダーの内容ではなく、残存するソーススパンを測定する
以前の評価器は、マスク済みテキスト内で gold の文字列全体を検索していました。その結果、次の 2 つの誤った評価が発生しました。
- gold エンティティ
Alpha BetaのうちAlphaだけをマスクすると、文字列全体が削除されたと誤認され、リークなしと報告されていました。 - gold の値
PERSONそのものをマスクすると[PERSON_1]が生成され、そのラベルがソーステキストのリークとして誤ってカウントされていました。
修正後の評価器は、実際の置換スパンの和集合が、gold の各値または許可された変形に一致するすべての出現箇所を完全に覆っているかを検査します。繰り返し出現する箇所も調べます。区切り文字が覆われていない場合を含め、部分的に覆われているだけなら、この保守的な指標では未カバーとしてカウントされます。生成されたトークン名の内部にある文字は、ソースの露出とは見なされません。
gold レコードにはアノテーションのオフセットではなく値が含まれるため、これらのスパンはソースとの照合によって推定されます。これは新たな PII 検出ではなく、文脈上は機密でない同一文字列の出現箇所に一致することがあります。カバレッジはプライバシー保証としてではなく、アノテーション方針に照らして解釈してください。
指標の正確な意味
| 結果フィールド | 計算方法 |
|---|---|
| entity/per_type precision, recall, F1 | 文書ごとに正規化した (TYPE, ORIGINAL) セットについて TP/FP/FN を合計 |
| documents.leak_rate | gold スパンが未カバーの文書数を全文書数で割った値 |
| entities.leak_rate | 出現箇所が 1 つでも未カバーの一意な gold ペア数を、一意な gold ペア総数で割った値 |
| entities.over_redaction_rate | 余分に予測されたペアの割合を表す従来のフィールド名: FP / 予測ペア数 |
| entities.hallucination_rate | 許可された型を持ち、ソースに一致しない空でない TSV 行の数を、そのような行の総数で割った値 |
| parse.success_rate | 呼び出し元が指定した parse_success フラグが True である文書の割合 |
| tokenization.deterministic_rate | 候補の順序を逆にした後、マスク済みテキスト、マッピング、スパンが同一である割合 |
| tokenization.round_trip_rate | NFC ソースに復元される割合 |
エンティティ F1 は、スパン単位の NER F1 ではありません。1 文書内の重複ペアは除去されますが、同じペアが異なる文書に出現する場合は、それぞれ個別にカウントされます。型は前後の空白を除去して大文字に変換し、値は前後の空白を除去して NFC 正規化します。有効な変形によってソース全体をマスクできても、gold の正確な表記と異なれば FP/FN が発生することがあります。そのため、従来の over-redaction フィールドは、不必要に削除された文字数を直接測定するものではありません。
Hallucination は parse フラグとは独立して、ソースとの一致を使用します。不明な型や通常の文章は、その行の分母に含まれません。現在の推論ヘルパーは、出力が空、またはソースに一致する使用可能な行を少なくとも 1 つ含む場合、その出力を parse 可能と判定します。これはすべての出力行を厳密に検証するものではありません。このフラグが False の場合、評価器はエンティティ予測を除外します。
分母が 0 の場合は、エンティティセットが空の場合の F1 を含め、0 を返します。レコード/予測 ID の重複、未知のレコードに対する予測、ソースと一致しない gold アノテーションは拒否されます。エラーには生のエンティティ値を含めません。
学習レコードと検証
JSONL レコードには source_text、entities、target_tsv が含まれます。ローダーは system/user プロンプトと assistant の completion を構築します。trainer は completion のみを対象とした loss を要求します。実行時には、実際の tokenizer/template、truncation、loss mask を検証してください。source、completion、mapping は通常のログや MLflow のパラメーター/タグに含めないでください。
回帰テストでは、修正前にトークンの衝突、復元時に情報が失われる変形、数値の変形の過剰な受け入れ、評価エラーが再現されました。 ローカルのテストは 50 件すべて合格しています。2,200 件のレコードを使った ground-truth oracle チェックでも、ハッシュの維持、決定性、復元、カバレッジが検証されています。 Oracle の妥当性確認結果は、モデル予測でもファインチューニング後の F1 測定値でもありません。 GPU 学習も、実際の顧客の PII 処理も行っていません。