0Pricing
AI Agents · Pelajaran

Mengapa Pengujian Agen Berbeda

Nondeterminisme, biaya LLM, dan alasan unit test standar tidak memadai.

Mengapa Pengujian Agen Berbeda adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Menguji Perangkat Lunak vs. Menguji Agen

Perangkat lunak tradisional bersifat deterministik: berikan masukan yang sama dan dapatkan keluaran yang sama. Pengujian unit mengandalkan sifat ini untuk memastikan nilai yang diharapkan secara tepat.

Agen AI mematahkan asumsi ini. Perintah yang sama dapat menghasilkan keluaran yang berbeda setiap kali dijalankan, sehingga pendekatan pengujian standar saja tidak memadai.

Ketidakdeterminisan: Masukan Sama, Keluaran Berbeda

LLM pada dasarnya bersifat probabilistik. Parameter temperature mengendalikan keacakan—bahkan pada temperature=0, keluaran dapat berbeda di antara versi model atau perubahan infrastruktur.

Artinya, pengujian agen yang berhasil hari ini dapat gagal besok tanpa perubahan kode.

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: Saturn

Masalah Biaya: Panggilan LLM Nyata Mahal

Menjalankan rangkaian pengujian yang melakukan panggilan API nyata ke OpenAI atau Anthropic dapat menghabiskan biaya beberapa dolar setiap kali dijalankan. Alur kerja CI yang menjalankan 100 pengujian × 10 iterasi dapat menghabiskan biaya ratusan dolar per bulan.

Hal ini membuat pengujian agen dengan cara yang sama seperti pengujian unit menjadi tidak praktis—Anda memerlukan strategi untuk mengendalikan biaya.

# 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')

Masalah Latensi

Panggilan API LLM nyata biasanya memerlukan waktu 2–20 detik. Rangkaian pengujian dengan 50 pengujian akan memerlukan waktu 100–1.000 detik untuk dijalankan. Hal ini menghambat produktivitas pengembang—umpan balik cepat merupakan nilai utama dari pengujian yang baik.

Pemalsuan panggilan LLM membuat pengujian berjalan dalam hitungan milidetik.

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 tests

Dependensi Eksternal dalam Pengujian Agen

Agen sering memanggil alat eksternal: API pencarian, basis data, sistem berkas, dan alat pengambil data web. Dalam pengujian, dependensi ini dapat:

  • Tidak tersedia (gangguan jaringan atau API tidak aktif)
  • Mengembalikan data yang berbeda pada setiap pelaksanaan
  • Memiliki batas laju yang memblokir alur kerja CI

Dependensi ini harus dikendalikan atau dipalsukan dalam pengujian unit.

# 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')

Asumsi Pengujian Unit Standar

Kerangka kerja pengujian unit standar seperti pytest mengasumsikan bahwa:

  • Pengujian berjalan cepat (dalam hitungan milidetik)
  • Pengujian bersifat deterministik
  • Pengujian tidak memiliki efek samping eksternal
  • Pengujian dapat dijalankan dalam urutan apa pun

Pengujian agen melanggar keempat asumsi ini kecuali Anda secara eksplisit merancang sistem untuk mengatasinya.

# 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')

Piramida Pengujian untuk Agen

Strategi pengujian praktis untuk agen mengikuti bentuk piramida:

  • Pengujian unit (banyak, cepat): Uji setiap alat dan fungsi dengan panggilan LLM yang dipalsukan
  • Pengujian integrasi (lebih sedikit, lebih lambat): Uji alur kerja agen dari awal hingga akhir dengan layanan yang diisolasi
  • Pengujian evaluasi (jarang, mahal): Uji kualitas keluaran dengan panggilan LLM nyata dan penilaian ala manusia

Asersi Struktural vs. Semantik

Alih-alih mencocokkan string secara tepat, pengujian agen sebaiknya menggunakan asersi struktural (apakah agen memanggil alat yang tepat?) atau pemeriksaan semantik (apakah keluaran memuat konsep yang relevan?).

# 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))  # True

Perangkat Evaluasi dan LLM sebagai Juri

Untuk evaluasi kualitas, industri menggunakan LLM sebagai juri: minta LLM kedua menilai keluaran agen. Kerangka kerja seperti DeepEval dan RAGAS mengotomatiskan pola ini.

Pendekatan ini digunakan untuk pelaksanaan evaluasi yang mahal, bukan untuk CI rutin.

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}

Pengujian Regresi untuk Agen

Saat Anda memperbarui perintah atau mengubah logika agen, pengujian regresi memastikan bahwa perilaku yang sudah ada tidak rusak. Catat contoh acuan (masukan → struktur yang diharapkan) dan jalankan contoh tersebut secara otomatis pada setiap commit.

# 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')

Menyiapkan Berkas Pengujian Agen Dasar

Berikut struktur minimal berkas pengujian pytest untuk sebuah agen. Struktur ini memisahkan pengujian unit yang cepat (dengan mock) dari pengujian integrasi yang lambat (dengan panggilan nyata), sehingga Anda dapat menjalankan hanya pengujian yang diperlukan.

# 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']) > 50

Pemeriksaan Pemahaman: Mengapa Pengujian Agen Berbeda

Uji pemahaman Anda tentang tantangan khusus dalam menguji agen AI.

Ringkasan: Mengapa Pengujian Agen Berbeda

Pengujian agen AI memerlukan pola pikir yang berbeda dari pengujian unit standar:

  • Ketidakdeterministikan: Input yang sama dapat menghasilkan output valid yang berbeda
  • Biaya: Panggilan LLM nyata mahal — gunakan tiruan dalam pengujian unit
  • Latensi: Panggilan API nyata memerlukan waktu beberapa detik — tiruan berjalan dalam hitungan milidetik
  • Dependensi eksternal: Alat dan API harus dikendalikan dalam pengujian
  • Asersi: Gunakan pemeriksaan struktural dan semantis, bukan pencocokan teks secara persis

Gunakan piramida pengujian: banyak pengujian unit murah dengan tiruan, serta lebih sedikit pengujian integrasi yang mahal dengan panggilan nyata.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengapa Pengujian Agen Berbeda” gratis?

Ya — teks lengkap “Mengapa Pengujian Agen Berbeda” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengapa Pengujian Agen Berbeda”?

Nondeterminisme, biaya LLM, dan alasan unit test standar tidak memadai. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mengapa Pengujian Agen Berbeda” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Pengujian Agen Berbeda
  2. Meniru Panggilan LLM dalam Pengujian
  3. Pengujian Agen Berbasis Assertion
  4. Pengujian Integrasi untuk Pipeline Agen
← Kembali ke AI Agents