ทำไมเอเจนต์ของคุณถึงเผาผลาญโทเคน

คุณได้ติดตั้ง coding agent ตัวหนึ่ง มันดึงตั๋ว (tickets) และส่ง PR ได้อย่างราบรื่น และทำงานได้ดี

จากนั้น บิลค่าใช้จ่ายก็ส่งมาถึง

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

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

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

คุณเห็นแค่บิล แต่ไม่เห็นการเรียกใช้งาน (calls) ซึ่งนั่นมันสายเกินไปแล้ว

ทีมที่ประสบความสำเร็จจะสร้างระบบควบคุมค่าใช้จ่ายตั้งแต่วันแรก โดยใช้วิธีการเหล่านี้:

ในการรันเอเจนต์ในระบบ production คุณจำเป็นต้องมี:

หากคุณพลาดสิ่งเหล่านี้ คุณก็เหมือนทำงานแบบตาบอด

LiteLLM ใช้รูปแบบเฉพาะเพื่อหลีกเลี่ยงปัญหานี้:

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

เริ่มทำตามขั้นตอนเหล่านี้ทันที:

สร้างโครงสร้างพื้นฐานที่แยกเอเจนต์ที่เชื่อถือได้ออกจากความผิดพลาดที่มีราคาแพง

ทำไมเอเจนต์ของคุณถึงเผาผลาญโทเคนอย่างเงียบๆ และวิธีหยุดยั้งพวกมัน

หากคุณเคยสร้างเอเจนต์ที่ขับเคลื่อนด้วย LLM คุณน่าจะเคยพบกับปัญหา "ลูปไม่สิ้นสุด" (infinite loop) คุณมอบหมายงานให้เอเจนต์ มันเริ่มคิด มันดำเนินการ และสังเกตผลลัพธ์ จากนั้น... มันก็ทำซ้ำ

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

ต้นทุนที่ซ่อนอยู่ของ Agentic Loops

เมื่อเราพูดถึงเอเจนต์ เรามักจะหมายถึงรูปแบบ ReAct (Reason + Act) โดยเอเจนต์จะทำตามวงจรดังนี้:

  1. Thought: เอเจนต์ตัดสินใจว่าจะทำอะไรต่อไป
  2. Action: เอเจนต์ดำเนินการบางอย่าง (เช่น ค้นหาเว็บ, เรียกใช้เครื่องมือ)
  3. Observation: เอเจนต์ดูผลลัพธ์จากการดำเนินการ

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

ทำไมสิ่งนี้ถึงเกิดขึ้น?

มีหลายเหตุผลที่ทำให้เอเจนต์ติดลูป:

วิธีหยุดการเผาผลาญโทเคน

1. กำหนดขีดจำกัดจำนวนรอบสูงสุด (Set a Maximum Iteration Limit)

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

# ตัวอย่างการกำหนดขีดจำกัดจำนวนรอบสูงสุด
agent_executor = AgentExecutor(agent=agent, tools=tools, max_iterations=5)

2. ใช้การตรวจสอบการใช้งานโทเคน (Implement Token Usage Monitoring)

อย่ารอ