AI Engineering Academy · पाठ

स्कीमा का विकास और पिछली संगतता

लंबे समय तक चलने वाली निष्कर्षण पाइपलाइन में स्कीमा के विघटनकारी बदलावों को संस्करण देकर, ऐतिहासिक निष्कर्षणों को माइग्रेट करके और संक्रमण के दौरान समानांतर सत्यापन चलाकर प्रबंधित करें।

पाठ 4, कुल 4 में से13 चरण

स्कीमा का विकास और पिछली संगतता, CoddyKit पर AI Engineering Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI Engineering Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

स्कीमा समय के साथ क्यों बदलते हैं

निष्कर्षण स्कीमा स्थिर नहीं होते। व्यावसायिक आवश्यकताएँ बदलती हैं, नए दस्तावेज़ प्रकार सामने आते हैं और आपको ऐसे फ़ील्ड मिलते हैं जिन्हें शुरू से ही कैप्चर किया जाना चाहिए था। सक्रिय प्रक्रिया में स्कीमा बदलने से पिछली संगतता की समस्या पैदा होती है: पहले से निकाले गए रिकॉर्ड पुराने स्कीमा का उपयोग करते हैं, जबकि नए रिकॉर्ड नए स्कीमा का। इस बदलाव को सुरक्षित रूप से प्रबंधित करना ही स्कीमा विकास कहलाता है।

अपने स्कीमा के संस्करण बनाना

प्रत्येक स्कीमा को एक संस्करण संख्या दें और उसे हर निकाले गए रिकॉर्ड के साथ संग्रहित करें। स्कीमा बदलने पर संस्करण बढ़ाएँ। इससे आप स्कीमा संस्करण के आधार पर रिकॉर्ड खोज सकते हैं, पुराने रिकॉर्ड पर स्थानांतरण चला सकते हैं और प्रत्येक संस्करण के लिए अलग सत्यापन तर्क बनाए रख सकते हैं। प्रत्येक आउटपुट मॉडल में एक सरल स्ट्रिंग फ़ील्ड schema_version पर्याप्त है।

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

जोड़ने वाले और विघटनकारी बदलाव

जोड़ने वाले बदलाव सुरक्षित होते हैं: Optional फ़ील्ड या डिफ़ॉल्ट मान वाला फ़ील्ड जोड़ने से पुराने निष्कर्षण कोड या पुराने रिकॉर्ड प्रभावित नहीं होते। विघटनकारी बदलाव जोखिमपूर्ण होते हैं: फ़ील्ड का नाम बदलना, उसके प्रकार को string से int में बदलना या फ़ील्ड हटाना, बाद के उपभोक्ताओं को प्रभावित करेगा। हमेशा जोड़ने वाले बदलावों को प्राथमिकता दें। जब विघटनकारी बदलाव अपरिहार्य हो, तो नया प्रमुख स्कीमा संस्करण बनाएँ और नियंत्रित तरीके से स्थानांतरण करें।

# 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

डेटाबेस में स्कीमा संस्करण संग्रहित करना

निष्कर्षण परिणाम तालिका में स्कीमा संस्करण शामिल करें, ताकि आपको हमेशा पता रहे कि प्रत्येक रिकॉर्ड किस संस्करण से बना है। पूरा निकाला गया डेटा रखने वाला jsonb कॉलम और schema_version टेक्स्ट कॉलम एक सामान्य तरीका है। इससे आप संस्करण-जागरूक प्रश्न लिख सकते हैं और कम ट्रैफ़िक वाले समय में पुराने रिकॉर्ड का चुनिंदा रूप से स्थानांतरण कर सकते हैं।

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

स्थानांतरण स्क्रिप्ट लिखना

प्रत्येक स्कीमा संस्करण बदलाव के लिए एक स्थानांतरण स्क्रिप्ट लिखें, जो पुराने रिकॉर्ड पढ़े, उन्हें नए प्रारूप में बदले और नए संस्करण के साथ वापस लिखे। लेन-देन के साथ छोटे बैच में स्थानांतरण चलाएँ, ताकि विफलता डेटाबेस को आधी-अधूरी स्थानांतरण स्थिति में न छोड़ दे। स्थानांतरण पूरी तरह सत्यापित होने तक पुराने स्कीमा को हमेशा उपलब्ध रखें।

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

बदलाव के दौरान समानांतर सत्यापन

स्कीमा स्थानांतरण के दौरान समानांतर सत्यापन चलाएँ: आने वाले दस्तावेज़ों के एक नमूने पर पुराने और नए दोनों स्कीमा से एक साथ निष्कर्षण करें। परिणामों की तुलना करके सुनिश्चित करें कि नया स्कीमा पुराने स्कीमा की सभी जानकारी के साथ नए फ़ील्ड भी कैप्चर करता है। सांख्यिकीय रूप से महत्वपूर्ण नमूने पर समानता स्थिर दिखाई देने के बाद ही पुराने स्कीमा को हटाएँ।

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}

स्कीमा जारी करने के लिए फ़ीचर फ़्लैग

