← Tüm yazılar

Red-Teaming ve Güvenlik Araştırması için Sansürsüz Bir LLM API'si

20 Ağu 2026 · 5 dk okuma · red-teaming, security

Otomatik bir red-teaming düzeneği (harness) kurduysanız hata modunu zaten biliyorsunuz: saldırgan modeliniz saldırıyı üretmeyi reddeder, hakem modeliniz puanlaması gereken çıktıyı okumayı reddeder ve saldırı başarı oranınız sessizce düşer. Hiçbir şey hata vermemiştir. Hedefinizin daha güvenli hale gelişini ölçmediniz — araçlarınızın daha ihtiyatlı hale gelişini ölçtünüz. Sansürsüz bir LLM API'si, o değişkeni ölçümden çıkarmak için vardır.

Bu, koruma bariyerlerinin (guardrail) kötü olduğu yönünde bir argüman değil. Nereye ait oldukları hakkında bir argüman. Tüketiciye yönelik bir sohbet ürünündeki koruma bariyeri işini yapıyordur. Aynı bariyer bir değerlendirme döngüsünün içinde, sizinle hesaplamaya çalıştığınız sayı arasına oturmuş kontrolsüz bir karıştırıcı değişkendir.

Reddetme bir yanlış negatiftir ve başarı gibi görünür

Bunun bu kadar can yakmasının nedeni, reddetmelerin hata olmamasıdır. HTTP 200 alırsınız. finish_reason: "stop" alırsınız. Sorunsuz ayrıştırılan, düzgün biçimlendirilmiş JSON alırsınız. İçindeki dize "Bu konuda yardımcı olamam"dır ve hattınız onu bir veri kümesi sütununa, bir etiket alanına ya da bir rapor bölümüne yazıp yoluna devam eder.

Somut olarak, en çok acıttığı üç yerde:

Saldırgan modeller. Yinelemeli bir jailbreak aramasında — PAIR, TAP, GCG tarzı iyileştirme, döngüde bir saldırgan bulunan her şey — bir reddetme, aramanın o dalını sonlandırır. Raporladığınız saldırı başarı oranı, hedefinizin dayanıklılığının değil saldırganınızın istekliliğinin bir fonksiyonu haline gelir. Saldırganı daha az ihtiyatlı biriyle değiştirin; hedef modelinize gönderdiğiniz "iyileştirme" buharlaşır.

Hakem ve puanlayıcı modeller. Zararlı çıktılar üzerinde LLM-as-judge puanlaması, hakemin zararlı çıktıyı gerçekten okumasını gerektirir. Reddettiğinde ayrıştırılamayan bir puan alırsınız. Çoğu düzenek o satırı atar. Atılan satırlar rastgele eksik değildir — tam da puanlanmasına en çok ihtiyaç duyduğunuz ağır çıktılarda kümelenirler; böylece toplamınız güvenli tarafa kayar.

Analiz işleri. Ana akım bir modele, kaynak koduna geri çevrilmiş (decompiled) bir rutinin ne yaptığını sorun; çoğu zaman gerçek isteğinize göre değil, kötü amaçlı yazılımı andıran token'ların varlığına göre reddedecektir. Görev savunma amaçlıydı; sınıflandırıcı kelime dağarcığına tepki verdi. Günlüklerdeki (log) istismar trafiğini triyajlamak, bir dedektör eğitmek için bir oltalama (phishing) derlemini etiketlemek ya da bir CTF bulgusunu yazıya dökmek için de aynı hikâye geçerli.

Reddetmeler sessiz olduğu için ekipler sonunda reddetme dedektörleri yazmaya başlar — ki bu da başlı başına çözülmemiş bir problemdir:

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)

Kaynağında silebileceğiniz bir problem için güvenilmez bir dedektör inşa etmek yanlış bir takastır.

API'yi çağırmak

unbleep, OpenAI Chat Completions şemasını konuşur; dolayısıyla elinizdeki her istemci çalışır. Base URL'i değiştirin, anahtarı değiştirin, SDK'yı koruyun.

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)

curl üzerinden eşdeğeri; burada bir dedektöre eğitim verisi oluşturmak için bir oltalama derlemi etiketleniyor:

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
  }'

