Bab 63 — Lisensi, Etika Data, dan Hukum: Aturan Main yang Sering Dilupakan
Seri A4 — AI Generatif dan Agent AI
Semua skrip bab ini ada di folder kode/bab63/. Di versi web, Anda juga bisa mengunduh semuanya sekaligus (zip).
Bayangkan Anda meminjam traktor tetangga. Ada yang bilang “pakai saja”, ada yang bilang “boleh, asal bensinnya diisi dan jangan disewakan”, ada yang bilang “boleh, tetapi hasil panennya dibagi”. Perangkat lunak, data, dan citra juga punya “syarat pinjam”: lisensi. Bab ini bukan bab pemrograman murni; ini bab tentang agar karya Anda tidak menimbulkan masalah bagi orang lain maupun bagi Anda.
Bab ini BUKAN nasihat hukum. Penulis bukan ahli hukum. Semua kutipan dan ringkasan di bawah dibaca dari sumber resmi pada 2026-10-10 (sumbernya disebut tiap kali); aturan dan syarat bisa berubah, dan penerapannya pada kasus Anda bergantung pada fakta. Untuk produk yang dijual, dibagikan, atau memuat data orang, tanyakan kepada konsultan hukum. Tabel dan kode di sini adalah alat belajar, bukan pengganti membaca teks lisensi dan undang-undang aslinya.

