Menangani Data Parsial dan Hilang
Rancang skema dengan bidang Optional dan skor keyakinan, implementasikan strategi ekstraksi cadangan untuk dokumen ambigu, lalu catat ekstraksi dengan keyakinan rendah untuk ditinjau manusia.
Menangani Data Parsial dan Hilang adalah pelajaran AI Engineering Academy 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 Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Kenyataan tentang Dokumen yang Tidak Lengkap
Dokumen dunia nyata jarang memuat setiap bidang yang diharapkan oleh skema Anda. Faktur mungkin tidak memiliki nomor PO, resume mungkin tidak mencantumkan tanggal, dan artikel berita mungkin tidak menyebutkan lokasi. Merancang skema ekstraksi agar dapat menangani data parsial dan data yang hilang dengan baik sama pentingnya dengan mengekstrak data yang tersedia.
Bidang Opsional di Pydantic
Tandai bidang yang mungkin tidak muncul di setiap dokumen sebagai Optional[type] dan beri nilai bawaan None. Pydantic v2 memperlakukan bidang-bidang ini sebagai nullable, dan model diarahkan untuk tidak mengarang nilai saat informasi tidak tersedia. Selalu utamakan None daripada string kosong untuk data yang hilang karena lebih mudah difilter pada tahap berikutnya.
from pydantic import BaseModel, Field
from typing import Optional
class JobPosting(BaseModel):
title: str
company: str
salary_min: Optional[float] = Field(None, description='Minimum salary if stated')
salary_max: Optional[float] = Field(None, description='Maximum salary if stated')
remote: Optional[bool] = Field(None, description='True if remote, False if on-site, None if unspecified')Menambahkan Skor Keyakinan
Minta model menilai keyakinannya sendiri pada setiap bidang yang diekstrak dengan menambahkan skor keyakinan di samping nilainya. Bungkus keduanya dalam pembantu generik FieldExtract. Hasil ekstraksi dengan keyakinan rendah dapat diarahkan kepada peninjau manusia, bukan langsung diteruskan ke sistem berikutnya, sehingga mengurangi risiko data yang buruk tanpa terdeteksi.
from pydantic import BaseModel
from typing import Optional
class Confident(BaseModel):
value: Optional[str]
confidence: float # 0.0 to 1.0
class ContractExtract(BaseModel):
party_a: Confident
party_b: Confident
effective_date: Confident
termination_clause: ConfidentNilai Penanda vs. None
Terkadang ketiadaan data itu sendiri memiliki makna. Gunakan Optional Python bersama enumerasi Literal untuk membedakan antara tidak disebutkan, secara eksplisit dinyatakan tidak ada, dan tidak diketahui. Pembedaan tiga arah ini mencegah kode tahap berikutnya memperlakukan ketiadaan yang dinyatakan secara eksplisit sama seperti penyebutan yang hilang, yang dapat menyebabkan kesalahan logika bisnis yang sulit terlihat.
from pydantic import BaseModel
from typing import Optional, Literal
class Discount(BaseModel):
# 'none' = explicitly no discount; None = not mentioned
discount_type: Optional[Literal['percentage', 'fixed', 'none']] = None
discount_value: Optional[float] = NoneStrategi Ekstraksi Cadangan
Saat pemanggilan ekstraksi utama menghasilkan terlalu banyak bidang None, coba perintah tindak lanjut yang terarah dan berfokus khusus pada informasi yang hilang. Kirim hanya paragraf yang relevan bersama model yang diekstrak sebagian, lalu minta model mengisi bidang yang kosong saja. Pendekatan dua tahap ini secara signifikan meningkatkan perolehan kembali pada dokumen yang ambigu.
def fill_missing(partial: JobPosting, raw_text: str) -> JobPosting:
missing = [k for k, v in partial.model_dump().items() if v is None]
if not missing:
return partial
prompt = f'From this text, extract ONLY these fields: {missing}.\n\n{raw_text}'
supplement = client.chat.completions.create(
model='gpt-4o-mini',
response_model=JobPosting,
messages=[{'role': 'user', 'content': prompt}]
)
merged = partial.model_dump()
for field in missing:
if getattr(supplement, field) is not None:
merged[field] = getattr(supplement, field)
return JobPosting(**merged)Menggunakan Nilai Bawaan dan Factory
Untuk bidang yang memiliki nilai bawaan yang masuk akal saat data hilang, gunakan default atau default_factory milik Pydantic. Misalnya, daftar tag sebaiknya memiliki nilai bawaan berupa daftar kosong, bukan None, agar kode tahap berikutnya selalu dapat melakukan iterasi atasnya. Gunakan None untuk bidang yang ketiadaannya harus ditandai dan ditangani secara eksplisit.
from pydantic import BaseModel, Field
from typing import List, Optional
class Article(BaseModel):
title: str
author: Optional[str] = None
tags: List[str] = Field(default_factory=list)
word_count: Optional[int] = None
published_date: Optional[str] = NoneMengarahkan Ekstraksi dengan Keyakinan Rendah
Buat antrean peninjauan untuk ekstraksi yang memiliki keyakinan di bawah ambang batas. Simpan hasil dengan keyakinan rendah dalam tabel basis data terpisah dengan penanda needs_review, tampilkan hasil tersebut di UI peninjauan internal, dan izinkan anotator manusia memperbaikinya. Masukkan koreksi tersebut kembali sebagai contoh few-shot untuk meningkatkan ekstraksi berikutnya.
CONFIDENCE_THRESHOLD = 0.75
def process_extraction(result: ContractExtract, doc_id: str):
needs_review = any(
field.confidence < CONFIDENCE_THRESHOLD
for field in [result.party_a, result.party_b, result.effective_date]
)
if needs_review:
queue_for_human_review(doc_id, result)
else:
store_in_production_table(doc_id, result)Menangani Rentang Teks yang Ambigu
Beberapa bidang dapat diekstrak dengan beberapa cara yang valid dari teks yang sama. Misalnya, tanggal yang ditulis sebagai 'Senin depan' bersifat ambigu tanpa tanggal acuan. Gunakan bidang raw_span untuk menangkap teks persis yang digunakan model, di samping nilai yang dinormalisasi. Hal ini mempertahankan bukti asli dan membuat penelusuran kesalahan ekstraksi jauh lebih mudah.
from pydantic import BaseModel
from typing import Optional
class DateField(BaseModel):
raw_span: Optional[str] = None # exact text from document
iso_date: Optional[str] = None # normalized YYYY-MM-DD
confidence: float = 1.0
class Contract(BaseModel):
effective_date: DateField
expiration_date: DateFieldMencatat Pola Bidang yang Hilang
Lacak bidang yang paling sering bernilai None di seluruh korpus dokumen Anda. Tingkat kehilangan yang tinggi pada bidang wajib menunjukkan bahwa bidang tersebut memang tidak ada di sebagian besar dokumen, atau deskripsi skema Anda membingungkan model. Mencatat pola kehilangan berdasarkan jenis dokumen membantu Anda memilah perbaikan skema yang akan memberikan dampak terbesar pada kualitas data.
from collections import Counter
missing_counter = Counter()
def log_missing(result):
for field, value in result.model_dump().items():
if value is None:
missing_counter[field] += 1
# After processing 1000 documents:
for field, count in missing_counter.most_common(5):
print(f'{field}: {count} missing ({100*count//1000}%)')Menggabungkan Ekstraksi dalam Beberapa Tahap
Untuk dokumen kompleks seperti laporan tahunan atau kontrak panjang, strategi ekstraksi multi-tahap paling efektif. Pada tahap pertama, ekstrak bidang dengan keyakinan tinggi yang selalu tersedia. Pada tahap-tahap berikutnya, fokuskan ekstraksi pada bagian atau paragraf tertentu untuk mengambil bidang yang lebih sulit. Gabungkan semua tahap menjadi satu catatan akhir, dengan membiarkan tahap berikutnya menimpa nilai None dari tahap sebelumnya.
def multi_pass_extract(pages: list) -> Invoice:
# Pass 1: header info from first page
header = extract_header(pages[0])
# Pass 2: line items from middle pages
items = []
for page in pages[1:-1]:
items.extend(extract_line_items(page))
# Pass 3: totals from last page
totals = extract_totals(pages[-1])
return Invoice(
vendor=header.vendor,
invoice_number=header.invoice_number,
line_items=items,
total_amount=totals.total_amount
)Praktik Terbaik Perancangan Skema
Skema yang dirancang dengan baik secara alami mengurangi data yang hilang. Gunakan deskripsi bidang yang sempit dan spesifik agar model mengetahui dengan tepat hal yang harus dicari. Hindari menggabungkan dua konsep dalam satu bidang. Tambahkan examples dalam deskripsi bidang untuk memandu ekstraksi. Skema yang memudahkan tugas model akan memiliki jauh lebih sedikit bidang yang hilang daripada skema yang mengandalkan label yang samar.
from pydantic import BaseModel, Field
class Address(BaseModel):
street: str = Field(description='Street number and name, e.g. 123 Main St')
city: str = Field(description='City name only, no state')
state: str = Field(description='Two-letter US state code, e.g. CA')
zip_code: str = Field(description='5-digit ZIP code, e.g. 94105')
country: str = Field(default='US', description='ISO 3166-1 alpha-2 country code')Pemeriksaan Singkat
Uji pemahaman Anda tentang penanganan data parsial dan data yang hilang dalam alur ekstraksi.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa bidang opsional dengan nilai bawaan None mencegah pengarang-ngarangan data yang hilang, skor keyakinan dan antrean peninjauan menyediakan jaring pengaman untuk ekstraksi yang tidak pasti, dan ekstraksi multi-tahap meningkatkan perolehan kembali pada dokumen kompleks dengan memusatkan setiap tahap pada bagian tertentu. Selanjutnya, kita akan menskalakan ekstraksi dengan pemrosesan asinkron dan antrean.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menangani Data Parsial dan Hilang” gratis?
Ya — teks lengkap “Menangani Data Parsial dan Hilang” 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 “Menangani Data Parsial dan Hilang”?
Rancang skema dengan bidang Optional dan skor keyakinan, implementasikan strategi ekstraksi cadangan untuk dokumen ambigu, lalu catat ekstraksi dengan keyakinan rendah untuk ditinjau manusia. 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 2 dari 4.
Berapa lama pelajaran “Menangani Data Parsial dan Hilang” 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
- Instructor: Ekstraksi Bertipe dengan Pydantic
- Menangani Data Parsial dan Hilang
- Pemrosesan Kelompok dengan Asinkron dan Antrean
- Evolusi Skema dan Kompatibilitas Mundur