AI-promptengineering · Les

Promptprestaties in productie monitoren

Latency, kosten, kwaliteitsscores en foutpercentages per promptversie bijhouden.

Les 4 van 413 stappen

Promptprestaties in productie monitoren is een gratis AI-promptengineering-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-promptengineering. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-promptengineering bevat in totaal 4 lessen.

Waarom promptprestaties monitoren

Een prompt die naar productie is uitgerold, is niet 'af'. Het gedrag van modellen verandert door updates, invoer van gebruikers verandert na verloop van tijd en kosten kunnen onverwacht sterk stijgen. Doorlopend monitoren detecteert regressies voordat ze gebruikers schaden en houdt uitgaven voorspelbaar.

Belangrijke meetwaarden per promptversie

Houd deze vijf meetwaarden per promptversie in productie bij:

  • Gemiddelde latentie: tijd van verzoek tot volledige reactie (P50, P95, P99)
  • Kosten per aanroep: invoertokens × prijs + uitvoertokens × prijs
  • Kwaliteitsscore: geautomatiseerde evaluatie (LLM als beoordelaar of taakmeting)
  • Foutenpercentage: API-fouten + parseerfouten door misvormde uitvoer
  • Gebruikerstevredenheid: duimbeoordeling, percentage nieuwe pogingen en afgebroken sessies

Instrumentatie: meetwaarden registreren

Omring elke LLM-aanroep met instrumentatie die alle belangrijke meetwaarden registreert in een tijdreeksopslag of database voor latere analyse en signalering.

import time
import openai

client = openai.OpenAI(api_key='YOUR_API_KEY')

def instrumented_call(prompt_id, version, messages, model):
    start = time.time()
    error = False
    response = None
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages
        )
    except Exception as e:
        error = True
        raise
    finally:
        latency_ms = (time.time() - start) * 1000
        usage = response.usage if response else None
        record_metric({
            'prompt_id': prompt_id,
            'version': version,
            'latency_ms': latency_ms,
            'input_tokens': usage.prompt_tokens if usage else 0,
            'output_tokens': usage.completion_tokens if usage else 0,
            'error': error,
            'timestamp': time.time()
        })
    return response

Kosten per aanroep berekenen

Kosten per aanroep = invoertokens × invoerprijs + uitvoertokens × uitvoerprijs. Door ruwe aantallen tokens op te slaan, kun je de kosten opnieuw berekenen wanneer prijzen veranderen.

# pricing.py — model pricing table (per 1M tokens)
PRICING = {
    'gpt-4o': {'input': 2.50, 'output': 10.00},
    'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
    'claude-3-5-sonnet-20241022': {'input': 3.00, 'output': 15.00},
}

def cost_usd(model, input_tokens, output_tokens):
    p = PRICING.get(model)
    if not p:
        return None
    cost = (input_tokens / 1_000_000) * p['input'] \
         + (output_tokens / 1_000_000) * p['output']
    return round(cost, 6)

# Example
c = cost_usd('gpt-4o-mini', input_tokens=800, output_tokens=200)
print(f'Cost per call: ${c}')   # Cost per call: $0.000240

# Daily cost estimate
calls_per_day = 50_000
print(f'Daily cost: ${round(c * calls_per_day, 2)}')  # $12.00

Geautomatiseerde kwaliteitsscore

Gebruik een LLM-beoordelaar om de kwaliteit van uitvoer automatisch op productieschaal te scoren. Neem een steekproef van 5-10% van de aanroepen voor kwaliteitsscores om de kosten beheersbaar te houden.

import random

JUDGE_SAMPLE_RATE = 0.05  # score 5% of calls

JUDGE_PROMPT = '''Rate the quality of this AI response on a scale of 1-5.
1=Very poor, 3=Acceptable, 5=Excellent.
Return only the integer score.

User input: {input}
AI response: {output}'''

def maybe_score_quality(user_input, ai_output, model='gpt-4o-mini'):
    if random.random() > JUDGE_SAMPLE_RATE:
        return None  # not sampled

    judge_messages = [{'role': 'user', 'content':
        JUDGE_PROMPT.format(input=user_input, output=ai_output)}]
    response = client.chat.completions.create(
        model=model, messages=judge_messages, max_tokens=5
    )
    try:
        score = int(response.choices[0].message.content.strip())
        return max(1, min(5, score))  # clamp to 1-5
    except ValueError:
        return None

Meetwaarden opslaan in een tijdreeksdatabase

Tijdreeksdatabases (InfluxDB, TimescaleDB of zelfs een eenvoudige PostgreSQL-tabel met een tijdstempelindex) slaan meetwaarden per aanroep efficiënt op en ondersteunen aggregatiequery's voor dashboards.

