AI-promptteknik · Lektion

Övervaka promptprestanda i produktion

Följ latens, kostnad, kvalitetsmått och felfrekvens för varje promptversion.

Lektion 4 av 413 steg

Övervaka promptprestanda i produktion är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Varför övervaka promptprestanda

En prompt som har driftsatts i produktion är inte ”klar”. Modellens beteende förändras när den uppdateras, användarnas indata förändras över tid och kostnaderna kan plötsligt öka. Kontinuerlig övervakning upptäcker försämringar innan de drabbar användarna och håller kostnaderna förutsägbara.

Viktiga mått per promptversion

Följ dessa fem mått per promptversion i produktion:

  • Genomsnittlig latens: tiden från begäran tills hela svaret har kommit (P50, P95, P99)
  • Kostnad per anrop: inmatningstoken × pris + utmatningstoken × pris
  • Kvalitetspoäng: automatisk utvärdering (LLM som bedömare eller uppgiftsmått)
  • Felfrekvens: API-fel och misslyckad parsning av felaktigt formaterade svar
  • Användarnöjdhet: tummebetyg, omförsöksfrekvens och avbrutna sessioner

Instrumentering: registrera mått

Lägg instrumentering runt varje LLM-anrop så att alla viktiga mått registreras i ett tidsserielager eller en databas för senare analys och aviseringar.

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

Beräkna kostnaden per anrop

Kostnad per anrop = inmatningstoken × inmatningspris + utmatningstoken × utmatningspris. Genom att lagra råa tokenantal kan kostnaden beräknas på nytt när priserna ändras.

# 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

Automatisk kvalitetspoängsättning

Använd en LLM som bedömare för att automatiskt poängsätta svarskvaliteten i produktionsskala. Kvalitetspoängsätt 5–10 % av anropen för att hålla kostnaderna på en hanterbar nivå.

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

Lagra mått i en tidsseriedatabas

Tidsseriedatabaser (InfluxDB, TimescaleDB eller till och med en enkel PostgreSQL-tabell med ett tidsstämpelindex) lagrar mått per anrop effektivt och stöder aggregeringsfrågor för instrumentpaneler.

-- 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;

Bygg en måttinstrumentpanel

Instrumentpaneler visar de fem viktigaste måtten i realtid. Använd Grafana (med TimescaleDB som datakälla) eller en anpassad webbinstrumentpanel. Viktiga paneler:

  • Latens för P50/P95/P99 över tid, per version
  • Trend för kostnad per anrop (dagligen/veckovis)
  • Felfrekvens i procent
  • Rullande medelvärde för kvalitetspoängen
  • Användarnöjdhetspoäng
# 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()

Avvikelsedetektering för promptförsämringar

Manuell granskning av instrumentpaneler missar långsamma försämringar. Automatisk avvikelsedetektering jämför ett rullande fönster med en historisk baslinje och utlöser en avisering när avvikelsen överskrider ett tröskelvärde.

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

Aviseringsregler och tröskelvärden

Definiera aviseringsregler som kod så att de versionshanteras och kan granskas. Vanliga aviseringar för promptövervakning:

  • Felfrekvens > 5 % under 5 minuter i följd
  • P95-latens > 10 s under 3 minuter
  • Kostnad per dag > 2× veckomedelvärdet (kostnadstopp)
  • Kvalitetspoängen sjunker > 20 % från baslinjen
# 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}'

Signaler för användarnöjdhet

Automatiska mått fångar inte allt. Samla in uttryckliga och indirekta användarsignaler som komplement till kvalitetspoängen:

  • Tummebetyg: uttryckligt 👍/👎 på AI-svar
  • Omförsöksfrekvens: användaren skickar om samma fråga direkt (indirekt missnöje)
  • Kopierings-/användningsfrekvens: användaren kopierar AI-resultatet (indirekt nöjdhet)
  • Korrigeringsfrekvens: användaren redigerar AI-resultatet innan det används
# 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}

Rapporter för versionsjämförelse

När ni utvärderar om en canary-version ska lanseras eller återställas ska ni generera en jämförelse sida vid sida av alla mått för den nya versionen och baslinjen. Rapporten ligger till grund för beslutet om lansering.

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%)

Snabbkontroll

Ni vill upptäcka kvalitetsförsämringar automatiskt utan att manuellt kontrollera instrumentpaneler. Vilket angreppssätt löser detta bäst?

Sammanfattning av övervakning

Produktionsövervakning av prompts kräver att fem dimensioner följs per version:

  • Latens (P50/P95/P99) — användarupplevelse
  • Kostnad per anrop — ekonomisk hälsa
  • Kvalitetspoäng — automatisk sampling med LLM som bedömare
  • Felfrekvens — tillförlitlighet
  • Användarnöjdhet — tummebetyg, omförsök och kopieringssignaler

Lagra måtten i en tidsseriedatabas, visualisera dem i instrumentpaneler och utlös aviseringar när tröskelvärden överskrids. Rapporter för versionsjämförelse ligger till grund för beslut om lansering och återställning.

Gratis att börja

Lär dig AI-promptteknik med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
53
Lektioner
199

Vanliga frågor

Är lektionen ”Övervaka promptprestanda i produktion” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Övervaka promptprestanda i produktion”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Vad lär jag mig i ”Övervaka promptprestanda i produktion”?

Följ latens, kostnad, kvalitetsmått och felfrekvens för varje promptversion. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?

Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Övervaka promptprestanda i produktion”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?

Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Arkitektur för ett promptregister
  2. Versionshantering av prompter
  3. Strategier för driftsättning och återställning
  4. Övervaka promptprestanda i produktion
← Tillbaka till AI-promptteknik