0Pricing
AI Agents · บทเรียน

การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ

เมื่อเครื่องมือส่งข้อผิดพลาด 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ReAct: รูปแบบการให้เหตุผลและลงมือทำ
  2. การพัฒนา ReAct ตั้งแต่ต้น
  3. ชุดเครื่องมือทั่วไป (เว็บ เครื่องคิดเลข RAG)
  4. การตรวจจับและกู้คืนจากข้อผิดพลาดของเครื่องมือ
← กลับไปที่ AI Agents