Ekstraksi Data Berbasis Skema
Sediakan skema JSON dalam perintah untuk menjamin format keluaran terstruktur.
Ekstraksi Data Berbasis Skema adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 2 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 Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Mengapa Ekstraksi Berbasis Skema?
Jika Anda memberi tahu model ekstrak data penting, Anda akan mendapatkan keluaran yang tidak konsisten dan tidak dapat diprediksi. Jika Anda memberikan skema JSON dan mengatakan ekstrak data yang sesuai dengan skema persis ini, Anda akan selalu mendapatkan keluaran yang dapat dibaca mesin, konsisten, dan aman berdasarkan jenis.
Ekstraksi berbasis skema adalah pola yang digunakan dalam sistem produksi untuk memproses faktur, kontrak, rekam medis, catatan rapat, dan dokumen apa pun yang datanya harus diekstrak secara andal dari teks tidak terstruktur.
Memberikan Skema dalam Perintah
Skema ditempatkan langsung dalam perintah. Model menggunakannya sebagai kontrak keluaran:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
INVOICE_SCHEMA = '''
{
"invoice_number": "string",
"vendor_name": "string",
"vendor_address": "string or null",
"invoice_date": "YYYY-MM-DD",
"due_date": "YYYY-MM-DD or null",
"line_items": [
{
"description": "string",
"quantity": "number",
"unit_price": "number",
"total": "number"
}
],
"subtotal": "number",
"tax": "number or null",
"total_amount": "number",
"currency": "3-letter ISO code e.g. USD"
}
'''
def extract_invoice(invoice_text):
prompt = f'Extract structured data from this invoice.\nReturn JSON matching this schema exactly:\n{INVOICE_SCHEMA}\n\nInvoice:\n{invoice_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=500, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
print('Invoice schema defined.')Contoh Ekstraksi Faktur
Menerapkan skema untuk mengekstrak data terstruktur dari teks faktur nyata:
invoice_text = '''
INVOICE #INV-2025-0342
From: Acme Software Ltd.
123 Tech Street, San Francisco, CA 94105
Date: March 15, 2025
Due: April 14, 2025
Items:
- Annual Pro License (5 seats) x1 @ $2,400.00 = $2,400.00
- Setup & Onboarding x2 @ $300.00 = $600.00
Subtotal: $3,000.00
Tax (8.5%): $255.00
TOTAL DUE: $3,255.00 USD
'''
result = extract_invoice(invoice_text)
print(f'Invoice: {result["invoice_number"]}')
print(f'Vendor: {result["vendor_name"]}')
print(f'Total: {result["currency"]} {result["total_amount"]}')
print(f'Line items: {len(result["line_items"])}')Ekstraksi Catatan Rapat
Menerapkan ekstraksi berbasis skema pada catatan rapat — jenis dokumen yang strukturnya lebih longgar:
MEETING_SCHEMA = '''
{
"meeting_title": "string",
"date": "YYYY-MM-DD",
"attendees": ["string"],
"decisions": ["string"],
"action_items": [
{
"task": "string",
"owner": "string or null",
"due_date": "YYYY-MM-DD or null"
}
],
"next_meeting": "string or null"
}
'''
meeting_notes = '''
Product Sync - March 20, 2025
Attendees: Sarah (PM), Jake (Engineering), Priya (Design)
Decided to push the v2.0 launch to April 15.
Will not include the analytics dashboard in v2.0.
Actions:
- Jake to fix the login bug by March 25
- Priya to finalize mockups by March 22
- Sarah to send updated roadmap to stakeholders (no date set)
Next sync: March 27, same time.
'''
print(f'Meeting schema: {len(MEETING_SCHEMA)} chars')
print(f'Notes length: {len(meeting_notes)} chars')Ekstraksi Spesifikasi Produk
Mengekstrak spesifikasi produk terstruktur dari deskripsi katalog:
PRODUCT_SCHEMA = '''
{
"product_name": "string",
"sku": "string or null",
"category": "string",
"price": {"amount": "number", "currency": "string"},
"dimensions": {
"length_cm": "number or null",
"width_cm": "number or null",
"height_cm": "number or null",
"weight_kg": "number or null"
},
"colors": ["string"],
"materials": ["string"],
"features": ["string"],
"in_stock": true | false
}
'''
product_text = 'AlphaDesk Pro standing desk. SKU: AD-PRO-001. $899. Available in white and black. 120x60x75cm, 35kg. Steel frame, bamboo top. Features: memory height, anti-collision, app control. In stock.'
prompt = f'Extract product specs. Return JSON:\n{PRODUCT_SCHEMA}\n\nProduct: {product_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=400, messages=[{'role': 'user', 'content': prompt}])
print(json.loads(r.content[0].text))Menangani Bidang Opsional
Skema harus menangani bidang opsional dengan baik. Gunakan null sebagai nilai bawaan untuk data yang tidak ada, alih-alih menghilangkan bidang tersebut — ini menjaga konsistensi struktur keluaran:
prompt_optional = '''
Extract the data. For fields not present in the source text,
use null — do NOT omit the field.
Every field in the schema must appear in the output.
Schema:
{
"company": "string",
"ceo": "string or null",
"founded": "YYYY or null",
"revenue": "string or null",
"employees": "number or null"
}
Text: Vertex AI Solutions is a B2B SaaS company.
'''
# Expected output: ceo, founded, revenue, employees all set to null
# NOT omitted — null fields are still present in the JSON
print(prompt_optional)Ekstraksi Banyak Dokumen dengan Skema yang Sama
Skema yang sama dapat diterapkan secara konsisten pada banyak dokumen. Dengan cara inilah Anda membangun basis data terstruktur dari dokumen tidak terstruktur dalam skala besar:
def extract_many(documents, schema):
results = []
for i, doc in enumerate(documents):
try:
r = client.messages.create(
model='claude-opus-4-5', max_tokens=400,
messages=[{'role': 'user', 'content': f'Extract data. Return JSON matching schema:\n{schema}\n\nDocument:\n{doc}'}]
)
parsed = json.loads(r.content[0].text)
parsed['_source_doc'] = i
parsed['_extraction_ok'] = True
results.append(parsed)
except (json.JSONDecodeError, Exception) as e:
results.append({'_source_doc': i, '_extraction_ok': False, '_error': str(e)})
return results
invoices = ['Invoice from Acme, March 2025, $500', 'Invoice from Beta Corp, April 2025, $1200']
results = extract_many(invoices, INVOICE_SCHEMA)
print(f'Processed: {len([r for r in results if r["_extraction_ok"]])} success, {len([r for r in results if not r["_extraction_ok"]])} failed')Validasi Skema setelah Ekstraksi
Validasi data yang diekstrak terhadap skema yang diharapkan menggunakan pustaka jsonschema Python atau validator khusus:
def validate_extracted(data, required_fields, type_checks):
errors = []
# Check required fields
for field in required_fields:
if field not in data or data[field] is None:
errors.append(f'Required field missing or null: {field}')
# Check types
for field, expected_type in type_checks.items():
if field in data and data[field] is not None:
if not isinstance(data[field], expected_type):
errors.append(f'{field}: expected {expected_type.__name__}, got {type(data[field]).__name__}')
return errors
extracted = {'invoice_number': 'INV-001', 'total_amount': 3255.0, 'vendor_name': 'Acme', 'invoice_date': '2025-03-15'}
required = ['invoice_number', 'total_amount', 'vendor_name']
types = {'total_amount': float, 'invoice_number': str, 'line_items': list}
errors = validate_extracted(extracted, required, types)
print('Validation errors:', errors)Penyempurnaan Skema secara Iteratif
Skema berkembang melalui pengujian iteratif. Prosesnya:
- Tentukan skema awal berdasarkan pengetahuan domain
- Jalankan ekstraksi pada 20 dokumen sampel
- Tinjau keluaran — bidang mana yang secara konsisten salah atau tidak ada?
- Sempurnakan deskripsi skema dan tambahkan definisi bidang
- Jalankan ulang pada 20 dokumen yang sama
- Ulangi hingga kualitas memenuhi ambang batas
Menambahkan Deskripsi Bidang ke Skema
Jika suatu bidang ambigu, tambahkan komentar deskripsi untuk memandu model:
ANNOTATED_SCHEMA = '''
{
"invoice_number": "string // The unique identifier for this invoice, e.g., INV-2025-001",
"invoice_date": "YYYY-MM-DD // Date the invoice was issued",
"due_date": "YYYY-MM-DD or null // Payment due date; null if not specified",
"subtotal": "number // Amount before tax, as a decimal number",
"tax": "number or null // Tax amount as a decimal; null if tax is not listed",
"total_amount": "number // Final amount to pay, including tax",
"payment_terms": "string or null // e.g., Net 30, Due on receipt; null if not mentioned"
}
'''
print('Annotated schema adds context per field.')
print(f'Schema length: {len(ANNOTATED_SCHEMA)} chars')Skor Keyakinan untuk Bidang yang Diekstrak
Untuk sistem produksi, sertakan skor keyakinan untuk setiap bidang. Ekstraksi dengan keyakinan rendah dapat diarahkan untuk ditinjau oleh manusia:
SCHEMA_WITH_CONFIDENCE = '''
{
"fields": {
"invoice_number": {"value": "string", "confidence": "high|medium|low"},
"total_amount": {"value": "number", "confidence": "high|medium|low"},
"due_date": {"value": "YYYY-MM-DD or null", "confidence": "high|medium|low"}
},
"overall_confidence": "high|medium|low",
"extraction_notes": "string or null // Any ambiguities encountered"
}
'''
prompt = f'Extract invoice data with confidence scores.\nReturn JSON:\n{SCHEMA_WITH_CONFIDENCE}\n\nInvoice: Payment due within 30 days. Total is approximately $500.'
r = client.messages.create(model='claude-opus-4-5', max_tokens=300, messages=[{'role': 'user', 'content': prompt}])
result = json.loads(r.content[0].text)
print('Overall confidence:', result.get('overall_confidence'))
print('Notes:', result.get('extraction_notes'))Pemeriksaan Singkat
Jika bidang wajib tidak terdapat dalam dokumen sumber, apa yang harus diinstruksikan oleh perintah ekstraksi berbasis skema kepada model untuk dikembalikan pada bidang tersebut?
Ekstraksi Berbasis Skema — Poin Utama
Ekstraksi berbasis skema adalah standar untuk pemrosesan dokumen yang andal dalam produksi:
- Berikan skema JSON persis dalam perintah — model menggunakannya sebagai kontrak keluaran
- Tambahkan deskripsi bidang untuk bidang ambigu guna memandu interpretasi model
- Selalu instruksikan: bidang yang tidak ada harus menghasilkan null, jangan pernah menghilangkannya
- Terapkan skema yang sama pada banyak dokumen untuk menghasilkan keluaran yang konsisten dan siap digunakan dalam basis data
- Sertakan skor keyakinan untuk setiap bidang agar peninjauan oleh manusia dapat diarahkan dengan tepat
- Validasi data secara terprogram setelah setiap ekstraksi
- Sempurnakan skema secara iteratif: ekstrak 20 sampel, tinjau, perbaiki, ulangi
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Ekstraksi Data Berbasis Skema” gratis?
Ya — teks lengkap “Ekstraksi Data Berbasis Skema” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Ekstraksi Data Berbasis Skema”?
Sediakan skema JSON dalam perintah untuk menjamin format keluaran terstruktur. Kamu berlatih AI Prompt Engineering 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 Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering 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 2 dari 4.
Berapa lama pelajaran “Ekstraksi Data Berbasis Skema” 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 Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering 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
- Perintah Ekstraksi Entitas Bernama
- Ekstraksi Data Berbasis Skema
- LLM sebagai Pengklasifikasi Teks
- Keyakinan dan Ketidakpastian dalam Klasifikasi