Bir etiketleme döngüsünde temperature: 0 ve sıkı bir max_tokens her zamankinden daha önemlidir — etiketi açıklayan bir paragraf değil, etiketin kendisini istersiniz.

Katman seçimi

Üç model, hepsi sansürsüz, bağlam ve fiyat açısından farklı:

unbleep ve unbleep-high akıl yürütme katmanlarıdır: yanıt vermeden önce düşünür ve izi content'in yanında bir reasoning_content alanında döndürürler. Bir hakem model için o iz gerçekten faydalıdır — bir satırın aldığı puanı neden aldığını söyler; bir anlaşmazlığı denetlerken ihtiyacınız olan da budur. Ayrıca çıktı olarak faturalandırılır; bu yüzden ihtiyaç duymayan işlerde "thinking": false gönderin. unbleep-mini doğrudan yanıtlar ve iz döndürmez.

Kontrolü sizde olan yönetişim

Reddetmeleri modelden kaldırmak, gözetimi hattınızdan kaldırmak anlamına gelmez. İsteğe bağlı policy parametresi, yönetişimi bizim tarafımızda, istek başına çalıştırır:

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

off varsayılan filtresiz taban çizgisidir. research tam olarak off gibi yanıtlar — seviye kullanım kaydına yazılır, böylece kendi raporlamanızda değerlendirme trafiğini taban çizgisi trafiğinden ayırabilirsiniz. Ek bir tarama uygulamaz. strict, mesaj metnini operatör tarafından yönetilen servis engelleme listemize karşı tarar ve eşleşme olursa 422 döndürür. Bu liste, katılan herkes için aynıdır — yapılandırılacak hesap başına bir engelleme listesi yoktur — bu yüzden onu üretim içerik politikanız olarak değil, bir yedek önlem olarak görün.

Bir hattı buraya yönlendirmeden önce netleştirmeniz gereken bir şey var: gönderdiğinizi de geri geleni de saklıyoruz. Kabul edip bir modele ilettiğimiz her çağrının istek gövdesi, yanıt içeriği ve kaynak IP'si veritabanımıza yazılır ve kötüye kullanım soruşturması, destek ve fatura itirazları için 30 gün tutulur. Gövdeler 64 KB'de kesilir. Kaynak IP 30 günden daha uzun yaşar — çağrıyı faturalandıran kullanım kaydına da yazılır ve o kayıt, daha uzun süre sakladığımız bir finansal kayıttır. Saklanmayan tek şey, strict'in bir modele ulaşmadan önce reddettiği bir istektir: o, kullanım geçmişinizde içeriği olmadan görünür. Başka hiçbir şey muaf değildir ve bunu kapatacak bir ayar yoktur. Derleminiz, çevrenizin dışında 30 günlük bir kopyanın sorun olacağı kadar hassassa — canlı kötü amaçlı yazılım, müşteri verisi, NDA kapsamındaki bir çalışma — bu gerçek bir kısıttır ve gizlilik politikası başlamadan önce okunacak sayfadır, sonra değil.

Hatalar OpenAI zarfını izler, dolayısıyla mevcut işleyiciler çalışır: 401 geçersiz anahtar, 402 kredi bitti, 422 politika tarafından engellendi, 429 hız sınırı aşıldı, 5xx yeniden denenebilir. Her yanıt x-ratelimit-* başlıklarını taşır; böylece bir toplu iş tahmin yürütmeden kendi hızını ayarlayabilir.

Sansürsüz bir LLM API'sinin size vermediği şey

Sansürsüz bir model daha keskin bir araçtır, her şeye izin veren bir araç değil. Temel modelin reddetmek üzere ayarlandığı soruları — sormamanız gerekenler dahil — yanıtlayacak ve bunu her şeye uyguladığı aynı özgüvenle yapacaktır; bu da korumalı bir modelin cehaletten reddedeceği yerde bu modelin düpedüz uydurabileceği anlamına gelir. Çıkan şeyden sorumlu bir insan bulundurun. Kabul edilebilir kullanım politikası, API'nin ne için olduğunu ve asla ne için olmadığı dar kümeyi açıkça belirtir; ölçüt kelime dağarcığı değil, yetki ve niyettir. Yasalara uygun kullanım sizin sorumluluğunuzdadır.

Bir API anahtarı alın ve araçlarınızın ihtiyatını ölçmeyi bırakın.