0Pricing
AI Prompt Engineering · Lektion

Architektur einer Prompt-Registry

Prompts als versionierte Artefakte mit Metadaten und Tags speichern.

Architektur einer Prompt-Registry ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Warum eine Prompt-Registry?

Ohne Registry sind Prompts über Code, Konfigurationsdateien und das Gedächtnis der Entwickler verstreut. Eine Prompt-Registry ist eine zentrale Ablage, die jeden Prompt als versioniertes und nachverfolgbares Artefakt behandelt — genau wie Softwarecode.

Zu den Vorteilen gehören Reproduzierbarkeit, Überprüfbarkeit, die Möglichkeit zum Zurücksetzen und die Zusammenarbeit im Team.

Kernfelder eines Prompt-Artefakts

Jedes Prompt-Artefakt sollte diese Felder enthalten:

  • prompt_id — eindeutiger, stabiler Bezeichner (z. B. summarize-article)
  • version — semantische Versionszeichenfolge (z. B. 2.1.0)
  • template — der eigentliche Prompt-Text mit {variable}-Platzhaltern
  • metadata — Autor, Tags, Zielmodell, created_at, Beschreibung

Datenbankschema-Entwurf

Ein relationales Schema für eine Prompt-Registry speichert Prompts und deren Versionsverlauf in getrennten Tabellen und ermöglicht so effiziente Abfragen und Prüfungen.

-- prompts table: one row per unique prompt identity
CREATE TABLE prompts (
  prompt_id   VARCHAR(100) PRIMARY KEY,
  description TEXT,
  created_at  TIMESTAMP DEFAULT NOW()
);

-- prompt_versions table: one row per versioned artifact
CREATE TABLE prompt_versions (
  id          SERIAL PRIMARY KEY,
  prompt_id   VARCHAR(100) REFERENCES prompts(prompt_id),
  version     VARCHAR(20)  NOT NULL,
  template    TEXT         NOT NULL,
  author      VARCHAR(100),
  tags        TEXT[],
  model       VARCHAR(50),
  is_active   BOOLEAN DEFAULT FALSE,
  created_at  TIMESTAMP DEFAULT NOW(),
  UNIQUE(prompt_id, version)
);

Dateibasierter Registry-Entwurf

Für kleinere Teams verwendet eine dateibasierte Registry eine strukturierte Verzeichnisstruktur. Jeder Prompt erhält einen Ordner; jede Version wird darin als YAML- oder JSON-Datei abgelegt.

# Directory structure
prompts/
  summarize-article/
    1.0.0.yaml
    1.1.0.yaml
    latest -> 1.1.0.yaml  # symlink
  classify-sentiment/
    1.0.0.yaml

# Example: summarize-article/1.1.0.yaml
prompt_id: summarize-article
version: '1.1.0'
model: gpt-4o-mini
author: alice@company.com
tags: [summarization, articles, english]
created_at: '2024-06-01T10:00:00Z'
template: |
  Summarize the following article in {num_sentences} sentences.
  Focus on: {focus_area}.

  Article:
  {article_text}

Python-Klasse PromptRegistry

Eine einfache Python-Klasse kapselt den Datenbankzugriff und stellt klare Methoden bereit: register(), get_active() und list_versions().

import psycopg2
import json
from datetime import datetime

class PromptRegistry:
    def __init__(self, dsn):
        self.conn = psycopg2.connect(dsn)

    def register(self, prompt_id, version, template, author, tags, model):
        with self.conn.cursor() as cur:
            # Ensure prompt identity exists
            cur.execute(
                'INSERT INTO prompts (prompt_id) VALUES (%s) ON CONFLICT DO NOTHING',
                (prompt_id,)
            )
            cur.execute(
                '''INSERT INTO prompt_versions
                   (prompt_id, version, template, author, tags, model)
                   VALUES (%s, %s, %s, %s, %s, %s)''',
                (prompt_id, version, template, author, tags, model)
            )
        self.conn.commit()
        print(f'Registered {prompt_id}@{version}')

    def get_active(self, prompt_id):
        with self.conn.cursor() as cur:
            cur.execute(
                'SELECT template, version FROM prompt_versions '
                'WHERE prompt_id=%s AND is_active=TRUE LIMIT 1',
                (prompt_id,)
            )
            row = cur.fetchone()
        if not row:
            raise ValueError(f'No active version for {prompt_id}')
        return {'template': row[0], 'version': row[1]}

