0Pricing
AI Prompt Engineering · Pelajaran

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 (misalnya summarize-article)
  • version — string versi semantik (misalnya 2.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 baru
  • GET /prompts/{id}/active — mendapatkan template aktif
  • PUT /prompts/{id}/activate/{version} — mengaktifkan suatu versi
  • GET /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_active dengan 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

  1. Arsitektur Registri Prompt
  2. Kontrol Versi untuk Prompt
  3. Strategi Penerapan dan Pemulihan Versi
  4. Memantau Kinerja Prompt dalam Produksi
← Kembali ke AI Prompt Engineering