Amazon Comprehend — deteksi PII
Comprehend menemukan entitas PII dalam teks beserta posisinya. Ia jadi lapisan pra-pemrosesan yang berdiri sendiri, di luar Bedrock.
Intisari
- Dua operasi:
DetectPiiEntities(posisi dan jenis) danContainsPiiEntities(ada atau tidak). - Mengembalikan offset karakter, sehingga kamu bisa menyensor tepat di tempatnya.
- Berdiri di luar Bedrock — bisa dipakai untuk log, tiket, dan berkas, bukan cuma prompt.
- Setiap temuan punya skor keyakinan; kamu yang menentukan ambangnya.
- Berlapis dengan Guardrails, bukan menggantikannya — defense in depth yang disebut Domain 3.
Kenapa perlu, padahal Guardrails sudah punya filter PII
| Guardrails | Comprehend | |
|---|---|---|
| Cakupan | Prompt dan respons Bedrock | Teks apa pun, di mana pun |
| Ditempatkan | Menempel pada pemanggilan model | Di mana saja dalam pipeline |
| Keluaran | Blok atau samarkan | Daftar entitas + posisi + skor |
| Cocok untuk | Pertahanan saat inferensi | Pembersihan sebelum ingest, pembersihan log, klasifikasi dokumen |
Contoh nyata: sebelum dokumen masuk knowledge base, kamu ingin tahu dokumen mana yang mengandung PII agar bisa diberi tag kerahasiaan. Guardrails tidak bisa melakukan itu — ia baru bekerja saat inferensi.
Mendeteksi
import boto3
comprehend = boto3.client("comprehend")
teks = "Hubungi Budi Santoso di [email protected] atau 0812-3456-7890."
resp = comprehend.detect_pii_entities(Text=teks, LanguageCode="en")
for e in resp["Entities"]:
print(f"{e['Type']:12} skor={e['Score']:.2f} '{teks[e['BeginOffset']:e['EndOffset']]}'")
NAME skor=0.99 'Budi Santoso'
EMAIL skor=1.00 '[email protected]'
PHONE skor=0.98 '0812-3456-7890'
Menyensor dengan benar
def sensor(teks: str, ambang: float = 0.8) -> str:
entitas = comprehend.detect_pii_entities(Text=teks, LanguageCode="en")["Entities"]
# WAJIB dari belakang ke depan: mengganti dari depan menggeser semua offset berikutnya
for e in sorted(entitas, key=lambda x: x["BeginOffset"], reverse=True):
if e["Score"] < ambang:
continue
teks = teks[:e["BeginOffset"]] + f"[{e['Type']}]" + teks[e["EndOffset"]:]
return teks
print(sensor(teks))
# Hubungi [NAME] di [EMAIL] atau [PHONE].
Urutan penggantian adalah bug klasik di sini. Kalau kamu mengganti dari entitas pertama ke terakhir, setiap penggantian menggeser offset entitas berikutnya, dan hasil sensornya memotong di tempat yang salah — kadang malah membiarkan sebagian PII terlihat. Selalu proses mundur.
Pemeriksaan murah lebih dulu
# Lebih murah kalau kamu cuma butuh tahu "ada PII atau tidak"
ada = comprehend.contains_pii_entities(Text=teks, LanguageCode="en")
label = {l["Name"] for l in ada["Labels"] if l["Score"] > 0.8}
if label:
dokumen_tag["kerahasiaan"] = "berisi-pii"
Di mana menempatkannya
| Titik | Tujuan |
|---|---|
| Sebelum ingest ke knowledge base | Menandai atau membersihkan dokumen ber-PII |
| Sebelum prompt dikirim | Mencegah data pribadi keluar dari sistemmu |
| Sebelum menulis log | Supaya CloudWatch Logs tidak jadi gudang PII |
| Sebelum menyimpan riwayat percakapan | Retensi jadi jauh lebih mudah dipertanggungjawabkan |
Baris ketiga sering terlewat. Aplikasi yang mencatat seluruh prompt dan respons untuk keperluan debugging sedang membangun basis data PII tanpa sadar — lengkap dengan retensi yang tidak pernah ditetapkan. Sensor dulu, baru catat.
Latihan: tambahkan fungsi sensor() ke jalur logging aplikasimu, lalu kirim satu
pertanyaan berisi nama dan nomor telepon. Periksa CloudWatch Logs dan pastikan yang tercatat sudah tersensor,
sementara jawaban ke pengguna tetap utuh.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.