Penggunaan Large Language Models (LLM) untuk pembuatan kode sering kali menghasilkan AI slop: boilerplate berlebihan, pemanggilan API yang tidak eksis, dan referensi dependensi fiktif (phantom packages). Tanpa filter otomatis, kode halusinatif ini lolos ke repositori utama dan menimbulkan risiko keamanan rantai pasok (supply chain attack) serta degradasi performa.
Solusi deterministik untuk masalah ini adalah menerapkan CI guardrail untuk kode AI menggunakan Abstract Syntax Tree (AST) linting dan analisis statis langsung pada pipeline integrasi berkelanjutan (CI/CD).
Anatomi Masalah: AI Slop dan Kode Halusinatif
LLM bekerja berdasarkan probabilitas token berikutnya, bukan pemahaman semantik dari sistem dependensi proyek Anda. Kesalahan paling umum mencakup:
- Phantom Dependencies: Mengimpor library yang terdengar kredibel tetapi tidak pernah didaftarkan pada
package.jsonataurequirements.txt. Penyerang dapat mendaftarkan nama paket fiktif ini di registry publik untuk menyuntikkan malware. - Halusinasi Metode SDK: Memanggil fungsi yang tidak ada pada client library resmi, seperti mengasumsikan method
client.user.get_or_create()pada SDK yang hanya menyediakanclient.users.create(). - Dead Code dan Over-defensive Logic: Pengecekan
nullbertingkat pada variabel yang secara deterministik sudah dijamin tidak bernilainulloleh schema runtime.
Implementasi AST Guardrail Menggunakan Semgrep
Pencarian berbasis RegEx sering gagal karena rentan terhadap false positive akibat pemformatan string dan komentar. Analisis berbasis AST memetakan kode menjadi struktur pohon logika, memungkinkan evaluasi semantik yang akurat.
Berikut adalah konfigurasi custom rules Semgrep (.semgrep/ai-guardrails.yml) untuk menangkap halusinasi API boundary dan pemanggilan method ilegal:
rules:
- id: detect-hallucinated-s3-method
patterns:
- pattern: $S3.upload_file_sync(...)
message: "Deteksi method halusinasi: Boto3 S3 tidak memiliki upload_file_sync. Gunakan upload_file atau upload_fileobj."
languages: [python]
severity: ERROR
- id: prevent-phantom-import-boundary
patterns:
- pattern: import $PKG
- metavariable-regex:
metavariable: $PKG
regex: ^(fastapi_utils|crypto_helpers|jwt_verifier)$
message: "Paket '$PKG' terdeteksi sebagai kandidat phantom dependency. Pastikan dependensi terdaftar di requirements.txt dan lockfile."
languages: [python]
severity: WARNINGValidasi Dependensi dan Rasio Dead Code
Untuk mendeteksi phantom packages pada ekosistem Node.js/TypeScript secara otomatis, gunakan depcheck atau integrasikan pemeriksaan lockfile ketat. Tool ini membandingkan AST dari seluruh import statement terhadap deklarasi manifes paket.
Jalankan perintah berikut untuk mengecek inkonsistensi dependensi tanpa mengeksekusi kode:
npx depcheck --ignores="eslint*,@types*" --skip-missing=falseJika AI menghasilkan pustaka fiktif yang lolos import lokal melalui symlink atau global scope, pengecekan ini akan menghasilkan exit code non-zero dan menghentikan pipeline.
Untuk mengukur dan membatasi akumulasi dead code (slop), integrasikan tool analisis cakupan mati seperti knip (untuk JavaScript/TypeScript) atau vulture (untuk Python):
vulture src/ --min-confidence 80 --exclude "tests/*"Konfigurasi GitHub Actions Pipeline
Berikut adalah template alur kerja GitHub Actions minimalis yang menyatukan verifikasi AST, audit dependensi, dan boundary checking:
name: AI Code Guardrails
on:
pull_request:
branches: [main, master]
jobs:
guardrail-check:
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
- name: Setup Python Environment
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Run Semgrep AST Rules
run: |
pip install semgrep
semgrep ci --config=.semgrep/ai-guardrails.yml --error
- name: Detect Unused and Phantom Code (Python)
run: |
pip install vulture
vulture src/ --min-confidence 90Batasan Teknis dan Praktik Terbaik
AST linting beroperasi pada level sintaksis dan semantik lokal. Tool ini tidak dapat memvalidasi apakah logika bisnis bernilai benar, hanya memastikan bahwa struktur dan pemanggilan simbol valid. Terapkan prinsip berikut saat merancang guardrail:
- Gunakan Type Check Ketat: Konfigurasi
tsc --noEmit(TypeScript) ataumypy --strict(Python) adalah lapis pertahanan utama sebelum Semgrep berjalan. - Tolak PR Tanpa Lockfile Update: Jika kode menambahkan deklarasi
importbaru tanpa perubahan yang sesuai padapackage-lock.json,poetry.lock, ataupnpm-lock.yaml, CI wajib memblokir merge. - Audit Semgrep False Positives: Batasi rule AST hanya pada SDK inti (database client, cloud provider, sistem auth) untuk menjaga waktu eksekusi CI tetap di bawah 2 menit.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!