AI प्रॉम्प्ट इंजीनियरिंग · पाठ

बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन

OpenAI Batch API, अतुल्यकालिक Python और समवर्ती प्रॉम्प्ट निष्पादन।

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

बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन, CoddyKit पर AI प्रॉम्प्ट इंजीनियरिंग का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह AI प्रॉम्प्ट इंजीनियरिंग सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI प्रॉम्प्ट इंजीनियरिंग पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

बैच और अतुल्यकालिक निष्पादन क्यों?

हज़ारों LLM अनुरोधों को क्रमिक रूप से संसाधित करना धीमा और महँगा होता है। बैच प्रसंस्करण अनुरोधों को समूहित करके लागत में 50% कमी करता है। अतुल्यकालिक निष्पादन दर सीमाओं के भीतर प्रसंस्करण क्षमता को अधिकतम करने के लिए अनुरोधों को समानांतर चलाता है। दोनों मिलकर लागत और कुल वास्तविक समय, दोनों को बहुत कम करते हैं।

OpenAI बैच एपीआई: लागत में 50% कमी

OpenAI बैच एपीआई अनुरोधों को पृष्ठभूमि में अतुल्यकालिक रूप से (24 घंटे तक) संसाधित करता है और इसकी लागत सामान्य एपीआई मूल्य की 50% होती है। यह मूल्यांकन चलाने, डेटासेट संसाधित करने और गैर-रीयल-टाइम कार्यभार के लिए आदर्श है।

import openai
import json

client = openai.OpenAI(api_key='YOUR_API_KEY')

# Step 1: Create batch input file (JSONL format)
batch_requests = [
    {
        'custom_id': f'request-{i}',
        'method': 'POST',
        'url': '/v1/chat/completions',
        'body': {
            'model': 'gpt-4o-mini',
            'messages': [
                {'role': 'user', 'content': f'Summarize this document: {doc}'}
            ],
            'max_tokens': 200
        }
    }
    for i, doc in enumerate(['Doc A text...', 'Doc B text...', 'Doc C text...'])
]

# Write to JSONL file
with open('batch_input.jsonl', 'w') as f:
    for req in batch_requests:
        f.write(json.dumps(req) + '\n')

# Step 2: Upload the file
batch_file = client.files.create(
    file=open('batch_input.jsonl', 'rb'),
    purpose='batch'
)
print(f'Batch file uploaded: {batch_file.id}')

बैच कार्य सबमिट करना और उसकी स्थिति जाँचना

इनपुट फ़ाइल अपलोड करने के बाद बैच कार्य बनाएँ और पूरा होने तक उसकी स्थिति जाँचते रहें। बैच एपीआई अनुरोधों को 24 घंटे के भीतर संसाधित करता है (छोटे बैच आम तौर पर इससे बहुत जल्दी पूरे हो जाते हैं)।

import time

# Step 3: Create batch job
batch = client.batches.create(
    input_file_id=batch_file.id,
    endpoint='/v1/chat/completions',
    completion_window='24h'
)
print(f'Batch created: {batch.id} | Status: {batch.status}')

# Step 4: Poll for completion
def wait_for_batch(batch_id, poll_interval=30, timeout=3600):
    start = time.time()
    while time.time() - start < timeout:
        batch = client.batches.retrieve(batch_id)
        print(f'Status: {batch.status} | '
              f'Completed: {batch.request_counts.completed}/ '
              f'{batch.request_counts.total}')
        if batch.status == 'completed':
            return batch
        if batch.status in ('failed', 'expired', 'cancelling', 'cancelled'):
            raise RuntimeError(f'Batch {batch_id} ended with status: {batch.status}')
        time.sleep(poll_interval)
    raise TimeoutError('Batch polling timed out')

# batch = wait_for_batch(batch.id)

बैच परिणाम प्राप्त करना

बैच पूरा हो जाने पर आउटपुट फ़ाइल डाउनलोड करें और JSONL परिणामों को उपयोगी प्रारूप में वापस पार्स करें।

def retrieve_batch_results(batch):
    if not batch.output_file_id:
        raise ValueError('No output file — batch may have failed')

    # Download output file
    content = client.files.content(batch.output_file_id).text

    # Parse JSONL: one result per line
    results = {}
    for line in content.strip().split('\n'):
        if not line:
            continue
        result = json.loads(line)
        custom_id = result['custom_id']
        if result.get('error'):
            results[custom_id] = {'error': result['error']}
        else:
            response_body = result['response']['body']
            text = response_body['choices'][0]['message']['content']
            results[custom_id] = {'text': text}

    # Report error rate
    errors = sum(1 for r in results.values() if 'error' in r)
    print(f'Retrieved {len(results)} results, {errors} errors')
    return results

