หลักปฏิบัติในการออกแบบระบบเอเจนต์

หลักปฏิบัติช่วยทีมตัดสินใจว่าพฤติกรรมใดของเอเจนต์ควรอยู่ในโมเดลภาษา และพฤติกรรมใดต้องกำหนดไว้ในซอฟต์แวร์

บทสรุปสำหรับผู้บริหาร

  • สิ่งสำคัญคือต้องพิจารณาอย่างรอบคอบว่าการตัดสินใจในระบบเอเจนต์ของคุณเกิดขึ้นอย่างไรและที่ส่วนใด

  • การมอบหมายการตัดสินใจให้ LLM มากขึ้นอาจช่วยให้ระบบรองรับงานได้หลากหลายขึ้น แต่ก็อาจต้องแลกกับความเร็ว ความน่าเชื่อถือ และความทนทานของระบบ

  • หากทำได้ ควรย้ายกระบวนการตัดสินใจออกจาก LLM มาไว้ในโค้ดซอฟต์แวร์ที่ระบุไว้อย่างชัดเจนให้มากที่สุด แนวทางนี้สำคัญอย่างยิ่งสำหรับเวิร์กโฟลว์ที่มีความเสี่ยงสูงและ/หรือใช้งานจริง

บทนำ

เมื่อออกแบบระบบเอเจนต์ที่ใช้ LLM หนึ่งในการตัดสินใจที่สำคัญที่สุดคือ การกำหนดขอบเขตว่ากระบวนการตัดสินใจส่วนใดควรอยู่ในโมเดล LLM และส่วนใดควรอยู่ในซอฟต์แวร์ที่ระบุไว้อย่างชัดเจน

เพื่อให้เข้าใจง่ายขึ้น เราอาจมองตัวเลือกนี้เป็นสเปกตรัมระหว่างแนวทางต่อไปนี้:

  • สถาปัตยกรรมแบบเราเตอร์กำหนดลำดับและตรรกะไว้ในโค้ดอย่างชัดเจน จึงทดสอบได้ คาดการณ์ได้ และมีความทนทานสำหรับงานเฉพาะทาง (เรียกอีกอย่างว่า “เอเจนต์เวิร์กโฟลว์”)

  • เอเจนต์ออร์เคสเตรเตอร์อาศัยโมเดลภาษาขนาดใหญ่ (LLM) เพื่อตัดสินใจลำดับงานแบบไดนามิกผ่านพรอมต์ภาษาธรรมชาติ เหมาะกับการโต้ตอบแบบปลายเปิดซึ่งตรรกะที่กำหนดไว้ล่วงหน้าไม่เพียงพอหรือไม่สามารถกำหนดได้

แผนภาพประกอบบทนำ

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

เราเตอร์กับออร์เคสเตรเตอร์: ทำความเข้าใจความแตกต่าง

สถาปัตยกรรมแบบเราเตอร์

ระบบเอเจนต์แบบเราเตอร์:

  • กำหนดลำดับการตัดสินใจผ่านโค้ดหรือซอฟต์แวร์อย่างชัดเจน และใช้ LLM เพื่อเลือกเส้นทางที่ซอฟต์แวร์จะดำเนินการ

  • ใกล้เคียงกับระบบซอฟต์แวร์แบบดั้งเดิม เพราะมีเส้นทางการทำงานที่ชัดเจนและคาดการณ์ได้ จึงให้ผลลัพธ์ที่สม่ำเสมอกว่า

  • เหมาะอย่างยิ่งกับงานที่กำหนดขอบเขตได้อย่างเคร่งครัด

ต่อไปนี้คือตัวอย่างอย่างง่ายของเอเจนต์แชตบอตสำหรับจองเที่ยวบินที่ใช้ “แนวทางแบบเราเตอร์” แม้ LLM จะช่วยจำแนกเจตนาของคำถามจากสามตัวเลือก แต่ท้ายที่สุดซอฟต์แวร์ของเราจะจับคู่เจตนานั้นกับคำตอบจากเทมเพลตข้อความ เนื่องจาก LLM ถูกจำกัดขอบเขตไว้อย่างมาก ผู้ใช้จึงได้รับประสบการณ์การทำงานที่สม่ำเสมอกว่า

แผนภาพเปรียบเทียบเราเตอร์กับออร์เคสเตรเตอร์เพื่ออธิบายความแตกต่าง

สถาปัตยกรรมแบบออร์เคสเตรเตอร์

