Melindungi data pribadi di produk AI: data governance, GDPR dan EU AI Act, redaction PII, serta hak pengguna. Kalian membangun aplikasi AI yang patuh regulasi tanpa mengorbankan fungsionalitastype: text

Episode 18 dan 19 mengamankan sistem dari serangan dan kegagalan. Episode ini mengamankan manusia: data pribadi pengguna yang mengalir melalui produk AI kalian. Di era regulasi seperti GDPR dan EU AI Act, privasi bukan lagi nilai tambah — ia syarat untuk beroperasi.
Mengapa penting? Karena produk AI menangani data yang dulu tidak pernah disentuh aplikasi biasa: riwayat percakapan, dokumen pribadi, rekaman suara, hasil ekstraksi. Data ini mengalir ke penyedia LLM, tersimpan di database, dan masuk log observability. Tanpa disiplin privasi, satu kebocoran kecil = denda besar + kepercayaan yang hilang selamanya.
Prinsip pertama governance: kalau tidak perlu, jangan simpan. Sebelum menyimpan apa pun, tanyakan:
Jawaban itu menjadi data map — dokumen hidup yang menjadi dasar compliance dan security. Tanpa data map, kalian tidak tahu apa yang harus dilindungi dan dihapus saat pengguna minta.
{
"percakapan": {
"sensitive": true,
"retention_days": 365,
"encrypted": true,
"third_party": ["openai"], // dikirim ke penyedia LLM
"purpose": "melayani percakapan"
},
"log_observability": {
"sensitive": true,
"retention_days": 30,
"encrypted": true,
"pii_redacted": true
}
}Dua regulasi yang paling berdampak pada produk AI:
Note
Catatan penting: ini bukan nasihat hukum. Untuk produk komersial yang melayani Eropa atau sektor regulasi (kesehatan, keuangan), konsultasikan dengan legal/DPO. Tugas AI engineer adalah menyediakan mekanisme teknis yang dibutuhkan compliance: simpan metadata izin, dukung penghapusan, redaksi PII, dan log aktivitas.
Data pribadi (nama, email, NIK, nomor kartu) tidak boleh keluar ke penyedia LLM tanpa keperluan. Praktik standar: redaksi PII sebelum request, restorasi sesudahnya bila diperlukan.
import re
def redact_pii(text: str) -> str:
text = re.sub(r"\b[\w.+-]+@[\w-]+\.[\w.]+\b", "[EMAIL]", text)
text = re.sub(r"\b08[0-9]{8,12}\b", "[HP]", text) # nomor HP ID
text = re.sub(r"\b\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b", "[KARTU]", text)
return text
# Untuk skala besar: Presidio (Microsoft) mendeteksi PII via model
from presidio_analyzer import AnalyzerEngine
analyzer = AnalyzerEngine()
def redact_presidio(text: str) -> str:
hasil = analyzer.analyze(text=text, language="en")
# ganti tiap entity dengan [TIPE]
for e in sorted(hasil, key=lambda x: -x.start):
text = text[:e.start] + f"[{e.entity_type}]" + text[e.end:]
return textDua level: regex untuk pola jelas (murah, cepat), Presidio untuk deteksi kontekstual (lebih lengkap, lebih mahal). Terapkan sebelum data dikirim ke LLM.
Regulasi mewajibkan hak pengguna atas data mereka. Secara teknis ini berarti:
def delete_user(user_id: str) -> None:
# 1. database relasional
db.execute("DELETE FROM messages WHERE user_id = ?", (user_id,))
db.execute("DELETE FROM conversations WHERE user_id = ?", (user_id,))
# 2. vector DB (memori / dokumen pribadi)
mem_col.delete(where={"user": user_id})
kb_col.delete(where={"owner": user_id})
# 3. cache
cache.flush_user(user_id)
db.commit()Perhatikan: penghapusan harus menyeluruh — keliru satu penyimpanan berarti data "terhapus" tapi masih ada di tempat lain. Ini bug compliance yang serius.
Desain paling aman adalah tidak memiliki data yang tidak perlu:
def emit_without_pii(user_id: str, **fields):
emit_metric("qa.faithfulness", fields, {"user_pseudo": hash(user_id)})Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita membawa model ke infrastruktur sendiri: serving & deploying LLMs — vLLM, TGI, Ollama, llama.cpp, dan deploy model open-weight di produksi. Sampai jumpa di episode 21!