0Pricing
AI Engineering Academy · บทเรียน

การจำแนกรูปแบบความล้มเหลวของเอเจนต์

สร้างหมวดหมู่ความล้มเหลวของเอเจนต์ ได้แก่ ข้อผิดพลาดของเครื่องมือ ผลลัพธ์ที่มีรูปแบบไม่ถูกต้อง วงจรการให้เหตุผล บริบทไม่เพียงพอ และบริการภายนอกไม่พร้อมใช้งาน พร้อมออกแบบกลยุทธ์กู้คืนสำหรับแต่ละกรณี

การจำแนกรูปแบบความล้มเหลวของเอเจนต์ เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดเอเจนต์จึงล้มเหลวในรูปแบบที่แตกต่างกัน

เอเจนต์ล้มเหลวแตกต่างจากการเรียกใช้ LLM แบบง่าย การเรียกใช้เพียงครั้งเดียวจะคืนคำตอบหรือส่งข้อผิดพลาด ส่วนเอเจนต์ที่ดำเนินงานหลายขั้นตอนอาจล้มเหลวได้ทุกจุด และความล้มเหลวนั้นอาจไม่เห็นได้ชัดจากผลลัพธ์สุดท้าย การทำความเข้าใจอนุกรมวิธานของรูปแบบความล้มเหลวของเอเจนต์เป็นขั้นตอนแรกในการสร้างเอเจนต์ที่ตรวจจับ วินิจฉัย และกู้คืนจากความล้มเหลวของตนเองได้

รูปแบบความล้มเหลวที่ 1: ข้อผิดพลาดของเครื่องมือ

ข้อผิดพลาดของเครื่องมือเกิดขึ้นเมื่อเอเจนต์เรียกใช้เครื่องมือด้วยอาร์กิวเมนต์ที่ไม่ถูกต้อง เครื่องมือส่งข้อยกเว้น หรือเครื่องมือคืนผลลัพธ์ว่างเปล่าหรือมีรูปแบบไม่ถูกต้อง ตัวอย่างเช่น การเรียก API ค้นหาด้วยคำค้นที่มีรูปแบบไม่ถูกต้อง การสืบค้นฐานข้อมูลด้วย SQL ที่ไม่ถูกต้อง หรือการเรียกใช้ตัวประมวลผลโค้ดที่หมดเวลา ข้อผิดพลาดของเครื่องมือตรวจจับได้ง่ายที่สุด เพราะจะสร้างสัญญาณข้อยกเว้นที่ชัดเจนซึ่งสามารถดักจับและจัดการได้

class ToolError(Exception):
    def __init__(self, tool_name: str, args: dict, error: Exception):
        self.tool_name = tool_name
        self.args = args
        self.original_error = error
        super().__init__(f'Tool {tool_name} failed: {error}')

def safe_tool_call(tool_func, args: dict) -> str:
    try:
        result = tool_func(**args)
        if not result:
            return 'Tool returned empty result. Try a different approach.'
        return str(result)
    except Exception as e:
        raise ToolError(tool_func.__name__, args, e)

รูปแบบความล้มเหลวที่ 2: ผลลัพธ์มีรูปแบบไม่ถูกต้อง

ผลลัพธ์ที่มีรูปแบบไม่ถูกต้องเกิดขึ้นเมื่อเอเจนต์สร้างข้อความที่ไม่ตรงกับรูปแบบที่คาดไว้ — ตัวอย่างเช่น ส่งคืนภาษาธรรมชาติในขณะที่ขั้นตอนถัดไปคาดหวัง JSON หรือเรียกใช้เครื่องมือด้วยอาร์กิวเมนต์ที่มีโครงสร้างไม่ถูกต้อง เรื่องนี้มักเกิดขึ้นเมื่อเอเจนต์สับสนระหว่างขั้นตอนปัจจุบันกับขั้นตอนก่อนหน้า ให้ตรวจสอบรูปแบบของผลลัพธ์จากเอเจนต์ทุกรายการก่อนนำไปใช้ และขอให้สร้างคำตอบใหม่เมื่อรูปแบบไม่ถูกต้อง

import json

def validate_agent_output(raw_output: str, expected_format: str) -> dict:
    if expected_format == 'json':
        try:
            return json.loads(raw_output)
        except json.JSONDecodeError as e:
            return {
                'valid': False,
                'error': f'Expected JSON but got invalid JSON: {e}',
                'raw': raw_output[:200]
            }
    return {'valid': True, 'data': raw_output}

รูปแบบความล้มเหลวที่ 3: วนซ้ำในการให้เหตุผล

