ブログ一覧へ戻る
コンプライアンス·2026年5月25日·読了8分

DSGVO 準拠の LLM 利用 — PII マスキング、AVV、Zero Data Retention

Claude / Gemini / GPTをGDPRに準拠して本番利用したいドイツ企業向けの実践ガイド。PIIマスキングのコード、誰とAVVを締結するか、Anthropic / Google(Enterprise)との直接契約によるZero Data Retention、Request-ID相関を備えた監査ログ、Schrems IIの問題。

ドイツ企業でGDPRに準拠してLLMを使用するには — ClaudeまたはGPTを本番環境で利用する前に必要なこと。PIIマスキング、監査ログ、Anthropic/GoogleでのZero Data Retention、AVVに関する実践的な設定。

必須の3要素

  1. 上流呼び出し前のPIIマスキング — 平文の個人データをフィルタリングせずに米国プロバイダーへ送信してはなりません
  2. データ処理契約(AVV/GDPR第28条) — モデルプロバイダー(Anthropic、Google、OpenAI)と直接締結。KunavoはAVVを提供しません
  3. 監査証跡 — 目的制限を記録し、すべての呼び出しを追跡可能にすること

1) PIIマスキング — 実践編

プロンプトが自社バックエンドから出る前に、マスキング処理を通します。メールアドレス、電話番号、個人名、IBAN、社会保障番号をトークンに置き換えます:

pii_mask.py
# Vor jedem LLM-Aufruf PII maskieren — niemals Klartext-Personendaten
# an die Upstream-API senden.
import re
from openai import OpenAI

PII_PATTERNS = [
    (re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+"), "<EMAIL>"),
    (re.compile(r"\b\d{4,}\b"), "<NUMBER>"),
    (re.compile(r"\b(?:\+49|0)\s*\d{2,4}\s*\d{4,8}\b"), "<PHONE_DE>"),
]

def redact(text: str) -> tuple[str, dict[str, str]]:
    redacted = text
    mapping: dict[str, str] = {}
    for i, (pat, tag) in enumerate(PII_PATTERNS):
        for match in pat.finditer(text):
            key = f"{tag}_{i}_{match.start()}"
            mapping[key] = match.group(0)
            redacted = redacted.replace(match.group(0), f"[{key}]")
    return redacted, mapping

def restore(text: str, mapping: dict[str, str]) -> str:
    for key, original in mapping.items():
        text = text.replace(f"[{key}]", original)
    return text

マッピングテーブルはローカルにのみ保持します。LLMの回答に再挿入された個人データを返す必要がある場合(例:「シュミット夫人、こんにちは」)、回答後にのみ置換します。これにより、上流プロバイダーには常に匿名化されたテキストだけが表示されます。

2) AVV — 誰がどの契約を必要とするか

  • あなた ↔ Kunavo:KunavoはGDPR第28条に基づくAVVを提供しません。リクエストは米国で処理され、アップストリームプロバイダーに転送されます。プロバイダーがコンテンツをどう扱うかは、各社のプライバシーおよび保存条件で定められています(/legal/privacy参照)
  • あなた ↔ モデルプロバイダー:ワークロードにAVVが必要な場合は、Anthropic、OpenAI、Googleと各社のBusinessまたはEnterprise条件で直接契約し、モデルを直接呼び出してください。Kunavo経由でサブプロセッサーの連鎖を引き継ぐことはありません
  • Schrems IIリスク:AnthropicとOpenAIは米国に所在します。AVVがないため、Kunavoには米国への移転に関する標準契約条項(SCC)もありません。リスク評価で純粋なEUプロバイダーが必要とされる場合、Kunavoは適していません。カタログ内にEU所在のプロバイダーはなく、すべてのリクエストはUS-Eastのゲートウェイを経由します

3) 監査ログ — すべての呼び出しを記録する

リクエストごと:Request-ID、User-ID、モデル、ハッシュ化されたプロンプト、トークン使用量、レイテンシー、独自ログ内の相関キーとしてのRequest-ID:

audit.py
# Jeder LLM-Aufruf wird in einem unveränderlichen Audit-Log festgehalten
import json, time, uuid
from datetime import datetime