Tiefgehende Betrachtung des Metadatenschemas

Umfangreiche Metadaten machen die Registry über die reine Speicherung hinaus nützlich. Wichtige Metadatenfelder:

  • author — Verantwortlichkeit und Kontaktstelle
  • tags — durchsuchbare Labels wie ['production', 'summarization', 'v2']
  • model — Zielmodell (der Prompt ist möglicherweise nicht modellunabhängig)
  • changelog — für Menschen lesbare Beschreibung der Änderungen
  • test_suite — Verknüpfung mit dem Evaluationsdatensatz für diesen Prompt
# Extended metadata example
prompt_metadata = {
    'prompt_id': 'extract-key-dates',
    'version': '2.0.0',
    'author': 'bob@company.com',
    'tags': ['extraction', 'dates', 'contracts', 'production'],
    'model': 'gpt-4o',
    'changelog': 'Added support for relative dates (next quarter, end of year)',
    'test_suite': 's3://company-evals/extract-key-dates/v2-testset.jsonl',
    'created_at': '2024-07-15T09:30:00Z',
    'is_active': True
}

Template-Rendering mit Variablen

Prompt-Templates verwenden eine Platzhalter-Syntax. Die Registry erzeugt den endgültigen Prompt, indem sie Laufzeitvariablen in das Template einsetzt. Die Verwendung von Pythons str.format_map() ist sicher und unkompliziert.

class PromptRegistry:
    # ... (previous methods)

    def render(self, prompt_id, variables: dict) -> str:
        artifact = self.get_active(prompt_id)
        template = artifact['template']
        try:
            rendered = template.format_map(variables)
        except KeyError as e:
            raise ValueError(f'Missing variable {e} for prompt {prompt_id}')
        return rendered

# Usage
registry = PromptRegistry(dsn='postgresql://...')
prompt = registry.render(
    'summarize-article',
    {
        'num_sentences': 3,
        'focus_area': 'financial impact',
        'article_text': 'Apple reported record revenue of $119B...'
    }
)
print(prompt)
# Output: Summarize the following article in 3 sentences.
# Focus on: financial impact. ...

Eine Version aktivieren

In der Produktion sollte immer nur eine Version eines Prompts aktiv sein. Die Aktivierung muss atomar erfolgen: aktuelle Version deaktivieren, neue Version aktivieren — alles innerhalb einer Transaktion, um Lücken zu vermeiden.

def activate_version(self, prompt_id, version):
    with self.conn.cursor() as cur:
        # Deactivate all current versions
        cur.execute(
            'UPDATE prompt_versions SET is_active=FALSE '
            'WHERE prompt_id=%s AND is_active=TRUE',
            (prompt_id,)
        )
        # Activate target version
        cur.execute(
            'UPDATE prompt_versions SET is_active=TRUE '
            'WHERE prompt_id=%s AND version=%s',
            (prompt_id, version)
        )
        if cur.rowcount == 0:
            self.conn.rollback()
            raise ValueError(f'Version {version} not found for {prompt_id}')
    self.conn.commit()
    print(f'Activated {prompt_id}@{version}')

Prompts auflisten und suchen

Eine Registry ist nur dann nützlich, wenn Sie ihre Inhalte auffinden können. Unterstützen Sie die Suche nach Tags und listen Sie alle Versionen eines bestimmten Prompts auf.

def list_versions(self, prompt_id):
    with self.conn.cursor() as cur:
        cur.execute(
            'SELECT version, author, is_active, created_at '
            'FROM prompt_versions WHERE prompt_id=%s '
            'ORDER BY created_at DESC',
            (prompt_id,)
        )
        return cur.fetchall()

def search_by_tag(self, tag):
    with self.conn.cursor() as cur:
        cur.execute(
            'SELECT prompt_id, version, tags FROM prompt_versions '
            'WHERE %s = ANY(tags)',
            (tag,)
        )
        return cur.fetchall()

# Usage
for v in registry.list_versions('summarize-article'):
    print(v)  # ('1.1.0', 'alice', True, datetime(...))

for p in registry.search_by_tag('production'):
    print(p)  # ('summarize-article', '1.1.0', ['production', 'summarization'])

Registry-API-Endpunkte