การวนซ้ำในการให้เหตุผลเกิดขึ้นเมื่อเอเจนต์ทำการกระทำหรือคิดแบบเดิมซ้ำไปเรื่อย ๆ โดยไม่มีความคืบหน้า เอเจนต์อาจใช้คำค้นเดิม 10 ครั้งติดต่อกัน ได้ผลลัพธ์ว่างเปล่าเหมือนเดิม และไม่รู้ว่าควรลองอะไรต่อ ตรวจจับการวนซ้ำโดยติดตามการกระทำล่าสุดและตรวจสอบการทำซ้ำ เมื่อพบการวนซ้ำ ให้แทรกคำสั่งเมตาที่บอกให้เอเจนต์ลองใช้แนวทางอื่น

from collections import Counter

class LoopDetector:
    def __init__(self, window: int = 5, threshold: int = 3):
        self.recent_actions = []
        self.window = window
        self.threshold = threshold

    def record(self, action: str) -> bool:
        self.recent_actions.append(action)
        if len(self.recent_actions) > self.window:
            self.recent_actions.pop(0)
        counts = Counter(self.recent_actions)
        most_common_count = counts.most_common(1)[0][1] if counts else 0
        return most_common_count >= self.threshold  # True = loop detected

รูปแบบความล้มเหลวที่ 4: บริบทเต็มขีดจำกัด

บริบทเต็มขีดจำกัดเกิดขึ้นเมื่อประวัติที่เอเจนต์สะสมไว้ (การเรียกใช้เครื่องมือ การสังเกต และความคิด) เกินหน้าต่างบริบทของโมเดล โมเดลอาจตัดประวัติออกโดยไม่แจ้งให้ทราบ ทำให้สูญเสียข้อมูลสำคัญ หรือส่งข้อผิดพลาดเกี่ยวกับขีดจำกัดโทเค็น ป้องกันปัญหานี้โดยติดตามการใช้โทเค็นในแต่ละขั้นตอน และบีบอัดประวัติ (สรุปขั้นตอนเก่า) ก่อนจะถึงขีดจำกัด

import tiktoken

CONTEXT_LIMIT = 100_000  # tokens
COMPRESS_AT = 80_000     # trigger compression with headroom

enc = tiktoken.encoding_for_model('gpt-4o')

def total_tokens(messages: list) -> int:
    return sum(len(enc.encode(str(m))) for m in messages)

def check_context(messages: list) -> str:
    tokens = total_tokens(messages)
    if tokens > COMPRESS_AT:
        return 'compress'
    if tokens > CONTEXT_LIMIT:
        return 'critical'
    return 'ok'

รูปแบบความล้มเหลวที่ 5: บริการภายนอกไม่พร้อมใช้งาน

ความล้มเหลวของบริการภายนอกเกิดขึ้นเมื่อบริการเบื้องหลังของเครื่องมือหยุดทำงาน ถูกจำกัดอัตราการเรียกใช้ หรือส่งข้อผิดพลาดที่ไม่คาดคิด เอเจนต์ที่ไม่สามารถเข้าถึงฐานข้อมูลที่ต้องสืบค้นจะติดขัด ต่างจากการวนซ้ำในการให้เหตุผล (ความผิดของเอเจนต์) ความล้มเหลวภายนอกเป็นความล้มเหลวของสภาพแวดล้อม จัดการด้วยการลองใหม่และการหน่วงเวลาแบบทวีคูณ พร้อมมีเครื่องมือสำรองที่สามารถประมาณผลลัพธ์โดยใช้แหล่งข้อมูลอื่น

import asyncio

async def resilient_tool_call(tool_func, args: dict, max_retries: int = 3) -> str:
    for attempt in range(max_retries):
        try:
            return await tool_func(**args)
        except (ConnectionError, TimeoutError) as e:
            if attempt == max_retries - 1:
                return f'Service unavailable after {max_retries} attempts. Error: {e}'
            wait = 2 ** attempt  # 1s, 2s, 4s
            await asyncio.sleep(wait)
    return 'Unexpected error in resilient_tool_call'

รูปแบบความล้มเหลวที่ 6: เข้าใจเป้าหมายผิด

การเข้าใจเป้าหมายผิดเกิดขึ้นเมื่อเอเจนต์ตีความงานผิดและมุ่งไปสู่เป้าหมายที่แตกต่างออกไปเล็กน้อย นี่เป็นความล้มเหลวที่ตรวจจับได้ยากที่สุด เพราะเอเจนต์อาจทำงานเสร็จสำเร็จ เพียงแต่ไม่ใช่งานที่ผู้ใช้ตั้งใจ ป้องกันโดยขอให้เอเจนต์กล่าวเป้าหมายซ้ำด้วยถ้อยคำของตนเองตั้งแต่เริ่มต้น และใช้ขั้นตอนตรวจสอบสุดท้ายเพื่อเช็กว่าผลลัพธ์ตอบคำถามเดิมจริงหรือไม่