def call_with_audit(user_id: str, prompt: str, model: str) -> dict:
    request_id = str(uuid.uuid4())
    redacted_prompt, mapping = redact(prompt)

    # Audit-Log VOR dem Call schreiben
    audit_log.write({
        "request_id": request_id,
        "user_id": user_id,
        "timestamp": datetime.utcnow().isoformat(),
        "model": model,
        "prompt_redacted": redacted_prompt,
        "prompt_hash": hashlib.sha256(prompt.encode()).hexdigest(),
        "pii_tags_count": len(mapping),
    })

    resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": redacted_prompt}],
        extra_headers={
            "X-Request-ID": request_id,  # nur für deine eigenen Logs; Kunavo wertet ihn nicht aus
        },
    )

    response_text = resp.choices[0].message.content
    # Bei Bedarf PII zurück mergen (nur in der lokalen DB)
    final_text = restore(response_text, mapping)

    audit_log.write({
        "request_id": request_id,
        "response_redacted": response_text,
        "tokens": resp.usage.model_dump(),
        "duration_ms": int((time.time() - start) * 1000),
    })
    return {"text": final_text, "request_id": request_id}

X-Request-IDはあなた自身のキーです。Kunavoはこのヘッダーを評価も保存もしません。また、利用状況ダッシュボードには、どのアップストリームプロバイダーが呼び出しを処理したかは表示されません。ここでは各呼び出しについて、時刻、モデル、トークン、コスト、レイテンシーを含むKunavo独自のCall-IDを確認できます。監査ログとの照合は時刻とモデルで行います。

ゼロデータ保持(ZDR)— モデルプロバイダーと直接契約した場合のみ

デフォルトでは、AnthropicとGoogleは不正利用監視のため、プロンプトのログをそれぞれ30日間(Anthropic)または60日間(Google)保存します。GDPR上センシティブなワークロードでは、プロバイダー自身にZDRを申請し、独自契約に含めることができます。KunavoはZDRルーティングもZDRレベルも提供しません。Kunavo経由のリクエストは米国で処理され、各アップストリームプロバイダーの保存規則が適用されます。

  • Anthropic ZDR:Anthropicとの直接契約を結ぶEnterprise顧客向け。Kunavo経由では利用できません
  • Google Vertex AI:独自のGoogle Cloud契約で同様の条件を設定でき、EUリージョン(europe-west4/オランダ)を選択できます。KunavoはEUリージョン経由でルーティングしません
  • OpenAI:Zero Data RetentionはOpenAIとの直接契約におけるEnterprise tierでのみ利用できます。Kunavo経由では仲介できません

データレジデンシー

  • Kunavoのルーティング:ゲートウェイ内の単一リージョン(US-East、Ashburn)で行われます。手前に配置されたAnycast edgeだけが、あなたの近くでTLSを終端します
  • アカウントデータの永続化:US-Eastに単一のプライマリデータベースがあり、ボリュームの暗号化された日次スナップショットを保存します。EU-onlyルーティングは提供していません
  • 付加価値税:チェックアウトではVATを表示せず、請求書も作成しません。会計用の証憑については contact@kunavo.com に連絡してください

ほとんどのコンプライアンスチームが見落とすこと

  • プロンプトに氏名が含まれる場合、その内容は個人データである — ユーザーが「Müller」と入力していなくても、「私はPetraです」と入力しただけで該当します。マスキングでは、ヒューリスティックにファーストネームと固有名詞を検出すべきです
  • データを使ったトレーニングは、AnthropicとGoogleではデフォルトで無効です(ChatGPTの個人ユーザー向けとは異なります)。Kunavo自身はコンテンツを使ってトレーニングしません。アップストリームプロバイダーがコンテンツをどう扱うかは各社の条件で定められています。Kunavoはこれについて契約上の保証を提供しません
  • 出力内容のハッシュ化 — DPAで定められている場合、当社は完全なテキストではなくハッシュのみを保存します
  • 消去権 — GDPR第17条に基づく請求があった場合、ログからプロンプトを削除できなければなりません。これは、監査ログが削除可能である場合にのみ機能します(append-onlyのブロックチェーン構造に保存してはいけません)

ImpressumとCookieバナー

完全なコンプライアンス対応については、§5 DDGに基づく/legal/impressumと、/legal/privacyのプライバシーポリシーをご覧ください。Cookieバナーは自社サイトで管理してください(例:Usercentrics、Cookiebot、Klaro)。Kunavo自身が設定するのは機能Cookieのみです。

準備はできましたか?無料登録後、$10からチャージして従量課金で利用できます。残高に有効期限はありません。ワークロードにAVV、ZDR、またはEUデータレジデンシーが必要な場合は、モデルプロバイダーと直接契約してください。