# results = retrieve_batch_results(batch)
# for req_id, result in results.items():
#     print(req_id, result.get('text', result.get('error', ''))[:50])

asyncio.gather() के साथ अतुल्यकालिक Python

रीयल-टाइम (गैर-बैच) समानांतर प्रसंस्करण के लिए Python का asyncio और asyncio.gather() कई एपीआई कॉल एक साथ शुरू करता है और सभी के पूरे होने की प्रतीक्षा करता है। इससे कई अनुरोधों वाले कार्यभार का कुल वास्तविक समय बहुत कम हो जाता है।

import asyncio
import openai

async_client = openai.AsyncOpenAI(api_key='YOUR_API_KEY')

async def async_completion(messages, model='gpt-4o-mini', max_tokens=200):
    response = await async_client.chat.completions.create(
        model=model,
        messages=messages,
        max_tokens=max_tokens
    )
    return response.choices[0].message.content

async def process_parallel(prompts):
    tasks = [
        async_completion([{'role': 'user', 'content': p}])
        for p in prompts
    ]
    results = await asyncio.gather(*tasks, return_exceptions=True)
    return results

# Usage
async def main():
    prompts = ['Explain photosynthesis.', 'Explain gravity.', 'Explain evolution.']
    results = await process_parallel(prompts)
    for prompt, result in zip(prompts, results):
        if isinstance(result, Exception):
            print(f'ERROR: {result}')
        else:
            print(f'{prompt[:30]}... -> {result[:60]}...')

# asyncio.run(main())
print('asyncio.gather: all 3 requests fire simultaneously')

दर सीमा के अनुरूप समवर्ती अनुरोध

बहुत अधिक समवर्ती अनुरोध शुरू करने से दर-सीमा संबंधी त्रुटियाँ उत्पन्न होती हैं। Semaphore समवर्ती अनुरोधों की संख्या सीमित करता है, ताकि दर सीमाओं के भीतर रहते हुए प्रसंस्करण क्षमता अधिकतम की जा सके।

import asyncio

# Rate limits (example for gpt-4o-mini):
# RPM (requests per minute): 500
# TPM (tokens per minute): 200,000

MAX_CONCURRENT = 20  # stay well below rate limit

async def process_with_rate_limit(prompts, max_concurrent=MAX_CONCURRENT):
    semaphore = asyncio.Semaphore(max_concurrent)
    results = [None] * len(prompts)

    async def bounded_completion(i, prompt):
        async with semaphore:
            try:
                result = await async_completion(
                    [{'role': 'user', 'content': prompt}]
                )
                results[i] = result
            except openai.RateLimitError as e:
                print(f'Rate limited on prompt {i}: {e}')
                await asyncio.sleep(60)  # back off and retry
                result = await async_completion(
                    [{'role': 'user', 'content': prompt}]
                )
                results[i] = result

    await asyncio.gather(*[
        bounded_completion(i, p) for i, p in enumerate(prompts)
    ])
    return results

print('Semaphore limits to', MAX_CONCURRENT, 'concurrent requests')

Anthropic बैच एपीआई

Anthropic भी Message Batches एपीआई उपलब्ध कराता है, जिसकी लागत-व्यवस्था OpenAI के बैच एपीआई जैसी है। बैच अतुल्यकालिक रूप से संसाधित किए जाते हैं और उनके परिणामों की स्थिति जाँची जाती है या उन्हें प्रवाह के रूप में भेजा जाता है।

import anthropic

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

# Create a batch of messages
batch = client.messages.batches.create(
    requests=[
        {
            'custom_id': f'doc-{i}',
            'params': {
                'model': 'claude-haiku-4-5',
                'max_tokens': 200,
                'messages': [{
                    'role': 'user',
                    'content': f'Classify the sentiment of: {text}'
                }]
            }
        }
        for i, text in enumerate([
            'Amazing product, exceeded expectations!',
            'Terrible quality, broke after one use.',
            'It works as described.'
        ])
    ]
)
print(f'Batch created: {batch.id} | Status: {batch.processing_status}')

# Poll for completion
# while (batch := client.messages.batches.retrieve(batch.id)).processing_status != 'ended':
#     time.sleep(30)

