Panduan API Penyensoran PII (2026): Perbandingan AWS, Google Cloud, Azure, dan Presidio untuk Aplikasi LLM
API penyensoran PII menerima teks, menemukan data pribadi seperti nama, email, nomor telepon, nomor kartu, dan nomor identitas resmi, lalu mengembalikan lokasi data tersebut atau salinan teks yang datanya telah disamarkan, diganti, atau ditokenisasi. Bagi tim produk AI, fungsi utamanya adalah menghapus atau melakukan pseudonimisasi data pribadi sebelum prompt, dokumen, dan log dikirim ke LLM pihak ketiga. Empat opsi yang paling sering dievaluasi adalah Amazon Comprehend DetectPiiEntities, Google Cloud Sensitive Data Protection (sebelumnya Cloud DLP), deteksi PII Azure Language, dan Microsoft Presidio yang bersifat sumber terbuka.
Panduan ini membandingkan endpoint, autentikasi, dukungan bahasa, satuan harga, dan format keluaran, disertai contoh yang dapat dijalankan menggunakan data sintetis. Panduan ini juga menyajikan hasil deteksi nyata dari pengujian Presidio lokal, termasuk data yang terlewat dan positif palsu yang perlu Anda antisipasi. Semua detail penyedia telah diperiksa berdasarkan dokumentasi resmi pada 27 Oktober 2026.
Flatkey tidak menyediakan API penyensoran PII bawaan. Pola di bawah ini dijalankan di layanan Anda sendiri sebelum permintaan dikirim melalui gateway model apa pun, termasuk Flatkey. Untuk aspek kebijakan dari masalah yang sama, baca panduan kebijakan penyensoran API AI kami.
Penyensoran, masking, deteksi entitas, dan tokenisasi: apa bedanya?
| Teknik | Hasil yang dikembalikan | Dapat dipulihkan? | Penggunaan umum |
|---|---|---|---|
| Deteksi entitas | Jenis entitas, skor keyakinan, dan offset karakter | Tidak berlaku (teks tidak diubah) | Menentukan tindakan untuk setiap entitas; mengaudit data yang mengalir |
| Penyensoran | Teks dengan PII yang dihapus atau diganti dengan label seperti [PERSON_1] |
Tidak | Prompt ke LLM eksternal, log, analitik |
| Masking | Teks dengan karakter yang disembunyikan, seperti ***********1111 |
Tidak | Tampilan dukungan pelanggan yang memerlukan sebagian nilai |
| Tokenisasi / pseudonimisasi | Teks dengan PII yang diganti dengan token konsisten atau nilai terenkripsi | Ya, dengan kunci atau tabel pemetaan | Alur kerja LLM yang harus mengembalikan nilai asli ke dalam jawaban |
| Penyensoran tingkat field | Field yang sudah diketahui (seperti email dalam JSON) dihapus atau diganti berdasarkan skema |
Tergantung | Payload terstruktur yang field berisi PII-nya sudah diketahui |
Untuk data terstruktur, aturan tingkat field lebih cepat dan lebih andal daripada model apa pun. Gunakan API deteksi PII untuk teks bebas: pesan chat, tiket dukungan, transkrip, dan dokumen.
Perbandingan API penyensoran PII (Oktober 2026)
| Amazon Comprehend | Google Sensitive Data Protection | Azure Language PII | Microsoft Presidio | |
|---|---|---|---|---|
| Jenis | API terkelola | API terkelola | API terkelola (juga tersedia dalam container) | Sumber terbuka, dihosting sendiri |
| Pemanggilan utama | DetectPiiEntities |
projects.content.deidentify |
analyze-text dengan PiiEntityRecognition |
AnalyzerEngine + AnonymizerEngine |
| Langsung mengembalikan teks yang telah disensor | Tidak, mengembalikan offset (gunakan offset untuk menyensor) | Ya | Ya (redactedText) |
Ya |
| Tokenisasi yang dapat dipulihkan | Tidak | Ya (transformasi berbasis kriptografi) | Tidak | Ya (operator encrypt / decrypt) |
| Dukungan bahasa untuk PII | Inggris dan Spanyol | Banyak infoTypes, sebagian khusus negara tertentu | Beberapa bahasa sesuai dokumentasi | Tergantung model NLP yang Anda muat |
| Batas input / satuan | 100 KB per permintaan; ditagih per 100 karakter, minimum 3 unit | Ditagih per GiB; minimum 1 KB per permintaan | Ditagih per rekaman teks | Sumber daya komputasi Anda |
| Kuota gratis | 50K unit (5M karakter) per API per bulan selama 12 bulan | 1 GiB pertama per bulan untuk inspeksi | 5,000 rekaman teks per bulan (paket gratis) | Perangkat lunak gratis |
| Data keluar dari jaringan Anda | Ya (AWS) | Ya (Google Cloud) | Ya, kecuali Anda menjalankan container | Tidak |
Sumber: Dokumentasi PII Amazon Comprehend, harga Comprehend, dokumentasi deidentifikasi Google, harga Sensitive Data Protection, gambaran umum Azure PII, harga Azure Language, dan dokumentasi Presidio, semuanya diperiksa pada 27 Oktober 2026.
Berapa biayanya?
- Amazon Comprehend: Dalam contoh Detect PII dari AWS, 10,000 komentar pelanggan yang masing-masing berisi 550 karakter dihitung sebagai 6 unit per permintaan, sehingga 60,000 unit dengan tarif $0.0001 per unit dikenai biaya $6 (harga Comprehend, contoh 7). Permintaan pendek ditagih dengan minimum 3 unit (300 karakter), jadi menggabungkan pesan-pesan kecil dalam satu batch dapat menghemat biaya.
- Google Sensitive Data Protection: inspeksi konten gratis untuk 1 GiB pertama per bulan, lalu $3.00 per GiB, turun menjadi $2.00 per GiB untuk volume yang lebih tinggi; tarif transformasi tercantum sebesar $2.00 per GiB, lalu $1.00. Setiap permintaan ditagih minimum 1 KB.
- Azure Language: deteksi PII ditagih per rekaman teks, dengan 5,000 rekaman teks gratis per bulan pada paket gratis. Tarif paket berbayar tercantum di halaman harga Azure untuk wilayah Anda.
- Presidio: tanpa biaya lisensi; Anda membayar sumber daya komputasi untuk menjalankan penganalisis dan model NLP.
Amazon Comprehend: DetectPiiEntities
Comprehend mendeteksi PII dalam teks berbahasa Inggris atau Spanyol. DetectPiiEntities mengembalikan Type, Score, BeginOffset, dan EndOffset untuk setiap entitas; input maksimum adalah 100 KB teks UTF-8 (referensi API). API ini tidak mengembalikan teks yang telah disensor, jadi Anda harus mengganti sendiri bagian teks yang terdeteksi.
import boto3
comprehend = boto3.client("comprehend", region_name="us-east-1")
text = "Hi, I'm Dana Whitfield. Email dana.whitfield@example.com or call 212-555-0187."
resp = comprehend.detect_pii_entities(Text=text, LanguageCode="en")
# Replace from the end so earlier offsets stay valid
redacted = text
for e in sorted(resp["Entities"], key=lambda e: e["BeginOffset"], reverse=True):
if e["Score"] >= 0.5:
redacted = redacted[:e["BeginOffset"]] + f"[{e['Type']}]" + redacted[e["EndOffset"]:]
print(redacted)
Autentikasi menggunakan kredensial AWS standar (peran IAM, SSO, atau kunci akses) dengan izin comprehend:DetectPiiEntities.
Google Cloud Sensitive Data Protection: content.deidentify
API Google melakukan inspeksi dan transformasi dalam satu pemanggilan. Anda memilih infoTypes (seperti EMAIL_ADDRESS dan PHONE_NUMBER) serta transformasinya: replaceWithInfoTypeConfig, redactConfig, characterMaskConfig, atau pseudonimisasi berbasis kriptografi (dokumentasi deidentifikasi).
curl -X POST \
"https://dlp.googleapis.com/v2/projects/$PROJECT_ID/content:deidentify" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"item": {"value": "Email dana.whitfield@example.com or call 212-555-0187."},
"inspectConfig": {
"infoTypes": [{"name": "EMAIL_ADDRESS"}, {"name": "PHONE_NUMBER"}, {"name": "PERSON_NAME"}]
},
"deidentifyConfig": {
"infoTypeTransformations": {
"transformations": [{"primitiveTransformation": {"replaceWithInfoTypeConfig": {}}}]
}
}
}'
item.value dalam respons berisi teks seperti Email [EMAIL_ADDRESS] or call [PHONE_NUMBER]. Google menyarankan agar Anda hanya mencantumkan infoTypes yang dibutuhkan, karena pemindaian dengan kumpulan default menambah latensi.
Azure Language: pengenalan entitas PII
Endpoint analyze-text Azure mengembalikan entitas sekaligus field redactedText. Parameter redactionPolicies mengontrol keluaran, misalnya entityMask untuk label atau characterMask untuk tanda bintang (referensi REST).
curl -X POST "$AZURE_LANGUAGE_ENDPOINT/language/:analyze-text?api-version=2026-05-01" \
-H "Ocp-Apim-Subscription-Key: $AZURE_LANGUAGE_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "PiiEntityRecognition",
"parameters": {"redactionPolicies": [{"policyKind": "entityMask"}]},
"analysisInput": {"documents": [
{"id": "1", "language": "en", "text": "My name is John Doe My phone number is 424 878 9192"}
]}
}'
Contoh respons dalam dokumentasi Microsoft mengembalikan "redactedText": "My name is [PERSON_1] My phone number is [PHONENUMBER_1]", beserta kategori, offset, panjang, dan skor keyakinan setiap entitas. Azure juga mendukung deteksi PII untuk percakapan dan dokumen, serta menyediakan container untuk menjalankan model di lingkungan Anda sendiri.
Versi Node.js
const res = await fetch(
`${process.env.AZURE_LANGUAGE_ENDPOINT}/language/:analyze-text?api-version=2026-05-01`,
{
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": process.env.AZURE_LANGUAGE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
kind: "PiiEntityRecognition",
parameters: { redactionPolicies: [{ policyKind: "entityMask" }] },
analysisInput: {
documents: [{ id: "1", language: "en", text: "Call Dana at 212-555-0187." }],
},
}),
}
);
const data = await res.json();
console.log(data.results.documents[0].redactedText);
Microsoft Presidio: penyensoran PII sumber terbuka
Presidio berjalan sepenuhnya di infrastruktur Anda sendiri. Penganalisisnya menggabungkan pengenalan entitas bernama berbasis NLP, ekspresi reguler, checksum, dan kata-kata kontekstual; penganonimnya menerapkan operator seperti replace, mask, redact, hash, dan encrypt. Dokumentasinya secara tegas menyatakan bahwa deteksi otomatis tidak dapat menjamin semua data sensitif ditemukan, jadi siapkan perlindungan tambahan.
Kami memasang Presidio (analyzer 2.2.365 dengan model en_core_web_lg dari spaCy) dan menjalankannya pada kalimat sintetis berikut:
Hai, saya Dana Whitfield. Kirim email ke dana.whitfield@example.com atau telepon 212-555-0187. Kartu 4111 1111 1111 1111, SSN 078-05-1120. Pesanan #A-77231 dikirim ke 42 Elm Street.
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
from presidio_anonymizer.entities import OperatorConfig
text = ("Hi, I'm Dana Whitfield. Email dana.whitfield@example.com or call 212-555-0187. "
"Card 4111 1111 1111 1111, SSN 078-05-1120. Order #A-77231 ships to 42 Elm Street.")
results = AnalyzerEngine().analyze(text=text, language="en")
for r in sorted(results, key=lambda r: r.start):
print(r.entity_type, repr(text[r.start:r.end]), round(r.score, 2))
out = AnonymizerEngine().anonymize(
text=text,
analyzer_results=results,
operators={
"DEFAULT": OperatorConfig("replace", {"new_value": "<REDACTED>"}),
"PERSON": OperatorConfig("replace", {"new_value": "<PERSON>"}),
"EMAIL_ADDRESS": OperatorConfig("replace", {"new_value": "<EMAIL>"}),
"CREDIT_CARD": OperatorConfig("mask", {"masking_char": "*", "chars_to_mask": 15, "from_end": False}),
},
)
print(out.text)
Apa yang terdeteksi dan apa yang terlewat
| Teks | Terdeteksi sebagai | Skor | Penilaian |
|---|---|---|---|
| Dana Whitfield | PERSON | 0.85 | Benar |
| dana.whitfield@example.com | EMAIL_ADDRESS | 1.0 | Benar |
| example.com (di dalam email) | URL | 0.5 | Positif palsu, tumpang tindih dengan email |
| 212-555-0187 | PHONE_NUMBER | 0.4 | Benar, tetapi tingkat keyakinannya rendah |
| 4111 1111 1111 1111 | CREDIT_CARD | 1.0 | Benar (checksum tervalidasi) |
| 078-05-1120 | PHONE_NUMBER | 0.4 | Salah jenis: ini adalah contoh SSN tidak valid yang dikenal luas, sehingga pengenal SSN menolaknya |
| Elm Street | LOCATION | 0.85 | Sebagian benar; nomor rumah "42" tetap tertinggal dalam teks |
| A-77231 (ID pesanan) | tidak terdeteksi | Tidak berlaku | Terlewat: pengenal bisnis memerlukan aturan khusus |
Tiga pelajaran dari pengujian kecil ini:
- Ambang batas menentukan kompromi antara data yang terlewat dan deteksi yang tidak relevan. Saat kami menjalankan ulang dengan
score_threshold=0.5, nomor telepon (skor 0.4) tidak disertakan dalam hasil deteksi dan tetap tidak tersensor. Sesuaikan ambang batas per jenis entitas, bukan secara global. - Pengenal internal Anda memerlukan pengenal khusus. Penambahan
PatternRecognizeruntuk\bA-\d{5}\bdengan skor 0.6 berhasil mendeteksi ID pesanan. Nilai berformat SSN yang realistis (536-90-4399) terdeteksi sebagaiUS_SSNdengan skor 0.85. - Tokenisasi yang dapat dipulihkan berfungsi. Penggunaan operator
encryptdengan kunci 128-bit sertaDeanonymizeEnginedengandecryptmemulihkan teks asli secara persis.
Alur penyensoran PII untuk aplikasi LLM
Pola umum untuk produk AI adalah menyensor, memanggil model, lalu memulihkan nilai yang perlu dilihat pengguna:
- Terapkan aturan field terlebih dahulu. Hapus atau ganti field PII yang sudah diketahui dari payload terstruktur berdasarkan skema.
- Deteksi dalam teks bebas. Jalankan API PII atau Presidio pada pesan, tiket, dan dokumen.
- Lakukan pseudonimisasi secara konsisten. Ganti setiap entitas dengan placeholder yang konsisten (
<PERSON_1>) dan simpan pemetaannya di layanan Anda, jangan pernah di dalam prompt. - Panggil LLM dengan teks yang telah disensor.
- Pulihkan placeholder dalam keluaran model hanya jika pengguna diizinkan melihat nilai aslinya.
- Catat versi yang telah disensor dan jumlah entitas ke log, bukan versi aslinya.
import os, re
from openai import OpenAI
from presidio_analyzer import AnalyzerEngine
analyzer = AnalyzerEngine()
client = OpenAI(api_key=os.environ["FLATKEY_API_KEY"], base_url="https://router.flatkey.ai/v1")
def non_overlapping(results, min_score=0.35):
kept = []
# prefer higher scores, then longer spans; drop anything overlapping a kept span
for r in sorted(results, key=lambda r: (-r.score, -(r.end - r.start))):
if r.score >= min_score and all(r.end <= k.start or r.start >= k.end for k in kept):
kept.append(r)
return sorted(kept, key=lambda r: r.start, reverse=True)
def pseudonymize(text):
mapping, counters = {}, {}
for r in non_overlapping(analyzer.analyze(text=text, language="en")):
counters[r.entity_type] = counters.get(r.entity_type, 0) + 1
token = f"<{r.entity_type}_{counters[r.entity_type]}>"
mapping[token] = text[r.start:r.end]
text = text[:r.start] + token + text[r.end:]
return text, mapping
ticket = "Customer Dana Whitfield (dana.whitfield@example.com) says order A-77231 never arrived."
safe, mapping = pseudonymize(ticket)
reply = client.chat.completions.create(
model="claude-haiku-5-5",
messages=[{"role": "user", "content": f"Draft a short apology email for this ticket:\n{safe}"}],
).choices[0].message.content
for token, value in mapping.items(): # restore only on your side
reply = reply.replace(token, value)
print(reply)
Langkah non_overlapping penting: tanpanya, URL yang terdeteksi di dalam alamat email akan merusak hasil penggantian. Dengan langkah ini, tiket pengujian kami menjadi Customer <PERSON_1> (<EMAIL_ADDRESS_1>) says order A-77231 never arrived. ID pesanan masih lolos, sehingga pengenal khusus dari bagian sebelumnya perlu diterapkan di lingkungan produksi. Penganonim bawaan Presidio menangani tumpang tindih ini untuk Anda.
Penanganan kegagalan dan pengujian
| Risiko | Mitigasi |
|---|---|
| Timeout atau error 5xx pada API PII | Blokir pengiriman saat terjadi kegagalan: jangan kirim teks yang belum disensor ke LLM; masukkan ke antrean dan coba lagi |
| Deteksi dengan tingkat keyakinan rendah | Ambang batas per entitas; tinjau sampel setiap minggu |
| Bahasa tidak didukung | Deteksi bahasa terlebih dahulu; PII AWS Comprehend hanya mendukung bahasa Inggris dan Spanyol |
| Pengenal bisnis (ID pesanan, nomor akun) | Pengenal regex khusus atau aturan field |
| Positif palsu yang merusak makna | Daftar pengecualian untuk nama produk dan alamat publik |
| PII dalam keluaran model | Jalankan deteksi pada respons sebelum mencatatnya ke log atau menampilkannya kepada pengguna lain |
| Log berisi data asli | Catat hanya teks yang telah disensor dan jumlah entitas |
Buat kumpulan pengujian berlabel berisi pesan sintetis yang menyerupai lalu lintas nyata Anda, termasuk nama dari berbagai budaya, format telepon internasional, dan format ID internal Anda. Ukur recall per jenis entitas sebelum peluncuran dan setelah setiap perubahan aturan.
Memilih API penyensoran PII
- Sudah menggunakan AWS dan teks berbahasa Inggris atau Spanyol: Amazon Comprehend sederhana dan murah untuk volume kecil.
- Membutuhkan tokenisasi yang dapat dipulihkan sebagai layanan terkelola, atau banyak pengenal khusus negara tertentu: Google Sensitive Data Protection.
- Membutuhkan teks yang telah disensor secara langsung, PII dalam percakapan atau dokumen, atau container di infrastruktur lokal: Azure Language PII.
- Data tidak boleh keluar dari jaringan Anda, atau Anda memerlukan kendali penuh atas aturan: Presidio, dengan pengenal khusus dan evaluasi Anda sendiri.
Banyak tim menggabungkannya: Presidio atau aturan field di jalur pemrosesan utama, dan API terkelola untuk pemindaian dokumen secara batch.
Penerapannya bersama Flatkey
Flatkey adalah gateway model: satu kunci dan endpoint yang kompatibel dengan OpenAI untuk banyak LLM. Flatkey tidak mendeteksi atau menyensor PII untuk Anda, jadi jalankan penyensoran di aplikasi Anda sebelum permintaan keluar dari layanan, seperti pada alur di atas. Dokumentasi enterprise Flatkey menjelaskan kebijakan tanpa retensi konten permintaan, yang mengurangi paparan tetapi tidak menggantikan penyensoran. Bacaan terkait: kebijakan penyensoran API AI, pengelolaan kunci API yang aman, pelacakan biaya LLM, dan katalog model Flatkey.
FAQ
Apa itu API penyensoran PII?
API ini mendeteksi data pribadi dalam teks, seperti nama, email, nomor telepon, dan nomor identitas, lalu mengembalikan lokasi data tersebut atau versi teks yang datanya telah dihapus, disamarkan, atau diganti.
Apa API penyensoran PII terbaik?
Tergantung stack dan data Anda. Amazon Comprehend cocok untuk teks berbahasa Inggris dan Spanyol di AWS, Google Sensitive Data Protection paling unggul untuk tokenisasi yang dapat dipulihkan dan banyak infoTypes, Azure langsung mengembalikan teks yang telah disensor dan dapat berjalan dalam container, sedangkan Presidio paling cocok jika data harus tetap berada di jaringan Anda.
Apakah ada API penyensoran PII gratis?
Presidio adalah perangkat lunak sumber terbuka yang gratis. Layanan terkelola memiliki kuota gratis: AWS Comprehend mencakup 50K unit (5M karakter) per API per bulan selama 12 bulan, 1 GiB pertama inspeksi Google per bulan gratis, dan paket gratis Azure mencakup 5,000 rekaman teks per bulan.
Haruskah saya menyensor PII sebelum mengirim prompt ke ChatGPT, Claude, atau API LLM lainnya?
Ya, jika model tidak membutuhkan nilai aslinya. Lakukan pseudonimisasi nama, detail kontak, dan ID, kirim placeholder ke model, lalu pulihkan nilainya di layanan Anda sendiri jika pengguna membutuhkannya.
Bisakah PII yang telah disensor dipulihkan?
Penyensoran sederhana dan masking tidak dapat dipulihkan. Tokenisasi atau pseudonimisasi berbasis enkripsi dapat dipulihkan dengan kunci atau tabel pemetaan, yang harus Anda simpan dengan aman dan terpisah dari data yang telah disensor.
Seberapa akurat API deteksi PII?
Tidak ada yang sempurna. Dalam pengujian Presidio kami, sebuah nomor telepon hanya mendapat skor 0.4 dan sebuah ID pesanan terlewat hingga kami menambahkan aturan khusus. Ukur recall menggunakan data sintetis Anda sendiri dan blokir pengiriman saat detektor mengalami error.
Apakah Flatkey menyensor PII?
Tidak. Flatkey meneruskan permintaan ke model; penyensoran harus dilakukan di aplikasi Anda sebelum permintaan dikirim.