अपनी प्रक्रिया को पुराने स्कीमा से नए स्कीमा पर कब बदलना है, यह नियंत्रित करने के लिए फ़ीचर फ़्लैग का उपयोग करें। इससे आप नए स्कीमा को ट्रैफ़िक के एक प्रतिशत हिस्से पर धीरे-धीरे जारी कर सकते हैं, त्रुटि दरों की निगरानी कर सकते हैं और कुछ गलत होने पर कोड को फिर से तैनात किए बिना तुरंत वापस लौट सकते हैं। LaunchDarkly जैसी फ़ीचर फ़्लैग सेवाएँ या डेटाबेस की एक सरल पंक्ति, दोनों काम करती हैं।

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)

यूनियन प्रकारों से उपभोक्ता संगतता

निकाले गए डेटा को पढ़ने वाले बाद के उपभोक्ताओं को कई स्कीमा संस्करणों को सहजता से संभालना चाहिए। अपने उपभोक्ता कोड में विभेदित यूनियन का उपयोग करें, जो schema_version फ़ील्ड के आधार पर सही पार्सिंग तर्क चुनता है। यह सशर्त if-else शृंखलाएँ लिखने से अधिक विश्वसनीय है और संस्करण 3 आने पर इसका विस्तार करना आसान है।

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

तैनाती से पहले स्कीमा बदलावों का परीक्षण करना

नया स्कीमा तैनात करने से पहले उसे अपने पूरे प्रतिगमन परीक्षण सेट पर चलाएँ: यह ज्ञात अपेक्षित आउटपुट वाले प्रतिनिधि दस्तावेज़ों का चुना हुआ संग्रह होता है। पुराने और नए स्कीमा के बीच प्रत्येक फ़ील्ड के F1 स्कोर की तुलना करें। किसी भी फ़ील्ड के F1 में गिरावट का अर्थ है कि नए स्कीमा के विवरण ने मॉडल को भ्रमित किया — जारी करने से पहले फ़ील्ड का विवरण ठीक करें।

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

स्कीमा के अप्रचलन को संभालना

जब किसी स्कीमा संस्करण का नए निष्कर्षण के लिए उपयोग बंद हो जाए, तो आप उसे अप्रचलित घोषित कर सकते हैं। अप्रचलन का अर्थ है: उस संस्करण में नए रिकॉर्ड स्वीकार करना बंद करना, पुराने रिकॉर्ड को पढ़ने योग्य बनाए रखना और ऐसी समाप्ति तिथि तय करना जब पुराने रिकॉर्ड का स्थानांतरण या संग्रह किया जाएगा। बदलावों की सूची में अप्रचलन का दस्तावेज़ रखें, ताकि सभी उपभोक्ताओं को अपना पार्सिंग कोड अपग्रेड करने की जानकारी हो।

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
        )

बदलावों की सूची और संचार

प्रत्येक स्कीमा बदलाव के साथ एक बदलाव सूची प्रविष्टि होनी चाहिए, जिसमें क्या बदला, क्यों बदला, स्थानांतरण निर्देश और अपेक्षित प्रभाव बताया गया हो। बदलाव तैनात करने से पहले निकाले गए डेटा का उपयोग करने वाली सभी टीमों के साथ इन प्रविष्टियों को साझा करें। स्कीमा स्थानांतरण की कई बड़ी समस्याएँ तकनीकी विफलताओं से नहीं, बल्कि उन उपभोक्ताओं से होती हैं जिन्हें आने वाले बदलाव की जानकारी नहीं दी गई थी।

# 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

त्वरित जाँच

निष्कर्षण प्रक्रियाओं में स्कीमा विकास और पिछली संगतता की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: स्कीमा संस्करण बनाना हर निकाले गए रिकॉर्ड के साथ एक संस्करण पहचानकर्ता संग्रहित करता है, ताकि आप चुनिंदा रूप से स्थानांतरण कर सकें; जोड़ने वाले बदलाव सुरक्षित होते हैं, जबकि फ़ील्ड का नाम बदलने या उसका प्रकार बदलने के लिए सावधानीपूर्वक स्थानांतरण आवश्यक है; और समानांतर सत्यापन से आप पुराने स्कीमा को हटाने से पहले नए स्कीमा की जाँच कर सकते हैं। आगे हम TTFT और TPOT मेट्रिक्स से LLM की विलंबता मापेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “स्कीमा का विकास और पिछली संगतता” पाठ निःशुल्क है?

हाँ—“स्कीमा का विकास और पिछली संगतता” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI Engineering Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“स्कीमा का विकास और पिछली संगतता” में मैं क्या सीखूँगा?

लंबे समय तक चलने वाली निष्कर्षण पाइपलाइन में स्कीमा के विघटनकारी बदलावों को संस्करण देकर, ऐतिहासिक निष्कर्षणों को माइग्रेट करके और संक्रमण के दौरान समानांतर सत्यापन चलाकर प्रबंधित करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI Engineering Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI Engineering Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI Engineering Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“स्कीमा का विकास और पिछली संगतता” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस AI Engineering Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर AI Engineering Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Instructor: Pydantic के साथ टाइपयुक्त निष्कर्षण
  2. अपूर्ण और अनुपलब्ध डेटा संभालना
  3. अतुल्यकालिकता और कतारों के साथ बैच संसाधन
  4. स्कीमा का विकास और पिछली संगतता
← AI Engineering Academy पर वापस जाएँ