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: SaturnMasalah 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 testsDependensi 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)) # TruePerangkat 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']) > 50Pemeriksaan 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
- Mengapa Pengujian Agen Berbeda
- Meniru Panggilan LLM dalam Pengujian
- Pengujian Agen Berbasis Assertion
- Pengujian Integrasi untuk Pipeline Agen