Yazılım eğitimi asistanlarında beğeni, kabul edilen kod ve kullanıcı düzeltmeleri eğitim verisine dönüşmeden önce köken, bütünlük, anomali ve sürümleme kontrollerinden geçmelidir. Bu yazı uygulanabilir bir güven zinciri kurar.
Yazılım Eğitimi Asistanlarında Geri Bildirim Verisi Zehirlenmesini Önleme
Yazılım eğitimi geri bildiriminde saldırı yüzeyini veri akışıyla modelleyin
Bir yazılım eğitimi asistanında 'yararlı' oyu, kullanıcının çalıştırdığı kod ve sohbet düzeltmesi doğrudan fine-tuning ya da tercih verisine girerse saldırganın hedefi modeli tek seferde bozmak değildir. Daha pratik hedef, belirli bir yanlış kod kalıbını binlerce kez olumlu sinyalle ilişkilendirerek sonraki eğitim koşularında seçilme olasılığını artırmaktır. Veri hattını istemci -> güvenilir toplama katmanı -> ham olay deposu -> karantina -> veri manifesti -> eğitim olarak ayırın. İstemciden gelen olay, eğitime uygun kayıt değildir; sadece doğrulanmayı bekleyen gözlemdir.
Ham olayı değiştirilemez bir nesne deposuna yazmadan önce eğitim kararını açıklayacak alanları zorunlu tutun. PostgreSQL tarafında olay kimliği ile eğitim adayını ayıran aşağıdaki şema, bir kaydın neden reddedildiğini sonradan incelemeyi mümkün kılar. `content_sha256` ham içeriğin, `actor_id` ise pseudonymize edilmiş hesabın özetidir; e-posta veya IP adresini eğitim tablosuna taşımayın.
CREATE TABLE feedback_event (
event_id UUID PRIMARY KEY,
received_at TIMESTAMPTZ NOT NULL,
actor_id BYTEA NOT NULL,
tenant_id UUID NOT NULL,
source TEXT NOT NULL CHECK (source IN ('web', 'ide', 'api')),
action TEXT NOT NULL CHECK (action IN ('vote', 'accepted_code', 'correction')),
content_sha256 BYTEA NOT NULL,
trace_id UUID NOT NULL,
signature_key_id TEXT NOT NULL,
signature BYTEA NOT NULL,
raw_object_uri TEXT NOT NULL,
eligibility TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX feedback_event_pending_idx
ON feedback_event (received_at)
WHERE eligibility = 'pending';Sık yapılan hata, `accepted_code` olayını gerçek doğruluk olarak kabul etmektir. Kullanıcının kodu çalıştırması yalnızca yerel testin geçtiğini gösterebilir; test zayıfsa zararlı veya yanlış davranış da kabul edilmiş görünür. Bu nedenle olay kaydına en az `execution_exit_code`, test komutu özeti, çalışma süresi ve sandbox imaj özeti ekleyin. Eğitime alınacak örneğin cevap kalitesi, kullanıcı memnuniyeti ve yürütme sonucu birbirinden bağımsız kanıtlar olarak değerlendirilmelidir.
Köken doğrulaması için imzalı olay zarfı kullanın
Bir API anahtarının varlığı, olayın güvenilir olduğu anlamına gelmez. Anahtar çalınmış olabilir veya yetkili bir entegrasyon hatalı toplu gönderim yapabilir. Güvenilir toplama katmanında kanonik JSON gövdesini Ed25519 ile imzalayın; eğitim işçisi yalnızca izinli anahtar kimlikleriyle doğrulanmış zarfları okusun. Ed25519 doğrulaması hızlıdır ve doğrulayıcıya imzalama sırrı dağıtmayı gerektirmez.
Python `cryptography` paketiyle doğrulama işlemi aşağıdaki gibi kurulabilir. `payload` alanına kullanıcı tarafından gönderilen serbest metni değil, önce doğruladığınız ve boyut sınırı uyguladığınız olay gövdesini koyun. İmza doğrulaması başarısız olduğunda olayı sessizce düşürmek yerine ayrı bir denetim akışına yazın.
import base64
import json
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
from cryptography.exceptions import InvalidSignature
ALLOWED_KEYS = {
"collector-2026-q3": "11" * 32
}
def canonical_bytes(event: dict) -> bytes:
envelope = {
"event_id": event["event_id"],
"received_at": event["received_at"],
"actor_id": event["actor_id"],
"content_sha256": event["content_sha256"],
"trace_id": event["trace_id"]
}
return json.dumps(envelope, sort_keys=True, separators=(",", ":")).encode()
def verify_event(event: dict) -> bool:
key_id = event["signature_key_id"]
public_hex = ALLOWED_KEYS.get(key_id)
if public_hex is None:
return False
try:
key = Ed25519PublicKey.from_public_bytes(bytes.fromhex(public_hex))
key.verify(base64.b64decode(event["signature"]), canonical_bytes(event))
return True
except (InvalidSignature, ValueError, KeyError):
return FalseKanonikleştirme burada kritik ayrıntıdır. Bir bileşen `{"score":1}` üretirken diğeri `{"score":1.0}` üretiyorsa iki taraf aynı semantik olayı farklı baytlara dönüştürür ve imza doğrulaması kırılır. Şema tabanlı tip normalizasyonu yapın, zaman damgalarını UTC RFC 3339 biçimine sabitleyin ve imzalanan alanları sürümleyin. Anahtar rotasyonunda `signature_key_id` saklanmadığında, eski olayları yeni anahtarla doğrulamaya çalışmak hem yanlış reddetmelere hem de denetim zinciri kaybına yol açar.
Anomali karantinasını tekil oy yerine davranış kümeleriyle kurun
Saldırganlar tek hesapla binlerce oy vermek zorunda değildir. Yeni açılmış hesaplar, aynı cevaba yoğunlaşma ve benzer metinlerin kısa zaman penceresinde tekrarı daha güçlü sinyallerdir. DuckDB ile günlük aday üretiminden önce hesap-konu çiftlerinin yoğunluğunu çıkarın. Aşağıdaki sorgu, son bir saatte aynı içerik özetini destekleyen genç hesap kümelerini `quarantine` durumuna alacak adayları üretir.
WITH recent AS (
SELECT
content_sha256,
actor_id,
received_at,
account_age_hours,
date_trunc('hour', received_at) AS hour_bucket
FROM read_parquet('s3://feedback/raw/date=2026-09-07/*.parquet')
WHERE action = 'vote'
AND received_at >= now() - INTERVAL 1 HOUR
), grouped AS (
SELECT
content_sha256,
hour_bucket,
count(*) AS votes,
count(DISTINCT actor_id) AS actors,
avg(account_age_hours) AS mean_account_age
FROM recent
GROUP BY 1, 2
)
SELECT content_sha256, hour_bucket, votes, actors
FROM grouped
WHERE votes >= 40
AND actors >= 20
AND mean_account_age < 48;Bu kural tek başına karar motoru olmamalıdır. Popüler bir hata açıklaması gerçekten çok oy alabilir. Karantina kararına ikinci bir sinyal ekleyin: aynı cevap için bağımsız sandbox test başarısızlık oranı veya uzman inceleme anlaşmazlığı. Örneğin son 200 olayda `accepted_code` oranı yüzde 90 iken derleyici başarısı yüzde 15 ise, kullanıcı oyu ile yürütülebilir kanıtın ayrıştığını görürsünüz. `quarantine_reason`, eşik sürümü ve sorgu çıktısını olayla birlikte saklayın; aksi halde altı ay sonra bir veri setinin neden dışlandığını yeniden üretemezsiniz.
Daha ileri bir koruma olarak aynı kullanıcının ürettiği hem olumlu hem olumsuz tercih çiftlerini eğitim bölünmelerine ayırmayın. DPO benzeri tercih eğitiminde aynı aktörün tercihleri hem train hem validation içinde kalırsa ölçüm, modelin genellemesini değil aktörün üslubunu ezberlemesini ödüllendirir. Bölmeyi `actor_id` ve zaman sınırı ile yapın: doğrulama seti, eğitim bitiş zamanından sonraki olaylardan ve eğitimde hiç görülmemiş aktörlerden oluşsun.
Veri manifesti ve karşılaştırmalı eval ile eğitim yayına alma kapısı oluşturun
Karantinadan geçen kayıtları doğrudan eğitime bağlamak yerine, içerik özetleri ve kural sürümlerinden oluşan değişmez bir manifest üretin. DVC veya lakeFS ile ham veri yolu, karantina sorgusu commit'i ve üretilen Parquet dosyasını aynı sürüm altında etiketleyin. Böylece bir eğitim koşusunun 'hangi veriyle' yapıldığı, yalnızca klasör adıyla değil kriptografik olarak doğrulanabilir girdi listesiyle cevaplanır.
Yayına alma kararı için temel model ile aday modeli aynı gizli eval setinde karşılaştırın. Sadece ortalama puan yeterli değildir; bootstrap güven aralığının alt sınırı da kalite gerilemesi olmadığını göstermelidir. Aşağıdaki kapı, adayın derleme başarısında en fazla yüzde 1 mutlak düşüşe izin verir ve farkın yüzde 95 güven aralığındaki alt sınırını kontrol eder.
import numpy as np
rng = np.random.default_rng(42)
def bootstrap_lower_bound(base_ok, candidate_ok, rounds=5000):
base_ok = np.asarray(base_ok, dtype=float)
candidate_ok = np.asarray(candidate_ok, dtype=float)
n = len(base_ok)
deltas = np.empty(rounds)
for i in range(rounds):
idx = rng.integers(0, n, size=n)
deltas[i] = candidate_ok[idx].mean() - base_ok[idx].mean()
return float(np.quantile(deltas, 0.05))
lower = bootstrap_lower_bound(base_compile_pass, candidate_compile_pass)
if lower < -0.01:
raise SystemExit(f"release blocked: compile pass lower CI={lower:.4f}")Önce-sonra karşılaştırmasında eval örneklerini eğitim manifestine sızdırmamak zorunludur. İçerik hash'i eşitliği yeterli değildir; küçük bir prompt değişikliği aynı çözümü taşıyabilir. Kod örneklerinde normalize edilmiş AST hash'i, metin örneklerinde ise MinHash veya embedding tabanlı en yakın komşu taraması kullanın. Örneğin Python kodunu `ast.parse` ile ayrıştırıp sabitleri ve değişken adlarını normalize ettikten sonra hashlemek, yalnızca isim değiştirilerek yapılan kopyaları yakalar.
Geri alma için ham veriyi silmeden eğitim etkisini izole edin
Zehirlenme şüphesinde ilk refleks ham olayları silmek olmamalıdır. Silinen olay, soruşturma ve yeniden üretilebilirlik için gerekli kanıtı yok eder. Bunun yerine olayın `eligibility` durumunu `revoked` yapın, ilgili manifestleri bulun ve sonraki eğitim planından çıkarın. Nesne deposunda WORM retention veya S3 Object Lock benzeri değişmez saklama kullanmak, yetkisiz bir kişinin kanıtı geriye dönük değiştirmesini zorlaştırır.
OpenTelemetry ile `feedback.ingest`, `feedback.verify`, `feedback.quarantine` ve `dataset.manifest` span'lerini aynı `trace_id` üzerinden bağlayın. Bir alarm kuralı, imza doğrulama başarısızlığı oranı beş dakikada yüzde 0.5'i geçerse veya tek bir `content_sha256` için karantina sayısı eşiği aşarsa ham olay URI'lerini ve anahtar kimliğini içermelidir. Prometheus sorgusu örneği şöyledir:
sum(rate(feedback_signature_failures_total[5m]))
/
sum(rate(feedback_events_total[5m])) > 0.005İncelik şudur: model eğitildikten sonra bir olayı `revoked` yapmak, olayın ağırlıklarını modelden geri çıkarmaz. Bu nedenle manifest ile model artefact'ı arasında bire çok ilişkiyi kayıt altına alın. `model_version -> training_run -> manifest_sha256 -> event_id` zinciri sayesinde etkilenen modelleri bulur, önce trafik yönlendirmesinden çıkarır, sonra temiz manifest ile yeniden eğitir veya güvenli önceki artefact'a dönersiniz. Bu süreçte kullanıcı trafiğinden gelen yeni geri bildirimi de aynı şüpheli anahtar veya kampanya göstergeleri için geçici karantinaya alın.
TechCareer İlgili Eğitimler
Sık Sorulan Sorular
Yazılım eğitimi asistanında kullanıcı beğenileri fine-tuning verisine doğrudan eklenebilir mi?
Hayır. Beğeniyi ham olay olarak saklayın; imza doğrulaması, hesap ve içerik yoğunluğu analizi, bağımsız yürütme kanıtı ve manifest sürümlemesinden geçmeyen kayıtları eğitim adayına dönüştürmeyin. Özellikle aynı yanıt için kısa sürede açılmış hesaplardan gelen oy kümelerini karantinaya alın.
Yazılım eğitimi geri bildirim verisinde veri zehirlenmesi nasıl tespit edilir?
En az üç sinyali birlikte ölçün: içerik hash'i başına saatlik benzersiz aktör sayısı, aktör hesap yaşı ve sandbox test sonucu ile oy sinyalinin ayrışması. DuckDB veya Spark ile saatlik kümeleri çıkarın, sonucu `quarantine_reason` ve kural sürümüyle kaydedin. Tek bir z-score eşiği, organik popüler içerikleri yanlış pozitif yapabileceği için yeterli değildir.
Yazılım eğitimi modeli için eğitim veri seti sürümleme nasıl yapılır?
Ham Parquet konumu, seçilen event_id listesi, karantina kuralı commit'i, şema sürümü ve içerik hash'lerini tek manifestte toplayın. Manifestin SHA-256 özetini eğitim koşusu metadata'sına yazın ve DVC ya da lakeFS etiketiyle saklayın. Bir regresyonda aynı manifestle eğitimi yeniden çalıştırabilmeniz gerekir.
Eğitim verisinden kaldırılan bir olay eğitilmiş LLM'den nasıl geri alınır?
Tekil olayı ağırlıklardan güvenilir biçimde çıkarmaya çalışmak yerine, olaydan etkilenen manifestleri ve model artefact'larını soy zinciri kaydından bulun. Trafiği temiz önceki modele yönlendirin veya olayın dışlandığı manifestle modeli yeniden eğitin. Geri alma tatbikatında modelden manifest SHA-256'ya ulaşma süresini ölçülebilir bir SLO olarak takip edin.
AI / LLM Discovery
Bu makale Opendart Akademi Yapay Zeka eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.


