AI Agents · Ders

Sınamalarda LLM Çağrılarını Taklit Etme

unittest.mock, pytest fikstürleri ve LLM yanıtlarını kaydetme/yeniden oynatma.

2. ders / 413 adım

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 made

pytest'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 it

vcr.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 None

Sahte 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 None

conftest.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_search

Bilgi 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_calls alanlarıyla araç çağrılarını sahteleyin
  • Sahte nesneleri sınamalar arasında paylaşmak için pytest fixture'larını ve conftest.py dosyasını kullanın
  • Daha sade bir söz dizimi için pytest-mock kullanın
  • Gerçek HTTP etkileşimlerini kaydetmek ve yeniden oynatmak için vcrpy kullanın

Sahte nesneler, hızlı ve bakımı kolay bir aracı sınama paketinin temelidir.

Başlamak ücretsiz

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

  1. Aracıları Sınamak Neden Farklıdır
  2. Sınamalarda LLM Çağrılarını Taklit Etme
  3. Doğrulama Tabanlı Aracı Sınaması
  4. Aracı İş Akışları İçin Tümleştirme Sınamaları
← AI Agents Sayfasına Dön