Sınamalarda LLM Çağrılarını Taklit Etme
unittest.mock, pytest fikstürleri ve LLM yanıtlarını kaydetme/yeniden oynatma.
Sınamalarda LLM Çağrılarını Taklit Etme, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. 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.
Sahteleme Nedir?
Sahteleme, gerçek bir işlevi veya nesneyi denetimli yanıtlar döndüren sahte bir sürümle değiştirir. Aracı sınamalarında LLM API çağrılarını sahte nesnelerle değiştirerek sınamaların anında çalışmasını, hiçbir maliyet oluşturmamasını ve öngörülebilir sonuçlar üretmesini sağlarız.
Python'un unittest.mock modülü bunun için standart araçtır.
unittest.mock.patch() Temelleri
unittest.mock.patch(target), bir sınama süresince adı verilen nesneyi geçici olarak değiştirir. target, sınanan modüle aktarılmış hâliyle nesneyi gösteren noktalı bir dizedir.
from unittest.mock import patch, MagicMock
# The function under test calls openai.chat.completions.create
# We patch it so no real API call is made
def ask_llm(question: str) -> str:
import openai
client = openai.OpenAI(api_key='test')
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': question}]
)
return resp.choices[0].message.content
with patch('openai.OpenAI') as mock_client_class:
mock_instance = MagicMock()
mock_client_class.return_value = mock_instance
mock_instance.chat.completions.create.return_value = MagicMock(
choices=[MagicMock(message=MagicMock(content='Paris'))]
)
result = ask_llm('Capital of France?')
print(result) # 'Paris' — no API call madepytest'te patch Dekoratör Olarak Kullanımı
pytest ile dekoratör olarak kullanıldığında @patch(), sahte nesneyi bir işlev parametresi olarak ekler. Sınama tamamlandıktan sonra sahte nesne otomatik olarak kaldırılır.
from unittest.mock import patch, MagicMock
import pytest
# Assume agent.py contains: import openai; client = openai.OpenAI(...)
@patch('agent.openai.OpenAI')
def test_agent_calls_llm(mock_openai_class):
# Set up the mock chain
mock_client = MagicMock()
mock_openai_class.return_value = mock_client
mock_client.chat.completions.create.return_value = MagicMock(
choices=[MagicMock(message=MagicMock(content='Paris is the capital of France.'))]
)
from agent import ask_llm
result = ask_llm('What is the capital of France?')
assert 'Paris' in result
mock_client.chat.completions.create.assert_called_once()Yeniden Kullanılabilir Sahte Yanıt Oluşturma
Sahte yanıt nesnelerini elle oluşturmak gereksiz yere uzun kod yazmayı gerektirir. OpenAI SDK'sinin yanıt biçimiyle eşleşen, doğru yapılandırılmış sahte nesneler oluşturmak için bir yardımcı işlev tanımlayın.
from unittest.mock import MagicMock
def make_mock_response(content: str, tool_calls: list = None) -> MagicMock:
message = MagicMock()
message.content = content
message.tool_calls = tool_calls or []
choice = MagicMock()
choice.message = message
choice.finish_reason = 'stop' if not tool_calls else 'tool_calls'
response = MagicMock()
response.choices = [choice]
response.usage = MagicMock(total_tokens=42)
return response
# Usage in tests:
# mock_create.return_value = make_mock_response('Hello!')
# mock_create.return_value = make_mock_response('', tool_calls=[...])
# --- demo ---
response = make_mock_response('The weather in Paris is 18C and sunny.')
print('content:', response.choices[0].message.content)
print('finish_reason:', response.choices[0].finish_reason)
print('total_tokens:', response.usage.total_tokens)
Yanıtlardaki Araç Çağrılarını Sahteleme
Bir aracının araç çağırma mantığını sınarken, sahte yanıt doğru ayrıştırılabilmesi için uygun yapıda bir tool_calls alanı içermelidir.
import json
from unittest.mock import MagicMock
def make_tool_call_response(tool_name: str, arguments: dict) -> MagicMock:
tool_call = MagicMock()
tool_call.id = 'call_abc123'
tool_call.type = 'function'
tool_call.function = MagicMock()
tool_call.function.name = tool_name
tool_call.function.arguments = json.dumps(arguments)
message = MagicMock()
message.content = None
message.tool_calls = [tool_call]
response = MagicMock()
response.choices = [MagicMock(message=message, finish_reason='tool_calls')]
return response
# mock.return_value = make_tool_call_response('search_web', {'query': 'Python tutorials'})
# --- demo ---
response = make_tool_call_response('search_web', {'query': 'Python tutorials'})
call = response.choices[0].message.tool_calls[0]
print('tool name:', call.function.name)
print('tool arguments:', call.function.arguments)
print('finish_reason:', response.choices[0].finish_reason)
Sahteleme için pytest Fixture'ları
pytest fixture'ları yeniden kullanılabilir kurulum kodu tanımlamanızı sağlar. LLM istemcisini değiştiren ve bunu isteyen tüm sınamalara sağlayan bir fixture oluşturun — tekrara gerek kalmaz.
import pytest
from unittest.mock import patch, MagicMock
@pytest.fixture
def mock_openai(make_mock_response):
with patch('myagent.client.chat.completions.create') as mock_create:
mock_create.return_value = MagicMock(
choices=[MagicMock(message=MagicMock(
content='Default mocked response',
tool_calls=[]
))]
)
yield mock_create
# Now any test can use it:
def test_agent_responds(mock_openai):
from myagent import agent
result = agent.run('Hello')
assert result is not None
mock_openai.assert_called_once()pytest-mock'tan mocker Fixture'ı
pytest-mock, yama uygulamayı kolaylaştıran bir mocker fixture'ı sağlar. Sahte nesneleri otomatik olarak temizler ve ham unittest.mock.patch kullanımından daha sade bir söz dizimi sunar.
# pip install pytest-mock
# In your test file:
def test_agent_with_mocker(mocker):
mock_create = mocker.patch('myagent.client.chat.completions.create')
mock_create.return_value = mocker.MagicMock(
choices=[mocker.MagicMock(message=mocker.MagicMock(
content='Mocked answer',
tool_calls=[]
))]
)
from myagent import agent
result = agent.run('What is 2+2?')
assert 'answer' in result.lower() or '4' in result
mock_create.assert_called_once()
# No cleanup needed — mocker handles itvcr.py ile Kaydetme ve Yeniden Oynatma
vcrpy, ilk çalıştırmada gerçek HTTP etkileşimlerini bir "kaset" dosyasına kaydeder, sonraki çalıştırmalarda ise bunları yeniden oynatır. Bu yöntem, SDK yerine ham HTTP API'sini kullanan kodları sınamak için idealdir.
# pip install vcrpy
import vcr
import httpx
@vcr.use_cassette('fixtures/cassettes/openai_chat.yaml')
def test_with_recorded_response():
# First run: makes a real HTTP call and records it
# Subsequent runs: uses the recorded cassette (no network, no cost)
response = httpx.post(
'https://api.openai.com/v1/chat/completions',
json={'model': 'gpt-4o-mini', 'messages': [{'role': 'user', 'content': 'Hello'}]},
headers={'Authorization': 'Bearer YOUR_KEY'}
)
data = response.json()
assert data['choices'][0]['message']['content'] is not NoneSahte Nesnenin Doğru Çağrıldığını Doğrulama
Bir sınamadan sonra sahte nesnenin doğru bağımsız değişkenlerle çağrıldığını doğrulayın. Bu, aracının yanlış modeli, eksik parametreleri veya hatalı iletileri gönderdiği hataları yakalar.
from unittest.mock import patch, MagicMock, call
@patch('myagent.client.chat.completions.create')
def test_agent_sends_correct_model(mock_create):
mock_create.return_value = MagicMock(
choices=[MagicMock(message=MagicMock(content='ok', tool_calls=[]))]
)
from myagent import agent
agent.run('Hello')
# Verify the mock was called with correct arguments
mock_create.assert_called_once()
call_kwargs = mock_create.call_args.kwargs
assert call_kwargs['model'] == 'gpt-4o-mini'
assert len(call_kwargs['messages']) >= 1
assert call_kwargs['messages'][0]['role'] == 'system'Sınamalarda API Hatalarını Benzeştirme
Sahte nesneyi istisnalar oluşturacak şekilde yapılandırarak aracınızın LLM hatalarını nasıl ele aldığını sınayın. Böylece gerçek API hatalarına neden olmadan hata işleme ve yeniden deneme mantığınızı doğrulayabilirsiniz.
from unittest.mock import patch
import openai
@patch('myagent.client.chat.completions.create')
def test_agent_handles_rate_limit(mock_create):
# Simulate a rate limit error
mock_create.side_effect = openai.RateLimitError(
message='Rate limit exceeded',
response=None,
body=None
)
from myagent import agent
result = agent.run('Hello')
# Agent should handle this gracefully
assert result['error'] == 'rate_limit'
# or
assert result['retry_after'] is not Noneconftest.py'de Sahte Fixture'larını Düzenleme
Paylaşılan fixture'ları sınama dizininizin kökündeki conftest.py dosyasına yerleştirin. pytest bu dosyayı otomatik olarak bulur ve fixture'ları içe aktarmaya gerek kalmadan tüm sınama dosyalarında kullanılabilir hâle getirir.
# tests/conftest.py
import pytest
from unittest.mock import patch, MagicMock
@pytest.fixture(autouse=False)
def mock_llm():
with patch('myagent.client.chat.completions.create') as mock_create:
mock_create.return_value = MagicMock(
choices=[MagicMock(message=MagicMock(
content='Test response',
tool_calls=[]
))]
)
yield mock_create
@pytest.fixture
def mock_search_tool():
with patch('myagent.tools.search_web') as mock_search:
mock_search.return_value = [{'title': 'Test', 'url': 'https://example.com'}]
yield mock_searchBilgi Denetimi: LLM Çağrılarını Sahteleme
Aracı sınamalarında sahteleme tekniklerini anlayıp anlamadığınızı sınayın.
Özet: Sınamalarda LLM Çağrılarını Sahteleme
Artık hızlı ve güvenilir aracı birim sınamaları yazmak için gereken araçlara sahipsiniz:
- LLM istemcilerini sahte nesnelerle değiştirmek için
unittest.mock.patch()kullanın - SDK'nin yanıt biçimiyle eşleşen, yeniden kullanılabilir sahte yanıt yardımcıları oluşturun
- Uygun yapıya sahip
tool_callsalanlarıyla araç çağrılarını sahteleyin - Sahte nesneleri sınamalar arasında paylaşmak için pytest fixture'larını ve
conftest.pydosyasını kullanın - Daha sade bir söz dizimi için
pytest-mockkullanın - Gerçek HTTP etkileşimlerini kaydetmek ve yeniden oynatmak için
vcrpykullanın
Sahte nesneler, hızlı ve bakımı kolay bir aracı sınama paketinin temelidir.
Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 60
- Dersler
- 239
Sıkça Sorulan Sorular
“Sınamalarda LLM Çağrılarını Taklit Etme” dersi ücretsiz mi?
Evet — “Sınamalarda LLM Çağrılarını Taklit Etme” 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.
“Sınamalarda LLM Çağrılarını Taklit Etme” dersinde ne öğreneceğim?
unittest.mock, pytest fikstürleri ve LLM yanıtlarını kaydetme/yeniden oynatma. 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 2. dersidir.
“Sınamalarda LLM Çağrılarını Taklit Etme” 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ı