← Semua pembelajaran / AWS untuk AI Engineer
Fase 7 · Observability, Biaya & Evaluasi

Batch inference

Batch inference mengirim banyak prompt sekaligus lewat S3 dan mengembalikan hasilnya ke S3. Cocok untuk pekerjaan besar yang tidak butuh jawaban seketika.

Intisari

  • Masukan berupa berkas JSONL di S3; hasilnya juga ditulis ke S3.
  • Format masukan mengikuti API InvokeModel atau Converse.
  • Tidak mendukung tool calling maupun structured output — tiap record diproses independen, tanpa interaksi bolak-balik.
  • Tidak berlaku untuk provisioned model, dan tidak bisa memakai prompt caching.
  • Tarifnya lebih murah dari on-demand — ini pengungkit biaya terbesar untuk pekerjaan besar.

Kapan dipakai

PekerjaanBatch cocok?
Mengklasifikasi 100.000 tiket dukunganSangat
Meringkas seluruh arsip dokumenSangat
Menjalankan dataset evaluasi besarYa
Menghasilkan metadata untuk pipeline ingestYa
Menjawab pertanyaan penggunaTidak — asinkron
Alur agent dengan toolTidak — tool calling tidak didukung

Format masukan

{"recordId":"001","modelInput":{"messages":[{"role":"user","content":[{"text":"Klasifikasikan: printer tidak menyala"}]}],"inferenceConfig":{"maxTokens":50}}}
{"recordId":"002","modelInput":{"messages":[{"role":"user","content":[{"text":"Klasifikasikan: lupa password"}]}],"inferenceConfig":{"maxTokens":50}}}

Satu baris JSON per record, tanpa koma antar baris — itulah JSONL. recordId yang kamu tentukan akan muncul lagi di hasilnya, dan itu satu-satunya cara mencocokkan keluaran dengan masukan.

Menjalankan

kelola = boto3.client("bedrock")

job = kelola.create_model_invocation_job(
    jobName="klasifikasi-tiket-2026-08",
    roleArn="arn:aws:iam::123456789012:role/BedrockBatchRole",
    modelId=MODEL_ID,
    inputDataConfig={"s3InputDataConfig": {
        "s3Uri": "s3://batch-ku/masukan/tiket.jsonl"}},
    outputDataConfig={"s3OutputDataConfig": {
        "s3Uri": "s3://batch-ku/keluaran/"}},
)

print(kelola.get_model_invocation_job(jobIdentifier=job["jobArn"])["status"])

Jangan polling status dengan loop. Job batch bisa berjalan berjam-jam. Bedrock menerbitkan perubahan status ke EventBridge — pakai rule yang memicu Lambda saat job selesai, seperti pola di Fase 1. Loop while yang menunggu di Lambda hanya membakar waktu eksekusi.

Membaca hasil

import json
import boto3

s3 = boto3.client("s3")

isi = s3.get_object(Bucket="batch-ku", Key="keluaran/…/tiket.jsonl.out")["Body"]

for baris in isi.iter_lines():
    rec = json.loads(baris)
    if "modelOutput" in rec:
        teks = rec["modelOutput"]["output"]["message"]["content"][0]["text"]
        print(rec["recordId"], teks)
    else:
        print(rec["recordId"], "GAGAL:", rec.get("error"))

Perhatikan cabang else: sebagian record bisa gagal sementara sisanya berhasil. Kode yang mengasumsikan semua record punya modelOutput akan meledak di berkas hasil yang sebenarnya sebagian besar sukses.

Batasan yang perlu dihafal

BatasanKonsekuensinya
Tidak mendukung tool callingAlur agent tidak bisa dibatch
Tidak mendukung structured outputMinta format JSON lewat instruksi prompt, lalu validasi sendiri
Tiap record independenTidak ada percakapan multi-giliran
Tidak untuk provisioned modelPilih salah satu
Prompt caching tidak berlakuPrefiks panjang yang berulang tetap dibayar penuh
AsinkronRancang alurnya berbasis event sejak awal

Tempatnya dalam strategi biaya

TeknikUntuk bebanPenghematan
Model lebih kecilSemuaSering paling besar
Prompt cachingInteraktif, prefiks berulangBesar
Batch inferenceOffline, volume besarBesar
maxTokens yang ketatSemuaSedang
Provisioned ThroughputStabil dan tinggiHanya di atas titik impas

Latihan: ambil 200 pertanyaan dari log invocation-mu, susun jadi JSONL, dan jalankan sebagai job batch untuk mengklasifikasikan topiknya. Bandingkan biaya dan waktunya dengan 200 panggilan on-demand berurutan, dan catat kedua angkanya.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.