async def confirm_goal_understanding(original_task: str) -> str:
    resp = await client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system', 'content': 'Restate the task in your own words. Be specific about what the final deliverable should be.'},
            {'role': 'user', 'content': f'Task: {original_task}'}
        ]
    )
    return resp.choices[0].message.content

# Use the restatement as the first step of the agent
# to catch misunderstandings before any tools are called

การสร้างระบบจำแนกความล้มเหลว

สร้างตัวจำแนกความล้มเหลวแบบมีโครงสร้างที่กำกับประเภทให้กับข้อยกเว้นของเอเจนต์ทุกรายการ วิธีนี้ทำให้สามารถกำหนดเส้นทางไปยังกลยุทธ์การกู้คืนที่เหมาะสมได้โดยอัตโนมัติ จัดเก็บบันทึกความล้มเหลวพร้อมป้ายกำกับประเภท เพื่อวิเคราะห์ว่ารูปแบบความล้มเหลวใดเกิดขึ้นบ่อยที่สุด และจัดลำดับความสำคัญของสิ่งที่ควรแก้ไขก่อน โดยทั่วไปข้อผิดพลาดของเครื่องมือและการวนซ้ำจะเกิดบ่อยที่สุดและแก้ไขได้ง่ายที่สุด

from enum import Enum
from dataclasses import dataclass

class FailureType(Enum):
    TOOL_ERROR = 'tool_error'
    MALFORMED_OUTPUT = 'malformed_output'
    REASONING_LOOP = 'reasoning_loop'
    CONTEXT_EXHAUSTION = 'context_exhaustion'
    EXTERNAL_SERVICE = 'external_service'
    GOAL_MISUNDERSTANDING = 'goal_misunderstanding'
    MAX_ITERATIONS = 'max_iterations'
    UNKNOWN = 'unknown'

@dataclass
class AgentFailure:
    failure_type: FailureType
    step: int
    tool_name: str | None
    error_message: str
    recoverable: bool

การจับคู่ความล้มเหลวกับการดำเนินการกู้คืน

ความล้มเหลวแต่ละประเภทมีการดำเนินการกู้คืนที่เหมาะสม ข้อผิดพลาดของเครื่องมือควรลองใหม่ด้วยอาร์กิวเมนต์ที่ปรับแล้ว การวนซ้ำควรใช้คำสั่งที่ส่งเสริมความหลากหลาย โดยบอกให้เอเจนต์ลองสิ่งใหม่ บริบทเต็มขีดจำกัดควรใช้การบีบอัด ความล้มเหลวของบริการภายนอกควรใช้เครื่องมือสำรอง ส่วนการเข้าใจเป้าหมายผิดควรขอคำชี้แจง ให้กำหนดการจับคู่เหล่านี้อย่างชัดเจนในตัวจัดเส้นทางการกู้คืนที่รันไทม์ของเอเจนต์เรียกใช้เมื่อเกิดความล้มเหลว

RECOVERY_ACTIONS = {
    FailureType.TOOL_ERROR:           'retry_with_corrected_args',
    FailureType.MALFORMED_OUTPUT:     'reformat_output',
    FailureType.REASONING_LOOP:       'inject_diversity_prompt',
    FailureType.CONTEXT_EXHAUSTION:   'compress_history',
    FailureType.EXTERNAL_SERVICE:     'use_fallback_tool',
    FailureType.GOAL_MISUNDERSTANDING:'request_clarification',
    FailureType.MAX_ITERATIONS:       'escalate_to_human',
    FailureType.UNKNOWN:              'escalate_to_human'
}

การกำหนดขีดจำกัดจำนวนรอบสูงสุด

เอเจนต์ทุกตัวต้องมีขีดจำกัดจำนวนรอบสูงสุดเป็นขอบเขตความปลอดภัยที่บังคับใช้ หากไม่มีขีดจำกัด เอเจนต์ที่วนซ้ำจะทำงานไม่สิ้นสุดและสิ้นเปลืองโทเค็นกับค่าใช้จ่าย กำหนดขีดจำกัดตามความซับซ้อนของงานที่คาดไว้ เช่น เอเจนต์ตอบคำถามอย่างง่ายอาจจำกัดไว้ที่ 5 ขั้นตอน ขณะที่เอเจนต์วิจัยที่ซับซ้อนอาจอนุญาต 20 ขั้นตอน เมื่อถึงขีดจำกัด ให้บันทึกความล้มเหลว บันทึกผลลัพธ์บางส่วน และส่งต่อให้มนุษย์หรือส่งคืนคำตอบบางส่วน

