Ejen AI · Pelajaran

Mengapa Pengujian Ejen Berbeza

Ketaktentuan, kos LLM dan sebab ujian unit standard tidak mencukupi.

Pelajaran 1 daripada 413 langkah

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

Masalah 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 tests

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

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

Pemeriksaan 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.

Percuma untuk bermula

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

  1. Mengapa Pengujian Ejen Berbeza
  2. Memalsukan Panggilan LLM dalam Ujian
  3. Pengujian Ejen Berasaskan Penegasan
  4. Ujian Integrasi untuk Pipeline Ejen
← Kembali ke Ejen AI