Geri Bildirim Toplama ve Depolama
Aracı etkileşimlerinden açık puanları ve örtük davranış sinyallerini yakalama.
Geri Bildirim Toplama ve Depolama, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Ajanların Geri Bildirime İhtiyaç Duymasının Nedeni
Hiç geri bildirim almayan bir ajan zaman içinde donup kalır — ilk eğitiminin ötesinde gelişemez. Geri bildirim, ajanın yaptığı şey ile kullanıcıların gerçekte istediği şey arasındaki döngüyü kapatır.
İki kategori özellikle önemlidir: açık geri bildirim (kullanıcı çıktıyı bilinçli olarak puanlar) ve örtük geri bildirim (kullanıcı bunu söylemeden davranışı kalite hakkında sinyal verir).
Açık Geri Bildirim: Başparmak Yukarı/Aşağı
En basit biçim: her yanıttan sonra verilen ikili sinyal. Toplaması ve saklaması kolaydır, ancak bilgi yoğunluğu düşüktür.
Uygulama örüntüsü: ajan yanıt verdikten sonra bir geri bildirim istemi sunun ve sonucu konuşma turunun ID'siyle birlikte kaydedin.
import uuid
from datetime import datetime
def collect_thumbs_feedback(turn_id: str, rating: str) -> dict:
"""rating: 'up' or 'down'"""
assert rating in ('up', 'down'), 'Invalid rating'
record = {
'feedback_id': str(uuid.uuid4()),
'turn_id': turn_id,
'type': 'thumbs',
'value': 1 if rating == 'up' else -1,
'created_at': datetime.utcnow().isoformat()
}
return record
feedback = collect_thumbs_feedback('turn_abc123', 'up')
print(feedback)Açık Geri Bildirim: Yıldız Puanları
1–5 yıldızlık bir puan, başparmak seçeneğine göre daha ayrıntılı bilgi sağlar. zar zor kabul edilebilir (2 yıldız) ile mükemmel (5 yıldız) arasındaki farkı görmenizi sağlar; bu da ince ayar için sinyal kalitesini iyileştirmede kullanışlıdır.
Eğitim işlem hatlarında kullanmadan önce 0–1 aralığına normalleştirin.
def collect_star_feedback(turn_id: str, stars: int) -> dict:
if not 1 <= stars <= 5:
raise ValueError('Stars must be between 1 and 5')
return {
'turn_id': turn_id,
'type': 'star',
'raw_value': stars,
'normalized': (stars - 1) / 4.0 # maps 1->0.0, 5->1.0
}
fb = collect_star_feedback('turn_xyz456', 4)
print(fb)
# {'turn_id': 'turn_xyz456', 'type': 'star', 'raw_value': 4, 'normalized': 0.75}Açık Geri Bildirim: Serbest Metin Düzeltmeleri
Serbest metin geri bildirimi en zengin sinyaldir. Kullanıcı tam olarak ne istediğini yazar: 'Özet çok uzundu', 'Ana noktayı atladınız', 'Yanlış para birimi — EUR istemiştim'.
Düzeltmeleri özgün çıktıyla ilişkilendirerek saklayın; böylece daha sonra denetimli ince ayar için (kötü çıktı → düzeltilmiş çıktı) eşleştirmesi yapabilirsiniz.
def collect_correction_feedback(
turn_id: str,
original_output: str,
corrected_output: str,
user_note: str = ''
) -> dict:
return {
'turn_id': turn_id,
'type': 'correction',
'original': original_output,
'corrected': corrected_output,
'user_note': user_note
}
fb = collect_correction_feedback(
'turn_789',
'The capital of Australia is Sydney.',
'The capital of Australia is Canberra.',
'Sydney is the largest city but not the capital.'
)
print(fb)Örtük Geri Bildirim: Yeniden Sorma Sinyali
Kullanıcı aynı soruyu farklı sözcüklerle hemen yeniden sorduğunda bu, önceki yanıtın yanlış veya yetersiz olduğuna ilişkin güçlü bir örtük sinyaldir. Kullanıcının herhangi bir şeye tıklaması gerekmez — davranışın kendisi sinyaldir.
from datetime import datetime, timedelta
def detect_re_ask(
current_msg: str,
conversation_history: list,
similarity_threshold: float = 0.7,
window_seconds: int = 120
) -> bool:
"""
Returns True if the current message is semantically similar
to a recent message, suggesting dissatisfaction.
"""
now = datetime.utcnow()
for turn in conversation_history[-5:]:
age = (now - turn['timestamp']).seconds
if age <= window_seconds and turn['role'] == 'user':
# In production: use embedding cosine similarity
if simple_similarity(current_msg, turn['content']) >= similarity_threshold:
return True
return False
def simple_similarity(a: str, b: str) -> float:
words_a = set(a.lower().split())
words_b = set(b.lower().split())
if not words_a or not words_b:
return 0.0
return len(words_a & words_b) / len(words_a | words_b)
if __name__ == '__main__':
now = datetime.utcnow()
history = [
{'role': 'user', 'content': 'How do I reset my password', 'timestamp': now - timedelta(seconds=30)},
]
result = detect_re_ask('How do I reset my password please', history)
print('Re-ask detected:', result)
Örtük Geri Bildirim: Çıktı Düzenleme Sinyali
Ajan metin oluşturur ve kullanıcı metni kullanmadan önce düzenlerse, özgün metin ile düzenlenmiş metin arasındaki fark örtük geri bildirimdir. Düzenlenmiş sürüm, kullanıcının gerçekte istediği şeydir.
Bu durum yazma yardımcılarında, kod oluşturucularda ve e-posta taslak araçlarında yaygındır.
import difflib
def extract_edit_feedback(original: str, edited: str) -> dict:
differ = difflib.unified_diff(
original.splitlines(),
edited.splitlines(),
lineterm=''
)
diff_lines = list(differ)
edit_ratio = difflib.SequenceMatcher(None, original, edited).ratio()
return {
'type': 'edit',
'original': original,
'edited': edited,
'edit_distance': 1.0 - edit_ratio, # 0=unchanged, 1=fully rewritten
'diff': '\n'.join(diff_lines)
}
fb = extract_edit_feedback(
'Dear John, I am writing to inform you...',
'Hi John, Just a quick note...'
)
print(f"Edit distance: {fb['edit_distance']:.2f}")Geri Bildirim Saklama Şeması
Tüm geri bildirim türleri, türe özgü yük alanlarının bulunduğu ortak bir şemayı paylaşır. type ayırt edicisi ve payload JSON sütunu içeren tek bir tablo kullanmak, her türlü geri bildirim türünü desteklerken sorguları basit tutar.
# SQL schema for feedback storage
CREATE_TABLE_SQL = '''
CREATE TABLE agent_feedback (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
session_id TEXT NOT NULL,
turn_id TEXT NOT NULL,
agent_id TEXT NOT NULL,
type TEXT NOT NULL CHECK (type IN ('thumbs','star','correction','re_ask','edit')),
value FLOAT, -- numeric signal: +1/-1, 0-1, edit distance
payload JSONB, -- type-specific data
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX ON agent_feedback (agent_id, created_at);
CREATE INDEX ON agent_feedback (type);
'''
# Example insert
INSERT_SQL = '''
INSERT INTO agent_feedback (session_id, turn_id, agent_id, type, value, payload)
VALUES ($1, $2, $3, $4, $5, $6)
'''
if __name__ == '__main__':
print('Feedback table schema:')
print(CREATE_TABLE_SQL)
print('Insert statement:')
print(INSERT_SQL)
Geri Bildirim Toplayıcı Sınıfı Yazma
Tüm geri bildirim toplamayı tek bir sınıf üzerinden merkezileştirmek, kod tabanının geri kalanını temiz tutar. Toplayıcı, yinelemeleri kaldırma, toplu işleme ve eşzamansız yazma işlemlerini yönetir; böylece geri bildirim ana ajan döngüsünü hiçbir zaman engellemez.
import asyncio
from collections import deque
from datetime import datetime
class FeedbackCollector:
def __init__(self, agent_id: str, flush_interval: int = 30):
self.agent_id = agent_id
self.buffer: deque = deque(maxlen=1000)
self.flush_interval = flush_interval
def record(self, turn_id: str, fb_type: str, value: float, payload: dict):
self.buffer.append({
'turn_id': turn_id,
'agent_id': self.agent_id,
'type': fb_type,
'value': value,
'payload': payload,
'created_at': datetime.utcnow().isoformat()
})
async def flush(self, db_client):
while self.buffer:
record = self.buffer.popleft()
await db_client.insert('agent_feedback', record)
async def start_auto_flush(self, db_client):
while True:
await asyncio.sleep(self.flush_interval)
await self.flush(db_client)
if __name__ == '__main__':
fc = FeedbackCollector(agent_id='agent-1')
fc.record('turn-1', 'thumbs', 1.0, {'comment': 'Great answer'})
fc.record('turn-2', 'thumbs', -1.0, {'comment': 'Wrong ticker'})
print(f'Buffered {len(fc.buffer)} feedback records:')
for rec in fc.buffer:
print(' -', rec['type'], rec['value'], rec['payload'])
Analiz İçin Geri Bildirimleri Birleştirme
Ham geri bildirim kayıtlarının iyileştirme kararlarında kullanılabilmesi için önce birleştirilmesi gerekir. Yaygın birleştirmeler şunlardır: amaç türüne göre onaylanma oranı, zaman içindeki düzeltme oranı ve en çok düzenlenen çıktı kategorileri.
from collections import defaultdict
from statistics import mean
def aggregate_feedback(records: list) -> dict:
by_type = defaultdict(list)
for r in records:
by_type[r['type']].append(r['value'])
summary = {}
if 'thumbs' in by_type:
values = by_type['thumbs']
summary['approval_rate'] = (values.count(1) / len(values)) * 100
if 'star' in by_type:
summary['avg_star'] = mean(by_type['star']) * 4 + 1 # denormalize
if 'edit' in by_type:
summary['avg_edit_distance'] = mean(by_type['edit'])
if 'correction' in by_type:
summary['correction_count'] = len(by_type['correction'])
return summary
records = [
{'type': 'thumbs', 'value': 1},
{'type': 'thumbs', 'value': -1},
{'type': 'star', 'value': 0.75},
{'type': 'edit', 'value': 0.3}
]
print(aggregate_feedback(records))Geri Bildirim Toplamada Gizlilik ve Rıza
Geri bildirimler çoğu zaman hassas kullanıcı verileri içerir. En iyi uygulamalar şunlardır: serbest metin düzeltmelerini kaydetmeden önce açık rıza alın, analizden önce oturum ID'lerini anonymise edin, saklama sınırları belirleyin (ör. 90 gün sonra silin) ve geri bildirim yüklerinde hiçbir zaman PII günlüğe kaydetmeyin.
import hashlib
import re
def anonymise_feedback(record: dict) -> dict:
"""Anonymise feedback record before storing for training."""
safe = record.copy()
# Hash the session_id so it can't be traced back to a user
if 'session_id' in safe:
safe['session_id'] = hashlib.sha256(
safe['session_id'].encode()
).hexdigest()[:16]
# Strip emails and phone numbers from correction text
if 'payload' in safe and 'corrected' in safe['payload']:
text = safe['payload']['corrected']
text = re.sub(r'[\w.+-]+@[\w-]+\.[\w.]+', '[EMAIL]', text)
text = re.sub(r'\+?[0-9][\s\-().]{7,}[0-9]', '[PHONE]', text)
safe['payload'] = dict(safe['payload'], corrected=text)
return safe
if __name__ == '__main__':
record = {
'session_id': 'sess-abc123',
'payload': {'corrected': 'Contact me at jane@example.com or 555-123-4567'}
}
print('Anonymised record:', anonymise_feedback(record))
Uçtan Uca Geri Bildirim İşlem Hattı
Tümünü bir araya getirdiğimizde: topla → anonymise → arabelleğe al → flush → birleştir → raporla. İşlem hattı üretimde ajanın yanında çalışır ve hangi amaçların en düşük onaylanma oranlarına sahip olduğunu gösteren haftalık bir iyileştirme raporu üretir.
# Simplified end-to-end feedback pipeline sketch
class FeedbackPipeline:
def __init__(self, agent_id: str):
self.collector = FeedbackCollector(agent_id)
self.records = []
def on_thumbs(self, turn_id: str, rating: str):
value = 1.0 if rating == 'up' else -1.0
record = self.collector.record(turn_id, 'thumbs', value, {})
self.records.append(record)
def on_edit(self, turn_id: str, original: str, edited: str):
fb = extract_edit_feedback(original, edited)
record = self.collector.record(
turn_id, 'edit', fb['edit_distance'], fb
)
self.records.append(record)
def weekly_report(self) -> dict:
return aggregate_feedback(
[r for r in self.records]
)Bilgi Kontrolü
Kullanıcıdan hiçbir bilinçli eylem gerektirmeyen geri bildirim sinyali hangisidir?
Özet: Geri Bildirim Toplama ve Saklama
Harika çalıştınız! Bu derste öğrendikleriniz:
- Açık geri bildirim: başparmak (ikili), yıldızlar (dereceli), düzeltmeler (eşleştirilmiş eğitim verileri)
- Örtük geri bildirim: yeniden sormayı algılama ve çıktı düzenleme uzaklığı, kullanıcı çabası olmadan kaliteyi gösterir
- Saklama şeması: tür ayırt edicisi ve JSONB yükü bulunan tek tablo
- İşlem hattı: topla → anonymise → arabelleğe al → flush → birleştir
- Gizlilik: oturum ID'lerini özetleyin, PII'yi çıkarın ve saklama sınırları belirleyin
Sonraki derste ajanların kendi performansları üzerine nasıl düşünebileceğini ve bu değerlendirmeleri epizodik bellek olarak saklayabileceğini öğreneceksiniz.
Sıkça Sorulan Sorular
“Geri Bildirim Toplama ve Depolama” dersi ücretsiz mi?
Evet — “Geri Bildirim Toplama ve Depolama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Geri Bildirim Toplama ve Depolama” dersinde ne öğreneceğim?
Aracı etkileşimlerinden açık puanları ve örtük davranış sinyallerini yakalama. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Geri Bildirim Toplama ve Depolama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Geri Bildirim Toplama ve Depolama
- Yansıtma ve Öz Eleştiri Döngüleri
- Yörünge Tabanlı Öz İyileştirme
- Öz İyileştirme Yanlış Gittiğinde