Prompt privacy
個人情報を含む prompt が AI agent の model に届く前に拒否します。
Prompt Privacy を使用する理由
ユーザーが customer record を support agent に貼り付け、苦情を要約するよう依頼したとします。この prompt は model provider に送信され、conversation history に保存され、その後のすべての turn で再利用されます。agent 自身の instructions ではこれを取り消せません。model が拒否できる時点では、すでに data を読み取っているためです。
Prompt privacy は turn を入口で停止します。prompt は agent の model が認識する前にスクリーニングされ、PII を含む prompt は完全に拒否されます。
- TypeScript
- Python
await this.squid.ai().agent('support-agent').updatePii({
onDetect: 'reject',
});
await self.squid.ai().agent('support-agent').update_pii(
{
'onDetect': 'reject',
}
)
概要
prompt privacy を有効にすると、agent が実行される前に、すべての incoming prompt が小型で高速な classifier model によりスクリーニングされます。prompt に選択した情報が含まれる場合、その turn は拒否されます。
- prompt は agent の model に送信されません。
- answer は生成されず、chat quota も消費されません。ただし、screening call 自体は AI spend として計測されます。
- conversation history には何も書き込まれないため、次の turn は前の state から開始します。
- caller は、
PII_DETECTED_IN_PROMPTから始まる error を受け取ります。
PII guardrail との違い
Prompt privacy は disablePii guardrailの inbound counterpart であり、両者は異なる問題を解決します。
pii(このページ) | guardrails.disablePii | |
|---|---|---|
| 方向 | Inbound: ユーザーが送信する内容 | Outbound: agent が回答する内容 |
| メカニズム | agent 実行前に classifier が prompt をスクリーニングする | agent の system prompt 内の instruction |
| 一致時 | turn が拒否される | model に情報を除外するよう求める |
| agent の model に届くか? | いいえ | はい |
data が model に一切届いてはならない場合は pii を使用します。agent に回答させつつ personal data を reply に含めないようにしたい場合は disablePii を使用します。両方を同時に有効化できます。
クイックスタート
screening は 1 回の call で有効化できます。configuration は保存済み agent に存在するため、すべての caller に適用されます。
- TypeScript
- Python
// Refuse any prompt containing an email address or a national identity number
await this.squid
.ai()
.agent('support-agent')
.updatePii({
onDetect: 'reject',
entities: ['email', 'ssn'],
});
# Refuse any prompt containing an email address or a national identity number
await self.squid.ai().agent('support-agent').update_pii(
{
'onDetect': 'reject',
'entities': ['email', 'ssn'],
}
)
拒否された prompt は throw される error として表示されるため、agent を呼び出す場所で処理します。
- TypeScript
- Python
try {
const answer = await this.squid.ai().agent('support-agent').ask(userPrompt);
return answer;
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
if (message.includes('PII_DETECTED_IN_PROMPT')) {
return 'Please remove any personal details from your question and try again.';
}
throw error;
}
try:
answer = await self.squid.ai().agent('support-agent').ask(user_prompt)
return answer
except Exception as error:
if 'PII_DETECTED_IN_PROMPT' in str(error):
return 'Please remove any personal details from your question and try again.'
raise
Configuration
すべての設定は agent の pii option の下にあります。
| Field | Type | Default | 説明 |
|---|---|---|---|
onDetect | 'off' or 'reject' | 'off' | 'reject' は PII を含む prompt を拒否します。'off' は screening を完全に無効化します。 |
entities | entity kind の array | すべての kind | スクリーニング対象にする情報の kind。 |
customRules | string の array | なし | plain language で記述する、business 固有の情報。 |
allowList | string の array | なし | PII として決して扱わない exact value。 |
classifierModel | model 名 | gpt-5.6-luna | screening を実行する model。 |
updatePii は updateGuardrails と同様に、agent の既存設定を置き換えるのではなく merge します。merge は shallow です。entities、customRules、allowList などの array field は append されず、全体が置き換えられます。
Entity kind
| Kind | 一致する内容 |
|---|---|
email | Email address |
phoneNumber | Phone number |
creditCard | Payment card number |
ssn | 米国の Social Security Number などの national identity number |
iban | IBAN などの bank account number |
passport | Passport およびその他の travel document number |
entities を未設定のままにすると、すべての kind をスクリーニングします。customRules のみに依存するには、empty array に設定します。entities が空で custom rule も設定されていない場合、スクリーニング対象がないため classifier は呼び出されず、すべての prompt が通過します。
Custom rule
model が prompt を読むため、custom rule は pattern ではなく description として記述します。注意深い読者が文から認識できるものであれば機能します。custom rule が一致した場合、拒否メッセージと audit entry は built-in kind ではなく rule text 自体を報告します。
- TypeScript
- Python
await this.squid.ai().agent('support-agent').updatePii({
onDetect: 'reject',
customRules: [
'internal case numbers like CASE-12345',
'employee IDs, which are always six digits prefixed with E',
'any reference to a customer contract number',
],
});
await self.squid.ai().agent('support-agent').update_pii(
{
'onDetect': 'reject',
'customRules': [
'internal case numbers like CASE-12345',
'employee IDs, which are always six digits prefixed with E',
'any reference to a customer contract number',
],
}
)
Allow list
本来は flag される shared かつ non-personal な value は allow list に追加します。
- TypeScript
- Python
await this.squid
.ai()
.agent('support-agent')
.updatePii({
onDetect: 'reject',
allowList: ['support@example.com', '+1-800-555-0100'],
});
await self.squid.ai().agent('support-agent').update_pii(
{
'onDetect': 'reject',
'allowList': ['support@example.com', '+1-800-555-0100'],
}
)
コアコンセプト
Screening は context 内で判断される
model が prompt を読むため、value は偶然一致する形式ではなく、prompt がそれを何として説明しているかに基づいて分類されます。SSN 113-772-1098 と記述された number は phone number に似た形式ですが、周囲の text がそのように示しているため ssn として報告されます。
Policy は request ごとに override できない
pii は保存済み agent から読み取られます。個別の ask または chat call の options で渡した pii value は無視されるため、caller は agent owner が有効にした screening を無効にできません。
拒否は Redact された Prompt で Audit される
agent で audit logging が有効な場合、拒否された turn も記録されますが、保存される prompt では一致したすべての value が [REDACTED] に置き換えられます。entry は一致した kind により tag 付けされ、value 自体で tag 付けされることはありません。そのため audit trail には、拒否の原因となった data を再掲することなく、request がなぜ拒否されたかが記録されます。
Screening は Fail-closed である
classifier に到達できない場合、screening されていない状態で通過させるのではなく、turn は PII_SCREENING_UNAVAILABLE で拒否されます。PII を拒否するよう設定された agent が、暗黙的に拒否を停止することはありません。
Error Handling
| Error | 意味 | 対処方法 |
|---|---|---|
PII_DETECTED_IN_PROMPT | prompt に PII が含まれていたため拒否されました。message には一致した kind が一覧表示されます。一致した custom rule は rule text によって報告されます。 | personal detail を除外して再送信するよう user に依頼します。 |
PII_SCREENING_UNAVAILABLE | classifier に到達できなかったため、prompt が拒否されました。 | retry します。継続する場合は、設定済みの classifierModel が利用可能か確認します。 |
いずれも answer が生成される前に、ask および chat call から throw されます。
ベストプラクティス
- 必要なものだけをスクリーニングしてください。 有効な agent はすべて、自身の model より先に prompt ごとに 1 回の classifier call を実行します。これにより各 turn に latency が追加され、app に請求される model spend が発生します。
entitiesを絞り込んでも call 自体はなくならないため、default ではなく意図的に有効化するものとして扱ってください。 - user に次に何をすべきか伝えてください。
PII_DETECTED_IN_PROMPTは一致した kind を示します。これを具体的なメッセージ(「credit card number を削除してください」)にする方が、一般的な失敗メッセージよりはるかに有用です。 - 境界を理解してください。 Prompt privacy は prompt を対象とします。connector result または knowledge base content を通じて model に到達する data はスクリーニングされないため、end-to-end の保証として user に説明しないでください。
- 共有 value 用の allow list を維持してください。 support address や public phone number は、通常の質問でも screen にかかる可能性があります。
- 両方向が重要な場合は outbound guardrail と組み合わせてください。 personal data を model に渡さないために
piiを有効化し、answer に含めないためにguardrails.disablePiiを有効化します。
Studio で Prompt Privacy を設定する
Squid Console を介して agent の prompt privacy を設定するには、次の手順に従います。
- 左 sidebar の Agent Studio tab に移動します
- 設定する agent を選択します
- Settings tab をクリックします
- Agent Guardrails の下にある Prompt Privacy section まで scroll します
- Reject prompts containing PII をオンにします。toggle をオンにすると、残りの option が表示されます
- Information to reject で、screening したくない kind を解除します。feature をオンにした時点ではすべて選択されています
- (任意)Custom PII rules field に 1 行につき 1 つの custom rule を追加します
allowList と classifierModel の設定には Studio control がありません。SDK または REST API を通じて設定してください。