
Multi-AI Agent คือโครงสร้างระบบที่เอเจนต์ผู้เชี่ยวชาญหลายตัวแบ่งหน้าที่กันและทำงานร่วมกันเพื่อทำภารกิจหนึ่งให้สำเร็จ สำหรับเวิร์กโฟลว์ที่มีความซับซ้อนซึ่งยากจะจัดการด้วยเอเจนต์เพียงตัวเดียว หรือภารกิจที่มีความยาวเกินขีดจำกัดของความยาวบริบท (Context Length) รูปแบบการออกแบบอย่างการแบ่งงานกันทำ (Division of Labor), การส่งต่องาน (Handoff) และการประมวลผลแบบขนาน (Parallel Execution) จะเป็นแนวทางแก้ไขที่มีประสิทธิภาพ
บทความนี้มีกลุ่มเป้าหมายเป็นวิศวกรและสถาปนิกที่กำลังพิจารณาการออกแบบและติดตั้งระบบ Multi-Agent โดยจะสรุปมุมมองด้านการติดตั้ง ตั้งแต่การเลือกใช้รูปแบบทั้ง 3 ประเภท ได้แก่ แบบ Orchestrator, แบบ Handoff และแบบ Parallel Worker ไปจนถึงการส่งผ่านสถานะระหว่างเอเจนต์, การออกแบบเมื่อเกิดความล้มเหลว และขั้นตอนการเปลี่ยนผ่านจากเอเจนต์เดี่ยวไปสู่ระบบหลายเอเจนต์อย่างเป็นลำดับขั้น การทำความเข้าใจเหตุผลเบื้องหลังการตัดสินใจออกแบบจะช่วยให้คุณสามารถเลือกสถาปัตยกรรมที่เหมาะสมกับกรณีการใช้งานขององค์กรคุณได้
ในขณะที่ AI Agent แบบเดี่ยวจะใช้โมเดลเพียงตัวเดียวในการจัดการทุกงาน แต่ระบบ Multi-Agent จะใช้เอเจนต์หลายตัวแบ่งหน้าที่และทำงานร่วมกัน เมื่อขนาดและความซับซ้อนเพิ่มมากขึ้น การใช้โครงสร้างแบบเดี่ยวอาจไม่สามารถรองรับได้ในบางสถานการณ์ เราจะมาสรุปกันว่าขีดจำกัดดังกล่าวอยู่ที่จุดใด และการแบ่งงานกันทำจะสร้างความเปลี่ยนแปลงอย่างไรบ้าง
หลายคนมักคิดว่าการขยายขีดความสามารถของเอเจนต์เดี่ยว (Single Agent) จะช่วยแก้ปัญหาได้ แต่ในความเป็นจริง เมื่อถึงจุดหนึ่ง การเพิ่มความยาวของ Prompt จะทำให้ความแม่นยำลดลง และการเพิ่มจำนวนเครื่องมือ (Tool) จะทำให้เกิดการเรียกใช้งานผิดพลาดมากขึ้น ซึ่งส่งผลในทางตรงกันข้าม หากเริ่มพบสัญญาณเตือน 3 ประการต่อไปนี้ แสดงว่าเป็นเวลาที่ควรพิจารณาทบทวนการออกแบบใหม่:
① Context Window เต็มอยู่ตลอดเวลา
เมื่อ System Prompt, คำจำกัดความของเครื่องมือ (Tool definition), ประวัติการสนทนา และผลลัพธ์ระหว่างทางสะสมรวมกัน จนทำให้ปริมาณข้อมูลที่โมเดลรับได้ใกล้ถึงขีดจำกัดอยู่เสมอ จะมีความเสี่ยงสูงที่คำสั่งสำคัญจะถูก "ดันออก" (Push out) จนถูกละเลย บ่อยครั้งที่เฉพาะคำจำกัดความของเครื่องมือเพียงอย่างเดียวก็ใช้ Token ไปหลายพันแล้ว ซึ่งเป็นการเบียดบังพื้นที่ Context ที่ควรจะนำไปใช้ในการประมวลผลจริง
② เกิดข้อผิดพลาดในการเรียกใช้เครื่องมือหรือลำดับการทำงานผิดพลาดบ่อยครั้ง
หากให้เอเจนต์ตัวเดียวถือเครื่องมือมากกว่า 10 รายการ โมเดลมีแนวโน้มที่จะสับสนระหว่างฟังก์ชันที่คล้ายคลึงกัน หรือดำเนินการตามขั้นตอนที่มีความสัมพันธ์กันแบบผิดลำดับ แม้จะปรับแก้ Prompt ทุกครั้งที่ Debug ก็มักจะวนกลับไปสู่วงจรเดิมที่ปัญหาไปเกิดกับเครื่องมือตัวอื่นแทน
③ เมื่อส่วนหนึ่งของงานล้มเหลว จำเป็นต้องเริ่มใหม่ทั้งหมด
ในโครงสร้างแบบเดี่ยว กระบวนการทำงานจะถูกเชื่อมโยงเป็น Flow เดียวกัน ดังนั้นหากเกิดข้อผิดพลาดในขั้นตอนท้ายๆ อาจจำเป็นต้องเริ่มรันใหม่ตั้งแต่ต้น ยิ่งกระบวนการยาวนานเท่าใด ต้นทุนในการลองใหม่ (Retry cost) ก็จะยิ่งสูงขึ้น และกลายเป็นโครงสร้างที่ยากต่อการแก้ไขเฉพาะจุด
สัญญาณเตือนทั้ง 3 ประการนี้อาจปรากฏขึ้นแยกกัน แต่หากพบหลายข้อพร้อมกัน การแบ่งบทบาท (Role splitting) และการกำหนดความรับผิดชอบให้ชัดเจนจะเป็นแนวทางแก้ไขที่มีประสิทธิภาพครับ
การใช้ระบบแบบหลายเอเจนต์ (Multi-agent) จะมีประสิทธิภาพเมื่อสามารถแบ่งงานได้อย่างชัดเจนและแต่ละเอเจนต์สามารถทำงานได้อย่างอิสระ อย่างไรก็ตาม ระบบนี้ไม่ใช่ทางออกสำหรับทุกปัญหา และมีขอบเขตจำกัดในการนำไปประยุกต์ใช้
สิ่งที่สามารถแก้ไขได้
สิ่งที่แก้ไขไม่ได้และประเด็นที่ควรระวัง
หากงานมีความสัมพันธ์กันอย่างใกล้ชิด (Tight dependency) โดยที่ผลลัพธ์ของขั้นตอนก่อนหน้าส่งผลโดยตรงต่อขั้นตอนถัดไป การแบ่งงานอาจเพิ่มเพียงแค่ต้นทุนในการประสานงานระหว่างเอเจนต์ ซึ่งอาจทำให้ระบบมีความซับซ้อนมากขึ้น นอกจากนี้ หากการส่งผ่านสถานะ (State) ระหว่างเอเจนต์ไม่สมบูรณ์ ก็จะทำให้เกิดข้อมูลตกหล่นหรือความขัดแย้งได้ง่าย
การใช้ระบบแบบหลายเอเจนต์จะมีประสิทธิภาพเมื่อสามารถแยกงานให้เป็นอิสระต่อกันได้ แต่หากกระบวนการมีความเชื่อมโยงกันสูงและต้องอาศัยลำดับขั้นตอนที่ตายตัว การพิจารณาปรับปรุงเอเจนต์เดี่ยว (Single agent) ก่อนจะเป็นทางเลือกที่สมเหตุสมผลกว่า
นอกจากนี้ ยิ่งจำนวนเอเจนต์เพิ่มมากขึ้นเท่าใด ความยากในการดีบั๊ก (Debug) และการตรวจสอบ (Monitor) ก็จะยิ่งสูงขึ้นเท่านั้น
จุดประสงค์ของการแบ่งงาน (Division of Labor) ไม่ได้มีเพียงแค่ "การย่อยปัญหาที่ใหญ่เกินไปให้เล็กลง" เท่านั้น แต่ยังประกอบด้วยแรงจูงใจหลายประการที่เกี่ยวข้องกัน เช่น ข้อจำกัดด้าน Context Length, การเพิ่มประสิทธิภาพด้านต้นทุนของโมเดล (Model Cost) และการนำกลับมาใช้ใหม่ (Reusability) ตามบทบาทหน้าที่ หากจัดระเบียบจุดประสงค์เหล่านี้ให้ชัดเจนก่อนเริ่มการออกแบบ จะช่วยให้เกณฑ์ในการตัดสินใจเลือกรูปแบบ (Pattern) มีความชัดเจนยิ่งขึ้น
เมื่อเพิ่มงานให้กับเอเจนต์เดี่ยว (Single Agent) อย่างต่อเนื่อง ในที่สุดทั้งหน้าต่างบริบท (Context Window) และรายการเครื่องมือ (Tool List) จะเข้าใกล้ขีดจำกัด เปรียบเสมือนการมอบคู่มือการทำงานทั้งหมดและสิทธิ์เข้าถึงระบบของทั้งบริษัทให้กับพนักงานเพียงคนเดียวในคราวเดียว ซึ่งเป็นสภาวะที่ "ความยุ่งยากในการค้นหาว่าจะใช้อะไร" เพิ่มขึ้นเร็วกว่าความแม่นยำในการประมวลผล
ความแม่นยำในการเลือกเครื่องมือของ LLM มีแนวโน้มที่จะลดลงเมื่อจำนวนเครื่องมือที่ลงทะเบียนไว้เพิ่มขึ้น ในขั้นตอนที่มีเครื่องมือจำนวนน้อย เราสามารถคาดหวังการเลือกที่เหมาะสมได้ แต่มีรายงานว่าเมื่อจำนวนเครื่องมือเพิ่มขึ้น จะเกิดกรณีการเลือกผิดพลาดหรือการเรียกใช้เครื่องมือที่ไม่จำเป็นเพิ่มมากขึ้น ในส่วนของความยาวบริบท (Context Length) ก็เช่นกัน เมื่อประวัติการสนทนา, System Prompt, คำจำกัดความของเครื่องมือ และผลลัพธ์ระหว่างทางทั้งหมดถูกสะสมไว้ในหน้าต่างเดียวกัน จะเกิดปรากฏการณ์ที่โมเดลมองข้ามคำสั่งในช่วงท้ายหรืออ้างอิงบริบทในช่วงแรกได้ยากขึ้น
การเปลี่ยนไปใช้ระบบหลายเอเจนต์ (Multi-Agent) จะช่วยแก้ปัญหานี้ด้วยการ "แบ่งส่วน" โดยมี 2 ประเด็นที่มีประสิทธิภาพดังนี้:
อย่างไรก็ตาม การแบ่งส่วนไม่ได้หมายความว่าความแม่นยำจะเพิ่มขึ้นเสมอไป หากการออกแบบการส่งต่องานระหว่างเอเจนต์ไม่รัดกุม จะทำให้เกิดข้อมูลสูญหายหรือการประมวลผลซ้ำซ้อนได้
ประโยชน์ของระบบ Multi-agent ที่มักถูกมองข้ามคือ อิสระในการเลือกโมเดล (Model Selection) ในตอนแรกเรามักจะคิดว่า "การใช้โมเดลประสิทธิภาพสูงสุดกับทุกเอเจนต์จะช่วยเพิ่มคุณภาพงาน" แต่ในความเป็นจริง การเลือกใช้โมเดลให้เหมาะสมกับความยากง่ายของงานจะช่วยลดต้นทุนได้อย่างมหาศาลโดยที่ยังคงรักษาคุณภาพไว้ได้
การปรับให้เหมาะสมตามบทบาทหน้าที่ สามารถพิจารณาได้จาก 3 แกนหลัก ดังนี้:
| แกน | แนวคิด |
|---|---|
| ความซับซ้อนของการใช้เหตุผล | งานวางแผนหรือตัดสินใจที่ซับซ้อนควรใช้ Frontier Model ส่วนงานแปลงรูปแบบหรือสรุปความควรใช้ Lightweight Model |
| ความถี่ในการเรียกใช้งาน | ยิ่ง Worker ถูกเรียกใช้งานบ่อยเท่าใด การใช้โมเดลต้นทุนต่ำก็จะยิ่งเห็นผลชัดเจนมากขึ้นเท่านั้น |
| ข้อกำหนดด้าน Latency | เอเจนต์ที่ต้องการความเร็วในการตอบสนองสูง ควรให้ความสำคัญกับโมเดลขนาดเล็กและประมวลผลเร็ว |
ตัวอย่างการแบ่งบทบาทหน้าที่ที่ชัดเจนคือ การกำหนดให้ Orchestrator ซึ่งทำหน้าที่ย่อยงานและสั่งการเอเจนต์ต่างๆ ใช้โมเดลที่มีความสามารถในการใช้เหตุผลสูง ส่วน Worker ที่รับผิดชอบงานประจำ เช่น การดึงข้อมูลจากผลการค้นหาเว็บ (Web Scraping) หรือการจัดรูปแบบ JSON ให้ใช้ Lightweight Model นอกจากนี้ยังมีทางเลือกในการเลือกใช้โมเดลที่เชี่ยวชาญด้านการเขียนโค้ดโดยเฉพาะสำหรับเอเจนต์ที่ทำหน้าที่สร้างโค้ด
ข้อควรระวังคือ หากลดระดับโมเดลของ Worker มากเกินไป คุณภาพของผลลัพธ์จะลดลงและอาจทำให้เกิดข้อผิดพลาดส่งต่อไปยังเอเจนต์ลำดับถัดไปได้ ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องประเมินคุณภาพผลลัพธ์ของเอเจนต์แต่ละตัวแยกกัน และค่อยๆ ปรับสมดุลระหว่างการลดต้นทุนและคุณภาพอย่างเป็นขั้นตอน
จุดแข็งของโครงสร้างแบบ Multi-agent คือการที่การจัดสรรโมเดลไม่ใช่สิ่งที่ตายตัว แต่สามารถ ปรับเปลี่ยนได้ตามปริมาณงานและงบประมาณที่เปลี่ยนแปลงไป
โครงสร้างของมัลติเอเจนต์สามารถแบ่งออกเป็น 3 รูปแบบหลัก ได้แก่ รูปแบบออร์เคสตราเตอร์ (Orchestrator) ที่เอเจนต์ส่วนกลางเป็นผู้สั่งการ, รูปแบบแฮนด์ออฟ (Handoff) ที่ส่งต่องานกันตามลำดับ และ รูปแบบพาราเรลเวิร์กเกอร์ (Parallel Worker) ที่เอเจนต์หลายตัวทำงานขนานกันไป โดยแต่ละรูปแบบจะมีความแตกต่างกันในด้านระดับการรวมศูนย์ของการควบคุมและขั้นตอนการทำงาน
เมื่อคุณรู้สึกว่า "การต้องเขียนคำสั่ง (Prompt) เพื่อบอกว่าควรให้เอเจนต์ตัวไหนทำอะไรในทุกๆ ครั้งนั้นมีขีดจำกัด" รูปแบบ Orchestrator จะกลายเป็นตัวเลือกที่น่าสนใจขึ้นมา
ในรูปแบบนี้ จะมีเอเจนต์ที่ทำหน้าที่ควบคุมเพียงอย่างเดียวเรียกว่า Orchestrator ซึ่งจะรับงานทั้งหมดมา แล้วทำหน้าที่จัดสรรงานให้กับ Sub-agent, กำหนดลำดับการทำงาน และรวบรวมผลลัพธ์ทั้งหมด โดยที่ Sub-agent จะตอบสนองต่อคำสั่งของ Orchestrator เท่านั้น และจะไม่สื่อสารกันเองโดยตรง
สรุปลักษณะโครงสร้างได้ดังนี้:
| องค์ประกอบ | บทบาท |
|---|---|
| Orchestrator | ย่อยงาน, จัดสรรงาน, รวบรวมผลลัพธ์ |
| Sub-agent | ปฏิบัติงานตามหน้าที่เดียวเท่านั้น |
| เส้นทางการสื่อสาร | Orchestrator ↔ Sub-agent แต่ละตัว (รูปแบบ Star) |
ตัวอย่างเช่น ในไปป์ไลน์การสร้างรายงานการวิจัย Orchestrator จะย่อยงานออกเป็น 3 ส่วน ได้แก่ "การรวบรวมข้อมูล", "การสรุปผล" และ "การตรวจสอบคุณภาพ" จากนั้นจะมอบหมายงานให้เอเจนต์เฉพาะทางแต่ละตัวทำตามลำดับหรือทำแบบขนาน โดย Orchestrator จะเป็นผู้รับผลลัพธ์สุดท้ายมาจัดรูปแบบและส่งคืน
รูปแบบ Sequential และ Concurrent ของ Microsoft Agent Framework ต่างก็เป็นรูปแบบย่อยของ Orchestrator นี้ โดยมีความแตกต่างกันเพียงแค่การกำหนดลำดับการทำงานว่าเป็นแบบอนุกรมหรือแบบขนานเท่านั้น
ข้อควรระวังคือ Orchestrator มักจะกลายเป็นคอขวดได้ง่าย เนื่องจากทุกการสื่อสารต้องผ่านจุดนี้ หากการออกแบบ Prompt ของ Orchestrator ไม่รัดกุม คำสั่งที่ส่งไปยัง Sub-agent ก็จะผิดพลาดตามไปด้วย
รูปแบบ Handoff คือวิธีการที่เอเจนต์หนึ่งตัวจะส่งมอบการควบคุมและสถานะทั้งหมดให้กับเอเจนต์ตัวถัดไปทันทีที่เสร็จสิ้นภารกิจ โดยเป็นการส่งต่อกระบวนการทำงานเหมือนกับการวิ่งผลัด ซึ่งแตกต่างจากการที่ Orchestrator คอยเฝ้าติดตามภาพรวมอยู่ตลอดเวลา โดยในรูปแบบนี้การทำงานจะดำเนินไปเป็นทอดๆ ตามการตัดสินใจอย่างอิสระของเอเจนต์แต่ละตัวที่ว่า "เมื่อทำงานของตนเสร็จแล้ว ให้ส่งต่อให้ตัวถัดไป"
ใน OpenAI Agents SDK การทำ Handoff จะถูกนำไปใช้งานในรูปแบบของ Tool (ฟังก์ชัน) ซึ่งทันทีที่มีการเรียกใช้ การทำงานจะเปลี่ยนไปสู่เอเจนต์ปลายทางที่ถูกระบุไว้ และสถานะการสนทนาล่าสุดจะถูกโอนย้ายไปโดยตรง กล่าวคือ เอเจนต์ตัวถัดไปจะเริ่มทำงานโดยรับช่วงต่อบริบทที่เอเจนต์ตัวก่อนหน้าได้รวบรวมไว้ ทำให้ไม่จำเป็นต้องป้อนข้อมูลหรือตีความข้อมูลใหม่
ตัวอย่างการใช้งานทั่วไปคือเวิร์กโฟลว์ที่มีขั้นตอนชัดเจนและขึ้นต่อกันตามลำดับ:
วิธีนี้จะมีประสิทธิภาพเป็นพิเศษในกรณีที่ผลลัพธ์ของแต่ละขั้นตอนเชื่อมโยงโดยตรงกับอินพุตของขั้นตอนถัดไป และมีโอกาสน้อยที่จะทำงานแบบขนานได้
อย่างไรก็ตาม มีเงื่อนไขที่ควรระวังคือ ในการออกแบบที่ Handoff ดำเนินไปในทิศทางเดียว หากเอเจนต์ระหว่างทางเกิดความล้มเหลว จำเป็นต้องมีการสร้าง Feedback Loop เพื่อย้อนกลับไปยังขั้นตอนก่อนหน้า นอกจากนี้ ยิ่งห่วงโซ่การทำงานยาวขึ้นเท่าใด ค่า Latency ก็จะสะสมมากขึ้นเท่านั้น ดังนั้นจึงควรจำกัดจำนวนขั้นตอนให้เหลือน้อยที่สุดเท่าที่จำเป็น
รูปแบบ Parallel Worker เป็นรูปแบบที่รันงานย่อยหลายงานที่สามารถดำเนินการได้อย่างอิสระพร้อมกัน แล้วจึงรวบรวมผลลัพธ์ในตอนท้าย ในตอนแรกเรามักจะคิดว่า "การประมวลผลตามลำดับนั้นแน่นอนกว่า" แต่การเรียงงานที่ไม่มีความเกี่ยวข้องกันต่อกันจะทำให้เกิดการสะสมของเวลารอคอย และทำให้ Latency เพิ่มขึ้นโดยไม่จำเป็น การระบุส่วนที่สามารถทำขนานกันได้แล้วกระจายงานออกไปจะช่วยปรับปรุง Throughput โดยรวมได้อย่างมาก
โครงสร้างทั่วไปมีดังนี้:
ตัวอย่างที่เป็นรูปธรรมคือการสรุปเอกสารหลายฉบับพร้อมกัน แทนที่จะให้ Agent 1 ตัวประมวลผลเอกสาร 10 ฉบับตามลำดับ หากเราแบ่งงานให้ Worker 10 ตัว ตัวละ 1 ฉบับ ก็จะสามารถลดเวลารอคอยตามทฤษฎีลงได้อย่างมาก ในกรณีการใช้งานด้านการวิจัยและการวิเคราะห์ข้อมูล โครงสร้างนี้จะแสดงประสิทธิภาพได้ดีเป็นพิเศษ
อย่างไรก็ตาม การทำขนานมีเงื่อนไขเบื้องต้น คือผลลัพธ์การประมวลผลของ Worker แต่ละตัวต้องเป็นอิสระต่อกัน และขั้นตอนการรวบรวมต้องสามารถจัดการลำดับหรือข้อมูลที่ขาดหายไปของผลลัพธ์ได้อย่างเหมาะสม หากมี Dependency ที่เอาต์พุตของ Worker หนึ่งกลายเป็นอินพุตของอีก Worker หนึ่ง ควรเลือกใช้รูปแบบ Handoff หรือ Orchestrator แทนรูปแบบ Parallel Worker
การออกแบบตรรกะการรวบรวม (Aggregation logic) ก็มีความสำคัญเช่นกัน การพิจารณาไม่เพียงแค่การรวมผลลัพธ์แบบง่ายๆ แต่รวมถึงการไกล่เกลี่ยผลลัพธ์ที่ขัดแย้งกัน และการจัดการผลลัพธ์บางส่วนในกรณีที่ Worker บางตัวล้มเหลว จะช่วยเพิ่มเสถียรภาพในสภาพแวดล้อมการใช้งานจริงได้ดียิ่งขึ้น
ทั้ง 3 รูปแบบมีสถานการณ์ที่ถนัดแตกต่างกันออกไป ดังนั้นการเลือกใช้ให้เหมาะสมกับลักษณะของงานจึงเป็นเรื่องสำคัญ โดยมีเกณฑ์ในการตัดสินใจ 2 ประการ ได้แก่ "ความสามารถในการแยกย่อยงานและความสัมพันธ์แบบพึ่งพากัน (Task decomposability and dependencies)" และ "การแลกเปลี่ยนระหว่างความหน่วง ต้นทุน และความสามารถในการทำซ้ำ (Latency, cost, and reproducibility trade-offs)"
เกณฑ์การตัดสินใจเบื้องต้นสำหรับคำถามที่ว่า "ไม่รู้ว่าควรเลือกรูปแบบไหน" คือการพิจารณาว่างานนั้นสามารถแบ่งย่อยได้หรือไม่ และแต่ละงานย่อยมีความสัมพันธ์แบบพึ่งพากันหรือไม่
สิ่งแรกที่ต้องตรวจสอบคือ ความสามารถในการแบ่งย่อย (Decomposability) หากสามารถแยกงานออกเป็นหน่วยอิสระได้ รูปแบบ Parallel Worker จะเป็นตัวเลือกที่เหมาะสม ตัวอย่างเช่น การประมวลผล "การสรุปเอกสารหลายฉบับพร้อมกัน" นั้นเหมาะสำหรับการทำขนาน เนื่องจากแต่ละเอกสารไม่มีผลกระทบต่อกัน ในทางกลับกัน หากโครงสร้างเป็นแบบ "ขั้นตอนถัดไปต้องใช้ผลลัพธ์จากขั้นตอนก่อนหน้าเสมอ" การทำขนานจะทำได้ยากและจำเป็นต้องประมวลผลแบบลำดับ (Sequential)
ถัดมาคือการตรวจสอบ ทิศทางของความสัมพันธ์แบบพึ่งพา (Dependency) หากความสัมพันธ์เชื่อมโยงกันในทิศทางเดียว รูปแบบ Handoff จะเหมาะสมที่สุด ซึ่งเป็นขั้นตอนแบบเส้นตรง เช่น ผลลัพธ์จากขั้นตอน A ถูกส่งต่อไปยังขั้นตอน B และส่งต่อไปยังขั้นตอน C ต่อไป ในทางกลับกัน หากวิธีการรวมงานย่อยยังไม่แน่นอนจนกว่าจะถึงเวลาดำเนินการ หรือหากเอเจนต์ที่ต้องเรียกใช้เปลี่ยนไปตามเงื่อนไข รูปแบบ Orchestrator จะเหมาะสมกว่า เนื่องจาก Orchestrator ที่เป็นศูนย์กลางสามารถประเมินสถานการณ์และตัดสินใจมอบหมายงานแบบไดนามิกได้
สรุปเกณฑ์การตัดสินใจได้ดังนี้:
| เงื่อนไข | รูปแบบที่แนะนำ |
|---|---|
| งานย่อยเป็นอิสระและสามารถประมวลผลขนานได้ | Parallel Worker |
| ขั้นตอนเชื่อมโยงกันในทิศทางเดียว | Handoff |
| จำเป็นต้องมีการแยกสาขาหรือมอบหมายงานแบบไดนามิกขณะทำงาน | Orchestrator |
ข้อควรระวังคือ หากความสัมพันธ์แบบพึ่งพามีความซับซ้อนสูง อย่าพยายามฝืนใช้รูปแบบใดรูปแบบหนึ่งเพียงอย่างเดียว แต่ควรพิจารณาโครงสร้างแบบไฮบริดที่ Orchestrator ทำหน้าที่ควบคุม Parallel Worker อีกทีหนึ่ง
ในการเลือกรูปแบบทั้ง 3 แบบ นอกจากความสามารถในการแบ่งงานและความสัมพันธ์เชิงพึ่งพา (dependency) แล้ว ยังต้องพิจารณาปัจจัยการแลกเปลี่ยน (trade-off) ใน 3 แกนหลัก ได้แก่ ความหน่วง (Latency), ต้นทุน (Cost) และความสามารถในการทำซ้ำ (Reproducibility)
| รูปแบบ | ความหน่วง | ต้นทุน | ความสามารถในการทำซ้ำ |
|---|---|---|---|
| แบบ Orchestrator | ปานกลาง-สูง (สั่งการตามลำดับ) | ปานกลาง-สูง (ใช้โมเดลประสิทธิภาพสูง) | สูง (การควบคุมรวมศูนย์) |
| แบบ Handoff | ปานกลาง (ประมวลผลแบบอนุกรม) | ต่ำ-ปานกลาง (ปรับโมเดลตามบทบาทได้) | ปานกลาง (ขึ้นอยู่กับคุณภาพการส่งต่องาน) |
| แบบ Parallel Worker | ต่ำ (ประมวลผลพร้อมกัน) | สูง (ตามจำนวนการเรียกใช้งานขนาน) | ต่ำ-ปานกลาง (ผันแปรตามตรรกะการรวมผล) |
รูปแบบ Parallel Worker สามารถลดเวลาในการตอบสนองได้จากการรันเอเจนต์หลายตัวพร้อมกัน แต่ต้นทุนจะเพิ่มขึ้นตามสัดส่วนเนื่องจากจำนวนการเรียกใช้ API ที่มากขึ้น ซึ่งมีโครงสร้างเดียวกับ "การจัดส่งพัสดุหลายชิ้นพร้อมกันจะถึงที่หมายเร็วขึ้น แต่ก็ต้องเสียค่าขนส่งตามจำนวนชิ้น"
ในแง่ของความสามารถในการทำซ้ำ รูปแบบ Orchestrator มักจะมีความเสถียรที่สุด เนื่องจากตรรกะการควบคุมรวมอยู่ที่จุดเดียว ทำให้การดีบั๊กและการเก็บล็อกเพื่อตรวจสอบทำได้ง่าย ในขณะที่รูปแบบ Handoff ผลลัพธ์ของเอเจนต์ลำดับถัดไปจะขึ้นอยู่กับคุณภาพของข้อความที่ส่งต่อมา ดังนั้นความแม่นยำในการออกแบบ Prompt จึงส่งผลโดยตรงต่อความสามารถในการทำซ้ำ
สำหรับเกณฑ์ในการตัดสินใจ สามารถใช้เงื่อนไขการแบ่งประเภทต่อไปนี้เป็นแนวทางได้:
การส่งผ่านสถานะระหว่างเอเจนต์เป็นหัวใจสำคัญที่กำหนดความน่าเชื่อถือของการออกแบบระบบหลายเอเจนต์ (Multi-agent design) โดยมีทางเลือกหลัก 2 วิธี ได้แก่ การใช้หน่วยความจำร่วม (Shared memory) และการส่งข้อความเพื่อส่งมอบงานอย่างชัดเจน (Explicit handover messages) ซึ่งแต่ละวิธีต่างก็มีสถานการณ์ที่เหมาะสมในการใช้งานแตกต่างกันไป
วิธีการส่งต่อสถานะระหว่างเอเจนต์สามารถแบ่งออกเป็น 2 ประเภทหลัก ได้แก่ "หน่วยความจำร่วม (Shared Memory)" และ "ข้อความส่งต่อแบบชัดเจน (Explicit Handoff Messages)"
หน่วยความจำร่วมเป็นวิธีการที่เอเจนต์ทุกตัวเขียนสถานะลงในที่จัดเก็บข้อมูลภายนอก (เช่น Redis หรือ Vector DB) ที่ทุกเอเจนต์สามารถเข้าถึงได้ เนื่องจากเอเจนต์ทุกตัวสามารถอ่านบริบทล่าสุดได้อย่างอิสระ จึงเหมาะกับโครงสร้างที่เอเจนต์หลายตัวทำงานพร้อมกันแบบ Parallel Worker อย่างไรก็ตาม หากจังหวะการเขียนข้อมูลทับซ้อนกันจะเกิดการแย่งชิงข้อมูล (Race Condition) ได้ง่าย และหากไม่มีการจัดการอย่างชัดเจนว่าเอเจนต์ใดถือสถานะที่ "ถูกต้อง" ก็อาจเสี่ยงต่อการสูญเสียความสอดคล้องของข้อมูล
ข้อความส่งต่อแบบชัดเจนเป็นวิธีการที่เอเจนต์ตัวก่อนหน้าจะสร้างข้อความที่รวบรวมผลลัพธ์การประมวลผลและคำสั่งสำหรับเอเจนต์ตัวถัดไป แล้วส่งต่อไปยังเอเจนต์ตัวนั้น แนวคิด Handoff ใน OpenAI Agents SDK มีความใกล้เคียงกับวิธีนี้ โดยจะส่งต่อสถานะการสนทนาล่าสุด ณ เวลาที่เรียกใช้งานไปโดยตรง เอเจนต์ที่ได้รับข้อความจะสามารถเข้าใจได้อย่างชัดเจนว่า "สิ่งใดเสร็จสิ้นแล้วและสิ่งใดยังคงค้างอยู่" จึงเหมาะกับรูปแบบ Handoff ที่มีการประมวลผลตามลำดับ
แนวทางปฏิบัติพื้นฐานในการเลือกใช้งานคือ หากงานมีความสัมพันธ์เชิงลำดับที่ชัดเจนให้ใช้ข้อความส่งต่อ แต่หากเอเจนต์ทำงานแยกกันอย่างอิสระและขนานกันให้ใช้หน่วยความจำร่วม
ในการออกแบบข้อความส่งต่อ หากจำกัดข้อมูลที่จะส่งให้เหลือเพียง 3 องค์ประกอบ ได้แก่ "ผลลัพธ์ที่ทำเสร็จแล้ว", "ปัญหาที่ยังไม่ได้รับการแก้ไข" และ "เงื่อนไขบังคับสำหรับเอเจนต์ตัวถัดไป" จะช่วยป้องกันไม่ให้ Prompt ของฝั่งผู้รับมีความยาวจนเกินไป ส่วนการใช้หน่วยความจำร่วมนั้น สามารถลดการแย่งชิงข้อมูลได้โดยการจำกัดสิทธิ์การเขียนให้เหลือเพียงเอเจนต์เดียว หรือใช้กลไกการล็อกแบบมองโลกในแง่ดี (Optimistic Locking)
ในหน้างานการพัฒนาแบบ Multi-agent นั้น ไม่ใช่เรื่องแปลกที่จะเกิดกรณีที่ต้องมาตั้งคำถามในภายหลังว่า "ทำไมถึงให้เครื่องมือนี้กับเอเจนต์ตัวนี้ด้วย"
เครื่องมือและสิทธิ์ที่มอบให้กับเอเจนต์ควรถูกจำกัดให้แคบลงอย่างเคร่งครัดตามขอบเขตบทบาทที่เอเจนต์นั้นรับผิดชอบ การออกแบบที่ให้เอเจนต์ทุกตัวใช้ชุดเครื่องมือเดียวกันอาจดูเรียบง่ายในตอนแรก แต่จะนำไปสู่การเรียกใช้เครื่องมือโดยไม่ตั้งใจหรือการก้าวก่ายสิทธิ์ได้ง่าย อีกทั้งยังทำให้การระบุสาเหตุเมื่อเกิดปัญหาทำได้ยากขึ้นด้วย
หลักการพื้นฐานในการออกแบบสิทธิ์มีดังนี้:
| ตัวอย่างบทบาท | เครื่องมือที่อนุญาต | เครื่องมือที่ควรห้าม |
|---|---|---|
| Research Agent | ค้นหาเว็บ, อ่านเอกสาร | เขียนข้อมูลลง DB, ส่งข้อมูลออก API ภายนอก |
| Execution Agent | เขียนข้อมูลลง DB, ส่งข้อมูลออก API ภายนอก | เข้าถึงข้อมูลผู้ใช้โดยตรง |
| Summarization Agent | สร้างข้อความ | การค้นหา, การเขียนข้อมูลทุกประเภท |
การจำกัดการจัดสรรเครื่องมือยังมีข้อดีในด้านความปลอดภัยอีกด้วย เพราะหากเอเจนต์ถูกโจมตีด้วย Prompt Injection ก็จะไม่สามารถดำเนินการนอกเหนือขอบเขตสิทธิ์ของตนได้ การนำหลักการ "Principle of Least Privilege" (หลักการสิทธิ์ขั้นต่ำ) มาประยุกต์ใช้ในการออกแบบเอเจนต์ จะช่วยจำกัดขอบเขตความเสียหายให้อยู่เพียงแค่ในระดับบทบาทเท่านั้น
ข้อควรระวังในการนำไปใช้งานจริงคือ ยิ่งมีจำนวนเครื่องมือมากเท่าใด ก็มีแนวโน้มที่โมเดลจะเลือกใช้เครื่องมือผิดพลาดมากขึ้นเท่านั้น ในทางปฏิบัติแล้ว การจำกัดจำนวนเครื่องมือไว้ที่ประมาณ 5-7 รายการต่อเอเจนต์หนึ่งตัว จะช่วยให้ความแม่นยำในการเรียกใช้เครื่องมือมีความเสถียรมากขึ้น หากเครื่องมือมีจำนวนมากเกินไป ให้ถือว่านั่นเป็นสัญญาณที่บ่งบอกว่าควรแบ่งแยกเอเจนต์ออกเป็นส่วนย่อยๆ ได้แล้ว
ยิ่งมีเอเจนต์ (Agent) มากเท่าใด ขอบเขตของผลกระทบเมื่อเกิดความล้มเหลวในจุดใดจุดหนึ่งก็จะยิ่งกว้างขึ้นเท่านั้น การกำหนดไว้ล่วงหน้าว่าจะจัดการกับความล้มเหลวเฉพาะจุด (Partial failure) อย่างไร และจะอนุญาตให้มีการลองใหม่ (Retry) ได้ถึงระดับไหน จะช่วยให้ระบบโดยรวมทำงานได้อย่างมีเสถียรภาพ
ในระบบ Multi-agent system หัวใจสำคัญของการออกแบบคือการตัดสินใจว่าเมื่อเอเจนต์ตัวใดตัวหนึ่งล้มเหลว ควรจะ "รีทราย (Retry) ทั้งระบบ" หรือ "รีทรายเฉพาะเอเจนต์ตัวนั้น"
ในช่วงแรก เรามักจะจัดการกับความล้มเหลวทุกอย่างเหมือนกันหมดและเลือกที่จะรันใหม่ทั้งระบบ แต่ในความเป็นจริง การแบ่งระดับความละเอียด (Granularity) ของการรีทรายตามประเภทของความล้มเหลว จะช่วยปรับปรุงทั้งในด้านต้นทุนและ Latency ได้อย่างมาก
เกณฑ์ในการตัดสินใจมี 2 แกนหลัก คือ "Idempotency" (ความเป็นเอกภาพ) และ "Dependency" (ความสัมพันธ์เชิงพึ่งพา)
นอกจากนี้ ควรตั้งค่าขีดจำกัดจำนวนครั้งในการรีทรายให้ชัดเจน เพราะการรีทรายแบบไม่จำกัดอาจนำไปสู่ปัญหา Loop ที่ควบคุมไม่ได้ (ซึ่งจะกล่าวถึงโดยละเอียดในส่วนถัดไป) โดยทั่วไปแล้ว สำหรับความล้มเหลวชั่วคราวจากเครือข่าย ควรใช้วิธี Exponential Backoff ประมาณ 3 ครั้ง ส่วนความล้มเหลวที่เกิดจากคุณภาพของ Output จากโมเดล ควรใช้วิธี "Fallback" ด้วยการลองใช้ Prompt Strategy อื่นแทนจะเหมาะสมกว่า
การจำแนกความล้มเหลวเฉพาะจุดได้อย่างแม่นยำ จะช่วยลดการรันใหม่ทั้งระบบที่ไม่จำเป็น และเพิ่มเสถียรภาพให้กับระบบโดยรวมได้
ในโครงสร้างที่เอเจนต์สามารถเรียกใช้เครื่องมือได้อย่างอิสระต่อเนื่องกันนั้น ปัญหาเรื่องลูป (Loop) หรือการทำงานที่ผิดพลาดจนควบคุมไม่ได้ (Runaway) ไม่ใช่ "ปัญหาที่อาจเกิดขึ้น" แต่เป็น "ปัญหาที่จะเกิดขึ้นแน่นอนหากไม่ป้องกันไว้ตั้งแต่การออกแบบ" ดังนั้น เงื่อนไขการหยุดทำงาน (Stop condition) จึงไม่ใช่สิ่งที่เพิ่มเข้ามาภายหลัง แต่ต้องถูกรวมไว้ตั้งแต่ขั้นตอนเริ่มต้นของการออกแบบ
เงื่อนไขการหยุดทำงานสามารถออกแบบโดยแบ่งออกเป็น 3 ประเภทหลัก ดังนี้:
การจัดการหลังจากหยุดทำงานควรแยกตามลักษณะของงาน หากเป็นขั้นตอนการทำงานที่ต้องมีการตรวจสอบโดยมนุษย์ ให้หยุดและแจ้งเตือนผู้รับผิดชอบ แต่หากเป็นงานแบบอะซิงโครนัส (Asynchronous task) เช่น งานประมวลผลแบบแบตช์ (Batch processing) การบันทึก Error log แล้วข้ามไปยังงานถัดไปจะเป็นทางเลือกที่เหมาะสมกว่า
ข้อควรระวังคือ หากตั้งเงื่อนไขการหยุดทำงานเข้มงวดเกินไป อาจทำให้งานที่ถูกต้องถูกตัดจบกลางคันได้ จึงแนะนำให้ตั้งค่าเริ่มต้นแบบยืดหยุ่นไว้ก่อน แล้วค่อยๆ ปรับให้รัดกุมขึ้นโดยพิจารณาจากบันทึกการทำงานจริง (Production log) ในภายหลัง
การเปลี่ยนจากเอเจนต์เดี่ยวไปเป็นระบบหลายเอเจนต์ในทันที มักจะทำให้การดีบั๊กมีความซับซ้อนขึ้น แนวทางที่เป็นขั้นตอนโดยเริ่มจากการรันเอเจนต์เดี่ยวที่มีอยู่เดิม แล้วค่อยๆ ระบุบทบาทที่สามารถแยกออกมาได้ทีละส่วนนั้นมีประสิทธิภาพมากกว่า
การพยายามแยก Single Agent ออกมาโดยตรงอาจทำให้ความซับซ้อนเพิ่มขึ้นได้ เปรียบเสมือนการแบ่งหน้าที่ในครัวระหว่าง "คนหั่นผัก" กับ "คนทำอาหาร" หากกฎการส่งต่อวัตถุดิบยังไม่ชัดเจน งานก็จะหยุดชะงักได้เช่นกัน ดังนั้น การเลือกบทบาทที่จะแยกออกมาเป็นส่วนแรกควรยึดหลักเกณฑ์ว่า "ขอบเขตมีความชัดเจนหรือไม่" เป็นสำคัญ
เงื่อนไขของบทบาทที่เหมาะสมแก่การแยกออกมา สามารถพิจารณาได้จาก 3 ประเด็น ดังนี้:
โดยเฉพาะอย่างยิ่ง "การค้นหาเว็บ/รวบรวมข้อมูล", "การรันโค้ด/Sandbox" และ "การสรุปเอกสาร" มักถูกยกให้เป็นตัวเลือกแรกๆ ในการแยกออกมา เนื่องจากทั้งหมดมี Input/Output ที่ชัดเจน และมีคุณสมบัติที่ง่ายต่อการทำงานแยกจาก Orchestrator หลัก
ในทางกลับกัน "การตีความเจตนาของผู้ใช้" หรือ "การสร้างคำตอบสุดท้าย" ไม่เหมาะสำหรับการแยกออกมาในช่วงแรก เนื่องจากต้องอาศัยบริบทของการสนทนาทั้งหมด หากแยกส่วนเหล่านี้ออกมาเร็วเกินไป จะทำให้การส่งต่อสถานะมีความซับซ้อนและส่งผลให้ต้นทุนในการ Debug พุ่งสูงขึ้น
การใช้วิธีแบบค่อยเป็นค่อยไป โดยเริ่มจากการแยกบทบาทออกมาหนึ่งอย่างเพื่อตรวจสอบการทำงาน และรอจนกว่าการออกแบบขอบเขตจะเสถียรแล้วจึงค่อยดำเนินการแบ่งส่วนถัดไป ถือเป็นแนวทางที่มีประสิทธิภาพในการลดความเสี่ยงด้านการ Implement
Q1. Multi-agent ดีกว่า Single-agent เสมอไปหรือไม่?
ไม่จำเป็นเสมอไป หากงานมีวัตถุประสงค์เดียวและอยู่ในขอบเขตของความยาวบริบท (context length) และจำนวนเครื่องมือที่ยอมรับได้ Single-agent จะมีความเรียบง่ายและน่าเชื่อถือมากกว่า การใช้ Multi-agent จะเพิ่มต้นทุนในการสื่อสารระหว่างเอเจนต์และความซับซ้อนในการจัดการสถานะ ดังนั้นจึงควรพิจารณานำมาใช้ก็ต่อเมื่อเห็นชัดเจนแล้วว่าเป็น "ปัญหาที่ไม่สามารถแก้ไขได้หากไม่แบ่งส่วนงาน"
Q2. ควรเริ่มจากรูปแบบ Orchestrator, Handoff หรือ Parallel Worker ดี?
รูปแบบ Handoff เป็นตัวเลือกที่เริ่มต้นได้ง่ายที่สุด เนื่องจากทำได้เพียงแค่แยกบทบาทเฉพาะออกมาจาก Single-agent เดิมแล้วส่งต่องานเป็นลำดับขั้น ซึ่งจะช่วยให้การเปลี่ยนแปลงการจัดการสถานะมีน้อยที่สุด เมื่อความสัมพันธ์ของงานเริ่มซับซ้อนขึ้นจึงค่อยเปลี่ยนไปใช้รูปแบบ Orchestrator และหากมีกระบวนการที่ทำงานแยกจากกันมากขึ้นค่อยนำรูปแบบ Parallel Worker มาผสมผสาน ซึ่งการขยายระบบแบบเป็นขั้นเป็นตอนนี้มักจะมีความเสถียรมากกว่าในการใช้งานจริง
Q3. จะป้องกันข้อมูลสูญหายเมื่อส่งต่อบริบทระหว่างเอเจนต์ได้อย่างไร?
สิ่งสำคัญคือการคัดกรองข้อมูลที่จะรวมไว้ในข้อความส่งต่อให้เหลือเพียง "ชุดข้อมูลขั้นต่ำที่จำเป็นสำหรับการตัดสินใจของเอเจนต์ถัดไป" และส่งผ่านด้วย Schema ที่มีโครงสร้างชัดเจน การส่งประวัติการสนทนาทั้งหมดไปโดยตรงจะทำให้ความยาวบริบทบวมขึ้นและเสี่ยงต่อการที่ข้อมูลสำคัญถูกกลบหายไป หากใช้หน่วยความจำร่วม (Shared Memory) ควรพิจารณาออกแบบโดยจำกัดสิทธิ์การเขียนตามขอบเขต (Scope) เพื่อป้องกันการเขียนทับโดยไม่ตั้งใจ
Q4. มีวิธีป้องกันไม่ให้เอเจนต์ติดอยู่ในลูปไม่รู้จบหรือไม่?
พื้นฐานของการป้องกันลูปคือการกำหนดทั้งขีดจำกัดจำนวนขั้นตอน (จำนวนเทิร์นสูงสุด) และการตั้งเวลา Time-out ตามเวลาที่ผ่านไป นอกจากนี้ การตรวจสอบจำนวนครั้งที่เรียกใช้เครื่องมือเดิมซ้ำๆ และใส่ระบบป้องกัน (Guard) เพื่อสั่งยุติการทำงานหากเกินเกณฑ์ที่กำหนดไว้ก็เป็นวิธีที่มีประสิทธิภาพ เงื่อนไขการหยุดทำงานไม่ควรปล่อยให้เอเจนต์ตัดสินใจเอง แต่ควรออกแบบให้สามารถควบคุมจากภายนอกโดยฝั่ง Orchestrator หรือ Runtime เพื่อจำกัดขอบเขตผลกระทบในกรณีที่ระบบทำงานผิดปกติ
Q5. สามารถพัฒนาโดยไม่ใช้เฟรมเวิร์กอย่าง LangChain หรือ AutoGen ได้หรือไม่?
สามารถทำได้ หากออกแบบการสื่อสารระหว่างเอเจนต์ผ่านคิว (Queue) หรือ Message Bus และจัดการสถานะผ่านฐานข้อมูลหรือ Shared Store ก็สามารถสร้างโครงสร้างที่เทียบเท่ากันได้โดยไม่ต้องใช้เฟรมเวิร์ก อย่างไรก็ตาม ต้นทุนในการพัฒนาฟังก์ชันที่จำเป็นต่อการใช้งานจริง เช่น การลองใหม่ (Retry), Time-out และการเก็บ Log นั้นไม่ใช่เรื่องเล็ก ทั้งนี้ AutoGen ได้ปล่อยเวอร์ชัน 0.4 ในเดือนมกราคม 2025 และมีจำนวน Star บน GitHub มากกว่า 37,000 ดวง ซึ่งแสดงให้เห็นว่าระบบนิเวศกำลังเติบโตเต็มที่ ดังนั้น สำหรับการทำ PoC ขนาดเล็ก การเริ่มจาก Implementation พื้นฐานแล้วค่อยพิจารณาใช้เฟรมเวิร์กในขั้นตอนการนำไปใช้งานจริง (Production) จึงเป็นแนวทางที่สมเหตุสมผลกว่า
จุดเริ่มต้นของการออกแบบ Multi-AI Agent คือการตั้งคำถามว่า "ทำไมต้องแบ่ง" ก่อนที่จะถามว่า "จะแบ่งอย่างไร"
สรุปประเด็นสำคัญที่ได้รวบรวมไว้ในบทความนี้:
แนวทางที่ใช้งานได้จริงคือการเริ่มต้นจาก Single Agent แล้วค่อยๆ แยกส่วนงานออกมาทีละขั้นตอนเมื่อพบจุดคอขวดที่ชัดเจน การพยายามสร้างโครงสร้าง Multi-Agent ที่ซับซ้อนตั้งแต่เริ่มต้นมักจะทำให้ต้นทุนในการ Debug พุ่งสูงขึ้น
Chi
ศึกษาเอกวิทยาการสารสนเทศที่มหาวิทยาลัยแห่งชาติลาว และระหว่างศึกษาได้มีส่วนร่วมในการพัฒนาซอฟต์แวร์ทางสถิติ สั่งสมพื้นฐานด้านการวิเคราะห์ข้อมูลและการเขียนโปรแกรมอย่างเป็นรูปธรรม ตั้งแต่ปี 2021 ได้ก้าวเข้าสู่เส้นทางการพัฒนา Web และแอปพลิเคชัน และตั้งแต่ปี 2023 เริ่มสั่งสมประสบการณ์การพัฒนาอย่างจริงจังทั้งในด้าน Frontend และ Backend ในบริษัทปัจจุบันรับผิดชอบการออกแบบและพัฒนาบริการ Web ที่ใช้ AI โดยมีส่วนร่วมในโครงการที่นำการประมวลผลภาษาธรรมชาติ (NLP) การเรียนรู้ของเครื่อง (Machine Learning) และ Generative AI รวมถึงโมเดลภาษาขนาดใหญ่ (LLM) มาผสานรวมกับระบบงานจริง มีความกระตือรือร้นในการติดตามเทคโนโลยีล่าสุดอยู่เสมอ และให้ความสำคัญกับความรวดเร็วในการดำเนินงานตั้งแต่การพิสูจน์แนวคิดทางเทคนิคไปจนถึงการนำไปใช้งานจริง