Mengapa Pengujian Ejen Berbeza
Ketaktentuan, kos LLM dan sebab ujian unit standard tidak mencukupi.
Mengapa Pengujian Ejen Berbeza ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Menguji Perisian berbanding Menguji Agen
Perisian tradisional bersifat deterministik: berikan masukan yang sama dan dapatkan keluaran yang sama. Ujian unit bergantung pada sifat ini untuk menegaskan nilai yang dijangka dengan tepat.
Agen AI mematahkan andaian ini. Gesaan yang sama boleh menghasilkan keluaran yang berbeza pada setiap pelaksanaan, menyebabkan pendekatan ujian standard tidak mencukupi jika digunakan sendirian.
Ketakdeterministikan: Masukan Sama, Keluaran Berbeza
LLM secara semula jadi bersifat kebarangkalian. Parameter temperature mengawal kerawakan — walaupun pada temperature=0, keluaran boleh berbeza antara versi model atau perubahan infrastruktur.
Ini bermakna ujian agen yang lulus hari ini mungkin gagal esok tanpa sebarang perubahan kod.
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 Kos: Panggilan LLM Sebenar Mahal
Menjalankan rangkaian ujian yang membuat panggilan API sebenar kepada OpenAI atau Anthropic boleh menelan belanja beberapa dolar bagi setiap pelaksanaan. Aliran kerja CI yang menjalankan 100 ujian × 10 lelaran boleh menelan kos ratusan dolar sebulan.
Hal ini menjadikan ujian agen dengan cara yang sama seperti ujian unit tidak praktikal — Anda memerlukan strategi untuk mengawal kos.
# 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 Kependaman
Panggilan API LLM sebenar biasanya mengambil masa 2-20 saat. Rangkaian ujian dengan 50 ujian akan mengambil masa 100-1000 saat untuk dijalankan. Keadaan ini menjejaskan produktiviti pembangun — maklum balas pantas ialah nilai teras ujian yang baik.
Meniru panggilan LLM membolehkan ujian dijalankan dalam unit milisaat.
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 testsKebergantungan Luaran dalam Ujian Agen
Agen sering memanggil alat luaran seperti API carian, pangkalan data, sistem fail dan pengikis web. Dalam ujian, kebergantungan ini boleh:
- Tidak tersedia (gangguan rangkaian, masa henti API)
- Mengembalikan data yang berbeza pada setiap pelaksanaan
- Mempunyai had kadar yang menyekat aliran kerja CI
Kebergantungan ini mesti dikawal atau ditiru dalam ujian 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')Andaian Ujian Unit Standard
Rangka kerja ujian unit standard seperti pytest mengandaikan bahawa:
- Ujian adalah pantas (milisaat)
- Ujian bersifat deterministik
- Ujian tidak mempunyai kesan sampingan luaran
- Ujian boleh dijalankan dalam apa-apa susunan
Ujian agen melanggar keempat-empat andaian ini kecuali Anda mereka bentuknya secara khusus 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')Piramid Ujian untuk Agen
Strategi ujian yang praktikal untuk agen mengikuti bentuk piramid:
- Ujian unit (banyak, pantas): Uji alat dan fungsi individu dengan panggilan LLM yang ditiru
- Ujian penyepaduan (lebih sedikit, lebih perlahan): Uji aliran kerja agen dari hujung ke hujung dengan perkhidmatan berkotak pasir
- Ujian penilaian (jarang, mahal): Uji kualiti keluaran dengan panggilan LLM sebenar dan pemarkahan seperti manusia
Pernyataan Struktur berbanding Semantik
Daripada memadankan rentetan dengan tepat, ujian agen hendaklah menggunakan pernyataan struktur (adakah agen memanggil alat yang betul?) atau semakan semantik (adakah keluaran mengandungi konsep yang berkaitan?).
# 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)) # TrueAbah-abah Penilaian dan LLM sebagai Hakim
Untuk penilaian kualiti, industri menggunakan LLM sebagai hakim: minta LLM kedua menilai keluaran agen. Rangka kerja seperti DeepEval dan RAGAS mengautomatikkan corak ini.
Kaedah ini dikhaskan untuk pelaksanaan penilaian yang mahal, bukan 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}Ujian Regresi untuk Agen
Apabila Anda mengemas kini gesaan atau mengubah logik agen, ujian regresi mengesahkan bahawa Anda tidak merosakkan tingkah laku sedia ada. Rekodkan contoh piawai (masukan → struktur yang dijangka) dan jalankannya secara automatik pada setiap komit.
# 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')
Menyediakan Fail Ujian Agen Asas
Berikut ialah struktur minimum fail ujian pytest untuk sebuah agen. Struktur ini memisahkan ujian unit pantas (dengan tiruan) daripada ujian penyepaduan perlahan (dengan panggilan sebenar), supaya Anda boleh menjalankan hanya perkara 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 Pengetahuan: Mengapa Ujian Agen Berbeza
Uji pemahaman Anda tentang cabaran unik dalam menguji agen AI.
Imbas Kembali: Mengapa Pengujian Ejen Berbeza
Pengujian ejen AI memerlukan pendekatan yang berbeza daripada pengujian unit standard:
- Ketidakdeterministikan: Masukan yang sama boleh menghasilkan keluaran sah yang berbeza
- Kos: Panggilan LLM sebenar mahal — gunakan olokan dalam ujian unit
- Kependaman: Panggilan API sebenar mengambil masa beberapa saat — olokan berjalan dalam beberapa milisaat
- Kebergantungan luaran: Alat dan API mesti dikawal dalam ujian
- Penegasan: Gunakan pemeriksaan struktur dan semantik, bukan padanan rentetan tepat
Gunakan piramid pengujian: banyak ujian unit murah dengan olokan, dan lebih sedikit ujian integrasi mahal dengan panggilan sebenar.
Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 60
- Pelajaran
- 239
Soalan Lazim
Adakah pelajaran “Mengapa Pengujian Ejen Berbeza” percuma?
Ya — teks penuh “Mengapa Pengujian Ejen Berbeza” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengapa Pengujian Ejen Berbeza”?
Ketaktentuan, kos LLM dan sebab ujian unit standard tidak mencukupi. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Mengapa Pengujian Ejen Berbeza” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?
Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengapa Pengujian Ejen Berbeza
- Memalsukan Panggilan LLM dalam Ujian
- Pengujian Ejen Berasaskan Penegasan
- Ujian Integrasi untuk Pipeline Ejen