ความล้มเหลวทั่วไปของลูปตัวแทน
ลูปไม่สิ้นสุด การเรียกใช้เครื่องมือเดิมซ้ำ และการไม่ไปถึงคำตอบสุดท้าย
ความล้มเหลวทั่วไปของลูปตัวแทน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
การวนรอบของเอเจนต์และรูปแบบความล้มเหลว
การวนรอบของเอเจนต์จะทำงานซ้ำ ๆ ดังนี้: ให้เหตุผล → เรียกใช้เครื่องมือ → สังเกตผลลัพธ์ → ให้เหตุผลอีกครั้ง การวนรอบนี้มีพลังมากแต่ก็เปราะบาง รูปแบบความล้มเหลวที่เป็นที่รู้จักหลายประการอาจทำให้เอเจนต์ติดอยู่ ใช้โทเค็นสิ้นเปลือง และสร้างผลลัพธ์ที่ไม่มีประโยชน์
การทำความเข้าใจความล้มเหลวเหล่านี้คือขั้นตอนแรกในการป้องกันความล้มเหลวเหล่านั้น
ความล้มเหลว 1: การวนรอบไม่สิ้นสุด
การวนรอบไม่สิ้นสุดเกิดขึ้นเมื่อเอเจนต์เรียกใช้เครื่องมือเดิมซ้ำ ๆ ด้วยอาร์กิวเมนต์เดิมโดยไม่มีความคืบหน้า สาเหตุอาจเกิดจากเครื่องมือส่งคืนผลลัพธ์ที่ไม่เป็นประโยชน์ และเอเจนต์ไม่สามารถใช้เหตุผลเพื่อหาทางออกได้
# Example of an agent in an infinite loop:
# Step 1: reasoning='Need to search for Python docs'
# tool='search_web', args={'query': 'Python documentation'}
# Step 2: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# Step 3: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# ... repeats until max_iterations or token budget is exhausted
print('Symptom: same tool + same arguments appearing repeatedly in steps')
print('Fix: detect repeated (tool, args) pairs and break the loop')ความล้มเหลว 2: สถานะติดค้าง
สถานะติดค้างเป็นรูปแบบที่ละเอียดอ่อนกว่าของการวนรอบไม่สิ้นสุด เอเจนต์ยังคงให้เหตุผลและเรียกใช้เครื่องมือต่าง ๆ แต่ไม่สามารถหาคำตอบสุดท้ายที่ลงตัวได้ เอเจนต์จะแกว่งไปมาระหว่างแนวทางต่าง ๆ โดยไม่มีความคืบหน้า
# Example of a stuck agent:
# Step 1: tool='search_web', args={'query': 'topic A'}
# Step 2: tool='search_web', args={'query': 'topic B'} # different args
# Step 3: tool='search_web', args={'query': 'topic A'} # back to first
# Step 4: tool='read_document', args={'url': '...'}
# Step 5: tool='search_web', args={'query': 'topic A'}
# ... no FINAL_ANSWER ever produced
print('Symptom: agent takes many steps but never calls FINAL_ANSWER')
print('Fix: max_iterations guard + force final answer if limit is near')ความล้มเหลว 3: ไม่มีคำตอบสุดท้าย
เอเจนต์บางตัววนรอบโดยไม่เคยตัดสินใจว่างานเสร็จสมบูรณ์แล้ว เอเจนต์รวบรวมข้อมูลแต่ไม่เคยหยุดเพื่อสังเคราะห์และส่งคืนข้อมูลเหล่านั้น ส่งผลให้สิ้นเปลืองโทเค็นและเวลา
# An agent that never concludes:
def run_agent_bad(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'tool':
result = execute_tool(action)
history.append(result)
# BUG: No check for 'final_answer' type!
# The agent loops until max_steps, returning None
return None # never actually returns an answer
# Fix: explicitly check for final_answer signal
def run_agent_good(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'final_answer':
return action['answer'] # exit cleanly
execute_tool(action)
return 'Reached step limit without a conclusion.'ความล้มเหลว 4: ข้อผิดพลาดในการแยกวิเคราะห์การเรียกใช้เครื่องมือ
เมื่อ LLM สร้าง JSON ที่มีรูปแบบไม่ถูกต้องสำหรับการเรียกใช้ฟังก์ชัน ตัวดำเนินการเครื่องมือจะไม่สามารถแยกวิเคราะห์ได้ เอเจนต์ที่เขียนไม่ดีอาจหยุดทำงานหรือข้ามขั้นตอนอย่างเงียบ ๆ ส่วนเอเจนต์ที่แข็งแกร่งจะตรวจจับข้อผิดพลาดในการแยกวิเคราะห์และส่งข้อผิดพลาดกลับไปยัง LLM
import json
def safe_parse_tool_call(arguments_str: str) -> dict:
try:
return json.loads(arguments_str)
except json.JSONDecodeError as e:
print(f'Failed to parse tool arguments: {e}')
print(f'Raw: {arguments_str}')
return None
def execute_step(tool_call) -> str:
args = safe_parse_tool_call(tool_call.function.arguments)
if args is None:
# Feed the error back to the LLM in the next step
return f'ERROR: Could not parse tool arguments. Raw: {tool_call.function.arguments}'
return run_tool(tool_call.function.name, args)ความล้มเหลว 5: เครื่องมือไม่ส่งคืนข้อมูลที่เป็นประโยชน์
เครื่องมืออาจทำงานสำเร็จในทางเทคนิค (ไม่มีข้อยกเว้น) แต่ส่งคืนข้อมูลว่างเปล่าหรือไม่มีประโยชน์ เอเจนต์ต้องจัดการกรณีนี้ และไม่ควรสันนิษฐานว่าการเรียกใช้เครื่องมือทุกครั้งจะส่งคืนข้อมูลที่นำไปดำเนินการได้
def run_agent_with_empty_result_handling(query: str) -> str:
for step in range(20):
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return action['answer']
result = execute_tool(action['tool'], action['args'])
# Detect empty results and provide context
if not result or result.strip() == '':
observation = f'Tool {action["tool"]} returned no data. Try a different approach or different arguments.'
elif 'error' in result.lower():
observation = f'Tool error: {result}. Consider a different tool or query.'
else:
observation = result
history.append({'tool': action['tool'], 'result': observation})
return 'Could not complete task within step limit.'ความล้มเหลว 6: ชื่อเครื่องมือที่สร้างขึ้นเอง
บางครั้ง LLM สร้างชื่อเครื่องมือที่ไม่มีอยู่จริง คุณควรตรวจสอบชื่อเครื่องมือกับเครื่องมือที่ลงทะเบียนไว้ทุกครั้งก่อนพยายามเรียกใช้ เมื่อเกิดกรณีนี้ ให้ส่งข้อผิดพลาดที่อธิบายข้อมูลได้กลับไปยังเอเจนต์
REGISTERED_TOOLS = {
'search_web': search_web_function,
'get_weather': get_weather_function,
'calculate': calculate_function
}
def dispatch_tool(tool_name: str, args: dict) -> str:
if tool_name not in REGISTERED_TOOLS:
available = ', '.join(REGISTERED_TOOLS.keys())
return (
f'ERROR: Unknown tool "{tool_name}". '
f'Available tools: {available}. '
f'Please use one of the available tools.'
)
tool_fn = REGISTERED_TOOLS[tool_name]
return tool_fn(**args)ความล้มเหลว 7: งบประมาณโทเค็นหมดลง
เอเจนต์ที่ทำงานเป็นเวลานานและเก็บผลลัพธ์เครื่องมือทั้งหมดไว้ในบริบท อาจชนขีดจำกัดหน้าต่างบริบทของ LLM ได้ ควรสรุปหรือตัดทอนผลลัพธ์เครื่องมือขนาดใหญ่ก่อนเพิ่มลงในประวัติ
def truncate_tool_result(result: str, max_chars: int = 2000) -> str:
if len(result) <= max_chars:
return result
truncated = result[:max_chars]
return f'{truncated}\n... [result truncated to {max_chars} chars]'
def add_observation_to_history(history: list, tool_name: str, result: str):
safe_result = truncate_tool_result(result, max_chars=2000)
history.append({
'role': 'tool',
'content': safe_result,
'tool_name': tool_name
})
print(f'[Step] Tool={tool_name}, Result length={len(result)} (stored {len(safe_result)})')
if __name__ == '__main__':
demo_history = []
add_observation_to_history(demo_history, 'search_web', 'x' * 3000)
การตรวจจับรูปแบบความล้มเหลวด้วยโปรแกรม
เขียนฟังก์ชันวินิจฉัยที่วิเคราะห์ประวัติขั้นตอนของเอเจนต์ เพื่อระบุว่าเกิดรูปแบบความล้มเหลวใดขึ้น วิธีนี้มีประโยชน์อย่างยิ่งระหว่างการแก้ไขข้อบกพร่อง
def diagnose_agent_failure(steps: list) -> str:
if not steps:
return 'No steps recorded'
# Check for infinite loop: same (tool, args) repeated
seen = {}
for s in steps:
key = (s.get('tool'), str(s.get('args')))
seen[key] = seen.get(key, 0) + 1
repeated = {k: v for k, v in seen.items() if v > 2}
if repeated:
return f'INFINITE_LOOP: repeated actions: {repeated}'
# Check for missing final answer
has_answer = any(s.get('type') == 'final_answer' for s in steps)
if not has_answer and len(steps) >= 15:
return 'STUCK_STATE: many steps taken but no final answer'
# Check for parse errors
errors = [s for s in steps if 'ERROR' in str(s.get('result', ''))]
if len(errors) > 2:
return f'TOOL_ERROR: {len(errors)} tool errors in pipeline'
return 'OK'
if __name__ == '__main__':
demo_steps = [{'tool': 'search_web', 'args': {'q': 'weather'}} for _ in range(3)]
print('Diagnosis:', diagnose_agent_failure(demo_steps))
การใช้ขีดจำกัดขั้นตอนอย่างง่าย
การวนรอบของเอเจนต์ทุกตัวในระบบจริงต้องมีขีดจำกัดขั้นตอนที่แน่นอน กลไกนี้เป็นมาตรการด้านความปลอดภัยที่สำคัญที่สุด เพราะรับประกันว่าการวนรอบจะสิ้นสุดไม่ว่า LLM จะตัดสินใจอย่างไร
def run_agent_with_budget(query: str, max_steps: int = 15) -> dict:
history = []
for step in range(1, max_steps + 1):
print(f'[Step {step}/{max_steps}]')
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return {
'status': 'success',
'answer': action['answer'],
'steps_taken': step
}
result = execute_tool(action['tool'], action['args'])
history.append({'step': step, 'tool': action['tool'], 'result': result})
if step == max_steps - 1:
# Warn the agent it must conclude
history.append({'role': 'system',
'content': 'You must provide a FINAL_ANSWER on the next step.'})
return {'status': 'timeout', 'answer': None, 'steps_taken': max_steps}ข้อมูลอ้างอิงฉบับย่อ: รูปแบบความล้มเหลวและวิธีแก้ไข
สรุปรูปแบบความล้มเหลวของการวนรอบเอเจนต์ทั้งหกแบบและวิธีแก้ไข:
- การวนรอบไม่สิ้นสุด: ตรวจจับคู่ (เครื่องมือ, อาร์กิวเมนต์) ที่ซ้ำกัน แล้วหยุดการวนรอบพร้อมส่งข้อมูลป้อนกลับเกี่ยวกับข้อผิดพลาด
- สถานะติดค้าง: ใช้ตัวป้องกันจำนวนรอบสูงสุด และบังคับให้ส่งคำตอบสุดท้ายเมื่อใกล้ถึงขีดจำกัด
- ไม่มีคำตอบสุดท้าย: ตรวจสอบสัญญาณคำตอบสุดท้ายในคำสั่งการทำงานอย่างชัดเจน
- ข้อผิดพลาดในการแยกวิเคราะห์: ครอบการแยกวิเคราะห์ JSON ด้วยการจัดการข้อผิดพลาด แล้วส่งข้อผิดพลาดกลับไปยัง LLM
- ผลลัพธ์เครื่องมือว่างเปล่า: ตรวจจับสตริงว่าง และส่งข้อมูลป้อนกลับว่า 'ไม่มีข้อมูล'
- ชื่อเครื่องมือที่สร้างขึ้นเอง: ตรวจสอบกับรายการเครื่องมือที่ลงทะเบียนไว้ แล้วส่งข้อความข้อผิดพลาดกลับไป
ทดสอบความรู้: ความล้มเหลวของการวนรอบเอเจนต์
ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบความล้มเหลวทั่วไปของการวนรอบเอเจนต์
สรุป: ความล้มเหลวทั่วไปของการวนรอบเอเจนต์
ขณะนี้คุณสามารถระบุและป้องกันรูปแบบความล้มเหลวหลักของการวนรอบเอเจนต์ได้แล้ว:
- การวนรอบไม่สิ้นสุด สถานะติดค้าง และการไม่มีคำตอบสุดท้าย ล้วนต้องใช้ ตัวป้องกันจำนวนรอบสูงสุด
- ข้อผิดพลาดในการแยกวิเคราะห์การเรียกใช้เครื่องมือจำเป็นต้องมี การจัดการข้อผิดพลาด ครอบการแยกวิเคราะห์ JSON
- ผลลัพธ์เครื่องมือว่างเปล่าต้องมีการตรวจจับและส่งข้อมูลป้อนกลับที่อธิบายข้อมูลได้ไปยัง LLM
- ชื่อเครื่องมือที่สร้างขึ้นเองต้องตรวจสอบกับรายการเครื่องมือที่ลงทะเบียนไว้
- งบประมาณโทเค็นที่หมดลงต้องจัดการด้วยการตัดทอนผลลัพธ์
การวนรอบของเอเจนต์ที่แข็งแกร่งจะคาดการณ์รูปแบบความล้มเหลวเหล่านี้ทั้งหมดและจัดการได้อย่างเหมาะสม
คำถามที่พบบ่อย
บทเรียน “ความล้มเหลวทั่วไปของลูปตัวแทน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ความล้มเหลวทั่วไปของลูปตัวแทน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ความล้มเหลวทั่วไปของลูปตัวแทน”
ลูปไม่สิ้นสุด การเรียกใช้เครื่องมือเดิมซ้ำ และการไม่ไปถึงคำตอบสุดท้าย คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ความล้มเหลวทั่วไปของลูปตัวแทน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความล้มเหลวทั่วไปของลูปตัวแทน
- การบันทึกการติดตามขั้นตอนของตัวแทน
- การตรวจจับและหยุดลูปไม่สิ้นสุด
- เทคนิคการแก้ไขข้อบกพร่องแบบเดินทีละขั้น