0Pricing
AI Agents · Leçon

Pourquoi tester les agents est différent

Non-déterminisme, coût des LLM et limites des tests unitaires standard.

Pourquoi tester les agents est différent est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.

Vérifier les logiciels et vérifier les agents

Les logiciels traditionnels sont déterministes : à la même entrée correspond la même sortie. Les vérifications unitaires s’appuient sur cette propriété pour comparer les valeurs attendues exactes.

Les agents d’IA remettent en cause cette hypothèse. La même invite peut produire des résultats différents à chaque exécution, ce qui rend les approches de vérification standard insuffisantes à elles seules.

Non-déterminisme : même entrée, sortie différente

Les LLM sont probabilistes par nature. Le paramètre temperature contrôle le caractère aléatoire ; même avec temperature=0, les résultats peuvent varier selon les versions du modèle ou les changements d’infrastructure.

Cela signifie qu’une vérification d’agent réussie aujourd’hui peut échouer demain sans aucune modification du code.

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

Le problème du coût : les appels réels aux LLM sont coûteux

Exécuter une suite de vérifications qui effectue de vrais appels d’API à OpenAI ou Anthropic peut coûter plusieurs euros par exécution. Une chaîne d’intégration continue exécutant 100 vérifications × 10 itérations pourrait coûter des centaines d’euros par mois.

Il devient alors difficile d’exécuter les vérifications d’agents comme les vérifications unitaires : vous avez besoin de stratégies pour maîtriser les coûts.

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

Le problème de la latence

Les appels réels aux API de LLM prennent généralement de 2 à 20 secondes. Une suite de vérifications comprenant 50 vérifications prendrait de 100 à 1 000 secondes. Cela nuit fortement à la productivité des développeurs : un retour rapide est une valeur essentielle de bonnes vérifications.

La simulation des appels aux LLM permet d’exécuter les vérifications en quelques millisecondes.

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

Dépendances externes dans les vérifications d’agents

Les agents appellent souvent des outils externes : API de recherche, bases de données, systèmes de fichiers et outils d’extraction web. Dans les vérifications, ces dépendances peuvent :

  • Être indisponibles (panne réseau, interruption de l’API)
  • Renvoyer des données différentes à chaque exécution
  • Être soumises à des limites de débit qui bloquent les chaînes d’intégration continue

Elles doivent être contrôlées ou simulées dans les vérifications unitaires.

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

Ce que supposent les vérifications unitaires standard

Les infrastructures standard de vérification unitaire comme pytest supposent que :

  • Les vérifications sont rapides (quelques millisecondes)
  • Les vérifications sont déterministes
  • Les vérifications n’ont aucun effet de bord externe
  • Les vérifications peuvent être exécutées dans n’importe quel ordre

Les vérifications d’agents enfreignent ces quatre hypothèses, sauf si vous les concevez explicitement en conséquence.

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

La pyramide de vérification des agents

Une stratégie pratique de vérification des agents suit une structure pyramidale :

  • Vérifications unitaires (nombreuses et rapides) : vérifiez les outils et fonctions individuels avec des appels aux LLM simulés
  • Vérifications d’intégration (moins nombreuses et plus lentes) : vérifiez la chaîne de traitement de l’agent de bout en bout avec des services isolés
  • Vérifications d’évaluation (rares et coûteuses) : vérifiez la qualité des résultats avec de vrais appels aux LLM et une notation de type humain

Assertions structurelles ou sémantiques

Au lieu de rechercher une correspondance exacte entre les chaînes, les vérifications d’agents doivent utiliser des assertions structurelles (l’agent a-t-il appelé le bon outil ?) ou des contrôles sémantiques (la sortie contient-elle le concept pertinent ?).

# 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

Harnais d’évaluation et évaluation par un LLM

Pour évaluer la qualité, le secteur utilise l’évaluation par un LLM : demandez à un second LLM de noter la sortie de l’agent. Des infrastructures comme DeepEval et RAGAS automatisent cette approche.

Cette méthode est réservée aux évaluations coûteuses, et non aux chaînes d’intégration continue habituelles.

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}

Vérification des régressions pour les agents

Lorsque vous mettez à jour une invite ou modifiez la logique d’un agent, les vérifications de régression garantissent que vous n’avez pas altéré le comportement existant. Enregistrez des exemples de référence (entrée → structure attendue) et exécutez-les automatiquement à chaque validation.

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

Configurer un fichier de vérification d’agent de base

Voici la structure minimale d’un fichier de vérification pytest pour un agent. Elle sépare les vérifications unitaires rapides (avec des simulations) des vérifications d’intégration lentes (avec de vrais appels), ce qui vous permet d’exécuter uniquement celles dont vous avez besoin.

# 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

Contrôle des connaissances : pourquoi la vérification des agents est différente

Vérifiez votre compréhension des difficultés propres à la vérification des agents d’IA.

Récapitulatif : pourquoi les tests d'agents sont différents

Les tests d'agents IA nécessitent une approche différente des tests unitaires classiques :

  • Non-déterminisme : une même entrée peut produire différentes sorties valides
  • Coût : les appels réels aux LLM sont coûteux — simulez-les dans les tests unitaires
  • Latence : les appels réels aux API prennent des secondes — les simulations s'exécutent en quelques millisecondes
  • Dépendances externes : les outils et les API doivent être contrôlés dans les tests
  • Assertions : utilisez des vérifications structurelles et sémantiques plutôt qu'une correspondance exacte des chaînes

Utilisez une pyramide de tests : de nombreux tests unitaires peu coûteux avec des simulations, et moins de tests d'intégration coûteux avec de vrais appels.

Questions Fréquemment Posées

La leçon « Pourquoi tester les agents est différent » est-elle gratuite ?

Oui — le texte complet de « Pourquoi tester les agents est différent » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Pourquoi tester les agents est différent » ?

Non-déterminisme, coût des LLM et limites des tests unitaires standard. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Agents ?

Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Pourquoi tester les agents est différent » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?

Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi tester les agents est différent
  2. Simuler les appels aux LLM dans les tests
  3. Tester les agents par assertions
  4. Tests d’intégration pour les pipelines d’agents
← Retour à AI Agents