การลองใหม่ด้วยการหน่วงแบบทวีคูณ
ใช้ tenacity เพื่อลองใหม่เมื่อเกิดความล้มเหลวชั่วคราว โดยเพิ่มเวลาหน่วงแบบทวีคูณและสุ่มค่าเบี่ยงเบน
การลองใหม่ด้วยการหน่วงแบบทวีคูณ เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องลองใหม่
การเรียกใช้บริการภายนอก เช่น LLM, API ค้นหา และฐานข้อมูลเวกเตอร์ อาจล้มเหลวชั่วคราว การลองใหม่แบบง่ายช่วยกู้คืนจากความไม่เสถียรส่วนใหญ่ได้โดยไม่รบกวนผู้ใช้
สิ่งที่ไม่ควรทำ
อย่าลองใหม่ทันทีในลูปที่ทำงานถี่ ๆ เพราะคุณจะส่งคำขอถล่มบริการ และตัวจำกัดอัตราการเรียกใช้จะปิดกั้นคุณ:
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
passการหน่วงเวลาแบบทวีคูณ
รอให้นานขึ้นหลังจากล้มเหลวแต่ละครั้ง การยกกำลังด้วย 2 เป็นรูปแบบที่ใช้กันทั่วไป:
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 secondsเพิ่มความแปรผันแบบสุ่ม
หากไม่มีความแปรผันแบบสุ่ม การลองใหม่จากไคลเอนต์จำนวนมากจะเกิดขึ้นพร้อมกัน ทำให้เกิดทราฟฟิกแบบฝูงชนถล่ม เพิ่มค่าชดเชยแบบสุ่ม:
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)ใช้ Tenacity
ไลบรารี tenacity จัดการเรื่องนี้ให้คุณ:
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()ลองใหม่เฉพาะข้อผิดพลาดชั่วคราว
อย่าลองใหม่เมื่อเกิดกรณีต่อไปนี้:
- ข้อผิดพลาด 4xx (คำขอไม่ถูกต้อง การลองใหม่จะไม่ช่วย)
- การยืนยันตัวตนล้มเหลว
- ข้อผิดพลาดในการตรวจสอบความถูกต้อง
ให้ลองใหม่เมื่อเกิดกรณีต่อไปนี้:
- หมดเวลา
- ข้อผิดพลาดจากเซิร์ฟเวอร์ 5xx
- ถึงขีดจำกัดอัตราการเรียกใช้ (โดยรอนานขึ้น)
การลองใหม่โดยคำนึงถึงขีดจำกัดอัตราการเรียกใช้
ปฏิบัติตามส่วนหัว Retry-After:
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continueจำกัดเวลารวมของการลองใหม่
จำกัดระยะเวลารวมที่ใช้ในการลองใหม่ โดยทั่วไปควรอยู่ที่ 30–60 วินาทีสำหรับการเรียกใช้ที่ผู้ใช้รอผล:
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...ส่วนหัวไอดอมโพเทนซี
สำหรับ API ที่ไม่เป็นไอดอมโพเทนต์ เช่น Stripe ให้ใส่คีย์ไอดอมโพเทนซีในการลองใหม่ทุกครั้ง เพื่อรวมการดำเนินการที่ซ้ำกันเข้าด้วยกัน:
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}ลองใหม่กับการเรียกใช้ LLM ด้วย
ชุดพัฒนาซอฟต์แวร์ของ OpenAI และ Anthropic จะลองใหม่โดยอัตโนมัติ 1–2 ครั้ง คุณสามารถกำหนดค่าได้:
client = OpenAI(max_retries=5, timeout=30.0)การลองใหม่แบบอะซิงโครนัส
สำหรับโค้ดแบบอะซิงโครนัส:
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()บันทึกการลองใหม่
การลองใหม่ทุกครั้งควรบันทึกหมายเลขครั้งที่ลอง ระยะเวลาที่หยุดรอ และสาเหตุของข้อผิดพลาด มิฉะนั้นจะไม่สามารถแก้ไขปัญหา "ทำไมจึงช้าจัง" ได้
การลองใหม่กับการกำหนดหมดเวลา
กำหนดเวลาหมดที่สั้นสำหรับแต่ละครั้งที่ลอง เช่น 10 วินาที และกำหนดขีดจำกัดรวมด้วย stop_after_delay เช่น 60 วินาที หากขาดอย่างใดอย่างหนึ่ง การเชื่อมต่อที่ค้างอาจทำให้ระบบหยุดรอไปตลอด
เหตุใดจึงต้องใช้ความแปรผันแบบสุ่ม
เหตุใดจึงควรเพิ่มความแปรผันแบบสุ่มให้กับช่วงเวลาหน่วงก่อนลองใหม่
สรุป
การหน่วงเวลาแบบทวีคูณ + ความแปรผันแบบสุ่ม + การจำกัดเวลารวม + ลองใหม่เฉพาะข้อผิดพลาดชั่วคราว ใช้ tenacity เพื่อลดโค้ดส่วนซ้ำซ้อน
คำถามที่พบบ่อย
บทเรียน “การลองใหม่ด้วยการหน่วงแบบทวีคูณ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การลองใหม่ด้วยการหน่วงแบบทวีคูณ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การลองใหม่ด้วยการหน่วงแบบทวีคูณ”
ใช้ tenacity เพื่อลองใหม่เมื่อเกิดความล้มเหลวชั่วคราว โดยเพิ่มเวลาหน่วงแบบทวีคูณและสุ่มค่าเบี่ยงเบน คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การลองใหม่ด้วยการหน่วงแบบทวีคูณ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เครื่องมือแบบทำซ้ำได้อย่างปลอดภัยและผลข้างเคียง
- การลองใหม่ด้วยการหน่วงแบบทวีคูณ
- หมดเวลาและตัวตัดวงจร
- การตรวจสอบผลลัพธ์เครื่องมือ (Pydantic)