ระบบเอเจนต์แบบออร์เคสเตรเตอร์แตกต่างจากระบบเราเตอร์ตรงที่:

  • กำหนดลำดับตรรกะผ่านพรอมต์ภาษาธรรมชาติแทนซอฟต์แวร์ หมายเหตุ: เมื่อเทียบกับภาษาโปรแกรม ภาษาธรรมชาติมีความกำกวมและยืดหยุ่นโดยธรรมชาติ (ซึ่งเป็นทั้งข้อดีและข้อเสีย ดังที่จะกล่าวถึงภายหลัง) เราเรียกแนวคิดนี้ว่า “เจตนาแทนคำสั่ง”

  • รองรับตัวเลือกการประมวลผลหลายแบบ โดยให้ LLM กำหนดลำดับและวิธีดำเนินการ

  • สร้างเส้นทางตรรกะใหม่แบบไดนามิก ซึ่งยากต่อการกำหนดอย่างชัดเจนในซอฟต์แวร์

  • ความกำกวมนี้อาจทำให้ผลลัพธ์ไม่สม่ำเสมอ แต่เมื่อทำงานได้ดีก็อาจให้ความรู้สึก “ราวกับมีเวทมนตร์”

ตัวอย่างต่อไปนี้นำแนวทางแบบออร์เคสเตรเตอร์มาใช้กับโจทย์สายการบินอย่างง่ายเดียวกัน แทนที่จะให้ซอฟต์แวร์ตัดสินใจว่าควรตอบอย่างไร เรามอบหมายการตัดสินใจให้เลเยอร์ LLM ในที่นี้ เรามีระบบหลายเอเจนต์ โดยเอเจนต์ออร์เคสเตรเตอร์ “หลัก” จะคัดแยกคำถามของผู้ใช้ ส่งต่องานให้เอเจนต์ที่ออกแบบมาเฉพาะสำหรับการเปลี่ยนเที่ยวบิน และเอเจนต์นั้นจะตอบผู้ใช้ในท้ายที่สุด

ในตัวอย่างนี้ เลเยอร์ LLM ทำหน้าที่เป็นทั้งตัวจำแนก เราเตอร์ และผู้เขียนคำตอบ ส่วนในตัวอย่างเราเตอร์ LLM ทำหน้าที่เพียงตัวจำแนกเท่านั้น (โดยซอฟต์แวร์จัดการส่วนที่เหลือ)

แผนภาพเปรียบเทียบเราเตอร์กับออร์เคสเตรเตอร์เพื่ออธิบายความแตกต่าง

จุดแข็งและความท้าทายของสถาปัตยกรรมแบบเราเตอร์

หากทำได้ เราแนะนำให้ใช้แนวทางแบบเราเตอร์ เพราะมีข้อดีดังต่อไปนี้:

  • ความเร็วและประสิทธิภาพ: การประมวลผลภายในระบบทำได้เร็วกว่าการใช้ออร์เคสเตรเตอร์ที่ต้องพึ่งพา API ภายนอก นอกจากนี้ การประมวลผลตรรกะ “IF/ELSE” ด้วย Python ยังมีต้นทุนต่ำกว่าการจ่ายเงินให้ผู้ให้บริการ LLM ส่งตรรกะดังกล่าวไปประมวลผลผ่านโมเดลที่มีพารามิเตอร์ 4 แสนล้านตัวอย่างมาก

  • ความสามารถในการทดสอบและการคาดการณ์: แก้ไขข้อบกพร่อง ทดสอบ และบำรุงรักษาได้ง่ายกว่ามากด้วยแนวปฏิบัติด้านซอฟต์แวร์ที่เป็นมาตรฐาน

  • ความโปร่งใสและความน่าเชื่อถือ: พฤติกรรมที่แปรผันน้อยลงช่วยให้แก้ไขปัญหาได้ง่ายขึ้น ขั้นตอนการทำงานของแอปพลิเคชันยังถูกถ่ายทอดผ่านซอฟต์แวร์ที่โปร่งใสและควบคุมเวอร์ชันได้ในสัดส่วนที่มากขึ้น แทนที่จะอยู่ในค่าน้ำหนักของ LLM ซึ่งไม่โปร่งใสและตีความไม่ได้

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

จุดแข็งและความท้าทายของสถาปัตยกรรมแบบออร์เคสเตรเตอร์

การออกแบบแบบออร์เคสเตรเตอร์มีความสามารถที่ทรงพลัง ได้แก่:

  1. การวางแผน: วางแผนคำตอบแบบไดนามิกได้

  2. การเลือกเครื่องมือ/ส่งต่องานให้เอเจนต์: เลือกเครื่องมือที่เหมาะสมหรือมอบหมายงานให้เอเจนต์

  3. การผสานผลลัพธ์แบบวนซ้ำ: ปรับซ้ำและนำผลลัพธ์มาผสานใหม่อย่างสร้างสรรค์

  4. การพิจารณาว่างานเสร็จสมบูรณ์หรือไม่: ตัดสินว่าเก็บข้อมูลได้เพียงพอสำหรับจัดทำคำตอบฉบับสมบูรณ์แล้วหรือยัง

