0Pricing
AI Engineering Academy · Pelajaran

Evolusi Skema dan Kompatibilitas Mundur

Kelola perubahan skema yang menyebabkan ketidakcocokan dalam alur pemrosesan ekstraksi jangka panjang dengan membuat versi skema, memigrasikan ekstraksi historis, dan menjalankan validasi paralel selama masa transisi.

Evolusi Skema dan Kompatibilitas Mundur adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 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 Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Mengapa Skema Berubah Seiring Waktu

Skema ekstraksi tidak bersifat tetap. Kebutuhan bisnis berkembang, jenis dokumen baru muncul, dan Anda menemukan kolom yang seharusnya sudah diambil sejak awal. Mengubah skema dalam pipeline aktif menimbulkan masalah kompatibilitas mundur: catatan hasil ekstraksi yang sudah ada menggunakan skema lama, sedangkan catatan baru menggunakan skema baru. Mengelola transisi ini dengan aman adalah inti dari evolusi skema.

Membuat Versi Skema

Tetapkan nomor versi untuk setiap skema dan simpan nomor tersebut bersama setiap catatan hasil ekstraksi. Saat mengubah skema, naikkan versinya. Dengan demikian, Anda dapat melakukan kueri berdasarkan versi skema, menjalankan migrasi pada catatan lama, dan mempertahankan logika validasi terpisah untuk setiap versi. Kolom string sederhana schema_version di setiap model keluaran sudah memadai.

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

Perubahan Penambahan vs Perubahan yang Merusak

Perubahan penambahan aman: menambahkan kolom Optional atau kolom dengan nilai bawaan tidak merusak kode ekstraksi lama maupun catatan lama. Perubahan yang merusak berisiko: mengganti nama kolom, mengubah jenis dari string menjadi int, atau menghapus kolom akan merusak konsumen hilir. Selalu utamakan perubahan penambahan. Jika perubahan yang merusak tidak dapat dihindari, buat versi utama skema yang baru dan lakukan migrasi secara terkendali.

# 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

Menyimpan Versi Skema di Basis Data

Sertakan versi skema dalam tabel hasil ekstraksi agar Anda selalu mengetahui versi yang menghasilkan setiap catatan. Kolom jsonb yang menyimpan seluruh data hasil ekstraksi, ditambah kolom teks schema_version, merupakan pola yang umum. Dengan pola ini, Anda dapat menulis kueri yang mempertimbangkan versi dan memigrasikan catatan lama secara selektif saat lalu lintas rendah.

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

Menulis Skrip Migrasi

Tulis skrip migrasi untuk setiap transisi versi skema. Skrip tersebut membaca catatan lama, mengubahnya ke format baru, lalu menuliskannya kembali dengan versi baru. Jalankan migrasi dalam kumpulan kecil dengan transaksi agar kegagalan tidak meninggalkan basis data dalam keadaan setengah termigrasi. Selalu pertahankan skema lama sampai migrasi dipastikan selesai.

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

Validasi Paralel selama Transisi

Selama migrasi skema, jalankan validasi paralel: lakukan ekstraksi dengan skema lama dan baru secara bersamaan untuk sampel dokumen masuk. Bandingkan hasilnya untuk memastikan skema baru menangkap semua hal yang ditangkap skema lama, ditambah kolom baru. Hentikan penggunaan skema lama hanya setelah validasi paralel menunjukkan kesetaraan yang stabil pada sampel yang signifikan secara statistik.

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}

Bendera Fitur untuk Peluncuran Skema

Gunakan bendera fitur untuk mengendalikan kapan pipeline Anda beralih dari skema lama ke skema baru. Dengan cara ini, Anda dapat meluncurkan skema baru secara bertahap kepada persentase lalu lintas tertentu, memantau tingkat error, dan segera mengembalikan perubahan jika terjadi masalah — tanpa menerapkan ulang kode. Layanan bendera fitur seperti LaunchDarkly atau satu baris sederhana di basis data sama-sama dapat digunakan.

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)

Kompatibilitas Konsumen dengan Jenis Union

Konsumen hilir yang membaca data hasil ekstraksi perlu menangani beberapa versi skema dengan baik. Gunakan union terdiskriminasi dalam kode konsumen untuk memilih logika penguraian yang tepat berdasarkan kolom schema_version. Cara ini lebih tangguh daripada menulis rangkaian if-else bersyarat dan lebih mudah diperluas saat versi 3 hadir.

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

Menguji Perubahan Skema sebelum Penerapan

Sebelum menerapkan skema baru, jalankan skema tersebut pada seluruh kumpulan pengujian regresi: kumpulan dokumen perwakilan yang telah dipilih dan memiliki keluaran yang diharapkan. Bandingkan skor F1 untuk setiap kolom antara skema lama dan baru. Penurunan F1 pada kolom mana pun berarti deskripsi skema baru membingungkan model — perbaiki deskripsi kolom tersebut sebelum dirilis.

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

Menangani Penghentian Penggunaan Skema

Setelah suatu versi skema tidak lagi digunakan untuk ekstraksi baru, Anda dapat menghentikan penggunaannya. Penghentian penggunaan berarti: berhenti menerima catatan baru dalam versi tersebut, tetap memastikan catatan lama dapat dibaca, dan menjadwalkan tanggal penghentian saat catatan lama akan dimigrasikan atau diarsipkan. Dokumentasikan penghentian penggunaan dalam catatan perubahan agar semua konsumen tahu kapan harus memperbarui kode penguraian mereka.

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
        )

Catatan Perubahan dan Komunikasi

Setiap perubahan skema harus disertai entri catatan perubahan yang menjelaskan apa yang berubah, alasannya, petunjuk migrasi, dan dampak yang diharapkan. Bagikan entri catatan perubahan kepada semua tim yang menggunakan data hasil ekstraksi sebelum menerapkan perubahan. Banyak bencana migrasi skema terjadi bukan karena kegagalan teknis, melainkan karena konsumen tidak diberi tahu bahwa perubahan akan dilakukan.

# 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

Pemeriksaan Singkat

Uji pemahaman Anda tentang evolusi skema dan kompatibilitas mundur dalam pipeline ekstraksi.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa pembuatan versi skema menyimpan pengenal versi bersama setiap catatan hasil ekstraksi sehingga Anda dapat melakukan migrasi secara selektif, perubahan penambahan aman sedangkan penggantian nama atau perubahan jenis kolom memerlukan migrasi yang cermat, dan validasi paralel memungkinkan Anda memverifikasi skema baru sebelum menghentikan penggunaan skema lama. Selanjutnya, kita akan mengukur latensi LLM dengan metrik TTFT dan TPOT.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Evolusi Skema dan Kompatibilitas Mundur” gratis?

Ya — teks lengkap “Evolusi Skema dan Kompatibilitas Mundur” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Evolusi Skema dan Kompatibilitas Mundur”?

Kelola perubahan skema yang menyebabkan ketidakcocokan dalam alur pemrosesan ekstraksi jangka panjang dengan membuat versi skema, memigrasikan ekstraksi historis, dan menjalankan validasi paralel sel… Kamu berlatih AI Engineering Academy 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 Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy 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 4 dari 4.

Berapa lama pelajaran “Evolusi Skema dan Kompatibilitas Mundur” 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 Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy 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. Instructor: Ekstraksi Bertipe dengan Pydantic
  2. Menangani Data Parsial dan Hilang
  3. Pemrosesan Kelompok dengan Asinkron dan Antrean
  4. Evolusi Skema dan Kompatibilitas Mundur
← Kembali ke AI Engineering Academy