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}-Platzhalternmetadata— 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 registrierenGET /prompts/{id}/active— aktives Template abrufenPUT /prompts/{id}/activate/{version}— eine Version aktivierenGET /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
- Architektur einer Prompt-Registry
- Versionskontrolle für Prompts
- Strategien für Deployment und Rollback
- Prompt-Performance in Produktion überwachen