MAX_ITERATIONS = 15

async def run_agent(task: str) -> str:
    messages = [{'role': 'user', 'content': task}]
    loop_detector = LoopDetector()
    for iteration in range(MAX_ITERATIONS):
        response = await get_agent_action(messages)
        if response.is_final:
            return response.answer
        action_key = f'{response.tool}:{response.args}'
        if loop_detector.record(action_key):
            messages.append({'role': 'system', 'content': 'You are repeating yourself. Try a completely different approach.'})
            continue
        result = await execute_tool(response.tool, response.args)
        messages.append({'role': 'tool', 'content': result})
    return 'Task exceeded maximum iterations. Partial results: ' + get_partial_result(messages)

การบันทึกความล้มเหลวเพื่อวิเคราะห์หลังเหตุการณ์

บันทึกความล้มเหลวของเอเจนต์ทุกรายการพร้อมบริบทที่เพียงพอสำหรับการวินิจฉัยภายหลัง ได้แก่ คำอธิบายงานทั้งหมด ประวัติการกระทำทั้งหมดจนถึงจุดที่ล้มเหลว ประเภทความล้มเหลวและข้อความข้อผิดพลาด จำนวนรอบ และการใช้โทเค็น จัดเก็บข้อมูลนี้ในตารางความล้มเหลว พร้อมดัชนีใน failure_type และ task_id ทบทวนบันทึกความล้มเหลวเป็นประจำเพื่อระบุประเภทงานที่มีแนวโน้มเกิดรูปแบบความล้มเหลวเฉพาะ และจัดลำดับความสำคัญของการแก้ไขให้เหมาะสม

import json
from dataclasses import asdict

async def log_agent_failure(task_id: str, failure: AgentFailure, history: list, pool):
    async with pool.acquire() as conn:
        await conn.execute('''
            INSERT INTO agent_failures
            (task_id, failure_type, step, tool_name, error_message,
             recoverable, action_history, failed_at)
            VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
        ''',
            task_id,
            failure.failure_type.value,
            failure.step,
            failure.tool_name,
            failure.error_message,
            failure.recoverable,
            json.dumps(history)
        )

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับการจำแนกรูปแบบความล้มเหลวของเอเจนต์

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า รูปแบบความล้มเหลวหลักหกประการของเอเจนต์ ได้แก่ ข้อผิดพลาดของเครื่องมือ ผลลัพธ์มีรูปแบบไม่ถูกต้อง การวนซ้ำในการให้เหตุผล บริบทเต็มขีดจำกัด ความล้มเหลวของบริการภายนอก และการเข้าใจเป้าหมายผิด การตรวจจับการวนซ้ำผ่านประวัติการกระทำช่วยจับรูปแบบการทำซ้ำก่อนที่จะใช้จำนวนรอบจนหมด และ การจับคู่ประเภทความล้มเหลวกับการดำเนินการกู้คืนช่วยให้ระบบซ่อมแซมตนเองโดยอัตโนมัติ บทถัดไป เราจะนำการแก้ไขตนเองและการป้อนคำสั่งแบบสะท้อนคิดมาใช้งาน

คำถามที่พบบ่อย

บทเรียน “การจำแนกรูปแบบความล้มเหลวของเอเจนต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำแนกรูปแบบความล้มเหลวของเอเจนต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจำแนกรูปแบบความล้มเหลวของเอเจนต์”

สร้างหมวดหมู่ความล้มเหลวของเอเจนต์ ได้แก่ ข้อผิดพลาดของเครื่องมือ ผลลัพธ์ที่มีรูปแบบไม่ถูกต้อง วงจรการให้เหตุผล บริบทไม่เพียงพอ และบริการภายนอกไม่พร้อมใช้งาน พร้อมออกแบบกลยุทธ์กู้คืนสำหรับแต่ละกรณี คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การจำแนกรูปแบบความล้มเหลวของเอเจนต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม

ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การจำแนกรูปแบบความล้มเหลวของเอเจนต์
  2. การแก้ไขตนเองและการเขียนพรอมต์แบบไตร่ตรอง
  3. การสร้างจุดตรวจสอบและดำเนินงานต่อ
  4. การส่งต่อให้มนุษย์มีส่วนร่วม
← กลับไปที่ AI Engineering Academy