個人情報黒塗りくん 日本語の個人情報マスキングAPI

LLMに渡す前に、日本語の個人情報を伏せる。

氏名・住所・電話番号から、マイナンバー・口座番号・和暦の生年月日まで。伏せた箇所はタグに置き換えるので、LLMの回答を元の値に戻せます。東京リージョンで処理し、送られた本文は保存しません。

デモ

例文
年齢・性別・会社名なども伏せる
マスクした結果

LLMとのやりとりで、個人情報だけを手元に残す

伏せた箇所には [PERSON_1] のようなタグが入り、同じ人には同じタグが付きます。LLMはタグのまま文脈を理解して回答し、その回答を元の値に戻せます。

  1. マスクする

    個人情報をタグに置き換えます。元に戻すための対応表は暗号化して返すので、サーバーには残りません。

    送る前山田太郎様から、090-1234-5678 に折り返し希望。 LLMに渡す形[PERSON_1]様から、[PHONE_1] に折り返し希望。
  2. LLMに渡す

    要約・分類・返信文の作成など、いつもどおりに使えます。LLM側には個人情報が届きません。

    LLMの回答[PERSON_1]様、お問い合わせありがとうございます。[PHONE_1] へ本日中にお電話いたします。
  3. 元に戻す

    回答と対応表を送ると、タグが元の値に戻ります。

    戻した結果山田太郎様、お問い合わせありがとうございます。090-1234-5678 へ本日中にお電話いたします。

伏せられる項目

番号は桁数だけでなく検査用の数字まで確かめ、日付や住所は前後の言葉から判断します。全角の数字やハイフン、Excelから貼り付けた表にも対応しています。

項目例判定のしかた
マイナンバー1234-5678-901812桁と検査用の数字。「個人番号」などの言葉があれば確度を上げる
口座番号三井住友銀行 渋谷支店 普通 1234567銀行名・支店名・預金種別と7桁。ゆうちょの記号番号にも対応
クレジットカード4111 1111 1111 1111Luhnの検査と、各ブランドの番号体系
電話番号090-1234-5678、080の2222の3333携帯・固定・フリーダイヤルの桁数。口頭の書き方や +81 にも対応
住所・郵便番号〒150-0002 東京都渋谷区渋谷2-24-12都道府県や市区町村と番地。「在住」「出身」などは含めない
生年月日昭和58年3月15日生まれ、S58.3.15実在する日付で、前後に「生年月日」「生まれ」などがあるもの。和暦・元年に対応
氏名山田太郎様、氏名:佐藤 花子敬称や「氏名」「名義」などの手がかり。一度見つけた氏名は文中のほかの箇所も伏せる
メール・IPアドレスtaro@example.co.jp、203.0.113.5形式。「v1.2.3.4」のようなバージョン番号は除く
運転免許証番号免許証番号 12345678901212桁と「免許」の言葉
年齢・性別指定したときだけ45歳男性、30代の女性「歳」「代」や年齢と並んだ性別。「20歳未満」「女性活躍」などは除く
会社名指定したときだけ株式会社サンプル、ABC(株)法人格の前後。後ろの「営業部」「御中」は含めない
カードの有効期限指定したときだけ有効期限 05/28「有効期限」「Exp」などの言葉か、カード番号の直後

業務のデータを安心して流せるように

本文を保存しません
送られたテキストは処理が終わると破棄し、ログにも残しません。記録するのは利用量としての文字数だけです。
東京リージョンで処理
AWSの東京リージョン(ap-northeast-1)だけで処理します。データが国外のサーバーを通りません。
元に戻せるのは、対応表を持つ人だけ
タグと元の値の対応表はAES-256で暗号化して返します。改ざんされたものは復号できず、既定で24時間後に失効します。
表データもそのまま
CSVやExcelからの貼り付けは、見出し(氏名・生年月日など)から列を判断してセルごと伏せます。Shift_JISのファイルも送れます。

使い方

HTTPでテキストを送るだけです。APIキーは X-API-Key ヘッダーに入れます。伏せ方は、元に戻せるタグ([PERSON_1])のほか、文字数ぶんの ■ で塗りつぶす黒塗り(style=block)なども選べます。項目の絞り込みや伏せ方の変更などはAPIドキュメントから試せます。

import requests

API = "https://kuronurikun.com"
HEADERS = {"X-API-Key": "pmk_..."}

# 1. マスクする
m = requests.post(f"{API}/v1/mask", headers=HEADERS,
                  json={"text": inquiry}).json()

# 2. LLMに渡す(個人情報はタグに置き換わっている)
answer = ask_llm(m["masked_text"])

# 3. 回答を元に戻す
restored = requests.post(f"{API}/v1/unmask", headers=HEADERS,
                         json={"text": answer, "mapping_token": m["mapping_token"]}).json()["text"]

今月の残りの文字数は、レスポンスの X-Quota-Remaining ヘッダーで確認できます。

料金

送ったテキストの文字数で数えます。元に戻す処理は数えません。毎月1日にリセットされます。

プラン料金月の上限向いている使い方
Free0円10万文字組み込みの検証、小さな社内ツール
Pro4,980円/月1,000万文字本番のサービスでの継続利用
法人向け月額5万円〜個別に設定年間契約・個別見積もり。請求書払い、専用環境、自社環境での運用(セルフホスト)に対応

表示価格はすべて税込です。お支払い方法や解約については特定商取引法に基づく表記をご覧ください。

よくある質問

送ったテキストはどこかに残りますか?

残りません。処理が終わると破棄し、ログにも本文は書き出しません。元に戻すための対応表は暗号化して利用者側に返すため、サーバーには保存されません。記録するのは、利用量としての文字数だけです。

すべての個人情報を確実に見つけられますか?

見落としが起こることはあります。特に、敬称や「氏名:」などの手がかりがない氏名(例:「渡邉亮です。」)は、現在は見つけられません。この点は改善を進めています。重要なデータでは、人の確認と組み合わせてお使いください。

どこのサーバーで処理されますか?

AWSの東京リージョン(ap-northeast-1)です。

一度に何文字まで送れますか?

APIは1回10万文字までです。このページのデモは1回2,000文字までで、1日に試せる量にも上限があります。

上限を超えるとどうなりますか?

そのリクエストは処理されず、HTTP 429 が返ります。文字数は加算されないので、翌月1日のリセットを待つか、プランの変更をご相談ください。