Arsitektur Registri Prompt
Simpan prompt sebagai artefak berversi dengan metadata dan tag.
Arsitektur Registri Prompt adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Mengapa Menggunakan Prompt Registry?
Tanpa registry, prompt tersebar di dalam kode, file konfigurasi, dan ingatan pengembang. Prompt registry adalah penyimpanan terpusat yang memperlakukan setiap prompt sebagai artefak berversi dan dapat dilacak — sama seperti kode perangkat lunak.
Manfaatnya mencakup reproduktibilitas, kemampuan audit, kemampuan melakukan rollback, dan kolaborasi tim.
Kolom Inti Artefak Prompt
Setiap artefak prompt harus memiliki kolom berikut:
prompt_id— pengenal unik yang stabil (misalnyasummarize-article)version— string versi semantik (misalnya2.1.0)template— teks prompt sebenarnya dengan placeholder{variable}metadata— penulis, tag, model target, created_at, deskripsi
Desain Skema Basis Data
Skema relasional untuk prompt registry menyimpan prompt dan riwayat versinya dalam tabel terpisah, sehingga pencarian dan audit dapat dilakukan secara efisien.
-- 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)
);Desain Registry Berbasis File
Untuk tim yang lebih kecil, registry berbasis file menggunakan tata letak direktori yang terstruktur. Setiap prompt memiliki folder; setiap versi berupa file YAML atau JSON di dalamnya.
# 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}Kelas PromptRegistry Python
Kelas Python sederhana membungkus akses basis data dan menyediakan metode yang rapi: register(), get_active(), dan 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]}Pendalaman Skema Metadata
Metadata yang kaya membuat registry berguna, bukan sekadar untuk penyimpanan sederhana. Kolom metadata utama:
- author — akuntabilitas dan kontak
- tags — label yang dapat dicari seperti
['production', 'summarization', 'v2'] - model — model target (prompt mungkin tidak agnostik terhadap model)
- changelog — deskripsi yang mudah dipahami manusia tentang perubahan yang dilakukan
- test_suite — tautan ke kumpulan data evaluasi untuk prompt ini
# 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
}Perenderan Template dengan Variabel
Template prompt menggunakan sintaks placeholder. Registry merender prompt akhir dengan mengganti variabel runtime ke dalam template. Penggunaan str.format_map() milik Python aman dan sederhana.
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. ...Mengaktifkan Versi
Dalam produksi, hanya satu versi prompt yang boleh aktif pada satu waktu. Aktivasi harus bersifat atomik: menonaktifkan versi saat ini lalu mengaktifkan versi baru — semuanya dalam satu transaksi agar tidak terjadi kekosongan.
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}')Mencantumkan dan Mencari Prompt
Registry hanya berguna jika Anda dapat menemukan isinya. Dukung pencarian berbasis tag dan pencantuman semua versi dari prompt tertentu.
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'])Titik Akhir API Registry
Sediakan registry sebagai API REST agar semua layanan (backend, pipeline ML, alat evaluasi) menggunakan sumber kebenaran yang sama. Titik akhir utama:
POST /prompts/{id}/versions— mendaftarkan versi baruGET /prompts/{id}/active— mendapatkan template aktifPUT /prompts/{id}/activate/{version}— mengaktifkan suatu versiGET /prompts— mencantumkan semua prompt beserta metadata
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'}Log Audit dan Riwayat Perubahan
Setiap peristiwa aktivasi, penonaktifan, dan pendaftaran harus dicatat bersama stempel waktu dan pelakunya. Jejak audit ini penting untuk men-debug insiden produksi dan memenuhi persyaratan kepatuhan.
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();Pemeriksaan Singkat
Dalam skema basis data prompt registry, kolom mana yang memastikan hanya satu versi prompt yang disajikan dalam produksi pada waktu tertentu?
Ringkasan Arsitektur Registry
Prompt registry memusatkan pengelolaan prompt dengan memperlakukan prompt sebagai artefak berversi. Keputusan desain utama:
- Pisahkan tabel identitas (prompt_id) dari tabel versi (version, template, metadata)
- Satu flag
is_activedengan pertukaran atomik mencegah bug dua versi aktif - Metadata yang kaya (penulis, tag, model, changelog) mendukung penemuan dan audit
- Lapisan API REST membuat registry dapat diakses oleh semua layanan
- Log audit mendukung kepatuhan dan penelusuran insiden
Registry berbasis file cocok untuk tim kecil; registry yang didukung basis data lebih disarankan untuk sistem produksi lintas tim dengan ketersediaan tinggi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Arsitektur Registri Prompt” gratis?
Ya — teks lengkap “Arsitektur Registri Prompt” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Arsitektur Registri Prompt”?
Simpan prompt sebagai artefak berversi dengan metadata dan tag. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Arsitektur Registri Prompt” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Arsitektur Registri Prompt
- Kontrol Versi untuk Prompt
- Strategi Penerapan dan Pemulihan Versi
- Memantau Kinerja Prompt dalam Produksi