Lisensi perangkat lunak
Tanpa lisensi, kode orang lain tidak boleh Anda pakai, ubah, atau bagikan (hak cipta melekat otomatis pada penulisnya; lihat bagian hak cipta di bawah). Lisensi adalah izin tertulis dari pemilik, beserta syaratnya. Ada dua keluarga besar:
- Permisif (MIT, Apache-2.0, BSD): izinnya longgar; syaratnya terutama mencantumkan teks lisensi dan catatan hak cipta.
- Copyleft (GPL, AGPL): karya turunan yang Anda bagikan harus memakai lisensi yang sama dan sumber kodenya tersedia. “Copyleft” adalah permainan kata dari copyright.
Tabel di bawah mengutip situs choosealicense.com (dibaca 2026-10-10), yang menyusun ringkasan lisensi umum dalam tiga kolom: Permissions (izin), Conditions (syarat), Limitations (batasan). Teks lisensi resminya yang mengikat. Kami mempertahankan istilah Inggris aslinya agar Anda bisa mencocokkan dengan situsnya.
02_tabel_lisensi.py
# Bab 63 - Tabel lisensi perangkat lunak dan kewajiban gabungan proyek
# Sumber isi: https://choosealicense.com/licenses/ (halaman MIT, Apache-2.0, GPL-3.0, AGPL-3.0; dibaca 2026-10-10)
# Ini ringkasan belajar, BUKAN nasihat hukum. Teks lisensi resminya yang mengikat.
LISENSI = {
"MIT": {
"izin": ["Commercial use", "Distribution", "Modification", "Private use"],
"syarat": ["License and copyright notice"],
"batasan": ["Liability", "Warranty"],
},
"Apache-2.0": {
"izin": ["Commercial use", "Distribution", "Modification", "Patent use", "Private use"],
"syarat": ["License and copyright notice", "State changes"],
"batasan": ["Liability", "Trademark use", "Warranty"],
},
"GPL-3.0": {
"izin": ["Commercial use", "Distribution", "Modification", "Patent use", "Private use"],
"syarat": ["Disclose source", "License and copyright notice", "Same license", "State changes"],
"batasan": ["Liability", "Warranty"],
},
"AGPL-3.0": {
"izin": ["Commercial use", "Distribution", "Modification", "Patent use", "Private use"],
"syarat": ["Disclose source", "License and copyright notice", "Network use is distribution",
"Same license", "State changes"],
"batasan": ["Liability", "Warranty"],
},
}
PENJELASAN = {
"License and copyright notice": "sertakan teks lisensi dan catatan hak cipta",
"State changes": "tandai bila Anda mengubah berkasnya",
"Disclose source": "sumber kode harus tersedia bagi penerima",
"Same license": "karya turunan memakai lisensi yang sama",
"Network use is distribution": "melayani lewat jaringan dihitung sebagai mendistribusikan",
}
print(f"{'lisensi':<12} {'jumlah syarat':>13} syarat")
for nama, d in LISENSI.items():
print(f"{nama:<12} {len(d['syarat']):>13} {', '.join(d['syarat'])}")
proyek = ["MIT", "Apache-2.0", "MIT", "AGPL-3.0"]
gabungan = sorted({s for nama in proyek for s in LISENSI[nama]["syarat"]})
print("\nProyek memakai:", sorted(set(proyek)))
print("Kewajiban gabungan yang harus ditinjau:")
for s in gabungan:
print(f" - {s}: {PENJELASAN[s]}")
copyleft = [n for n in set(proyek) if "Same license" in LISENSI[n]["syarat"]]
print("\nLisensi dengan syarat 'Same license':", sorted(copyleft))
print("Artinya: tanyakan kepada ahli hukum sebelum menggabungkannya ke produk yang dibagikan atau dilayankan.")lisensi jumlah syarat syarat
MIT 1 License and copyright notice
Apache-2.0 2 License and copyright notice, State changes
GPL-3.0 4 Disclose source, License and copyright notice, Same license, State changes
AGPL-3.0 5 Disclose source, License and copyright notice, Network use is distribution, Same license, State changes
Proyek memakai: ['AGPL-3.0', 'Apache-2.0', 'MIT']
Kewajiban gabungan yang harus ditinjau:
- Disclose source: sumber kode harus tersedia bagi penerima
- License and copyright notice: sertakan teks lisensi dan catatan hak cipta
- Network use is distribution: melayani lewat jaringan dihitung sebagai mendistribusikan
- Same license: karya turunan memakai lisensi yang sama
- State changes: tandai bila Anda mengubah berkasnya
Lisensi dengan syarat 'Same license': ['AGPL-3.0']
Artinya: tanyakan kepada ahli hukum sebelum menggabungkannya ke produk yang dibagikan atau dilayankan.
Lihat kolom “jumlah syarat”: MIT hanya 1 (cantumkan lisensi dan hak cipta), Apache-2.0 2 (ditambah State changes, tandai bila Anda mengubah berkas), GPL-3.0 4 (ditambah Disclose source dan Same license), AGPL-3.0 5 (ditambah Network use is distribution). Menurut situs itu, MIT dan Apache-2.0 sama-sama memberi izin penggunaan komersial, distribusi, modifikasi, dan penggunaan pribadi; Apache-2.0 menambahkan izin paten (Patent use) dan batasan Trademark use. Seluruh lisensi ini membatasi pertanggungjawaban dan jaminan (Liability dan Warranty): perangkat lunaknya diberikan “apa adanya”.
Bagian bawah keluaran menghitung kewajiban gabungan dari sebuah proyek yang memakai MIT, Apache-2.0, dan AGPL-3.0: lima syarat harus ditinjau, dan AGPL membawa syarat Same license serta Network use is distribution. Maknanya, menurut halaman choosealicense, pada AGPL melayankan program lewat jaringan diperlakukan seperti membagikannya. Itu relevan bila Anda menyajikan agent atau asisten dari Bab 60 dan 62 sebagai layanan web dengan komponen berlisensi AGPL. Bagaimana tepatnya syarat itu berlaku pada kasus Anda adalah pertanyaan hukum.
Memeriksa lisensi paket yang terpasang
Proyek Python Anda bergantung pada puluhan paket. Pustaka standar importlib.metadata membaca metadata paket terpasang, termasuk lisensinya.
01_lisensi_paket.py
# Bab 63 - Memeriksa lisensi paket terpasang dengan importlib.metadata
from importlib import metadata
PAKET = ["numpy", "pandas", "geopandas", "scikit-learn", "torch", "transformers", "peft",
"langgraph", "mcp", "chromadb", "faiss-cpu", "matplotlib", "httpx"]
def baca_lisensi(nama):
"""Kembalikan (lisensi, dari_mana). Metadata paket bisa menyimpan lisensi di tiga tempat berbeda."""
m = metadata.metadata(nama)
ekspresi = m.get("License-Expression")
if ekspresi:
return ekspresi, "License-Expression"
teks = (m.get("License") or "").strip()
if teks and len(teks) <= 40 and "\n" not in teks:
return teks, "License"
klasifikasi = [c.split(" :: ")[-1] for c in m.get_all("Classifier", []) if c.startswith("License ::")]
if klasifikasi:
return klasifikasi[0], "Classifier"
return "(tidak jelas: baca berkas LICENSE)", "-"
def keluarga(lisensi):
kecil = lisensi.lower()
if "agpl" in kecil or "gpl" in kecil:
return "COPYLEFT: baca syaratnya"
return "permisif"
print(f"{'paket':<14} {'lisensi':<46} {'sumber metadata':<19} keluarga")
for nama in PAKET:
lisensi, dari = baca_lisensi(nama)
tampil = lisensi if len(lisensi) <= 44 else lisensi[:41] + "..."
print(f"{nama:<14} {tampil:<46} {dari:<19} {keluarga(lisensi)}")
# Peragaan penanda copyleft pada daftar buatan (bukan paket sungguhan)
print("\nPeragaan dengan daftar contoh:")
for nama, lisensi in [("pustaka-a", "MIT"), ("pustaka-b", "GPL-3.0-or-later"), ("pustaka-c", "AGPL-3.0-only")]:
print(f" {nama}: {lisensi:<18} -> {keluarga(lisensi)}")paket lisensi sumber metadata keluarga
numpy BSD-3-Clause AND 0BSD AND MIT AND Zlib AN... License-Expression permisif
pandas BSD License Classifier permisif
geopandas BSD-3-Clause License-Expression permisif
scikit-learn BSD-3-Clause License-Expression permisif
torch Apache-2.0 AND Apache-2.0 WITH LLVM-excep... License-Expression permisif
transformers Apache 2.0 License License permisif
peft Apache License permisif
langgraph MIT License-Expression permisif
mcp MIT License permisif
chromadb Apache Software License Classifier permisif
faiss-cpu MIT License-Expression permisif
matplotlib Python Software Foundation License Classifier permisif
httpx BSD-3-Clause License permisif
Peragaan dengan daftar contoh:
pustaka-a: MIT -> permisif
pustaka-b: GPL-3.0-or-later -> COPYLEFT: baca syaratnya
pustaka-c: AGPL-3.0-only -> COPYLEFT: baca syaratnya
Keluaran memperlihatkan hal yang sering mengejutkan: metadata lisensi tidak seragam. Beberapa paket (numpy, geopandas, langgraph) memakai bidang modern License-Expression yang berisi pengenal SPDX, misalnya BSD-3-Clause; numpy dan torch bahkan menuliskan beberapa lisensi sekaligus karena membawa komponen berlisensi berbeda. Paket lain (transformers, peft, mcp, httpx) menulis di bidang License dengan teks bebas (“Apache 2.0 License”, “Apache”). Sebagian (pandas, chromadb, matplotlib) hanya punya classifier seperti Python Software Foundation License. Karena itu fungsi baca_lisensi mencoba tiga tempat berurutan. Hasilnya hanya petunjuk awal: “Apache” saja tidak memberi tahu versi lisensinya, dan bidang metadata bisa saja keliru. Untuk keputusan serius baca berkas LICENSE di paketnya. Ketiga belas baris semuanya tergolong permisif menurut penyaring sederhana kita; peragaan di akhir menunjukkan bagaimana daftar contoh yang berisi GPL dan AGPL akan ditandai sebagai copyleft. Perhatikan juga: lisensi paket berbeda dari lisensi bobot model dan data yang dipakai paket itu.
Untuk proyek yang akan dibagikan, simpan daftar lisensi dependensi di repositori (dan perbarui bila menambah paket). Bila ada satu paket berlisensi copyleft, catat dan putuskan secara sadar, jangan menemukannya sesudah produk beredar.
Lisensi data dan citra
Data juga punya syarat, dan bentuknya beragam. Tiga contoh yang relevan bagi buku ini:
Citra Sentinel (Copernicus). Lisensi data Sentinel (Copernicus Sentinel data licence, rev. 1, dibaca di ads.atmosphere.copernicus.eu/licences/ec-sentinel pada 2026-10-10) menyatakan akses gratis, penuh, dan terbuka untuk data Sentinel, dengan penggunaan yang boleh meliputi reproduksi, distribusi, komunikasi ke publik, adaptasi, dan penggabungan dengan data lain, selama penggunaannya sah. Syaratnya: bila Anda mengomunikasikan atau mendistribusikannya, sebut sumbernya dengan kalimat “Copernicus Sentinel data [Tahun]”, dan bila datanya Anda ubah, “Contains modified Copernicus Sentinel data [Tahun]”. Datanya diberikan tanpa jaminan, dan pengguna melepaskan tuntutan ganti rugi kepada Uni Eropa dan penyedia data. Ada juga pembatasan akses yang dimungkinkan hukum UE dalam kasus langka (keamanan, hak pihak ketiga, risiko gangguan layanan).
Citra Landsat (USGS). Halaman akses data Landsat di usgs.gov (dibaca 2026-10-10) menyatakan produk Landsat di arsip USGS EROS tersedia gratis sejak 2008. Halaman itu tidak menyebut syarat sitasi atau pembatasan penggunaan, dan menyarankan membaca panduan masing-masing aplikasi. Karena halaman itu diam soal syarat, kami tidak menyimpulkan bahwa tidak ada syarat; baca kebijakan resmi USGS sebelum membagikan ulang. Itulah contoh status “belum jelas” yang akan muncul di proyek kita.
Data pemerintah Indonesia. Tata kelola data pemerintah diatur antara lain oleh Peraturan Presiden Nomor 39 Tahun 2019 tentang Satu Data Indonesia (ditetapkan 12 Juni 2019, Lembaran Negara 2019 Nomor 112; metadata di peraturan.bpk.go.id, dibaca 2026-10-10). Kami belum membaca pasal-pasalnya, jadi kami tidak menyebut apa pun tentang hak pakai data. Praktiknya: tiap portal atau instansi (misalnya portal data atau geoportal) memuat syarat penggunaan sendiri; baca di portal tempat Anda mengunduh, dan catat tanggal membacanya.
Kebiasaan yang sama untuk semua data: catat sumber, alamat, tanggal unduh, dan syarat; sebut sumber bila diwajibkan; jangan menganggap “ada di internet” berarti “bebas dipakai”. Di buku ini kita memakai data tiruan buatan sendiri karena alasan itu.
Privasi dan UU Pelindungan Data Pribadi
Sistem yang kita bangun (asisten, agent, catatan lapangan) mudah menyentuh data pribadi: nama penyuluh, nomor telepon, alamat peternak, bahkan koordinat rumah. Di Indonesia dasarnya adalah Undang-Undang Nomor 27 Tahun 2022 tentang Pelindungan Data Pribadi (“UU PDP”), ditetapkan 17 Oktober 2022 (sumber: peraturan.bpk.go.id/Details/229798; teks resmi salinan PDF di situs yang sama dibaca 2026-10-10; teks PDF dibaca lewat ekstraksi mesin sehingga kutipan di bawah merupakan parafrasa, bukan salinan kata demi kata). Beberapa ketentuan yang kami baca langsung:
| Ketentuan | Isi ringkas (parafrasa) |
|---|---|
| Pasal 1 angka 1 | Data Pribadi adalah data tentang orang perseorangan yang teridentifikasi atau dapat diidentifikasi, sendiri atau dikombinasikan dengan informasi lain, langsung atau tidak langsung, lewat sistem elektronik maupun nonelektronik |
| Pasal 2 ayat (2) | UU ini tidak berlaku bagi pemrosesan data pribadi oleh orang perseorangan dalam kegiatan pribadi atau rumah tangga |
| Pasal 4 ayat (1) dan (2) | Data Pribadi terdiri atas yang spesifik (antara lain data dan informasi kesehatan, biometrik, genetika, catatan kejahatan, dan data anak) dan yang umum |
| Pasal 20 ayat (1) dan (2) | Pengendali Data Pribadi wajib punya dasar pemrosesan, misalnya persetujuan sah yang eksplisit untuk tujuan tertentu, pemenuhan perjanjian, kewajiban hukum, kepentingan vital, tugas kepentingan umum atau pelayanan publik, atau kepentingan yang sah lainnya |
| Pasal 57 | Pelanggaran sejumlah pasal dikenai sanksi administratif: peringatan tertulis, penghentian sementara pemrosesan, penghapusan atau pemusnahan data, dan/atau denda administratif paling tinggi 2% dari pendapatan atau penerimaan tahunan terhadap variabel pelanggaran |
| Pasal 65 dan 67 | Melawan hukum memperoleh atau mengumpulkan data pribadi yang bukan miliknya untuk menguntungkan diri atau orang lain dilarang; pidananya (Pasal 67 ayat 1) penjara paling lama 5 tahun dan/atau denda paling banyak Rp5 miliar; mengungkapkan data pribadi yang bukan miliknya (ayat 2) penjara paling lama 4 tahun dan/atau denda paling banyak Rp4 miliar |
Perhatikan bahwa kami hanya mencantumkan pasal yang sudah dibaca. UU PDP memuat banyak ketentuan lain (hak subjek data, kewajiban pengendali dan prosesor, pemindahan data lintas negara, lembaga pelaksana) yang tidak kami tafsirkan di sini, dan ada peraturan pelaksana. Konsekuensi praktis yang masuk akal (pendapat penulis, bukan nasihat hukum): kumpulkan sedikit mungkin data pribadi; punya alasan sah untuk tiap data; samarkan atau hapus bila tidak perlu; amankan penyimpanannya; dan jangan mengirim data orang ke layanan LLM luar tanpa dasar yang jelas.
Skrip berikut menunjukkan teknik teknisnya pada data fiktif: mengenali pola data pribadi dengan ekspresi reguler (Bab 22) dan menyamarkannya, serta membuat pseudonim (kode tetap pengganti identitas).
03_data_pribadi.py
# Bab 63 - Mengenali dan menyamarkan data pribadi dalam teks (data FIKTIF)
import hashlib
import re
CATATAN = [
"Penyuluh Budi Santoso, NIK 3201010101010001, HP 081234567890, memeriksa kolam B.",
"Laporan dikirim ke siti.rahayu@contoh.test pada hari Senin.",
"Peternak Agus (+62 812-3456-7890) melaporkan sapi sakit di kandang 2.",
"Kolam C panen 720 kg tanpa kendala.",
]
POLA = {
"NIK": re.compile(r"\b\d{16}\b"),
"EMAIL": re.compile(r"\b[\w.+-]+@[\w-]+\.[\w.]+\b"),
"TELEPON": re.compile(r"(?:\+62\s?|0)8[\d\s-]{8,14}\d"),
}
def samarkan(teks):
temuan = []
for jenis, pola in POLA.items():
for _ in pola.findall(teks):
temuan.append(jenis)
teks = pola.sub(f"[{jenis}]", teks)
return teks, temuan
def pseudonim(nilai, garam="garam-contoh"):
"""Ganti identitas dengan kode tetap (hash bergaram): bisa dihitung ulang, tidak bisa dibaca langsung."""
return hashlib.sha256((garam + nilai).encode()).hexdigest()[:8]
total = 0
for baris in CATATAN:
bersih, temuan = samarkan(baris)
total += len(temuan)
print(f"{len(temuan)} temuan {temuan}\n -> {bersih}")
print("\nTotal data pribadi ditemukan:", total)
print("Pseudonim yang sama untuk orang yang sama:", pseudonim("Budi Santoso") == pseudonim("Budi Santoso"))
print("Pseudonim Budi:", pseudonim("Budi Santoso"), "| Siti:", pseudonim("Siti Rahayu"))
print("\nPola teks hanya menangkap bentuk yang kita duga. Nama orang, alamat rumah, dan koordinat rumah tidak tertangkap.")2 temuan ['NIK', 'TELEPON']
-> Penyuluh Budi Santoso, NIK [NIK], HP [TELEPON], memeriksa kolam B.
1 temuan ['EMAIL']
-> Laporan dikirim ke [EMAIL] pada hari Senin.
1 temuan ['TELEPON']
-> Peternak Agus ([TELEPON]) melaporkan sapi sakit di kandang 2.
0 temuan []
-> Kolam C panen 720 kg tanpa kendala.
Total data pribadi ditemukan: 4
Pseudonim yang sama untuk orang yang sama: True
Pseudonim Budi: eb7280e1 | Siti: d3f4c92b
Pola teks hanya menangkap bentuk yang kita duga. Nama orang, alamat rumah, dan koordinat rumah tidak tertangkap.
Empat data pribadi ditemukan dan disamarkan: sebuah NIK (pola 16 angka dalam contoh ini), dua nomor telepon (dengan awalan 08 dan +62 8...), dan satu email. Pola telepon awalnya tidak menangkap bentuk +62 812-... yang memakai spasi setelah +62; sesudah diperbaiki (\s?), keduanya tertangkap. Pelajarannya: uji pola dengan banyak bentuk. Pseudonim memakai hash SHA-256 bergaram: orang yang sama selalu mendapat kode yang sama (True), sehingga data masih bisa dianalisis per orang tanpa memperlihatkan namanya. Tetapi pseudonim bukan anonim: siapa pun yang memegang garam dan daftar nama bisa menghitung ulang. Baris terakhir keluaran memberi peringatan penting: pola teks tidak menangkap nama orang, alamat rumah, atau koordinat rumah. Menyamarkan data pribadi dengan benar butuh lebih dari sekadar regex.
Etika scraping
Scraping (mengambil data dari halaman web secara otomatis; lihat Bab 41) legal-tidaknya bergantung pada situs, jenis data, dan hukum yang berlaku; itu pertanyaan hukum, bukan teknis. Tetapi ada tata krama teknis yang jelas. File robots.txt adalah cara situs menyatakan bagian mana yang diminta tidak diambil oleh perayap. Menurut RFC 9309 (Robots Exclusion Protocol, September 2022, rfc-editor.org, dibaca 2026-10-10), aturan itu bukan mekanisme izin atau pengamanan, melainkan permintaan yang diharapkan dipatuhi perayap; untuk melindungi konten yang terlarang situs perlu memakai pengamanan sungguhan seperti autentikasi. Maka patuh pada robots.txt adalah etika dan itikad baik, bukan jaminan Anda bebas masalah; syarat layanan situs tetap harus dibaca.
04_etika_scraping.py
# Bab 63 - Etika scraping: membaca robots.txt dan menahan laju permintaan (tanpa internet)
from urllib.robotparser import RobotFileParser
# robots.txt karangan penulis untuk situs fiktif contoh.test
ROBOTS = """User-agent: *
Disallow: /admin/
Disallow: /data-pribadi/
Crawl-delay: 5
User-agent: bot-buruk
Disallow: /
"""
pembaca = RobotFileParser()
pembaca.parse(ROBOTS.splitlines())
AGEN = "bot-belajar-buku"
for jalur in ["/berita/panen-2026", "/admin/login", "/data-pribadi/penyuluh.csv"]:
boleh = pembaca.can_fetch(AGEN, "https://contoh.test" + jalur)
print(f"{jalur:<28} -> {'BOLEH' if boleh else 'DILARANG'} untuk {AGEN}")
print("bot-buruk ke /berita/ ->", "BOLEH" if pembaca.can_fetch("bot-buruk", "https://contoh.test/berita/") else "DILARANG")
print("Jeda yang diminta situs (detik):", pembaca.crawl_delay(AGEN))
class PenahanLaju:
"""Menjamin jarak minimal antar-permintaan. Jam di sini palsu agar keluaran tetap."""
def __init__(self, jeda):
self.jeda, self.terakhir, self.jam = jeda, None, 0.0
def tunggu(self):
if self.terakhir is not None and self.jam - self.terakhir < self.jeda:
self.jam = self.terakhir + self.jeda # menunggu secukupnya
self.terakhir = self.jam
return self.jam
penahan = PenahanLaju(pembaca.crawl_delay(AGEN))
print("\nWaktu (detik) 4 permintaan beruntun:", [penahan.tunggu() for _ in range(4)])
print("Tanpa penahan, 4 permintaan terjadi di detik 0 semuanya: situs kecil bisa kewalahan.")
print("\nIngat: robots.txt adalah tata krama teknis, BUKAN izin hukum. Syarat layanan situs tetap harus dibaca.")/berita/panen-2026 -> BOLEH untuk bot-belajar-buku
/admin/login -> DILARANG untuk bot-belajar-buku
/data-pribadi/penyuluh.csv -> DILARANG untuk bot-belajar-buku
bot-buruk ke /berita/ -> DILARANG
Jeda yang diminta situs (detik): 5
Waktu (detik) 4 permintaan beruntun: [0.0, 5.0, 10.0, 15.0]
Tanpa penahan, 4 permintaan terjadi di detik 0 semuanya: situs kecil bisa kewalahan.
Ingat: robots.txt adalah tata krama teknis, BUKAN izin hukum. Syarat layanan situs tetap harus dibaca.
Skrip memakai urllib.robotparser bawaan Python pada robots.txt karangan penulis (situs fiktif, tanpa internet). Agen bot-belajar-buku boleh membuka /berita/... tetapi dilarang ke /admin/ dan /data-pribadi/; agen bot-buruk dilarang ke mana pun. Situs meminta jeda 5 detik antar-permintaan (Crawl-delay; pustaka Python mendukungnya, tetapi tidak semua perayap memahaminya). Kelas PenahanLaju menjamin jeda itu: empat permintaan jatuh di detik 0, 5, 10, dan 15 (jamnya palsu agar keluaran tetap). Tanpa penahan, semuanya di detik 0 dan situs kecil bisa kewalahan. Kebiasaan baik lain: perkenalkan diri dengan User-Agent yang jelas, simpan hasil agar tidak mengunduh ulang, hindari data pribadi, dan lebih baik pakai API resmi bila ada.
Etika AI
Etika AI bukan daftar hafalan, tetapi kebiasaan bertanya. Pertanyaan yang layak diajukan pada setiap sistem di Seri A3 dan A4 (ini kerangka dari penulis, bukan standar resmi):
- Siapa yang bisa dirugikan bila sistem salah? Penyuluh yang menerima anjuran keliru, peternak yang kehilangan ternak karena peringatan dini terlewat, warga yang datanya bocor.
- Apakah ada manusia yang memeriksa keputusan penting? (Bab 62: persetujuan manusia untuk aksi menulis.)
- Apakah datanya adil? Model yang dilatih dari data satu wilayah bisa buruk di wilayah lain (Bab 58 membahas bias).
- Apakah pengguna tahu mereka berbicara dengan AI, dan dari mana jawabannya berasal? (Kutipan sumber di Bab 60.)
- Bagaimana jejak audit dan jalur keberatan? (Pencatatan panggilan di Bab 60.)
- Apakah ada alternatif yang lebih sederhana dan tidak berisiko?
Hak cipta dan keluaran AI
Di Indonesia, hak cipta diatur dalam Undang-Undang Nomor 28 Tahun 2014 tentang Hak Cipta (ditetapkan 16 Oktober 2014; peraturan.bpk.go.id/Details/38690; teks PDF-nya dibaca 2026-10-10). Pada Pasal 1, hak cipta didefinisikan sebagai hak eksklusif pencipta yang timbul secara otomatis berdasarkan prinsip deklaratif setelah ciptaan diwujudkan dalam bentuk nyata (angka 1); pencipta adalah seorang atau beberapa orang yang menghasilkan ciptaan yang bersifat khas dan pribadi (angka 2); dan ciptaan adalah hasil karya cipta di bidang ilmu pengetahuan, seni, dan sastra yang dihasilkan atas inspirasi, kemampuan, pikiran, imajinasi, kecekatan, keterampilan, atau keahlian (angka 3). Karena definisi pencipta menyebut “orang” dan “khas dan pribadi”, status hukum keluaran AI murni di Indonesia belum jelas bagi penulis: kami tidak menemukan atau mencari putusan atau peraturan Indonesia yang khusus menjawabnya, jadi hal itu belum diverifikasi. Tanyakan kepada ahli hukum.
Sebagai pembanding dari negara lain: laporan Kantor Hak Cipta Amerika Serikat, Copyright and Artificial Intelligence, Part 2: Copyrightability (Januari 2025, copyright.gov/ai, dibaca 2026-10-10), menyimpulkan bahwa hukum yang ada cukup untuk menjawab soal ini kasus per kasus; penggunaan AI sebagai alat bantu tidak menghilangkan perlindungan atas keluaran; hak cipta melindungi ekspresi orisinal yang dibuat penulis manusia meskipun karyanya memuat bagian buatan AI; sedangkan prompt saja, pada tahap sekarang, tidak cukup untuk menjadi kepenulisan atas keluaran. Itu hukum Amerika Serikat, bukan Indonesia, dan bukan nasihat bagi Anda.
Ada sisi lain: data latih dan keluaran yang menyalin. Model bisa menghasilkan teks atau gambar yang mirip karya yang ada. Kebiasaan aman: jangan menyajikan keluaran AI sebagai karya sendiri tanpa menyebut bahwa AI dipakai, periksa kemiripan dengan karya yang ada untuk hal penting, jangan memakai gambar buatan AI untuk menyerupai orang atau karya tertentu, dan baca syarat penyedia model soal kepemilikan dan penggunaan keluaran. Karena status lisensi gambar AI belum pasti, buku ini tidak memakai gambar buatan AI.
Proyek Bersambung A4: tinjauan lisensi dan etika data
Kita tutup proyek A4 dengan tinjauan menyeluruh: daftar sumber yang dipakai (atau mungkin dipakai) beserta syarat dan keputusan.
05_proyek_tinjauan.py
# Bab 63 - Proyek A4: tinjauan lisensi dan etika data untuk seluruh proyek
# Status tiap baris berasal dari pembacaan sumber resmi tanggal 2026-10-10 (lihat teks bab); bukan nasihat hukum.
SUMBER = [
{"nama": "Data inti fiktif (kolam, pohon, ternak)", "pemilik": "proyek", "syarat": "buatan penulis",
"wajib_atribusi": False, "bagikan_ulang": True, "pribadi": False},
{"nama": "Dokumen SOP fiktif (Bab 60)", "pemilik": "proyek", "syarat": "buatan penulis",
"wajib_atribusi": False, "bagikan_ulang": True, "pribadi": False},
{"nama": "Model uji acak buatan sendiri (Bab 61)", "pemilik": "proyek", "syarat": "dibuat dari konfigurasi",
"wajib_atribusi": False, "bagikan_ulang": True, "pribadi": False},
{"nama": "Citra Sentinel (Copernicus), bila dipakai", "pemilik": "Uni Eropa/ESA",
"syarat": "free, full and open; sebut sumber 'Copernicus Sentinel data [Tahun]'",
"wajib_atribusi": True, "bagikan_ulang": True, "pribadi": False},
{"nama": "Citra Landsat (USGS), bila dipakai", "pemilik": "USGS",
"syarat": "unduh gratis; halaman akses data tidak menyebut syarat sitasi",
"wajib_atribusi": None, "bagikan_ulang": None, "pribadi": False},
{"nama": "Model uji unduhan tiny-random-gpt2 (dihentikan)", "pemilik": "pihak luar",
"syarat": "halaman model tidak mencantumkan lisensi",
"wajib_atribusi": None, "bagikan_ulang": None, "pribadi": False},
{"nama": "Daftar kontak penyuluh (jika ada)", "pemilik": "orang-orang bersangkutan",
"syarat": "data pribadi: butuh dasar pemrosesan sah",
"wajib_atribusi": False, "bagikan_ulang": False, "pribadi": True},
]
def tinjau(s):
if s["pribadi"]:
return "TAHAN: butuh dasar pemrosesan dan penyamaran (lihat UU PDP, Pasal 20 ayat 2)"
if s["bagikan_ulang"] is None:
return "BELUM JELAS: periksa sumber resmi sebelum membagikan ulang"
if s["wajib_atribusi"]:
return "BOLEH, dengan menyebut sumber"
return "BOLEH"
hitung = {}
for s in SUMBER:
hasil = tinjau(s)
jenis = hasil.split(":")[0].split(",")[0]
hitung[jenis] = hitung.get(jenis, 0) + 1
print(f"- {s['nama']}\n {hasil}")
print("\nRingkasan:", hitung)
print("Keputusan proyek: sumber berstatus BELUM JELAS tidak dimasukkan ke berkas yang dibagikan.")- Data inti fiktif (kolam, pohon, ternak)
BOLEH
- Dokumen SOP fiktif (Bab 60)
BOLEH
- Model uji acak buatan sendiri (Bab 61)
BOLEH
- Citra Sentinel (Copernicus), bila dipakai
BOLEH, dengan menyebut sumber
- Citra Landsat (USGS), bila dipakai
BELUM JELAS: periksa sumber resmi sebelum membagikan ulang
- Model uji unduhan tiny-random-gpt2 (dihentikan)
BELUM JELAS: periksa sumber resmi sebelum membagikan ulang
- Daftar kontak penyuluh (jika ada)
TAHAN: butuh dasar pemrosesan dan penyamaran (lihat UU PDP, Pasal 20 ayat 2)
Ringkasan: {'BOLEH': 4, 'BELUM JELAS': 2, 'TAHAN': 1}
Keputusan proyek: sumber berstatus BELUM JELAS tidak dimasukkan ke berkas yang dibagikan.
Dari tujuh baris, empat boleh (tiga buatan sendiri, satu Sentinel dengan syarat menyebut sumber), dua belum jelas, dan satu ditahan. Dua yang belum jelas patut dicermati. Landsat: halaman akses datanya tidak menyebut syarat, dan “tidak disebut” tidak sama dengan “bebas”. Model uji unduhan tiny-random-gpt2: ini kejadian nyata pada penulisan Bab 61. Model itu sempat diunduh (454 KB), tetapi halaman modelnya tidak mencantumkan lisensi, sehingga dibuang dan diganti model buatan sendiri. Kebijakannya sederhana dan layak ditiru: sumber yang belum jelas tidak masuk ke berkas yang dibagikan sampai diperiksa. Satu baris ditahan karena memuat data pribadi: butuh dasar pemrosesan (UU PDP Pasal 20 ayat 2) dan penyamaran. Pada proyek Anda sendiri, jadikan tinjauan seperti ini bagian dari daftar periksa sebelum merilis.
Latihan
- Jalankan
01_lisensi_paket.pydan tambahkan dua paket lain yang Anda pakai ke daftarPAKET. Paket mana yang lisensinya tidak jelas dari metadata? Buka berkasLICENSE-nya. - Ubah
proyekdi02_tabel_lisensi.pyagar hanya berisi MIT dan Apache-2.0. Berapa syarat gabungannya? Apakah masih ada lisensi dengan syarat Same license? - Tambahkan pola untuk plat nomor kendaraan atau nomor rekening ke
03_data_pribadi.pydan uji dengan tiga bentuk penulisan. Berapa bentuk yang tertangkap? - Tantangan: buat daftar semua sumber data dan model yang akan Anda pakai di proyek akhir buku ini. Isi seperti
05_proyek_tinjauan.pydengan syarat dari sumber resmi (catat tanggal membaca), lalu putuskan mana yang boleh, belum jelas, dan ditahan.
Ringkasan Bab
- Lisensi menentukan apa yang boleh Anda lakukan. Permisif (MIT, Apache-2.0) menuntut sedikit; copyleft (GPL, AGPL) menuntut karya turunan memakai lisensi yang sama, dan AGPL menyamakan pelayanan lewat jaringan dengan distribusi. Teks resminya yang mengikat.
- Metadata lisensi paket tidak seragam;
importlib.metadatahanya memberi petunjuk awal. - Data punya syarat sendiri: Sentinel gratis dan terbuka dengan kewajiban menyebut sumber; Landsat gratis tetapi syarat sitasinya tidak dinyatakan di halaman yang kami baca; data pemerintah mengikuti syarat tiap portal.
- UU PDP (UU 27/2022): pasal yang kami baca meliputi definisi, jenis data, dasar pemrosesan, sanksi administratif, dan pidana. Kumpulkan seminimal mungkin, samarkan, dan punya dasar yang sah. Ini bukan nasihat hukum.
- Scraping: patuhi robots.txt dan tahan laju, tetapi ingat robots.txt bukan izin hukum.
- Etika AI: tanyakan siapa yang dirugikan, siapa yang memeriksa, dan apa sumbernya. Hak cipta keluaran AI di Indonesia belum kami verifikasi; AS punya laporan resmi sendiri.
- Sumber yang belum jelas tidak masuk ke berkas yang dibagikan.
Penutup Seri A4
Selamat! Anda telah menamatkan Seri A4: AI Generatif dan Agent AI. Anda sekarang bisa membangun asisten tanya-jawab dokumen dengan RAG, embedding, dan penyimpanan vektor (Bab 60); memahami isi mesin bahasa: attention, token, VRAM, LoRA, dan kuantisasi (Bab 61); membuat agent yang memakai alat, termasuk server MCP, graf LangGraph, dan alat GIS dengan pagar keamanan (Bab 62); serta meninjau lisensi, data pribadi, dan etika sebelum membagikan karya (Bab 63). Semua itu Anda jalankan sungguhan di komputer sendiri, dengan keterbatasan yang dinyatakan terus terang: model bahasa tiruan, model uji kecil, dan data fiktif.
Semua sistem sudah berjalan. Seri A5 memahami Python sampai ke dalam dan menyiapkan langkah karier: bagaimana Python bekerja di balik layar, cara mempercepatnya, cara memproses data besar dengan banyak pekerja, dan cara menyusun portofolio.
Selanjutnya, di Bab 64: metaprogramming, yaitu descriptor, metaclass, __init_subclass__, introspeksi, dan AST.