การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย
ออกแบบโครงสร้างข้อมูลด้วยฟิลด์ Optional และคะแนนความเชื่อมั่น ใช้กลยุทธ์สำรองในการดึงข้อมูลสำหรับเอกสารกำกวม และบันทึกการดึงข้อมูลที่มีความเชื่อมั่นต่ำไว้ให้มนุษย์ตรวจสอบ
การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความเป็นจริงของเอกสารที่ไม่ครบถ้วน
เอกสารในโลกจริงแทบไม่เคยมีทุกฟิลด์ตามที่สคีมาของคุณคาดหวัง ใบแจ้งหนี้อาจไม่มีเลข PO ประวัติย่ออาจไม่ระบุวันที่ และบทความข่าวอาจไม่กล่าวถึงสถานที่ การออกแบบสคีมาสำหรับดึงข้อมูลให้จัดการกับข้อมูลบางส่วนและข้อมูลที่หายไปได้อย่างเหมาะสมมีความสำคัญไม่แพ้การดึงข้อมูลที่มีอยู่
ฟิลด์ที่เป็นตัวเลือกใน Pydantic
ทำเครื่องหมายฟิลด์ที่อาจไม่ปรากฏในเอกสารทุกฉบับเป็น Optional[type] และกำหนดค่าเริ่มต้นเป็น None Pydantic v2 จะถือว่าฟิลด์เหล่านี้อนุญาตให้เป็นค่าว่าง และโมเดลจะได้รับคำสั่งไม่ให้สร้างค่าขึ้นเองเมื่อไม่มีข้อมูล ควรใช้ None แทนสตริงว่างสำหรับข้อมูลที่หายไปเสมอ เพราะกรองต่อในขั้นตอนถัดไปได้ง่ายกว่า
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')การเพิ่มคะแนนความมั่นใจ
ขอให้โมเดลประเมินความมั่นใจของตนเองในแต่ละฟิลด์ที่ดึงได้ โดยเพิ่มคะแนนความมั่นใจไว้คู่กับค่า ห่อทั้งสองค่าไว้ในตัวช่วยทั่วไป FieldExtract ผลลัพธ์ที่มีความมั่นใจต่ำสามารถส่งต่อไปให้ผู้ตรวจสอบที่เป็นมนุษย์ แทนการส่งตรงไปยังระบบขั้นถัดไป ซึ่งช่วยลดความเสี่ยงจากข้อมูลผิดที่ไม่ถูกตรวจพบ
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: Confidentค่าบ่งชี้พิเศษเทียบกับ None
บางครั้งการไม่มีข้อมูลก็มีความหมายในตัวเอง ใช้ Optional ของ Python ร่วมกับ enum Literal เพื่อแยกความแตกต่างระหว่าง ไม่ได้กล่าวถึง ระบุไว้อย่างชัดเจนว่าไม่มี และ ไม่ทราบ ความแตกต่างสามทางนี้ป้องกันไม่ให้โค้ดขั้นถัดไปปฏิบัติต่อการระบุว่าไม่มีอย่างชัดเจนเหมือนกับการไม่ได้กล่าวถึง ซึ่งอาจทำให้เกิดข้อผิดพลาดละเอียดอ่อนในตรรกะทางธุรกิจ
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] = Noneกลยุทธ์การดึงข้อมูลสำรอง
เมื่อการเรียกใช้เพื่อดึงข้อมูลหลักส่งคืนฟิลด์ None มากเกินไป ให้ลองใช้พรอมต์ติดตามผลแบบเจาะจงที่มุ่งเน้นข้อมูลที่หายไปโดยเฉพาะ ส่งเฉพาะย่อหน้าที่เกี่ยวข้องพร้อมโมเดลที่ดึงข้อมูลมาได้บางส่วน แล้วขอให้โมเดลเติมเฉพาะฟิลด์ที่ว่าง วิธีการสองรอบนี้ช่วยเพิ่มความครอบคลุมในเอกสารที่คลุมเครือได้อย่างมาก
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)การใช้ค่าเริ่มต้นและโรงงานสร้างค่า
สำหรับฟิลด์ที่มีค่าเริ่มต้นเหมาะสมเมื่อข้อมูลหายไป ให้ใช้ default หรือ default_factory ของ Pydantic ตัวอย่างเช่น รายการแท็กควรมีค่าเริ่มต้นเป็นรายการว่างแทน None เพื่อให้โค้ดขั้นถัดไปวนดูรายการได้เสมอ สงวน None ไว้สำหรับฟิลด์ที่ต้องทำเครื่องหมายและจัดการกรณีไม่มีข้อมูลอย่างชัดเจน
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] = Noneการส่งต่อข้อมูลที่มีความมั่นใจต่ำไปตรวจสอบ
สร้างคิวตรวจสอบสำหรับข้อมูลที่ดึงได้ซึ่งมีความมั่นใจต่ำกว่าเกณฑ์ เก็บผลลัพธ์ที่มีความมั่นใจต่ำไว้ในตารางฐานข้อมูลแยกต่างหากพร้อมแฟล็ก needs_review แสดงผลลัพธ์เหล่านี้ใน UI ตรวจสอบภายใน และอนุญาตให้ผู้ใส่คำกำกับที่เป็นมนุษย์แก้ไข จากนั้นป้อนการแก้ไขกลับไปเป็นตัวอย่างแบบ few-shot เพื่อปรับปรุงการดึงข้อมูลในอนาคต
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)การจัดการช่วงข้อความที่คลุมเครือ
บางฟิลด์สามารถดึงได้หลายรูปแบบที่ถูกต้องจากข้อความเดียวกัน ตัวอย่างเช่น วันที่ที่เขียนว่า 'วันจันทร์หน้า' จะคลุมเครือหากไม่มีวันที่อ้างอิง ใช้ฟิลด์ raw_span เพื่อเก็บข้อความที่โมเดลใช้แบบตรงตามต้นฉบับไว้คู่กับค่าที่ปรับให้อยู่ในรูปมาตรฐาน วิธีนี้จะรักษาหลักฐานดั้งเดิมและทำให้การแก้ไขข้อบกพร่องของการดึงข้อมูลง่ายขึ้นมาก
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: DateFieldการบันทึกรูปแบบของฟิลด์ที่หายไป
ติดตามว่าฟิลด์ใดมีค่า None บ่อยที่สุดในชุดเอกสารของคุณ อัตราการหายไปที่สูงในฟิลด์ที่จำเป็นอาจบ่งชี้ว่าฟิลด์นั้นไม่มีอยู่จริงในเอกสารส่วนใหญ่ หรือคำอธิบายสคีมาของคุณทำให้โมเดลสับสน การบันทึกรูปแบบฟิลด์ที่หายไปแยกตามประเภทเอกสารช่วยให้คุณจัดลำดับความสำคัญของการปรับปรุงสคีมาที่จะส่งผลต่อคุณภาพข้อมูลมากที่สุด
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}%)')การรวมผลการดึงข้อมูลจากหลายรอบ
สำหรับเอกสารซับซ้อน เช่น รายงานประจำปีหรือสัญญายาว กลยุทธ์การดึงข้อมูลหลายรอบมักให้ผลดีที่สุด ในรอบแรก ให้ดึงฟิลด์ที่มีความมั่นใจสูงและมีอยู่เสมอ ในรอบถัดไป ให้มุ่งเน้นส่วนหรือย่อหน้าเฉพาะเพื่อดึงฟิลด์ที่ยากขึ้น รวมผลจากทุกรอบเป็นระเบียนสุดท้ายเดียว โดยให้รอบหลังเขียนทับค่าที่เป็น None จากรอบก่อน
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
)แนวทางปฏิบัติที่ดีในการออกแบบสคีมา
สคีมาที่ออกแบบมาอย่างดีช่วยลดข้อมูลที่หายไปได้โดยธรรมชาติ ใช้คำอธิบายฟิลด์ที่แคบและเฉพาะเจาะจงเพื่อให้โมเดลทราบว่าต้องค้นหาอะไรอย่างแน่ชัด หลีกเลี่ยงการรวมสองแนวคิดไว้ในฟิลด์เดียว เพิ่ม examples ไว้ในคำอธิบาย Field เพื่อชี้แนะแนวทางการดึงข้อมูล สคีมาที่ทำให้โมเดลทำงานได้ง่ายจะมีฟิลด์ที่หายไปน้อยกว่าสคีมาที่พึ่งพาป้ายกำกับกำกวมมาก
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')ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการจัดการข้อมูลบางส่วนและข้อมูลที่หายไปในกระบวนการดึงข้อมูล
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า ฟิลด์ Optional ที่มีค่าเริ่มต้นเป็น Noneช่วยป้องกันการสร้างข้อมูลที่หายไปขึ้นเอง คะแนนความมั่นใจและคิวตรวจสอบสร้างกลไกความปลอดภัยสำหรับผลลัพธ์ที่ไม่แน่นอน และ การดึงข้อมูลหลายรอบช่วยเพิ่มความครอบคลุมในเอกสารซับซ้อนโดยมุ่งเน้นส่วนเฉพาะในแต่ละรอบ บทถัดไป เราจะขยายการดึงข้อมูลด้วยการประมวลผลแบบอะซิงก์และคิว
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย”
ออกแบบโครงสร้างข้อมูลด้วยฟิลด์ Optional และคะแนนความเชื่อมั่น ใช้กลยุทธ์สำรองในการดึงข้อมูลสำหรับเอกสารกำกวม และบันทึกการดึงข้อมูลที่มีความเชื่อมั่นต่ำไว้ให้มนุษย์ตรวจสอบ คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม
ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Instructor: การดึงข้อมูลแบบมีชนิดด้วย Pydantic
- การจัดการข้อมูลบางส่วนและข้อมูลที่ขาดหาย
- การประมวลผลเป็นชุดด้วยอะซิงโครนัสและคิว
- วิวัฒนาการของโครงสร้างข้อมูลและความเข้ากันได้ย้อนหลัง