# Retrieve results
# for result in client.messages.batches.results(batch.id):
#     print(result.custom_id, result.result.message.content[0].text[:50])

प्रसंस्करण क्षमता का अनुकूलन: बैच रणनीतियाँ

अपनी विलंबता आवश्यकताओं और कार्यभार की विशेषताओं के आधार पर सही बैच रणनीति चुनकर प्रसंस्करण क्षमता अधिकतम करें।

throughput_strategies = {
    'API Batch (OpenAI/Anthropic)': {
        'cost': '50% of normal price',
        'latency': 'Minutes to hours (background processing)',
        'best_for': 'Offline workloads: eval runs, dataset labeling, report generation',
        'max_batch_size': '50,000 requests per batch'
    },
    'asyncio.gather()': {
        'cost': 'Normal price',
        'latency': 'Same as slowest individual request',
        'best_for': 'Real-time parallel enrichment, multi-step pipelines',
        'max_concurrent': '10-50 depending on rate limits'
    },
    'Streaming + Concurrent': {
        'cost': 'Normal price',
        'latency': 'First token arrives faster, total similar',
        'best_for': 'User-facing applications needing perceived speed',
        'pattern': 'asyncio with stream=True per request'
    },
    'Worker Queue (Celery, RQ)': {
        'cost': 'Normal price',
        'latency': 'Variable (depends on queue depth)',
        'best_for': 'High-volume production with auto-scaling workers',
        'backends': 'Redis, RabbitMQ'
    }
}

for strategy, details in throughput_strategies.items():
    print(f'{strategy}: {details["best_for"][:60]}')

बैच/अतुल्यकालिक कार्यों में त्रुटि प्रबंधन और पुनःप्रयास तर्क

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

import asyncio
import random

async def resilient_completion(prompt, max_retries=3, base_delay=1.0):
    for attempt in range(max_retries):
        try:
            return await async_completion(
                [{'role': 'user', 'content': prompt}]
            )
        except openai.RateLimitError:
            wait = base_delay * (2 ** attempt) + random.uniform(0, 1)
            print(f'Rate limited. Waiting {wait:.1f}s (attempt {attempt+1})')
            await asyncio.sleep(wait)
        except openai.APITimeoutError:
            print(f'Timeout on attempt {attempt+1}')
            await asyncio.sleep(base_delay)
        except openai.APIError as e:
            if e.status_code >= 500:
                await asyncio.sleep(base_delay * (attempt + 1))
            else:
                raise  # Don't retry 4xx errors
    raise RuntimeError(f'Failed after {max_retries} attempts')

async def batch_with_error_reporting(prompts):
    tasks = [resilient_completion(p) for p in prompts]
    results = await asyncio.gather(*tasks, return_exceptions=True)
    successes = sum(1 for r in results if not isinstance(r, Exception))
    print(f'Batch complete: {successes}/{len(prompts)} succeeded')
    return results

बैच प्रसंस्करण के लिए बड़े इनपुट को खंडों में बाँटना

मॉडल की संदर्भ विंडो से बड़े दस्तावेज़ों को बैच बनाने से पहले खंडों में बाँटना आवश्यक है। हर खंड एक अलग बैच अनुरोध बन जाता है; बाद में परिणामों को मिलाया या उनका सारांश बनाया जाता है।

def chunk_document(text, max_tokens=3000, overlap_tokens=200):
    '''
    Split a long document into overlapping chunks for batch processing.
    Approximate: 1 token ~ 4 characters
    '''
    max_chars = max_tokens * 4
    overlap_chars = overlap_tokens * 4
    chunks = []
    start = 0
    while start < len(text):
        end = min(start + max_chars, len(text))
        # Try to break at a sentence boundary
        if end < len(text):
            last_period = text.rfind('.', start, end)
            if last_period > start + max_chars // 2:
                end = last_period + 1
        chunks.append({'text': text[start:end], 'start': start, 'end': end})
        start = end - overlap_chars  # overlap for context continuity
    return chunks

def batch_summarize_long_document(document_text, summary_prompt):
    chunks = chunk_document(document_text)
    print(f'Document split into {len(chunks)} chunks')
    # Create one batch request per chunk
    batch_inputs = [
        {'custom_id': f'chunk-{i}',
         'content': summary_prompt + '\n\n' + chunk['text']}
        for i, chunk in enumerate(chunks)
    ]
    # Submit all chunks as one batch job
    return batch_inputs

