Tools

การตรวจจับลูปของเครื่องมือ

OpenClaw มีกลไกป้องกันสองชั้นที่ทำงานร่วมกันเพื่อตรวจจับรูปแบบการเรียกใช้เครื่องมือซ้ำ โดยทั้งสองตั้งค่าไว้ภายใต้ tools.loopDetection:

  1. การตรวจจับลูป (enabled) - ปิดใช้งานโดยค่าเริ่มต้น ตรวจสอบประวัติ การเรียกใช้เครื่องมือแบบเลื่อนต่อเนื่องเพื่อหารูปแบบที่ซ้ำและการลองเรียกเครื่องมือที่ไม่รู้จักซ้ำ
  2. กลไกป้องกันหลัง Compaction - เปิดใช้งานเมื่อ enabled ไม่ได้ตั้งค่าเป็น false อย่างชัดเจน กลไกจะเริ่มทำงานหลังการลองใหม่ภายหลัง Compaction ทุกครั้ง และ ยุติการทำงานหากเอเจนต์ทำซ้ำชุดสามค่า (tool, args, result) เดิม ภายในช่วงเวลาที่กำหนด

ตั้งค่า tools.loopDetection.enabled: false เพื่อปิดกลไกป้องกันทั้งสองชั้น

เหตุผลที่มีฟีเจอร์นี้

  • ตรวจจับลำดับซ้ำที่ไม่มีความคืบหน้า
  • ตรวจจับลูปความถี่สูงที่ไม่มีผลลัพธ์ (เครื่องมือเดิม อินพุตเดิม และข้อผิดพลาด ซ้ำ)
  • ตรวจจับรูปแบบการเรียกซ้ำเฉพาะสำหรับเครื่องมือสำรวจสถานะที่รู้จัก
  • ตัดวงจรบริบทล้น -> Compaction -> ลูปเดิม แทนที่จะปล่อยให้ ทำงานต่อไปอย่างไม่มีกำหนด

บล็อกการกำหนดค่า

การตั้งค่าส่วนกลาง:

json5
{  tools: {    loopDetection: {      enabled: false, // สวิตช์หลักสำหรับตัวตรวจจับประวัติแบบเลื่อนต่อเนื่อง    },  },}

การตั้งค่าทับสำหรับแต่ละเอเจนต์ (ไม่บังคับ ที่ agents.list[].tools.loopDetection):

json5
{  agents: {    list: [      {        id: "safe-runner",        tools: {          loopDetection: {            enabled: true,          },        },      },    ],  },}

การตั้งค่าสำหรับแต่ละเอเจนต์จะแทนที่การตั้งค่าส่วนกลาง

ลักษณะการทำงานของฟิลด์

ฟิลด์ ค่าเริ่มต้น ผล
enabled false สวิตช์หลักสำหรับตัวตรวจจับประวัติแบบเลื่อนต่อเนื่อง false ยังปิดกลไกป้องกันหลัง Compaction ด้วย

สำหรับ exec การแฮชเพื่อตรวจสอบว่าไม่มีความคืบหน้าจะเปรียบเทียบผลลัพธ์ของคำสั่งที่คงที่ (สถานะ รหัสออก แฟล็กหมดเวลา และเอาต์พุต) และละเว้นข้อมูลเมตารันไทม์ที่เปลี่ยนแปลงได้ เช่น ระยะเวลา PID, ID เซสชัน และไดเรกทอรีทำงาน ผลลัพธ์จากการส่งข้อความออก จะถูกแฮชโดยตัด ID ที่เปลี่ยนไปในแต่ละครั้ง (ID ข้อความ, ID ไฟล์, การประทับเวลา) ออก เพื่อไม่ให้ผลลัพธ์ "ส่งแล้ว" ดูเหมือนกับผลลัพธ์ "ส่งแล้ว" ของอีกครั้งทุกประการ เมื่อมี ID การทำงาน ระบบจะประเมินประวัติเฉพาะภายในการทำงานนั้น ดังนั้นรอบ Heartbeat ตามกำหนดเวลาและการทำงานใหม่จะไม่สืบทอดจำนวนลูปเก่า จากการทำงานก่อนหน้า

การตั้งค่าที่แนะนำ

  • สำหรับโมเดลขนาดเล็ก ให้ตั้งค่า enabled: true โมเดลระดับเรือธงแทบไม่จำเป็นต้องใช้การตรวจจับประวัติแบบเลื่อนต่อเนื่อง และสามารถ คงสวิตช์หลักไว้ที่ false ขณะที่ยังได้รับประโยชน์จาก กลไกป้องกันหลัง Compaction
  • หากต้องการปิดทุกอย่างรวมถึงกลไกป้องกันหลัง Compaction ให้ตั้งค่า tools.loopDetection.enabled: false อย่างชัดเจน

กลไกป้องกันหลัง Compaction

หลังการลองใหม่ภายหลัง Compaction ที่เกิดจากบริบทล้น ตัวดำเนินการจะเปิดใช้ กลไกป้องกันแบบช่วงเวลาสั้นกับการเรียกใช้เครื่องมือสองสามครั้งถัดไป หากเอเจนต์ส่ง ชุดสามค่า (toolName, argsHash, resultHash) เดิมซ้ำมากพอภายในช่วงเวลานั้น กลไกป้องกันจะสรุปว่า Compaction ไม่สามารถตัด ลูปได้ และยุติการทำงานด้วยข้อผิดพลาด compaction_loop_persisted

กลไกป้องกันนี้ควบคุมโดยแฟล็กหลัก tools.loopDetection.enabled โดยมีเงื่อนไขพิเศษหนึ่งข้อ: กลไกจะยังคง เปิดใช้งานเมื่อไม่ได้ตั้งค่าแฟล็กหรือแฟล็กเป็น true และจะปิด เฉพาะเมื่อกำหนดแฟล็กเป็น false อย่างชัดเจน ซึ่งเป็นพฤติกรรมโดยตั้งใจ เพราะกลไกป้องกันนี้ มีไว้เพื่อออกจากลูป Compaction ที่มิฉะนั้นจะใช้โทเค็นอย่างไร้ขีดจำกัด ดังนั้นผู้ใช้ที่ไม่ได้กำหนดค่าก็ยังได้รับการป้องกัน

json5
{  tools: {    loopDetection: {      // สวิตช์หลัก; ตั้งค่าเป็น false เพื่อปิดกลไกป้องกันพร้อมกับตัวตรวจจับแบบเลื่อนต่อเนื่อง      enabled: true,    },  },}
  • กลไกป้องกันจะไม่ยุติการทำงานขณะที่ผลลัพธ์กำลังเปลี่ยนแปลง โดยจะทำงานเฉพาะเมื่อ ผลลัพธ์เหมือนกันทุกไบต์ตลอดช่วงเวลาที่กำหนด
  • กลไกจะเปิดใช้เฉพาะทันทีหลังการลองใหม่ภายหลัง Compaction เท่านั้น ไม่ใช่ในจุดอื่น ของการทำงาน

บันทึกและพฤติกรรมที่คาดไว้

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

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

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page