← Semua pembelajaran / AWS untuk AI Engineer
Fase 6 · Safety, Security & Governance

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) dan ContainsPiiEntities (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

GuardrailsComprehend
CakupanPrompt dan respons BedrockTeks apa pun, di mana pun
DitempatkanMenempel pada pemanggilan modelDi mana saja dalam pipeline
KeluaranBlok atau samarkanDaftar entitas + posisi + skor
Cocok untukPertahanan saat inferensiPembersihan 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

TitikTujuan
Sebelum ingest ke knowledge baseMenandai atau membersihkan dokumen ber-PII
Sebelum prompt dikirimMencegah data pribadi keluar dari sistemmu
Sebelum menulis logSupaya CloudWatch Logs tidak jadi gudang PII
Sebelum menyimpan riwayat percakapanRetensi 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.