AI-agenter · leksjon

Hvorfor testing av agenter er annerledes

Ikke-determinisme, LLM-kostnader og hvorfor standard enhetstester ikke strekker til.

Leksjon 1 av 413 trinn

Hvorfor testing av agenter er annerledes er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Testing av programvare kontra testing av agenter

Tradisjonell programvare er deterministisk: Gi den samme inndata, og De får samme utdata. Enhetstester bygger på denne egenskapen for å kontrollere nøyaktige forventede verdier.

AI-agenter bryter med denne antakelsen. Den samme ledeteksten kan gi ulike resultater hver gang, noe som gjør standardmetoder for testing utilstrekkelige alene.

Ikke-determinisme: Samme inndata, ulik utdata

LLM-er er i sin natur probabilistiske. Parameteren temperature styrer tilfeldigheten — selv ved temperature=0 kan resultatene variere mellom modellversjoner eller endringer i infrastrukturen.

Det betyr at en agenttest som består i dag, kan mislykkes i morgen uten at koden er endret.

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

Kostnadsproblemet: Ekte LLM-kall er dyre

Det kan koste flere dollar per kjøring å kjøre en testpakke som foretar ekte API-kall til OpenAI eller Anthropic. En CI-pipeline som kjører 100 tester × 10 iterasjoner, kan koste flere hundre dollar i måneden.

Dette gjør det upraktisk å kjøre agenttester på samme måte som enhetstester — De trenger strategier for å kontrollere kostnadene.

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

Forsinkelsesproblemet

Ekte LLM API-kall tar vanligvis 2–20 sekunder. En testpakke med 50 tester vil dermed ta 100–1000 sekunder å kjøre. Dette svekker utviklerproduktiviteten — rask tilbakemelding er en sentral egenskap ved gode tester.

Ved å late som LLM-kall kjører testene på millisekunder.

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

Eksterne avhengigheter i agenttester

Agenter kaller ofte eksterne verktøy: søke-API-er, databaser, filsystemer og webskrapere. I tester kan disse avhengighetene:

  • være utilgjengelige (nettverksbrudd eller API-nedetid)
  • returnere ulike data ved hver kjøring
  • ha hastighetsgrenser som blokkerer CI-pipelines

Disse må kontrolleres eller simuleres i enhetstester.

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

Hva standard enhetstester forutsetter

Standardrammeverk for enhetstesting, som pytest, forutsetter at:

  • testene er raske (millisekunder)
  • testene er deterministiske
  • testene ikke har eksterne bivirkninger
  • testene kan kjøres i hvilken som helst rekkefølge

Agenttester bryter med alle disse fire antakelsene med mindre De utformer dem med dette i tankene.

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

Testpyramiden for agenter

En praktisk teststrategi for agenter følger en pyramide:

  • Enhetstester (mange og raske): Test individuelle verktøy og funksjoner med simulerte LLM-kall
  • Integrasjonstester (færre og langsommere): Test agentens pipeline fra ende til ende med sandkassede tjenester
  • Evalueringstester (sjeldne og dyre): Test kvaliteten på utdata med ekte LLM-kall og poengsetting på menneskelig vis

Strukturelle kontra semantiske påstander

I stedet for å sammenligne nøyaktige strenger bør agenttester bruke strukturelle påstander (kalte agenten riktig verktøy?) eller semantiske kontroller (inneholder utdataene det relevante konseptet?).

# 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

Evalueringsrammeverk og LLM-as-judge

Til kvalitetsevaluering bruker bransjen LLM-as-judge: De ber en annen LLM om å vurdere agentens utdata. Rammeverk som DeepEval og RAGAS automatiserer denne fremgangsmåten.

Dette er forbeholdt kostbare evalueringskjøringer, ikke rutinemessig CI.

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}

Regresjonstesting av agenter

Når De oppdaterer en ledetekst eller endrer agentlogikken, kontrollerer regresjonstester at De ikke har ødelagt eksisterende atferd. Lagre gylne eksempler (inndata → forventet struktur), og kjør dem automatisk ved hver 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')

Sette opp en grunnleggende agenttestfil

Her er en minimal struktur for en pytest-testfil for en agent. Den skiller raske enhetstester (med simuleringer) fra langsomme integrasjonstester (med ekte kall), slik at De kan kjøre bare det De trenger.

# 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

Kunnskapssjekk: Hvorfor testing av agenter er annerledes

Test forståelsen Deres av de unike utfordringene ved testing av AI-agenter.

Oppsummering: Hvorfor testing av agenter er annerledes

Testing av AI-agenter krever en annen tilnærming enn vanlig enhetstesting:

  • Ikke-determinisme: Samme inndata kan gi ulike gyldige resultater
  • Kostnad: Ekte LLM-kall er dyre – bruk mocker i enhetstester
  • Forsinkelse: Ekte API-kall tar sekunder – mocker kjører på millisekunder
  • Eksterne avhengigheter: Verktøy og API-er må kontrolleres i testene
  • Assertions: Bruk strukturelle og semantiske kontroller, ikke eksakt strengsammenligning

Bruk en testpyramide: mange billige enhetstester med mocker og færre kostbare integrasjonstester med ekte kall.

Gratis å komme i gang

Lær deg AI-agenter med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
60
Leksjoner
239

Ofte stilte spørsmål

Er leksjonen «Hvorfor testing av agenter er annerledes» gratis?

Ja – hele teksten i «Hvorfor testing av agenter er annerledes» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hvorfor testing av agenter er annerledes»?

Ikke-determinisme, LLM-kostnader og hvorfor standard enhetstester ikke strekker til. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI-agenter?

Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Hvorfor testing av agenter er annerledes»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?

Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hvorfor testing av agenter er annerledes
  2. Mocke LLM-kall i tester
  3. Påstandsbasert agenttesting
  4. Integrasjonstester for agentpipelines
← Tilbake til AI-agenter