0Pricing
AI Engineering Academy · Ders

Şema Gelişimi ve Geriye Dönük Uyumluluk

Şemaları sürümlendirerek, geçmiş çıkarmaları taşıyarak ve geçişler sırasında paralel doğrulama çalıştırarak uzun süre çalışan çıkarma iş akışlarındaki geriye dönük uyumsuz şema değişikliklerini yönetin.

Şema Gelişimi ve Geriye Dönük Uyumluluk, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. 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 Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Şemalar Zaman İçinde Neden Değişir

Çıkarma şemaları sabit değildir. İş gereksinimleri değişir, yeni belge türleri ortaya çıkar ve başlangıçtan itibaren yakalamanız gereken alanları fark edersiniz. Canlı bir işlem hattında şemayı değiştirmek geriye dönük uyumluluk sorunu oluşturur: daha önce çıkarılmış kayıtlar eski şemayı, yeni kayıtlar ise yeni şemayı kullanır. Bu geçişi güvenli şekilde yönetmek, şema değişiminin konusudur.

Şemalarınızı Sürümlendirme

Her şemaya bir sürüm numarası atayın ve bunu çıkarılan her kaydın yanında saklayın. Şemayı değiştirdiğinizde sürümü artırın. Böylece kayıtları şema sürümüne göre sorgulayabilir, eski kayıtlarda geçişler çalıştırabilir ve her sürüm için ayrı doğrulama mantığı kullanabilirsiniz. Her çıktı modelinde bulunan basit bir schema_version dizesi yeterlidir.

from pydantic import BaseModel
from typing import Literal

class InvoiceV1(BaseModel):
    schema_version: Literal['1.0'] = '1.0'
    vendor: str
    total_amount: float

class InvoiceV2(BaseModel):
    schema_version: Literal['2.0'] = '2.0'
    vendor: str
    vendor_tax_id: str | None = None  # new field
    total_amount: float
    currency: str = 'USD'  # new field with default

Eklemeli ve Bozucu Değişiklikler

Eklemeli değişiklikler güvenlidir: İsteğe bağlı bir alanın veya varsayılan değeri olan bir alanın eklenmesi, eski çıkarma kodunu ya da eski kayıtları bozmaz. Bozucu değişiklikler risklidir: Bir alanı yeniden adlandırmak, türünü dizeden tamsayıya değiştirmek veya bir alanı kaldırmak, sonraki tüketicileri bozar. Her zaman eklemeli değişiklikleri tercih edin. Bozucu bir değişiklik kaçınılmazsa yeni bir ana şema sürümü oluşturun ve geçişi denetimli biçimde gerçekleştirin.

# Safe: additive change - add optional field
class ProductV2(BaseModel):
    name: str
    price: float
    sku: str | None = None   # NEW optional field - backward safe
    category: str = 'general'  # NEW with default - backward safe

# Risky: breaking change - rename or retype
# class ProductV2(BaseModel):
#     product_name: str  # RENAMED from name - breaks consumers
#     price_cents: int   # RETYPED from float - breaks data

Şema Sürümünü Veritabanında Saklama

Her kaydı hangi sürümün oluşturduğunu her zaman bilebilmek için şema sürümünü çıkarma sonuçları tablonuza ekleyin. Çıkarılan verilerin tamamını saklayan bir jsonb sütunu ile schema_version metin sütunu yaygın bir yaklaşımdır. Bu sayede sürüme duyarlı sorgular yazabilir ve eski kayıtları düşük trafik dönemlerinde seçerek dönüştürebilirsiniz.