-- TimescaleDB / PostgreSQL schema for prompt metrics
CREATE TABLE prompt_metrics (
  ts              TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  prompt_id       VARCHAR(100),
  version         VARCHAR(20),
  model           VARCHAR(50),
  latency_ms      FLOAT,
  input_tokens    INT,
  output_tokens   INT,
  cost_usd        FLOAT,
  quality_score   FLOAT,   -- NULL if not sampled
  error           BOOLEAN DEFAULT FALSE
);

-- Convert to hypertable (TimescaleDB)
SELECT create_hypertable('prompt_metrics', 'ts');

-- Query: hourly P95 latency by version
SELECT
  date_trunc('hour', ts) AS hour,
  version,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency_ms) AS p95_latency
FROM prompt_metrics
WHERE prompt_id = 'summarize-article'
  AND ts > NOW() - INTERVAL '24 hours'
GROUP BY 1, 2
ORDER BY 1;

Een dashboard voor meetwaarden bouwen

Dashboards tonen de vijf belangrijkste meetwaarden in realtime. Gebruik Grafana (met TimescaleDB als gegevensbron) of een aangepast webdashboard. Belangrijke panelen:

  • Latentie P50/P95/P99 in de tijd, per versie
  • Trend van kosten per aanroep (dagelijks/wekelijks)
  • Foutenpercentage
  • Voortschrijdend gemiddelde van de kwaliteitsscore
  • Score voor gebruikerstevredenheid
# Simple dashboard query aggregation in Python
def get_dashboard_stats(conn, prompt_id, hours=24):
    with conn.cursor() as cur:
        cur.execute('''
            SELECT
              version,
              COUNT(*) AS calls,
              AVG(latency_ms) AS avg_latency,
              PERCENTILE_CONT(0.95)
                WITHIN GROUP (ORDER BY latency_ms) AS p95_latency,
              AVG(cost_usd) AS avg_cost,
              AVG(quality_score) FILTER (WHERE quality_score IS NOT NULL) AS avg_quality,
              SUM(error::int)::float / COUNT(*) AS error_rate
            FROM prompt_metrics
            WHERE prompt_id = %s
              AND ts > NOW() - INTERVAL %s
            GROUP BY version
            ORDER BY MAX(ts) DESC
        ''', (prompt_id, f'{hours} hours'))
        return cur.fetchall()

Anomaliedetectie voor promptregressies

Een handmatige dashboardcontrole mist langzame regressies. Geautomatiseerde anomaliedetectie vergelijkt een voortschrijdend venster met een historische basislijn en genereert een waarschuwing wanneer de afwijking een drempelwaarde overschrijdt.

import statistics

def detect_anomaly(recent_values, baseline_values, threshold_std=2.0):
    if len(baseline_values) < 10:
        return False  # not enough data
    baseline_mean = statistics.mean(baseline_values)
    baseline_std = statistics.stdev(baseline_values)
    recent_mean = statistics.mean(recent_values)

    if baseline_std == 0:
        return False
    z_score = abs(recent_mean - baseline_mean) / baseline_std
    return z_score > threshold_std

# Example: detect quality regression
baseline_quality = [4.1, 4.0, 4.2, 4.1, 4.0, 3.9, 4.1, 4.2, 4.0, 4.1]
recent_quality   = [3.2, 3.1, 3.4, 3.0]

if detect_anomaly(recent_quality, baseline_quality):
    print('ALERT: Quality score anomaly detected!')
    # fire_pagerduty_alert(...)
else:
    print('Quality within normal range')

Waarschuwingsregels en drempelwaarden

Definieer waarschuwingsregels als code, zodat ze onder versiebeheer staan en kunnen worden beoordeeld. Veelgebruikte waarschuwingen voor promptmonitoring:

  • Foutenpercentage > 5% gedurende 5 opeenvolgende minuten
  • P95-latentie > 10 s gedurende 3 minuten
  • Kosten per dag > 2× het weekgemiddelde (kostenpiek)
  • Kwaliteitsscore daalt met > 20% ten opzichte van de basislijn
# alerts.yaml (Grafana alerting or custom)
alerts:
  - name: HighErrorRate
    condition: error_rate > 0.05
    for: 5m
    severity: critical
    message: 'Prompt {prompt_id} error rate {error_rate:.1%} exceeds 5%'

  - name: HighLatencyP95
    condition: p95_latency_ms > 10000
    for: 3m
    severity: warning
    message: 'P95 latency {p95_latency_ms}ms exceeds 10s for {prompt_id}'

  - name: CostSpike
    condition: daily_cost_usd > weekly_avg_daily_cost * 2
    for: 1h
    severity: warning
    message: 'Daily cost ${daily_cost_usd:.2f} is 2x the weekly average'

  - name: QualityRegression
    condition: rolling_quality_avg < baseline_quality_avg * 0.80
    for: 15m
    severity: critical
    message: 'Quality dropped {pct_drop:.0%} for prompt {prompt_id}'