เฟรมเวิร์กอย่าง Pydantic-AI หรือ Agents SDK ของ OpenAI ช่วยให้การจัดระบบทำได้ง่ายและนำไปใช้ได้อย่างรวดเร็ว จึงเหมาะอย่างยิ่งสำหรับการสาธิตหรือการพิสูจน์แนวคิด

ข้อเสียของแนวทางนี้ ได้แก่:

  • ไม่มีสิ่งใดรับประกันได้ว่าขั้นตอนการวางแผนและการดำเนินการต่อมาของ LLM จะถูกต้องหรือเหมาะสม ระบบเราเตอร์ก็มีปัญหาเดียวกัน แต่เนื่องจากมีขอบเขตจำกัดกว่า พฤติกรรมจึงคาดการณ์ได้มากกว่า

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

  • เนื่องจากตรรกะส่วนใหญ่อยู่ใน LLM ระบบจึงเสี่ยงถูกผู้ไม่หวังดีเจลเบรกหรือหาช่องทางแสวงหาประโยชน์ได้มากขึ้น

  • แนวทางนี้ซ่อนกระบวนการตัดสินใจไว้ใน LLM จึงทำให้เข้าใจระบบได้ยากขึ้น (แม้เครื่องมือตรวจสอบอย่าง Langfuse หรือ Braintrust อาจช่วยได้บางส่วน)

หลักปฏิบัติของเราในการออกแบบระบบเอเจนต์

หมายเหตุถึงผู้อ่าน: แม้ความสามารถของโมเดลจะเปลี่ยนแปลงอย่างรวดเร็ว แต่แนวทางด้านล่างนี้ไม่น่าจะเปลี่ยนไปในอนาคตอันใกล้

ทำความเข้าใจการตัดสินใจที่จำเป็นในแอปพลิเคชันของคุณ

กำหนดขอบเขตของปัญหา

  • คุณสามารถถ่ายทอดตรรกะการตัดสินใจที่ต้องการเป็นแผนภาพได้โดยง่ายหรือไม่

  • แอปพลิเคชันของคุณยอมรับความล้มเหลวหรือพฤติกรรมที่ไม่คาดคิดไม่ได้ใช่หรือไม่

หากตอบ “ใช่” สำหรับคำถามข้อใดข้อหนึ่งข้างต้น แสดงว่าความสามารถแบบเราเตอร์น่าจะเหมาะกว่า

เริ่มจากเราเตอร์ แล้วจึงใช้แนวทางแบบผสมผสาน

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

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

  1. การเลือกเครื่องมือ/ส่งต่องานให้เอเจนต์: ทำได้ง่ายผ่านการแยกแขนงตามเงื่อนไขหรือตัวจำแนก LLM

  2. การพิจารณาว่างานเสร็จสมบูรณ์หรือไม่: ตัวจำแนก LLM แบบพื้นฐานสามารถตรวจสอบว่าคำตอบครบถ้วนก่อนส่งกลับให้ผู้ใช้

อย่างไรก็ตาม “การวางแผน” และ “การผสานผลลัพธ์แบบวนซ้ำ” ทำได้ยากกว่ามากในระบบเราเตอร์ที่ตายตัวอย่างไม่ต้องสงสัย ดังนั้น เมื่องานต้องใช้ความสามารถเหล่านี้ (โดยพิจารณาจากตัวจำแนก LLM หรือตรรกะอื่น) เราแนะนำให้สร้างแขนงออร์เคสเตรเตอร์ที่มีข้อจำกัดน้อยลงในระบบ

บทสรุปและแนวโน้มในอนาคต

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

เมื่อ LLM พัฒนาอย่างต่อเนื่อง จุดสมดุลระหว่างสองแนวทางนี้ก็อาจเปลี่ยนแปลงไป เรามีแนวโน้มเลือกสถาปัตยกรรมแบบเราเตอร์หรือแบบผสมผสานสำหรับเวิร์กโหลดที่ใช้งานจริง และใช้ออร์เคสเตรเตอร์กับปัญหาแบบปลายเปิดที่ต้องการการโต้ตอบอย่างเป็นธรรมชาติ ยืดหยุ่น และคล้ายมนุษย์

ผู้เขียน

Andrew Liubinas