รูปแบบ 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