Stellen Sie die Registry als REST-API bereit, damit alle Dienste (Backend, ML-Pipelines, Evaluierungstools) dieselbe zentrale Quelle verwenden. Zentrale Endpunkte:

  • POST /prompts/{id}/versions — neue Version registrieren
  • GET /prompts/{id}/active — aktives Template abrufen
  • PUT /prompts/{id}/activate/{version} — eine Version aktivieren
  • GET /prompts — alle Prompts mit Metadaten auflisten
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()
registry = PromptRegistry(dsn='postgresql://user:pass@localhost/prompts')

class VersionPayload(BaseModel):
    version: str
    template: str
    author: str
    tags: list
    model: str

@app.post('/prompts/{prompt_id}/versions')
def register_version(prompt_id: str, payload: VersionPayload):
    registry.register(
        prompt_id, payload.version, payload.template,
        payload.author, payload.tags, payload.model
    )
    return {'status': 'registered'}

@app.get('/prompts/{prompt_id}/active')
def get_active(prompt_id: str):
    try:
        return registry.get_active(prompt_id)
    except ValueError as e:
        raise HTTPException(404, str(e))

@app.put('/prompts/{prompt_id}/activate/{version}')
def activate(prompt_id: str, version: str):
    registry.activate_version(prompt_id, version)
    return {'status': 'activated'}

Prüfprotokoll und Änderungshistorie

Jedes Aktivierungs-, Deaktivierungs- und Registrierungsereignis sollte mit Zeitstempel und Akteur protokolliert werden. Dieses Prüfprotokoll ist für die Fehlersuche bei Vorfällen in der Produktion und zur Erfüllung von Compliance-Anforderungen unerlässlich.

CREATE TABLE prompt_audit_log (
  id          SERIAL PRIMARY KEY,
  prompt_id   VARCHAR(100),
  version     VARCHAR(20),
  action      VARCHAR(50),  -- 'registered', 'activated', 'deactivated'
  actor       VARCHAR(100), -- user or service that performed the action
  reason      TEXT,
  created_at  TIMESTAMP DEFAULT NOW()
);

-- Trigger to auto-log activations
CREATE OR REPLACE FUNCTION log_activation()
RETURNS TRIGGER AS $func$
BEGIN
  IF NEW.is_active != OLD.is_active THEN
    INSERT INTO prompt_audit_log (prompt_id, version, action)
    VALUES (NEW.prompt_id, NEW.version,
            CASE WHEN NEW.is_active THEN 'activated' ELSE 'deactivated' END);
  END IF;
  RETURN NEW;
END;
$func$ LANGUAGE plpgsql;

CREATE TRIGGER trg_activation
AFTER UPDATE ON prompt_versions
FOR EACH ROW EXECUTE FUNCTION log_activation();

Kurzcheck

Welches Feld stellt in einem Datenbankschema für eine Prompt-Registry sicher, dass zu jedem Zeitpunkt nur eine Version eines Prompts in der Produktion bereitgestellt wird?

Zusammenfassung der Registry-Architektur

Eine Prompt-Registry zentralisiert die Prompt-Verwaltung, indem sie Prompts als versionierte Artefakte behandelt. Zentrale Entwurfsentscheidungen:

  • Eine separate Identitätstabelle (prompt_id) von der Versionstabelle (version, template, metadata) trennen
  • Ein einzelnes is_active-Flag mit atomaren Wechseln verhindert Fehler durch zwei gleichzeitig aktive Versionen
  • Umfangreiche Metadaten (Autor, Tags, Modell, Änderungsprotokoll) unterstützen das Auffinden und Prüfen
  • Die REST-API-Schicht macht die Registry für alle Dienste zugänglich
  • Das Prüfprotokoll unterstützt Compliance und die Fehlersuche bei Vorfällen

Dateibasierte Registries eignen sich für kleine Teams; datenbankgestützte Registries werden für produktive Systeme mit mehreren Teams und hoher Verfügbarkeit bevorzugt.

Häufig gestellte Fragen

Ist die Lektion „Architektur einer Prompt-Registry“ kostenlos?

Ja — der vollständige Text von „Architektur einer Prompt-Registry“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Architektur einer Prompt-Registry“?

Prompts als versionierte Artefakte mit Metadaten und Tags speichern. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Prompt Engineering zu starten?

Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Architektur einer Prompt-Registry“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?

Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Architektur einer Prompt-Registry
  2. Versionskontrolle für Prompts
  3. Strategien für Deployment und Rollback
  4. Prompt-Performance in Produktion überwachen
← Zurück zu AI Prompt Engineering