การจำแนกรูปแบบความล้มเหลวของเอเจนต์
สร้างหมวดหมู่ความล้มเหลวของเอเจนต์ ได้แก่ ข้อผิดพลาดของเครื่องมือ ผลลัพธ์ที่มีรูปแบบไม่ถูกต้อง วงจรการให้เหตุผล บริบทไม่เพียงพอ และบริการภายนอกไม่พร้อมใช้งาน พร้อมออกแบบกลยุทธ์กู้คืนสำหรับแต่ละกรณี
การจำแนกรูปแบบความล้มเหลวของเอเจนต์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจำแนกรูปแบบความล้มเหลวของเอเจนต์
- การแก้ไขตนเองและการเขียนพรอมต์แบบไตร่ตรอง
- การสร้างจุดตรวจสอบและดำเนินงานต่อ
- การส่งต่อให้มนุษย์มีส่วนร่วม