AI-prompt engineering · leksjon

Overvåke promptytelse i produksjon

Sporing av forsinkelse, kostnad, kvalitetspoeng og feilrate per promptversjon.

Leksjon 4 av 413 trinn

Overvåke promptytelse i produksjon er en gratis leksjon i AI-prompt engineering på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-prompt engineering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.

Hvorfor overvåke promptytelse?

En prompt som er rullet ut til produksjon, er ikke «ferdig». Modellens atferd endrer seg med oppdateringer, brukerinndata endres over tid, og kostnadene kan plutselig øke. Kontinuerlig overvåking oppdager regresjoner før de skader brukerne, og holder kostnadene forutsigbare.

Nøkkelmålinger per promptversjon

Følg med på disse fem målingene for hver promptversjon i produksjon:

  • Gjennomsnittlig latenstid: tiden fra forespørselen sendes til hele svaret er mottatt (P50, P95, P99)
  • Kostnad per kall: inndatatokener × pris + utdata-tokener × pris
  • Kvalitetspoeng: automatisert evaluering (LLM-vurdering eller oppgavemåling)
  • Feilrate: API-feil + feil ved parsing av ugyldige svar
  • Brukertilfredshet: tommelvurdering, andel nye forsøk og avbrutte økter

Instrumentering: Registrering av målinger

Omslutt hvert LLM-kall med instrumentering som registrerer alle nøkkelmålinger i et tidsserielager eller en database for senere analyse og varsling.

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

Beregning av kostnad per kall

Kostnad per kall = inndatatokener × inndatapris + utdata-tokener × utdatapris. Ved å lagre de rå token-antallene kan kostnaden beregnes på nytt når prisene endres.

# 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 kvalitetsvurdering

Bruk en LLM-vurderer til å poengsette kvaliteten på svar automatisk i produksjonsskala. Ta et utvalg på 5–10 % av kallene til kvalitetsvurdering, slik at kostnadene holdes på et håndterbart 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

Lagring av målinger i en tidsseriedatabase

Tidsseriedatabaser (InfluxDB, TimescaleDB eller til og med en enkel PostgreSQL-tabell med en tidsstempelindeks) lagrer målinger per kall effektivt og støtter aggregeringsspørringer for dashbord.

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

Bygging av et målingsdashbord

Dashbord viser de fem nøkkelmålingene i sanntid. Bruk Grafana (med TimescaleDB som datakilde) eller et tilpasset webdashbord. Viktige paneler:

  • Latenstid for P50/P95/P99 over tid, per versjon
  • Utvikling i kostnad per kall (daglig/ukentlig)
  • Feilrate i prosent
  • Rullerende gjennomsnitt for kvalitetspoeng
  • Brukertilfredshetspoeng
# 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()

Avviksdeteksjon for promptregresjoner

Manuell gjennomgang av dashbord overser langsomme regresjoner. Automatisk avviksdeteksjon sammenligner et rullerende tidsvindu med en historisk referanse og utløser et varsel når avviket overskrider en terskelverdi.

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

Varslingsregler og terskelverdier

Definer varslingsregler som kode, slik at de kan versjonskontrolleres og gjennomgås. Vanlige varsler for promptovervåking:

  • Feilrate > 5 % i 5 sammenhengende minutter
  • P95-latenstid > 10 s i 3 minutter
  • Kostnad per dag > 2× ukentlig gjennomsnitt (kostnadstopp)
  • Kvalitetspoeng faller > 20 % fra referansen
# 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 på brukertilfredshet

Automatiserte målinger fanger ikke opp alt. Samle inn eksplisitte og implisitte brukersignaler som supplement til kvalitetspoengene:

  • Tommelvurdering: eksplisitt 👍/👎 på AI-svar
  • Andel nye forsøk: brukeren sender inn samme spørsmål på nytt umiddelbart (implisitt misnøye)
  • Kopierings-/bruksrate: brukeren kopierer AI-utdata (implisitt tilfredshet)
  • Korrigeringsrate: brukeren redigerer AI-utdata før det tas i bruk
# 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 for sammenligning av versjoner

Når det vurderes om en canary-versjon skal fremmes eller rulles tilbake, skal det genereres en side-ved-side-sammenligning av alle målinger mellom den nye versjonen og referansen. Denne rapporten danner grunnlaget for beslutningen om å fremme versjonen.

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

Hurtigsjekk

Det skal oppdages kvalitetsregresjoner automatisk uten manuell kontroll av dashbord. Hvilken tilnærming oppnår dette best?

Sammendrag av overvåking

Overvåking av prompter i produksjon krever at fem dimensjoner følges opp for hver versjon:

  • Latenstid (P50/P95/P99) — brukeropplevelse
  • Kostnad per kall — økonomisk kontroll
  • Kvalitetspoeng — automatisert utvalgsbasert LLM-vurdering
  • Feilrate — pålitelighet
  • Brukertilfredshet — tommelvurdering samt signaler fra nye forsøk og kopiering

Lagre målingene i en tidsseriedatabase, visualiser dem i dashbord, og send varsler når terskelverdier overskrides. Rapporter for sammenligning av versjoner danner grunnlaget for beslutninger om å fremme eller rulle tilbake versjoner.

Gratis å komme i gang

Lær deg AI-prompt engineering 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
53
Leksjoner
199

Ofte stilte spørsmål

Er leksjonen «Overvåke promptytelse i produksjon» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien AI-prompt engineering, inkludert «Overvåke promptytelse i produksjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.

Hva lærer jeg i «Overvåke promptytelse i produksjon»?

Sporing av forsinkelse, kostnad, kvalitetspoeng og feilrate per promptversjon. Du øver på AI-prompt engineering 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-prompt engineering?

Ingen tidligere erfaring er nødvendig. AI-prompt engineering 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 4 av 4.

Hvor lang tid tar leksjonen «Overvåke promptytelse i produksjon»?

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-prompt engineering-leksjonen?

Ja. Alle AI-prompt engineering-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. Arkitektur for et promptregister
  2. Versjonskontroll for prompter
  3. Strategier for utrulling og tilbakerulling
  4. Overvåke promptytelse i produksjon
← Tilbake til AI-prompt engineering