← Semua tulisan

API LLM Tanpa Sensor untuk Red-Teaming dan Riset Keamanan

20 Agu 2026 · 6 menit baca · red-teaming, security

Jika Anda pernah membangun harness red-teaming otomatis, Anda sudah tahu mode kegagalannya: model penyerang Anda menolak menghasilkan serangan, model penilai Anda menolak membaca keluaran yang seharusnya dinilai, dan tingkat keberhasilan serangan Anda turun diam-diam. Tidak ada yang error. Anda tidak mengukur target Anda menjadi lebih aman — Anda mengukur tooling Anda menjadi lebih berhati-hati. API LLM tanpa sensor ada untuk menghapus variabel itu dari pengukuran.

Ini bukan argumen bahwa guardrail itu buruk. Ini argumen tentang di mana seharusnya guardrail berada. Guardrail pada produk chat konsumen sedang menjalankan tugasnya. Guardrail yang sama di dalam loop evaluasi adalah variabel perancu (confounder) yang tidak terkendali, duduk di antara Anda dan angka yang sedang Anda coba hitung.

Penolakan adalah false negative, dan tampak seperti keberhasilan

Alasan masalah ini begitu menggigit adalah karena penolakan bukan error. Anda mendapat HTTP 200. Anda mendapat finish_reason: "stop". Anda mendapat JSON yang rapi dan bisa di-parse dengan bersih. String di dalamnya berbunyi "Saya tidak bisa membantu dengan itu," dan pipeline Anda menuliskannya ke kolom dataset, field label, atau bagian laporan, lalu melanjutkan.

Konkretnya, di tiga tempat yang paling terasa sakitnya:

Model penyerang. Dalam pencarian jailbreak iteratif — PAIR, TAP, refinement ala GCG, apa pun yang melibatkan penyerang di dalam loop — sebuah penolakan mengakhiri cabang pencarian itu. Tingkat keberhasilan serangan yang Anda laporkan menjadi fungsi dari kesediaan penyerang Anda, bukan ketahanan target Anda. Ganti penyerangnya dengan yang kurang berhati-hati dan "peningkatan" yang Anda rilis ke model target lenyap.

Model penilai dan grader. Penilaian LLM-as-judge atas keluaran berbahaya mengharuskan penilai benar-benar membaca keluaran berbahaya itu. Ketika penilai menolak, Anda mendapat skor yang tidak bisa di-parse. Kebanyakan harness membuang baris itu. Baris yang dibuang tidak hilang secara acak — baris-baris itu mengumpul persis pada keluaran paling parah yang paling Anda butuhkan skornya, sehingga agregat Anda condong ke arah aman.

Pekerjaan analisis. Tanyakan pada model arus utama apa yang dilakukan sebuah rutin hasil dekompilasi, dan model itu sering menolak berdasarkan kehadiran token yang berbau malware, bukan berdasarkan permintaan Anda yang sebenarnya. Tugasnya defensif; classifier-nya terpicu oleh kosakata. Cerita yang sama untuk triase lalu lintas exploit di log, melabeli korpus phishing untuk melatih detektor, atau menulis laporan temuan CTF.

Karena penolakan bersifat senyap, tim akhirnya menulis detektor penolakan — yang merupakan masalah tersendiri yang belum terpecahkan:

python
REFUSAL_MARKERS = ("i can't", "i cannot", "i'm unable", "i won't", "as an ai")

def looks_like_refusal(text: str) -> bool:
    """Substring heuristic. Good enough to alarm on, not good enough to trust:
    it misses polite deflections that never use the phrase, and it fires on any
    completion that quotes a refusal. Both error directions corrupt a dataset."""
    return any(m in text[:200].lower() for m in REFUSAL_MARKERS)

Membangun detektor yang tidak andal untuk masalah yang bisa Anda hapus di sumbernya adalah pertukaran yang salah.

Memanggil API

unbleep berbicara dengan skema OpenAI Chat Completions, jadi klien apa pun yang sudah Anda miliki bisa dipakai. Ganti base URL, ganti key, pertahankan SDK.

python
import json
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://unbleep.ai/v1",
    api_key=os.environ["UNBLEEP_API_KEY"],
)

TRIAGE = """You are a malware analyst writing notes for a detection engineer.
Given a decompiled routine, describe what it does, the observable artefacts it
would leave on a host, and where a defender could detect it. Reply as JSON with
keys: behaviour, artefacts, detection_surface, confidence."""


def triage(decompiled: str) -> dict:
    """One sample in, one structured verdict out — no refusal branch to handle."""
    resp = client.chat.completions.create(
        model="unbleep",
        messages=[
            {"role": "system", "content": TRIAGE},
            {"role": "user", "content": decompiled},
        ],
        response_format={"type": "json_object"},
        temperature=0.2,
    )
    return json.loads(resp.choices[0].message.content)

Padanannya lewat curl, di sini melabeli korpus phishing untuk membangun data latih bagi sebuah detektor:

