การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด
เรียนรู้การใช้งาน BootstrapFewShot, MIPRO และเครื่องมือปรับให้เหมาะที่สุดอื่น ๆ ของ DSPy
การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน
ความหมายของการเพิ่มประสิทธิภาพใน DSPy
การเพิ่มประสิทธิภาพของ DSPy (เรียกว่าการคอมไพล์) จะค้นหาการตั้งค่าพรอมป์ต์ที่ดีที่สุดสำหรับโปรแกรมของคุณ โดยพิจารณาจากชุดข้อมูลฝึกและเมตริก ตัวเพิ่มประสิทธิภาพจะค้นหาจากตัวอย่างจำนวนน้อย คำสั่ง และตัวอย่างสาธิตการให้เหตุผลที่เป็นไปได้
คุณคอมไพล์หนึ่งครั้ง บันทึกผลลัพธ์ แล้วนำโปรแกรมที่เพิ่มประสิทธิภาพแล้วไปใช้งาน ในช่วงการอนุมานจะมีเพียงการเรียก LLM ที่รวดเร็วเท่านั้น ไม่มีค่าใช้จ่ายเพิ่มเติมจากการเพิ่มประสิทธิภาพอีก
การกำหนดฟังก์ชันเมตริก
ตัวเพิ่มประสิทธิภาพของ DSPy ทุกตัวต้องใช้ฟังก์ชันเมตริกเพื่อให้คะแนนการทำนายโดยพิจารณาจากเอาต์พุตที่คาดหวัง ฟังก์ชันนี้คืนค่าตัวเลข (หรือค่าบูลีน) โดยค่าที่สูงกว่าจะดีกว่า
เมตริกคือสัญญาณที่ตัวเพิ่มประสิทธิภาพใช้ตัดสินว่าการตั้งค่าพรอมป์ต์ดีหรือไม่
# Metric: exact match on answer field
def exact_match_metric(example, prediction, trace=None):
"""
example: a training example with .answer
prediction: the module's output with .answer
Returns 1.0 if correct, 0.0 otherwise
"""
expected = example.answer.strip().lower()
predicted = prediction.answer.strip().lower()
return float(expected == predicted)
# Metric: F1 score for token overlap (common in QA)
def token_f1_metric(example, prediction, trace=None):
gold_tokens = set(example.answer.lower().split())
pred_tokens = set(prediction.answer.lower().split())
if not pred_tokens:
return 0.0
precision = len(gold_tokens & pred_tokens) / len(pred_tokens)
recall = len(gold_tokens & pred_tokens) / len(gold_tokens)
if precision + recall == 0:
return 0.0
return 2 * precision * recall / (precision + recall)การเตรียมชุดข้อมูลฝึก
DSPy ต้องการชุดข้อมูลฝึกที่ประกอบด้วยออบเจ็กต์ dspy.Example แต่ละตัวอย่างระบุอินพุตและเอาต์พุตที่คาดหวัง แม้มีเพียง 20–50 ตัวอย่างก็มักเพียงพอสำหรับ BootstrapFewShot
import dspy
# Build training examples
trainset = [
dspy.Example(
question='What is the capital of Germany?',
answer='Berlin'
).with_inputs('question'),
dspy.Example(
question='Who wrote Romeo and Juliet?',
answer='William Shakespeare'
).with_inputs('question'),
dspy.Example(
question='What year did World War II end?',
answer='1945'
).with_inputs('question'),
# ... add more examples
]
print(f'Training set size: {len(trainset)} examples')
print(trainset[0].question, '->', trainset[0].answer)ตัวเพิ่มประสิทธิภาพ BootstrapFewShot
BootstrapFewShot คือตัวเพิ่มประสิทธิภาพของ DSPy ที่ใช้กันมากที่สุด โดยเรียกใช้โปรแกรมของคุณกับชุดข้อมูลฝึก รวบรวมร่องรอยการทำงานที่สำเร็จ (คู่ข้อมูลอินพุตและเอาต์พุตที่เมตริกผ่านเกณฑ์) แล้วใช้ร่องรอยเหล่านั้นเป็นตัวอย่างสาธิตจำนวนน้อยในพรอมป์ต์ที่คอมไพล์แล้ว
import dspy
from dspy.teleprompt import BootstrapFewShot
# Define your program
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# Set up the optimizer
optimizer = BootstrapFewShot(
metric=exact_match_metric,
max_bootstrapped_demos=4, # Up to 4 few-shot examples per predictor
max_labeled_demos=4, # Use labeled examples directly if available
)
# Compile!
compiled_program = optimizer.compile(program, trainset=trainset)
print('Compilation complete')ตัวเพิ่มประสิทธิภาพ MIPRO
MIPRO (การเสนอและเพิ่มประสิทธิภาพคำสั่งแบบหลายพรอมป์ต์) เป็นตัวเพิ่มประสิทธิภาพที่มีความสามารถสูงกว่า นอกจากเลือกตัวอย่างจำนวนน้อยแล้ว ยังค้นหาข้อความคำสั่งที่ดีกว่าเพื่อนำไปใส่ในพรอมป์ต์ด้วย
MIPRO ต้องใช้การเรียก LLM มากขึ้นระหว่างการคอมไพล์ แต่บ่อยครั้งให้ความแม่นยำสูงขึ้นอย่างมีนัยสำคัญ
import dspy
from dspy.teleprompt import MIPROv2
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# MIPRO: optimizes both instructions AND few-shot examples
optimizer = MIPROv2(
metric=exact_match_metric,
auto='medium', # 'light' / 'medium' / 'heavy' for optimization budget
num_threads=4, # Parallel evaluation threads
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
num_trials=20, # Number of candidate prompts to evaluate
)
print('MIPRO compilation complete')ลักษณะของพรอมป์ต์ที่คอมไพล์แล้ว
หลังการคอมไพล์ DSPy จะฝังตัวอย่างสาธิตจำนวนน้อยที่เพิ่มประสิทธิภาพแล้วลงในพรอมป์ต์ คุณตรวจสอบสิ่งนี้ได้โดยดูตัวทำนายของโปรแกรมที่คอมไพล์แล้ว
import dspy
# After compiling, inspect the optimized state
compiled_program = dspy.ChainOfThought('question -> answer')
# (Assume this was returned by optimizer.compile(...))
# Inspect the demos that were found
for demo in compiled_program.demos:
print('Input:', demo.question)
print('Reasoning:', demo.get('reasoning', 'N/A'))
print('Answer:', demo.answer)
print('---')
# Save the compiled state
compiled_program.save('compiled_qa_program.json')
print('Saved compiled program')อินเทอร์เฟซ teleprompter.compile()
ตัวเพิ่มประสิทธิภาพของ DSPy ทั้งหมดใช้อินเทอร์เฟซ compile() เดียวกัน ความสอดคล้องนี้ทำให้คุณสลับตัวเพิ่มประสิทธิภาพได้โดยไม่ต้องเปลี่ยนโค้ดโปรแกรม
from dspy.teleprompt import BootstrapFewShot, MIPROv2, COPRO
# All optimizers use the same interface:
# compiled = optimizer.compile(program, trainset=trainset)
# BootstrapFewShot: fast, uses successful traces as demos
opt1 = BootstrapFewShot(metric=exact_match_metric)
# MIPRO: slower, optimizes instructions too
opt2 = MIPROv2(metric=exact_match_metric, auto='light')
# COPRO: coordinate descent over instruction proposals
opt3 = COPRO(metric=exact_match_metric, depth=3)
# Swap between them with one line change:
compiled = opt1.compile(program, trainset=trainset)
# or: compiled = opt2.compile(program, trainset=trainset)BootstrapFewShotWithRandomSearch
BootstrapFewShotWithRandomSearch ขยายความสามารถของ BootstrapFewShot โดยสร้างชุดตัวอย่างสาธิตที่เป็นตัวเลือกจำนวนมาก แล้วเลือกชุดที่ทำผลงานดีที่สุดบนชุดตรวจสอบความถูกต้อง
เป็นทางเลือกตรงกลางที่ดีระหว่างความเรียบง่ายของ BootstrapFewShot กับความสามารถของ MIPRO
from dspy.teleprompt import BootstrapFewShotWithRandomSearch
# Split data into train and validation
trainset = examples[:40]
devset = examples[40:60]
optimizer = BootstrapFewShotWithRandomSearch(
metric=exact_match_metric,
max_bootstrapped_demos=4,
num_candidate_programs=8, # Try 8 different demo sets
num_threads=4,
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
valset=devset, # Picks the best program based on validation
)
print('Best program selected from 8 candidates')ข้อควรพิจารณาด้านต้นทุนการคอมไพล์
การคอมไพล์จะเรียก LLM เพิ่มเติมเพื่อสร้างและประเมินพรอมป์ต์ที่เป็นตัวเลือก จึงควรจัดสรรงบประมาณให้เหมาะสม:
- BootstrapFewShot: ประมาณ 1–2 เท่าของขนาดชุดข้อมูลฝึกในการเรียก LLM
- RandomSearch ที่มีตัวเลือก 8 รายการ: ประมาณ 8–10 เท่า
- MIPRO ระดับกลาง: ประมาณ 30–50 เท่า
ให้คอมไพล์แบบออฟไลน์ บันทึกผลลัพธ์ แล้วนำโปรแกรมที่บันทึกไว้ไปใช้งาน ต้นทุนการอนุมานในระบบจริงจะไม่เปลี่ยนแปลง
การตรวจสอบโปรแกรมที่คอมไพล์แล้ว
หลังการคอมไพล์ ให้ประเมินผลกับชุดทดสอบที่กันไว้นอกชุดฝึกเสมอ เพื่อยืนยันว่าโปรแกรมที่เพิ่มประสิทธิภาพแล้วสามารถใช้กับข้อมูลใหม่ได้จริง อย่าตรวจสอบเฉพาะผลการทำงานบนชุดข้อมูลฝึก
import dspy
# Evaluate on test set
evaluate = dspy.Evaluate(
devset=testset,
metric=exact_match_metric,
num_threads=4,
display_progress=True,
)
# Compare uncompiled vs compiled
uncompiled_score = evaluate(uncompiled_program)
compiled_score = evaluate(compiled_program)
print(f'Uncompiled accuracy: {uncompiled_score:.1%}')
print(f'Compiled accuracy: {compiled_score:.1%}')
print(f'Improvement: +{compiled_score - uncompiled_score:.1%}')นำทุกอย่างมาประกอบกัน
กระบวนการเพิ่มประสิทธิภาพ DSPy ที่สมบูรณ์คือ กำหนด signature → สร้างโมดูล → เตรียมข้อมูลฝึก → เลือกตัวเพิ่มประสิทธิภาพ → คอมไพล์ → ประเมินผล → บันทึก นี่คือวงจรเต็มรูปแบบตั้งแต่แนวคิดไปจนถึงกระบวนการประมวลผลพรอมป์ต์ที่เพิ่มประสิทธิภาพและพร้อมใช้งานจริง
import dspy
from dspy.teleprompt import BootstrapFewShot
# 1. Configure LM
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini', api_key='sk-...'))
# 2. Define signature and module
class QA(dspy.Signature):
"""Answer questions accurately."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# 3. Compile
optimizer = BootstrapFewShot(metric=exact_match_metric)
compiled = optimizer.compile(program, trainset=trainset)
# 4. Save
compiled.save('production_qa.json')
print('Production program ready')ตรวจสอบความรู้: BootstrapFewShot
BootstrapFewShot ใช้อะไรจากชุดข้อมูลฝึกของคุณเพื่อปรับปรุงพรอมป์ต์ที่คอมไพล์แล้ว
ทบทวน: การคอมไพล์และการเพิ่มประสิทธิภาพ
การเพิ่มประสิทธิภาพของ DSPy จะค้นหาการตั้งค่าพรอมป์ต์ที่ดีที่สุดโดยใช้ฟังก์ชันเมตริกและชุดข้อมูลฝึก BootstrapFewShot ค้นหาตัวอย่างสาธิตจำนวนน้อยที่ดีจากร่องรอยการทำงานที่สำเร็จ ส่วน MIPROv2 จะค้นหาข้อความคำสั่งที่ดียิ่งขึ้นเพิ่มเติม ตัวเพิ่มประสิทธิภาพทั้งหมดใช้อินเทอร์เฟซ compile(program, trainset=...) เดียวกัน การคอมไพล์มีค่าใช้จ่ายครั้งเดียวแบบออฟไลน์ ให้บันทึกผลลัพธ์ด้วย program.save() แล้วนำโปรแกรมที่เพิ่มประสิทธิภาพแล้วไปใช้งานโดยไม่มีค่าใช้จ่ายเพิ่มเติมในช่วงการอนุมาน
คำถามที่พบบ่อย
บทเรียน “การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด”
เรียนรู้การใช้งาน BootstrapFewShot, MIPRO และเครื่องมือปรับให้เหมาะที่สุดอื่น ๆ ของ DSPy คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Prompt Engineering หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Prompt Engineering บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Prompt Engineering นี้ได้ไหม
ได้ บทเรียน AI Prompt Engineering ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- บทนำสู่เฟรมเวิร์ก DSPy
- การกำหนดลายเซ็นและโมดูล
- การคอมไพล์และปรับพรอมต์ให้เหมาะที่สุด
- การประเมินไปป์ไลน์ DSPy