Signalen voor gebruikerstevredenheid

Geautomatiseerde meetwaarden leggen niet alles vast. Verzamel expliciete en impliciete gebruikerssignalen als aanvulling op kwaliteitsscores:

  • Duimbeoordeling: expliciete 👍/👎 bij AI-antwoorden
  • Percentage nieuwe pogingen: de gebruiker dient dezelfde vraag onmiddellijk opnieuw in (impliciete ontevredenheid)
  • Percentage kopiëren/gebruiken: de gebruiker kopieert AI-uitvoer (impliciete tevredenheid)
  • Correctiepercentage: de gebruiker bewerkt AI-uitvoer voordat die wordt gebruikt
# feedback_collector.py
def record_feedback(prompt_id, version, call_id, signal_type, value):
    '''
    signal_type: 'thumbs' | 'retry' | 'copy' | 'edit'
    value: for thumbs: 1 (up) or -1 (down); others: 1 (occurred)
    '''
    db.execute(
        'INSERT INTO prompt_feedback '
        '(prompt_id, version, call_id, signal_type, value, ts) '
        'VALUES (%s, %s, %s, %s, %s, NOW())',
        (prompt_id, version, call_id, signal_type, value)
    )

# Aggregate satisfaction score
def satisfaction_score(prompt_id, version):
    rows = db.fetch(
        'SELECT signal_type, AVG(value) as avg_val FROM prompt_feedback '
        'WHERE prompt_id=%s AND version=%s GROUP BY signal_type',
        (prompt_id, version)
    )
    return {r['signal_type']: round(r['avg_val'], 3) for r in rows}

Vergelijkingsrapporten voor versies

Genereer bij de beslissing om een canary verder uit te rollen of terug te draaien een vergelijking naast elkaar van alle meetwaarden van de nieuwe versie en de basislijn. Dit rapport vormt de basis voor het uitrolbesluit.

def version_comparison_report(prompt_id, version_a, version_b, hours=48):
    stats_a = get_dashboard_stats_for_version(prompt_id, version_a, hours)
    stats_b = get_dashboard_stats_for_version(prompt_id, version_b, hours)

    print(f'=== Comparison: {version_a} vs {version_b} ===')
    metrics = ['avg_latency', 'p95_latency', 'avg_cost', 'avg_quality', 'error_rate']
    for m in metrics:
        va = stats_a.get(m, 0)
        vb = stats_b.get(m, 0)
        delta = vb - va
        pct = (delta / va * 100) if va else 0
        direction = '+' if delta > 0 else ''
        print(f'{m:20s}: {va:.4f} -> {vb:.4f}  ({direction}{pct:.1f}%)')

# Example output:
# avg_latency         : 1234.5000 -> 1189.2000  (-3.7%)
# p95_latency         : 3210.0000 -> 3050.0000  (-5.0%)
# avg_cost            : 0.000240 -> 0.000255  (+6.2%)
# avg_quality         : 4.1000 -> 4.3000  (+4.9%)
# error_rate          : 0.0120 -> 0.0080  (-33.3%)

Korte controle

Je wilt kwaliteitsregressies automatisch detecteren zonder dashboards handmatig te controleren. Welke aanpak bereikt dit het best?

Samenvatting van monitoring

Monitoring van prompts in productie vereist dat je vijf dimensies per versie bijhoudt:

  • Latentie (P50/P95/P99) — gebruikerservaring
  • Kosten per aanroep — financiële gezondheid
  • Kwaliteitsscore — geautomatiseerde steekproeven met een LLM-beoordelaar
  • Foutenpercentage — betrouwbaarheid
  • Gebruikerstevredenheid — duimbeoordeling, nieuwe pogingen en kopieersignalen

Sla meetwaarden op in een tijdreeksdatabase, visualiseer ze in dashboards en genereer waarschuwingen wanneer drempelwaarden worden overschreden. Vergelijkingsrapporten voor versies ondersteunen beslissingen over verdere uitrol en terugdraaien.

Gratis beginnen

Leer AI-promptengineering met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
53
Lessen
199

Veelgestelde vragen

Is de les “Promptprestaties in productie monitoren” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad AI-promptengineering, waaronder “Promptprestaties in productie monitoren”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus AI-promptengineering bevat in totaal 4 lessen.

Wat leer ik in “Promptprestaties in productie monitoren”?

Latency, kosten, kwaliteitsscores en foutpercentages per promptversie bijhouden. Je oefent met AI-promptengineering door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI-promptengineering te beginnen?

Ervaring vooraf is niet nodig. AI-promptengineering op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Promptprestaties in productie monitoren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI-promptengineering?

Ja. Elke les over AI-promptengineering bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Architectuur van een promptregister
  2. Versiebeheer voor prompts
  3. Strategieën voor deployment en rollback
  4. Promptprestaties in productie monitoren
← Terug naar AI-promptengineering