Aracıları Sınamak Neden Farklıdır
Belirsizlik, LLM maliyeti ve standart birim sınamalarının neden yetersiz kaldığı.
Aracıları Sınamak Neden Farklıdır, 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.
Yazılımı Sınamak ve Ajanları Sınamak
Geleneksel yazılım belirlenimcidir: aynı girdiyi verdiğinizde aynı çıktıyı alırsınız. Birim sınamaları, beklenen kesin değerleri doğrulamak için bu özelliğe dayanır.
Yapay zekâ ajanları bu varsayımı bozar. Aynı istem her çalıştırmada farklı çıktılar üretebilir; bu nedenle standart sınama yaklaşımları tek başına yetersiz kalır.
Belirlenimcilik Dışı: Aynı Girdi, Farklı Çıktı
LLM'ler doğaları gereği olasılıksaldır. temperature parametresi rastgeleliği denetler; temperature=0 değerinde bile çıktı, model sürümleri veya altyapı değişiklikleri arasında farklılık gösterebilir.
Bu, bugün başarılı olan bir ajan sınamasının yarın hiçbir kod değişikliği yapılmadan başarısız olabileceği anlamına gelir.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
# Same prompt, potentially different outputs each run
for i in range(3):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': 'Name a planet.'}],
temperature=0.9 # High randomness
)
print(f'Run {i+1}: {response.choices[0].message.content}')
# Run 1: Mars
# Run 2: Jupiter
# Run 3: SaturnMaliyet Sorunu: Gerçek LLM Çağrıları Pahalıdır
OpenAI veya Anthropic'e gerçek uygulama programlama arayüzü çağrıları yapan bir sınama paketi, çalıştırma başına birkaç dolara mal olabilir. Ayda 100 sınamayı 10 yinelemeyle çalıştıran bir sürekli tümleştirme işlem hattı yüzlerce dolara mal olabilir.
Bu nedenle ajan sınamalarını birim sınamalarını çalıştırdığınız şekilde çalıştırmak pratik değildir; maliyetleri denetlemek için stratejilere ihtiyacınız vardır.
# A test that calls the real API costs tokens every run
# 100 tests x 500 tokens each x 10 CI runs/day = 500,000 tokens/day
# At $0.15/1M tokens (gpt-4o-mini): ~$0.075/day = ~$27/year for a tiny suite
# For gpt-4o: 15x more expensive = ~$400/year
# This is why mocking and recording API responses is essential
print('Real API calls in tests = expensive and slow')
print('Solution: Mock or record LLM responses in unit tests')
print('Reserve real calls for scheduled integration tests')Gecikme Sorunu
Gerçek LLM uygulama programlama arayüzü çağrıları genellikle 2-20 saniye sürer. 50 sınamadan oluşan bir sınama paketinin çalışması 100-1000 saniye sürebilir. Bu durum geliştirici üretkenliğini düşürür; hızlı geri bildirim, iyi sınamaların temel değerlerinden biridir.
LLM çağrılarını benzetmek, sınamaların milisaniyeler içinde çalışmasını sağlar.
import time
# Simulating what a test suite looks like with real vs mocked calls
num_tests = 50
# Real API calls
real_time = num_tests * 5 # avg 5 seconds per call
print(f'With real API calls: {real_time}s = {real_time/60:.1f} minutes')
# Mocked calls
mock_time = num_tests * 0.001 # <1ms per mock
print(f'With mocked calls: {mock_time:.3f}s = nearly instant')
# Conclusion: mock in unit tests, use real calls in integration testsAjan Sınamalarında Dış Bağımlılıklar
Ajanlar genellikle dış araçları çağırır: arama uygulama programlama arayüzleri, veritabanları, dosya sistemleri ve web kazıyıcıları. Sınamalarda bu bağımlılıklar:
- kullanılamaz durumda olabilir (ağ kesintisi, uygulama programlama arayüzü hizmet kesintisi)
- her çalıştırmada farklı veriler döndürebilir
- sürekli tümleştirme işlem hatlarını engelleyen hız sınırlarına sahip olabilir
Birim sınamalarında bunlar denetlenmeli veya benzetilmelidir.
# An agent might call multiple external services
# Each is a potential test failure point
def agent_pipeline(query: str) -> str:
search_results = search_web(query) # External: Tavily/Serper API
documents = fetch_documents(search_results) # External: HTTP calls
answer = llm_summarize(documents) # External: OpenAI API
saved = database_store(answer) # External: PostgreSQL
return answer
# In unit tests: mock ALL of these
# In integration tests: use sandboxed versions of real services
print('Each external call is a test reliability risk')Standart Birim Sınamalarının Varsaydıkları
pytest gibi standart birim sınaması çerçeveleri şunları varsayar:
- Sınamalar hızlıdır (milisaniyeler sürer)
- Sınamalar belirlenimcidir
- Sınamaların dış yan etkileri yoktur
- Sınamalar herhangi bir sırayla çalıştırılabilir
Ajan sınamaları, açıkça bu varsayımlara göre tasarlanmadıkları sürece dördünü de ihlal eder.
# Standard unit test — works perfectly for deterministic code
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5 # Always passes — deterministic
# Agent 'unit test' that calls a real LLM — problematic
# def test_agent_answers_question():
# response = agent.run('What is 2+2?')
# assert response == '4' # Might return 'The answer is 4' or 'Four'
print('Exact string matching fails for LLM outputs')
print('Need structural or semantic assertions instead')Ajanlar için Sınama Piramidi
Ajanlar için uygulanabilir bir sınama stratejisi bir piramit izler:
- Birim sınamaları (çok sayıda, hızlı): Tek tek araçları ve işlevleri, benzetilmiş LLM çağrılarıyla sınayın
- Tümleştirme sınamaları (daha az sayıda, daha yavaş): Ajan işlem hattını korumalı hizmetlerle uçtan uca sınayın
- Değerlendirme sınamaları (seyrek, pahalı): Çıktı kalitesini gerçek LLM çağrıları ve insan benzeri puanlamayla sınayın
Yapısal ve Anlamsal Doğrulamalar
Kesin dize eşleştirmesi yerine ajan sınamaları yapısal doğrulamalar (ajan doğru aracı çağırdı mı?) veya anlamsal kontroller (çıktı ilgili kavramı içeriyor mu?) kullanmalıdır.
# Fragile: exact string match
# assert response.content == 'The capital of France is Paris.'
# Better: structural assertion
# assert response.tool_calls[0]['function']['name'] == 'search_web'
# Better: semantic check
def test_capital_in_response(response_text: str) -> bool:
key_words = ['paris', 'france', 'capital']
lower = response_text.lower()
return all(word in lower for word in key_words)
response = 'Paris is the capital city of France.'
print(test_capital_in_response(response)) # TrueDeğerlendirme Düzenekleri ve LLM ile Yargılama
Kalite değerlendirmesi için sektör, LLM ile yargılama yöntemini kullanır: ajanın çıktısını puanlaması için ikinci bir LLM'ye başvurulur. DeepEval ve RAGAS gibi çerçeveler bu yöntemi otomatikleştirir.
Bu yöntem, rutin sürekli tümleştirme için değil, maliyetli değerlendirme çalıştırmaları için ayrılmıştır.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def llm_judge(question: str, answer: str) -> dict:
prompt = f'Question: {question}\nAnswer: {answer}\nRate the answer 1-5 for accuracy. Reply with only a number.'
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
score = int(response.choices[0].message.content.strip())
return {'score': score, 'pass': score >= 4}
# result = llm_judge('What is the capital of France?', 'Paris')
# print(result) # {'score': 5, 'pass': True}Ajanlar için Gerileme Sınaması
Bir istemi güncellediğinizde veya ajan mantığını değiştirdiğinizde gerileme sınamaları, mevcut davranışı bozmadığınızı doğrular. Referans örnekleri (girdi → beklenen yapı) kaydedin ve bunları her işleme alımda otomatik olarak çalıştırın.
# golden_examples.py
GOLDEN_EXAMPLES = [
{
'input': 'Search for the weather in Paris',
'expected_tool': 'get_weather',
'expected_args': {'city': 'Paris'}
},
{
'input': 'Calculate 15% tip on $45',
'expected_tool': 'calculate',
'expected_args': {'expression': '45 * 0.15'}
}
]
def run_regressions(agent, examples: list) -> int:
failures = 0
for ex in examples:
result = agent.plan(ex['input']) # mocked LLM
if result['tool'] != ex['expected_tool']:
print(f'FAIL: expected {ex["expected_tool"]}, got {result["tool"]}')
failures += 1
return failures
# --- demo: a stub agent whose .plan() mimics an LLM's tool choice ---
class _StubAgent:
def plan(self, text):
if 'weather' in text.lower():
return {'tool': 'get_weather'}
if 'tip' in text.lower() or 'calculate' in text.lower():
return {'tool': 'wrong_tool'} # simulate a regression
return {'tool': 'unknown'}
failures = run_regressions(_StubAgent(), GOLDEN_EXAMPLES)
print(f'{failures} of {len(GOLDEN_EXAMPLES)} golden examples failed')
Temel Bir Ajan Sınama Dosyası Oluşturma
Aşağıda bir ajan için en temel pytest sınama dosyası yapısı yer almaktadır. Bu yapı, hızlı birim sınamalarını (benzetimlerle) yavaş tümleştirme sınamalarından (gerçek çağrılarla) ayırarak yalnızca ihtiyacınız olanları çalıştırmanıza olanak tanır.
# tests/test_agent.py
import pytest
# Fast unit tests — run on every commit
class TestAgentTools:
def test_tool_returns_dict(self, mock_llm):
result = my_tool(query='test')
assert isinstance(result, dict)
assert 'data' in result
def test_agent_selects_correct_tool(self, mock_llm):
response = agent.run('Search for Python tutorials')
assert response['tool_used'] == 'web_search'
# Slow integration tests — run nightly or on release
@pytest.mark.integration
class TestAgentIntegration:
def test_full_pipeline_with_real_api(self):
# Uses real OpenAI + sandboxed services
result = agent.run('Summarize the Python docs')
assert len(result['answer']) > 50Bilgi Kontrolü: Ajan Sınaması Neden Farklıdır
Yapay zekâ ajanlarını sınamanın kendine özgü zorlukları konusundaki anlayışınızı sınayın.
Özet: Aracıları Sınamak Neden Farklıdır
Yapay zekâ aracılarının sınanması, standart birim sınamalarından farklı bir bakış açısı gerektirir:
- Belirlenemezlik: Aynı girdi, geçerli ancak farklı çıktılar üretebilir
- Maliyet: Gerçek LLM çağrıları pahalıdır — birim sınamalarında bunları sahte nesnelerle değiştirin
- Gecikme: Gerçek API çağrıları saniyeler sürer — sahte nesneler milisaniyeler içinde çalışır
- Dış bağımlılıklar: Araçlar ve API'ler sınamalarda denetim altında tutulmalıdır
- Doğrulamalar: Tam dize eşleştirmesi yerine yapısal ve anlamsal denetimler kullanın
Bir sınama piramidi kullanın: sahte nesnelerle çok sayıda ucuz birim sınaması, gerçek çağrılarla daha az sayıda pahalı tümleştirme sınaması.
Sıkça Sorulan Sorular
“Aracıları Sınamak Neden Farklıdır” dersi ücretsiz mi?
Evet — “Aracıları Sınamak Neden Farklıdır” 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.
“Aracıları Sınamak Neden Farklıdır” dersinde ne öğreneceğim?
Belirsizlik, LLM maliyeti ve standart birim sınamalarının neden yetersiz kaldığı. 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.
“Aracıları Sınamak Neden Farklıdır” 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
- Aracıları Sınamak Neden Farklıdır
- Sınamalarda LLM Çağrılarını Taklit Etme
- Doğrulama Tabanlı Aracı Sınaması
- Aracı İş Akışları İçin Tümleştirme Sınamaları