การแยกส่วนการส่งอีเมลของ LLM ในเวิร์กโฟลว์อัตโนมัติ
เมื่อเอเจนต์ LLM เริ่มส่งอีเมลหรืออนุมัติตั๋ว (tickets) ปัญหาจะเปลี่ยนไป มันไม่ใช่แค่เรื่องที่ว่าพรอมต์ (prompt) ของคุณทำงานได้หรือไม่อีกต่อไป แต่ตอนนี้ระบบของคุณต้องพึ่งพา 3 เลเยอร์ ได้แก่: การตัดสินใจ (decision), การดำเนินการ (execution) และการตรวจสอบ (verification)
หากคุณผสมผสานเลเยอร์เหล่านี้เข้าด้วยกัน ทีมของคุณจะประสบปัญหาในการทำความเข้าใจว่าเอเจนต์ได้ทำอะไรลงไปกันแน่
ขั้นตอนการส่งอีเมลมักจะดูเหมือนเป็นจุดสิ้นสุดของเวิร์กโฟลว์ แต่ในความเป็นจริง มันคือจุดที่ความล้มเหลวปรากฏให้เห็นเป็นอันดับแรก เอเจนต์อาจจำแนกคำขอได้อย่างถูกต้อง แต่กลับส่งไปยังบุคคลที่ผิดหรือใช้ลิงก์ที่หมดอายุ คุณจึงต้องแยกการทดสอบ (tests) และการติดตามผล (traces) ออกจากกัน
การออกแบบที่เสถียรจะไม่พยายามทดสอบความฉลาดทั้งหมดในคราวเดียว แต่จะแบ่งระบบของคุณออกเป็นสัญญา (contracts) ขนาดเล็กแทน:
- Input Contract: กำหนดว่าเอเจนต์ใช้ข้อมูลอะไรและสามารถร้องขอการดำเนินการใดได้บ้าง
- Execution Contract: กำหนดว่าการดำเนินการจะกลายเป็นการส่งอีเมลที่เฉพาะเจาะจงได้อย่างไร
- Observability Contract: เชื่อมโยงล็อก (logs), ข้อความที่ได้รับ และสถานะสุดท้ายของระบบเข้าด้วยกัน
แยกตรรกะการส่งอีเมลออกจากพรอมต์แบบอิสระ (free prompt) LLM สามารถเสนอการดำเนินการ เช่น "send_followup_email" ได้ อย่างไรก็ตาม โมเดลไม่ควรเป็นผู้ตัดสินใจเรื่องส่วนหัว (headers), ผู้รับ หรือนโยบายการลองใหม่ (retry policies) ให้ใช้โค้ดแบบ deterministic สำหรับการแปลงข้อมูลเหล่านี้
แนวทางนี้ช่วยลดความเสี่ยงในการดำเนินงาน LLM เป็นผู้เสนอ ระบบเป็นผู้ตรวจสอบ และตัวดำเนินการ (executor) เป็นผู้ส่ง
เพื่อให้สามารถมองเห็นภาพได้อย่างชัดเจน ให้ติดตามสัญญาณ 4 อย่างนี้:
- การตัดสินใจของเอเจนต์และบริบท (context) ที่ใช้
- คำสั่งสุดท้ายที่ส่งไปยังตัวดำเนินการอีเมล (email executor)
- ข้อความที่ได้รับในอินบ็อกซ์ที่แยกไว้ต่างหาก (isolated inbox)
- ผลลัพธ์สุดท้ายหลังจากคลิกลิงก์หรือยืนยันการดำเนินการ
ใช้ trace_id ร่วมกันตั้งแต่เหตุการณ์เริ่มต้นไปจนถึงการคลิกครั้งสุดท้าย สิ่งนี้จะช่วยให้คุณค้นหาข้อผิดพลาดได้อย่างรวดเร็ว คุณจะทราบได้ทันทีว่าความล้มเหลวเกิดขึ้นที่โมเดล, นโยบายของเครื่องมือ (tool policy) หรือตัวทำงาน (worker)
ปฏิบัติตามเช็คลิสต์นี้เพื่อการทำงานอัตโนมัติที่ดีขึ้น:
- ทุกการดำเนินการต้องมี
trace_idของตัวเอง - LLM จะร้องขอการดำเนินการภายใต้ schema ที่ถูกต้องเท่านั้น
- ตัวดำเนินการอีเมล (email executor) ต้องตรวจสอบผู้รับและเทมเพลตซ้ำอีกครั้ง
- แต่ละสถานการณ์การทดสอบต้องใช้อินบ็อกซ์ที่แยกต่างหาก
- การคลิกครั้งสุดท้ายต้องยืนยันการเปลี่ยนแปลงสถานะที่คาดหวังไว้
- ล็อก (logs) ต้องช่วยให้คุณติดตามกรณีต่างๆ ได้โดยไม่ต้องคาดเดา
การแยกขั้นตอนเหล่านี้อาจเพิ่มงานขึ้นอีกเล็กน้อย แต่มันให้สิ่งที่มีค่าแก่คุณ นั่นคือความสามารถในการอธิบายว่าทำไมอีเมลจึงถูกส่งออกไป หรือทำไมมันถึงล้มเหลว
Optional learning community: https://t.me/GyaanSetuAi
