รูปแบบ PRG สำหรับ AI Agents

AI agents กำลังประสบกับปัญหาเก่าแก่ ซึ่งเป็นบั๊กแบบเดียวกับที่เคยทำให้ฟอร์มบนเว็บพังในช่วงยุค 90

ในยุคเว็บสมัยก่อน เมื่อผู้ใช้ส่งฟอร์ม หากพวกเขากดรีเฟรช เบราว์เซอร์จะส่งข้อมูลซ้ำอีกครั้ง ซึ่งหมายถึงการสั่งซื้อซ้ำสองครั้ง, การเรียกเก็บเงินซ้ำสองครั้ง หรือการส่งอีเมลซ้ำสองฉบับ

วิธีแก้ไขคือรูปแบบ Post/Redirect/Get (PRG)

ตรรกะนั้นเรียบง่าย:

  • ผู้ใช้ส่งคำขอแบบ POST
  • เซิร์ฟเวอร์ประมวลผลงาน
  • เซิร์ฟเวอร์ส่ง 302 Redirect ไปยัง URL ใหม่
  • เบราว์เซอร์ทำตามการ redirect ด้วยคำขอแบบ GET

การรีเฟรชในตอนนี้จะทำเพียงแค่โหลดหน้าผลลัพธ์ใหม่เท่านั้น โดยไม่เป็นการทำซ้ำการกระทำเดิม

AI agents ได้นำบั๊กนี้กลับมาสู่เลเยอร์ใหม่

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

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

คุณต้องนำรูปแบบ PRG มาใช้กับ agentic pipelines ของคุณโดยใช้ idempotency keys

Idempotency key คือการ redirect ของคุณ มันช่วยแยก "การกระทำ" ออกจาก "ผลลัพธ์"

วิธีนำไปใช้งาน:

  • เครื่องมือที่มีการเปลี่ยนแปลงข้อมูล (mutating tool) ทุกชนิดต้องรองรับ idempotency key
  • สร้าง key ขึ้นมาก่อนการพยายามครั้งแรก
  • กำหนด key จากความตั้งใจของผู้ใช้ (user intent) ไม่ใช่จากประทับเวลา (timestamp)
  • เซิร์ฟเวอร์ต้องตรวจสอบว่าเคยเห็น key นี้มาก่อนหรือไม่
  • หากพบว่ามี key นี้อยู่แล้ว ให้ส่งคืนผลลัพธ์ที่บันทึกไว้แทนที่จะรันงานนั้นซ้ำอีกครั้ง

สำหรับงานที่ใช้เวลานาน คุณต้องการมากกว่าแค่ key นั่นคือคุณต้องมี checkpointing

Checkpointing จะบันทึกสถานะ (state) ในทุกขั้นตอน หากเอเจนต์หยุดทำงานกลางคันในระหว่างงานที่ต้องใช้เวลา 20 นาที มันจะสามารถทำงานต่อจากจุดที่ค้างไว้ได้ โดยไม่ต้องเริ่มใหม่ตั้งแต่ต้น

หากคุณทำได้เพียงอย่างเดียว จงทำให้การเรียกใช้เครื่องมือทุกครั้งปลอดภัยพอที่จะรันซ้ำได้สองครั้ง

สร้างเอเจนต์ของคุณด้วยการตรวจสอบ 5 ข้อนี้:

  • เครื่องมือทุกชนิดรองรับ idempotency key หรือไม่?
  • Key อ้างอิงจากความตั้งใจ (intent) แทนที่จะเป็นเวลาใช่หรือไม่?
  • มีการใช้ key เดิมในการลองใหม่ทุกครั้งหรือไม่?
  • เซิร์ฟเวอร์ส่งคืนผลลัพธ์ที่บันทึกไว้เมื่อเจอ key ซ้ำหรือไม่?
  • มีการบันทึกขั้นตอนระหว่างทางสำหรับงานที่ใช้เวลานานหรือไม่?

รูปแบบยังคงเหมือนเดิม เปลี่ยนเพียงแค่เลเยอร์เท่านั้น

แหล่งที่มา: https://dev.to/ravikiran438/the-prg-pattern-for-ai-agents-a-25-year-old-fix-coming-of-age-in-a-new-era-23fh