bash
curl https://unbleep.ai/v1/chat/completions \
  -H "Authorization: Bearer $UNBLEEP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "unbleep",
    "messages": [
      {"role": "system", "content": "Label each email for a phishing detector. Answer with one word: phishing or benign."},
      {"role": "user", "content": "Subject: Payroll update required\n\nYour direct deposit is on hold. Confirm at hxxp://payroll-verify.example.com"}
    ],
    "temperature": 0,
    "max_tokens": 4
  }'

temperature: 0 dan max_tokens yang ketat lebih penting dari biasanya dalam loop pelabelan — Anda ingin labelnya, bukan satu paragraf yang menjelaskan label itu.

Memilih tier

Tiga model, semuanya tanpa sensor, berbeda dalam konteks dan harga:

unbleep dan unbleep-high adalah tier penalaran: keduanya berpikir sebelum menjawab dan mengembalikan jejaknya di field reasoning_content di samping content. Untuk model penilai, jejak itu sungguh berguna — jejak itu memberi tahu Anda mengapa sebuah baris mendapat skor tertentu, yang persis Anda butuhkan saat mengaudit sebuah ketidaksepakatan. Jejak itu juga ditagih sebagai keluaran, jadi kirim "thinking": false pada pekerjaan yang tidak membutuhkannya. unbleep-mini menjawab langsung dan tidak mengembalikan jejak.

Tata kelola yang Anda kendalikan

Menghapus penolakan dari model tidak berarti menghapus pengawasan dari pipeline Anda. Parameter opsional policy menjalankan tata kelola di sisi kami, per request:

python
resp = client.chat.completions.create(
    model="unbleep",
    messages=[...],
    extra_body={"policy": "research"},  # recorded on the usage row; answers exactly like off
)

off adalah baseline default tanpa filter. research menjawab persis seperti off — levelnya dicatat pada baris usage, sehingga Anda bisa memisahkan lalu lintas evaluasi dari lalu lintas baseline dalam pelaporan Anda sendiri. Level ini tidak menerapkan penyaringan tambahan. strict memindai teks pesan terhadap daftar blokir layanan yang dikelola operator kami dan mengembalikan 422 bila ada kecocokan. Daftar itu sama untuk semua orang yang memilih ikut — tidak ada daftar blokir per akun yang bisa dikonfigurasi — jadi perlakukan level ini sebagai pengaman terakhir, bukan sebagai kebijakan konten produksi Anda.

Satu hal yang harus dibereskan sebelum Anda mengarahkan pipeline ke sini: kami menyimpan apa yang Anda kirim dan apa yang kembali. Body request, konten respons, dan IP sumber dari setiap panggilan yang kami terima dan teruskan ke model ditulis ke database kami dan disimpan selama 30 hari, untuk investigasi penyalahgunaan, dukungan, dan sengketa penagihan. Body dipotong pada 64 KB. IP sumber bertahan lebih lama dari 30 hari — IP itu juga ditulis ke baris usage yang menagih panggilan tersebut, dan baris itu adalah catatan keuangan yang kami simpan lebih lama. Satu-satunya hal yang tidak disimpan adalah request yang ditolak strict sebelum sampai ke model: request itu muncul di riwayat penggunaan Anda tanpa isinya. Tidak ada hal lain yang dikecualikan, dan tidak ada pengaturan untuk mematikannya. Jika korpus Anda cukup sensitif sehingga salinan 30 hari di luar perimeter Anda menjadi masalah — malware hidup, data pelanggan, engagement di bawah NDA — itu adalah batasan nyata, dan kebijakan privasi adalah halaman yang harus dibaca sebelum Anda mulai, bukan sesudahnya.

Error mengikuti amplop OpenAI, jadi handler yang sudah ada tetap berfungsi: 401 key salah, 402 kredit habis, 422 diblokir kebijakan, 429 kena rate limit, 5xx bisa dicoba ulang. Setiap respons membawa header x-ratelimit-* sehingga batch job bisa mengatur lajunya sendiri tanpa menebak-nebak.

Apa yang tidak diberikan oleh API LLM tanpa sensor

Model tanpa sensor adalah alat yang lebih tajam, bukan alat yang permisif. Model ini akan menjawab pertanyaan yang model dasarnya di-tuning untuk ditolak, termasuk pertanyaan yang seharusnya tidak Anda ajukan, dan melakukannya dengan tingkat kepercayaan diri yang sama seperti untuk segala hal lainnya — yang juga berarti bahwa di tempat model berpengaman tadinya menolak karena ketidaktahuan, model ini mungkin begitu saja mengarang. Pastikan ada manusia yang bertanggung jawab atas apa yang keluar. Kebijakan penggunaan menyatakan dengan gamblang untuk apa API ini dan sekumpulan kecil hal yang tidak pernah boleh dilakukan dengannya; otorisasi dan niat adalah ujiannya, bukan kosakata. Penggunaan yang sah adalah tanggung jawab Anda.

Dapatkan API key dan berhentilah mengukur kehati-hatian tooling Anda.