การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ
เมื่อเครื่องมือส่งข้อผิดพลาด 500 ให้ส่งข้อผิดพลาดนั้นกลับไปยังโมเดล เพื่อให้ลองวิธีอื่นแทนการหยุดทำงาน
การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เครื่องมือขัดข้อง จงวางแผนรับมือ
เครื่องมือจริงทุกชนิดอาจขัดข้องได้ในบางครั้ง:
- หมดเวลาการเชื่อมต่อเครือข่าย
- ถึงขีดจำกัดอัตราการเรียกใช้
- โมเดลส่งอาร์กิวเมนต์ไม่ถูกต้อง
- บริการภายนอกหยุดให้บริการ
- การยืนยันตัวตนไม่ถูกต้อง
เอเจนต์สำหรับใช้งานจริงต้องกู้คืนการทำงานได้อย่างเหมาะสม
ส่งคืนเสมอ อย่าส่งข้อยกเว้น
ภายในลูปของเอเจนต์ ให้ดักจับข้อผิดพลาดของเครื่องมือทั้งหมดและส่งคืนเป็นเนื้อหา อย่าปล่อยให้ข้อยกเว้นทำให้ลูปหยุดทำงาน:
def safe_dispatch(tool_call):
try:
args = json.loads(tool_call.function.arguments)
return TOOLS[tool_call.function.name](**args)
except json.JSONDecodeError:
return {'error': 'Arguments are not valid JSON.'}
except KeyError:
return {'error': f'Unknown tool: {tool_call.function.name}'}
except Exception as e:
return {'error': f'{type(e).__name__}: {e}'}รูปแบบข้อผิดพลาดที่มีโครงสร้าง
ใช้รูปแบบที่สอดคล้องกัน เพื่อให้โมเดลรู้จักข้อผิดพลาด:
error = {'ok': False, 'error_type': 'TimeoutError', 'error_message': 'Tavily timed out after 10s', 'retryable': True}
print(error)
แยกข้อผิดพลาดที่ลองใหม่ได้กับข้อผิดพลาดถาวร
ข้อผิดพลาดบางอย่างควรลองใหม่ เช่น หมดเวลา แต่บางอย่างไม่ควรลองใหม่ เช่น 404 ให้บอกโมเดลดังนี้:
if isinstance(e, requests.Timeout):
return {'ok': False, 'retryable': True, 'error': str(e)}
if isinstance(e, ValueError):
return {'ok': False, 'retryable': False, 'error': str(e)}ลองใหม่โดยอัตโนมัติเมื่อเกิดข้อผิดพลาดชั่วคราว
สำหรับการเรียกเครือข่าย ให้ลองใหม่โดยเพิ่มระยะเวลาหน่วงแบบทวีคูณ:
from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type
@retry(
wait=wait_exponential(multiplier=1, max=10),
stop=stop_after_attempt(3),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def web_search(query):
return requests.get('https://api.tavily.com/search', ...).json()การตรวจสอบอาร์กิวเมนต์
ก่อนเรียกใช้เครื่องมือ ให้ตรวจสอบอาร์กิวเมนต์ด้วยแบบจำลอง Pydantic:
from pydantic import BaseModel, ValidationError
class SearchArgs(BaseModel):
query: str
k: int = 5
try:
args = SearchArgs.model_validate_json(tool_call.function.arguments)
except ValidationError as e:
return {'error': f'Bad arguments: {e}'}แสดงข้อผิดพลาดให้โมเดลเห็น
เพิ่มข้อผิดพลาดเป็นผลลัพธ์ของเครื่องมือ แล้วเรียกโมเดลอีกครั้ง โมเดลมักแก้ไขตัวเองได้:
messages.append({
'role': 'tool',
'tool_call_id': tc.id,
'content': json.dumps({'error': 'Argument k must be an integer'})
})
# Next model call: 'Sorry, let me retry with k=5...'หลีกเลี่ยงลูปข้อผิดพลาดไม่รู้จบ
เมื่อแสดงข้อผิดพลาดให้โมเดลเห็น โมเดลบางตัวจะลองเรียกที่ผิดพลาดเดิมซ้ำ ให้จำกัดจำนวนรอบและตรวจจับการเรียกซ้ำ:
recent_calls = []
for tc in msg.tool_calls:
key = (tc.function.name, tc.function.arguments)
if recent_calls.count(key) >= 3:
return 'Agent stuck in retry loop, aborting.'
recent_calls.append(key)การกู้คืนเฉพาะเครื่องมือ
สำหรับเครื่องมือที่ทราบว่าไม่เสถียร ให้สร้างตรรกะการลองใหม่ไว้ INSIDE เครื่องมือ ไม่ใช่ในลูป:
def search_with_fallback(query):
try:
return tavily_search(query)
except Exception:
return bing_search(query) # secondary providerกำหนดหมดเวลาทุกการเรียก
การเรียกใช้บริการภายนอกทุกครั้งต้องมีการกำหนดหมดเวลา มิฉะนั้นบริการที่ทำงานช้ารายการเดียวจะทำให้เอเจนต์ทั้งหมดหยุดชะงัก:
import requests
response = requests.get(url, timeout=10) # 10s
# For LLM calls:
from openai import OpenAI
client = OpenAI(timeout=30.0)ตัวตัดวงจร
เมื่อเครื่องมือล้มเหลวซ้ำ ๆ ให้ "เปิด" วงจรและข้ามเครื่องมือนั้นไปชั่วระยะหนึ่ง:
import time
class CircuitOpen(Exception):
pass
def circuit(failure_threshold=5, recovery_timeout=60):
def decorator(func):
state = {'failures': 0, 'open_until': 0}
def wrapper(*args, **kwargs):
if time.time() < state['open_until']:
raise CircuitOpen('circuit is open')
try:
result = func(*args, **kwargs)
state['failures'] = 0
return result
except Exception:
state['failures'] += 1
if state['failures'] >= failure_threshold:
state['open_until'] = time.time() + recovery_timeout
raise
return wrapper
return decorator
@circuit(failure_threshold=3, recovery_timeout=1)
def fragile_tool(x):
if x < 0:
raise ValueError('bad input')
return x * 2
for x in [1, -1, -1, -1, -1]:
try:
print('ok', fragile_tool(x))
except CircuitOpen as e:
print('blocked:', e)
except ValueError as e:
print('failed:', e)
บันทึกข้อผิดพลาดพร้อมบริบท
บันทึกข้อมูลให้เพียงพอสำหรับการแก้ไขข้อผิดพลาดภายหลัง ได้แก่ ชื่อเครื่องมือ อาร์กิวเมนต์ ประเภทข้อผิดพลาด ร่องรอยสแตก รหัสคำขอ รหัสผู้ใช้ และรหัสการติดตาม ส่งข้อมูลไปยังเครื่องมือตรวจสอบการทำงานของระบบ
การลดความสามารถอย่างเหมาะสม
เมื่อเครื่องมือสำคัญใช้งานไม่ได้ ให้แจ้งผู้ใช้อย่างตรงไปตรงมา แทนการแสร้งทำว่าเอเจนต์ทำงานสำเร็จ:
if all_search_tools_failed:
return 'I was unable to search the web right now. Please try again in a few minutes.'รูปแบบการจัดการข้อผิดพลาดของเครื่องมือ
วิธีที่ปลอดภัยที่สุดในการจัดการข้อยกเว้นของเครื่องมือภายในลูปเอเจนต์คืออะไร
สรุป
เครื่องมืออาจล้มเหลว ให้ดักจับ จัดประเภท จัดรูปเป็นเนื้อหา และเปิดโอกาสให้เอเจนต์กู้คืนการทำงาน เพิ่มการกำหนดหมดเวลา การลองใหม่ และตัวตัดวงจรเพื่อความน่าเชื่อถือในการใช้งานจริง
คำถามที่พบบ่อย
บทเรียน “การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ”
เมื่อเครื่องมือส่งข้อผิดพลาด 500 ให้ส่งข้อผิดพลาดนั้นกลับไปยังโมเดล เพื่อให้ลองวิธีอื่นแทนการหยุดทำงาน คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ReAct: รูปแบบการให้เหตุผลและลงมือทำ
- การพัฒนา ReAct ตั้งแต่ต้น
- ชุดเครื่องมือทั่วไป (เว็บ เครื่องคิดเลข RAG)
- การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