0Pricing
AI Prompt Engineering · Ders

İstem Kayıt Defteri Mimarisi

İstemleri üst veriler ve etiketlerle sürümlenmiş yapıtlar olarak saklama.

İstem Kayıt Defteri Mimarisi, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

Neden İstem Kayıt Defteri?

Bir kayıt defteri olmadığında istemler kodlara, yapılandırma dosyalarına ve geliştiricilerin belleğine dağılmış halde bulunur. İstem kayıt defteri, her istemi tıpkı yazılım kodu gibi sürümlenen ve izlenebilen bir yapıt olarak ele alan merkezi bir depodur.

Yararları arasında yeniden üretilebilirlik, denetlenebilirlik, geri alma olanağı ve ekip iş birliği bulunur.

Temel İstem Yapıtı Alanları

Her istem yapıtı şu alanları taşımalıdır:

  • prompt_id — benzersiz ve değişmez tanımlayıcı (ör. summarize-article)
  • version — anlamsal sürüm dizesi (ör. 2.1.0)
  • template — {variable} yer tutucularını içeren gerçek istem metni
  • metadata — yazar, etiketler, hedef model, oluşturulma zamanı, açıklama

Veritabanı Şeması Tasarımı

Bir istem kayıt defteri için ilişkisel şema, istemleri ve sürüm geçmişlerini ayrı tablolarda depolayarak verimli aramalara ve denetimlere olanak tanır.

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

Dosya Tabanlı Kayıt Defteri Tasarımı

Daha küçük ekipler için dosya tabanlı bir kayıt defteri, yapılandırılmış bir dizin düzeni kullanır. Her istem bir klasör alır; her sürüm de bu klasörün içindeki bir YAML veya JSON dosyasıdır.

# 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 PromptRegistry Sınıfı

Basit bir Python sınıfı, veritabanı erişimini kapsüller ve temiz yöntemler sunar: register(), get_active() ve 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]}

Üstveri Şemasına Derinlemesine Bakış

Zengin üstveri, kayıt defterini basit bir depolama alanının ötesinde kullanışlı kılar. Temel üstveri alanları:

  • author — sorumluluk ve iletişim noktası
  • tags — ['production', 'summarization', 'v2'] gibi aranabilir etiketler
  • model — hedef model (istem modelden bağımsız olmayabilir)
  • changelog — neyin değiştiğini açıklayan, insanların okuyabileceği açıklama
  • test_suite — bu isteme ait değerlendirme veri kümesine bağlantı
# 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
}

Değişkenlerle Şablon Oluşturma

İstem şablonları yer tutucu söz dizimini kullanır. Kayıt defteri, çalışma zamanı değişkenlerini şablona yerleştirerek son istemi oluşturur. Python'daki str.format_map() kullanımı güvenli ve basittir.

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

Bir Sürümü Etkinleştirme

Üretimde bir istemin aynı anda yalnızca bir sürümü etkin olmalıdır. Etkinleştirme atomik olmalıdır: boşluk oluşmasını önlemek için mevcut sürümü devre dışı bırakıp yenisini etkinleştirme işlemlerinin tümü tek bir işlem içinde yapılmalıdır.

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

İstemleri Listeleme ve Arama

Bir kayıt defteri, içeriğini keşfedemediğiniz sürece kullanışlı değildir. Etiket tabanlı aramayı ve belirli bir istemin tüm sürümlerini listelemeyi destekleyin.

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

Kayıt Defteri API Uç Noktaları

Kayıt defterini bir REST API olarak sunun; böylece tüm hizmetler (arka uç, makine öğrenimi işlem hatları, değerlendirme araçları) aynı doğru bilgi kaynağını paylaşsın. Temel uç noktalar:

  • POST /prompts/{id}/versions — yeni sürüm kaydetme
  • GET /prompts/{id}/active — etkin şablonu alma
  • PUT /prompts/{id}/activate/{version} — bir sürümü etkinleştirme
  • GET /prompts — tüm istemleri üstverileriyle listeleme
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'}

Denetim Günlüğü ve Değişiklik Geçmişi

Her etkinleştirme, devre dışı bırakma ve kaydetme olayı zaman damgası ve işlemi gerçekleştiren kişiyle birlikte kayda geçirilmelidir. Bu denetim izi, üretim olaylarında hata ayıklamak ve uyumluluk gereksinimlerini karşılamak için zorunludur.

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

Kısa Yoklama

Bir istem kayıt defteri veritabanı şemasında, herhangi bir anda üretimde bir istemin yalnızca bir sürümünün sunulmasını hangi alan sağlar?

Kayıt Defteri Mimarisi Özeti

Bir istem kayıt defteri, istemleri sürümlenen yapıtlar olarak ele alarak istem yönetimini merkezileştirir. Temel tasarım kararları:

  • kimlik tablosunu (prompt_id), sürüm tablosundan (version, template, metadata) ayırma
  • Atomik değişimlerle kullanılan tek bir is_active bayrağı, aynı anda iki etkin sürüm bulunması hatalarını önler
  • Zengin üstveri (yazar, etiketler, model, değişiklik günlüğü) keşfi ve denetimi destekler
  • REST API katmanı, kayıt defterini tüm hizmetlerin erişimine açar
  • Denetim günlüğü, uyumluluk ve olaylarda hata ayıklama desteği sağlar

Dosya tabanlı kayıt defterleri küçük ekipler için uygundur; çok ekipli, yüksek erişilebilirlik gerektiren üretim sistemlerinde veritabanı destekli kayıt defterleri tercih edilir.

Sıkça Sorulan Sorular

“İstem Kayıt Defteri Mimarisi” dersi ücretsiz mi?

Evet — “İstem Kayıt Defteri Mimarisi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

“İstem Kayıt Defteri Mimarisi” dersinde ne öğreneceğim?

İstemleri üst veriler ve etiketlerle sürümlenmiş yapıtlar olarak saklama. AI Prompt Engineering ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“İstem Kayıt Defteri Mimarisi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Prompt Engineering dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İstem Kayıt Defteri Mimarisi
  2. İstemler İçin Sürüm Denetimi
  3. Dağıtım ve Geri Alma Stratejileri
  4. Üretimde İstem Performansını İzleme
← AI Prompt Engineering Sayfasına Dön