-- PostgreSQL table design
CREATE TABLE extractions (
    doc_id TEXT PRIMARY KEY,
    schema_version TEXT NOT NULL,
    extracted_data JSONB NOT NULL,
    extracted_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_schema_version ON extractions(schema_version);

-- Query old records needing migration
SELECT doc_id, extracted_data
FROM extractions
WHERE schema_version = '1.0'
LIMIT 1000;

Geçiş Betikleri Yazma

Her şema sürümü geçişi için eski kayıtları okuyan, yeni biçime dönüştüren ve yeni sürümle geri yazan bir geçiş betiği yazın. Bir hata olduğunda veritabanının kısmen dönüştürülmüş durumda kalmaması için geçişleri işlemlerle birlikte küçük gruplar hâlinde çalıştırın. Geçişin tamamlandığı doğrulanana kadar eski şemayı her zaman kullanılabilir durumda tutun.

import asyncpg
import json

async def migrate_v1_to_v2(pool, batch_size=100):
    async with pool.acquire() as conn:
        rows = await conn.fetch(
            'SELECT doc_id, extracted_data FROM extractions WHERE schema_version=$1 LIMIT $2',
            '1.0', batch_size
        )
        for row in rows:
            old = row['extracted_data']
            new_data = {
                'schema_version': '2.0',
                'vendor': old['vendor'],
                'vendor_tax_id': None,  # unknown for old records
                'total_amount': old['total_amount'],
                'currency': 'USD'  # assume USD for old records
            }
            await conn.execute(
                'UPDATE extractions SET extracted_data=$1, schema_version=$2 WHERE doc_id=$3',
                json.dumps(new_data), '2.0', row['doc_id']
            )

Geçişler Sırasında Paralel Doğrulama

Şema geçişi sırasında paralel doğrulama çalıştırın: gelen belgelerden oluşan bir örneklem üzerinde hem eski hem de yeni şemayla eşzamanlı olarak çıkarma yapın. Yeni şemanın, yeni alanlara ek olarak eski şemanın yakaladığı her şeyi yakaladığını doğrulamak için sonuçları karşılaştırın. Eski şemayı yalnızca paralel doğrulama, istatistiksel açıdan anlamlı bir örneklemde kararlı eşdeğerlik gösterdikten sonra kullanımdan kaldırın.

async def parallel_validate(text: str) -> dict:
    v1_result, v2_result = await asyncio.gather(
        extract_with_schema(text, InvoiceV1),
        extract_with_schema(text, InvoiceV2)
    )
    discrepancy = (
        v1_result.vendor != v2_result.vendor or
        abs(v1_result.total_amount - v2_result.total_amount) > 0.01
    )
    if discrepancy:
        log_discrepancy(text, v1_result, v2_result)
    return {'v1': v1_result, 'v2': v2_result, 'discrepancy': discrepancy}

Şema Yayını İçin Özellik Bayrakları

İşlem hattınızın eski şemadan yeni şemaya ne zaman geçeceğini denetlemek için özellik bayrakları kullanın. Böylece yeni şemayı trafiğin belirli bir yüzdesine kademeli olarak sunabilir, hata oranlarını izleyebilir ve bir sorun olduğunda kodu yeniden dağıtmadan anında geri alabilirsiniz. LaunchDarkly gibi özellik bayrağı hizmetleri veya basit bir veritabanı satırı bu iş için uygundur.

import os

def get_active_schema():
    version = os.environ.get('EXTRACTION_SCHEMA_VERSION', '1.0')
    schemas = {
        '1.0': InvoiceV1,
        '2.0': InvoiceV2,
    }
    return schemas.get(version, InvoiceV1)

async def extract_document(text: str):
    SchemaClass = get_active_schema()
    return await extract_with_schema(text, SchemaClass)

Birleşim Türleriyle Tüketici Uyumluluğu

Çıkarılan verileri okuyan sonraki tüketicilerin birden çok şema sürümünü sorunsuz biçimde ele alması gerekir. Tüketici kodunuzda, schema_version alanına göre doğru ayrıştırma mantığını seçen bir ayırt edici birleşim kullanın. Bu yaklaşım, koşullu if-else zincirleri yazmaktan daha sağlamdır ve 3. sürüm geldiğinde genişletilmesi daha kolaydır.

from pydantic import BaseModel
from typing import Union, Annotated
from typing import Literal

def parse_extraction(raw: dict) -> Union[InvoiceV1, InvoiceV2]:
    version = raw.get('schema_version', '1.0')
    if version == '1.0':
        return InvoiceV1(**raw)
    elif version == '2.0':
        return InvoiceV2(**raw)
    else:
        raise ValueError(f'Unknown schema version: {version}')

Dağıtımdan Önce Şema Değişikliklerini Sınama

Yeni bir şemayı dağıtmadan önce, onu tüm gerileme sınama kümenize uygulayın: beklenen çıktıları bilinen, temsili belgelerden oluşturulmuş özenle seçilmiş bir koleksiyon. Eski ve yeni şema arasındaki her alanın F1 puanlarını karşılaştırın. Herhangi bir alandaki F1 gerilemesi, yeni şema açıklamasının modeli şaşırttığı anlamına gelir; kullanıma sunmadan önce alan açıklamasını düzeltin.

def eval_schema_on_test_set(test_cases: list, SchemaClass) -> dict:
    field_f1 = {}
    for case in test_cases:
        result = extract_with_schema(case['text'], SchemaClass)
        for field in case['expected']:
            expected = case['expected'][field]
            actual = getattr(result, field, None)
            # Update precision/recall counters
            update_metrics(field_f1, field, expected, actual)
    return {k: compute_f1(v) for k, v in field_f1.items()}

Şemanın Kullanımdan Kaldırılmasını Yönetme

Bir şema sürümü yeni çıkarmalarda artık kullanılmadığında onu kullanımdan kaldırabilirsiniz. Kullanımdan kaldırma; bu sürümde yeni kayıtları kabul etmeyi durdurmak, eski kayıtların okunabilir kalmasını sağlamak ve eski kayıtların dönüştürüleceği veya arşivleneceği bir sonlandırma tarihi belirlemek anlamına gelir. Tüm tüketicilerin ayrıştırma kodlarını ne zaman yükseltmeleri gerektiğini bilmesi için bu işlemi değişiklik günlüğünde belgeleyin.

DEPRECATED_VERSIONS = {'1.0'}
SUNSET_DATE = '2026-09-01'

def warn_if_deprecated(version: str):
    if version in DEPRECATED_VERSIONS:
        import warnings
        warnings.warn(
            f'Schema version {version} is deprecated. '
            f'It will be removed after {SUNSET_DATE}. '
            'Migrate consumers to version 2.0.',
            DeprecationWarning,
            stacklevel=2
        )

Değişiklik Günlüğü ve İletişim

Her şema değişikliğine, neyin değiştiğini, neden değiştiğini, geçiş talimatlarını ve beklenen etkiyi açıklayan bir değişiklik günlüğü girdisi eşlik etmelidir. Değişikliği dağıtmadan önce bu girdileri, çıkarılan verileri kullanan tüm ekiplerle paylaşın. Şema geçişlerindeki birçok felaket teknik arızalardan değil, bir değişikliğin geleceğinden haberdar edilmeyen tüketicilerden kaynaklanır.

# CHANGELOG.md entry format:
# ## Schema v2.0 (2026-07-01)
# ### Changes
# - ADDED: vendor_tax_id (Optional[str]) - VAT/EIN extracted from header
# - ADDED: currency (str, default='USD') - detected from symbol/code
# ### Migration
# Run: python scripts/migrate_v1_to_v2.py --batch-size=500
# ### Consumers
# - billing-service: update parse_extraction() to handle v2
# - audit-service: query now supports currency filter

Hızlı Kontrol

Çıkarma işlem hatlarında şema değişimi ve geriye dönük uyumluluk konusundaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: şema sürümlendirme, seçerek geçiş yapabilmeniz için her çıkarılan kaydın yanında bir sürüm tanımlayıcısı saklar; eklemeli değişiklikler güvenlidir, ancak alanları yeniden adlandırmak veya türlerini değiştirmek dikkatli bir geçiş gerektirir; paralel doğrulama ise eski şemayı kullanımdan kaldırmadan önce yeni şemayı doğrulamanızı sağlar. Sırada, TTFT ve TPOT ölçümleriyle LLM gecikmesini ölçeceğiz.

Sıkça Sorulan Sorular

“Şema Gelişimi ve Geriye Dönük Uyumluluk” dersi ücretsiz mi?

Evet — “Şema Gelişimi ve Geriye Dönük Uyumluluk” 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 Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Şema Gelişimi ve Geriye Dönük Uyumluluk” dersinde ne öğreneceğim?

Şemaları sürümlendirerek, geçmiş çıkarmaları taşıyarak ve geçişler sırasında paralel doğrulama çalıştırarak uzun süre çalışan çıkarma iş akışlarındaki geriye dönük uyumsuz şema değişikliklerini yönet… AI Engineering Academy 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 Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, 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 4. dersidir.

“Şema Gelişimi ve Geriye Dönük Uyumluluk” 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 Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy 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. Instructor: Pydantic ile Tür Bilgili Çıkarma
  2. Kısmi ve Eksik Verileri İşleme
  3. Eşzamansız İşleme ve Kuyruklarla Toplu İşleme
  4. Şema Gelişimi ve Geriye Dönük Uyumluluk
← AI Engineering Academy Sayfasına Dön