long_doc = 'Lorem ipsum ' * 5000  # ~20K character document
chunks = chunk_document(long_doc)
print(f'Chunks: {len(chunks)}, first chunk length: {len(chunks[0]["text"])} chars')

बड़े बैचों की प्रगति निगरानी

बड़े बैच कार्यों (हज़ारों अनुरोधों) के लिए रीयल-टाइम प्रगति दिखाएँ, ताकि संचालक प्रसंस्करण क्षमता पर नज़र रख सकें और पूरा होने के समय का अनुमान लगा सकें।

import asyncio
import time

async def batch_with_progress(prompts, max_concurrent=20):
    semaphore = asyncio.Semaphore(max_concurrent)
    completed = 0
    total = len(prompts)
    start_time = time.time()
    results = [None] * total

    async def process_one(i, prompt):
        nonlocal completed
        async with semaphore:
            results[i] = await resilient_completion(prompt)
            completed += 1

        elapsed = time.time() - start_time
        rate = completed / elapsed if elapsed > 0 else 0
        eta = (total - completed) / rate if rate > 0 else float('inf')

        if completed % 10 == 0 or completed == total:
            print(f'Progress: {completed}/{total} '
                  f'({completed/total:.0%}) | '
                  f'{rate:.1f} req/s | '
                  f'ETA: {eta:.0f}s')

    await asyncio.gather(*[
        process_one(i, p) for i, p in enumerate(prompts)
    ])
    return results

print('Progress tracking: reports every 10 completions with ETA.')

त्वरित जाँच

आपको रात भर में भावना विश्लेषण के लिए 10,000 दस्तावेज़ों पर लेबल लगाने हैं। आप लागत कम से कम रखना चाहते हैं और आपको रीयल-टाइम परिणामों की आवश्यकता नहीं है। कौन-सा तरीका सबसे अच्छा है?

बैच और अतुल्यकालिक निष्पादन का सारांश

बड़े पैमाने पर प्रॉम्प्ट इंजीनियरिंग के लिए बैच प्रसंस्करण और अतुल्यकालिक निष्पादन आवश्यक हैं:

  • OpenAI/Anthropic बैच एपीआई: लागत में 50% कमी, पृष्ठभूमि में प्रसंस्करण, प्रति बैच 50 हज़ार तक अनुरोध
  • asyncio.gather(): समवर्ती रीयल-टाइम अनुरोध, सभी एक साथ शुरू होते हैं और सभी परिणामों की प्रतीक्षा करते हैं
  • Semaphore: दर-सीमा के अनुरूप समवर्ती नियंत्रण (आमतौर पर 10-50 समवर्ती अनुरोध)
  • घातांकीय बैकऑफ़: दर-सीमा या समय-समाप्ति संबंधी त्रुटियों पर दोगुनी देरी के साथ पुनःप्रयास
  • लचीला gather: return_exceptions=True किसी एक विफलता को पूरे बैच को रोकने से बचाता है
  • प्रगति निगरानी: बड़े कार्यों के लिए दर और ETA के साथ पूर्ण हुए अनुरोधों की रिपोर्ट
शुरुआत निःशुल्क

एआई शिक्षक के साथ AI प्रॉम्प्ट इंजीनियरिंग सीखें — निःशुल्क

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

पाठ्यक्रम
53
पाठ
199

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

क्या “बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन” पाठ निःशुल्क है?

हाँ — AI प्रॉम्प्ट इंजीनियरिंग अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। AI प्रॉम्प्ट इंजीनियरिंग पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन” में मैं क्या सीखूँगा?

OpenAI Batch API, अतुल्यकालिक Python और समवर्ती प्रॉम्प्ट निष्पादन। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI प्रॉम्प्ट इंजीनियरिंग का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI प्रॉम्प्ट इंजीनियरिंग शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

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

“बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन” पाठ पूरा करने में कितना समय लगता है?

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

क्या मैं इस AI प्रॉम्प्ट इंजीनियरिंग पाठ में कोड लिख और चला सकता हूँ?

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

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

  1. प्रॉम्प्ट के लिए कैशिंग रणनीतियाँ
  2. बैच प्रोसेसिंग और अतुल्यकालिक निष्पादन
  3. मॉडलों के बीच लोड संतुलन
  4. प्रॉम्प्ट पाइपलाइनों की निगरानी और चेतावनी
← AI प्रॉम्प्ट इंजीनियरिंग पर वापस जाएँ