• Qodo เป็นทีมที่พัฒนาเครื่องมือช่วยเขียนโค้ดด้วย AI มาตั้งแต่ยุค GPT-3 และล่าสุดได้เลือกเฟรมเวิร์ก LangGraph เพื่อสร้างโค้ดดิ้งเอเจนต์ที่ยืดหยุ่นและไดนามิกมากขึ้น
  • เอกสารนี้อธิบายว่า LangGraph สามารถตอบโจทย์ทั้งความยืดหยุ่นของโฟลว์การพัฒนาและมาตรฐานคุณภาพโค้ดได้พร้อมกันอย่างไร

การเปลี่ยนผ่านจากแนวทางเชิงโครงสร้างในช่วงแรกสู่ LangGraph

  • ในช่วงแรกที่อิงกับ GPT-3 งานหลักจะเป็นงานเชิงโครงสร้างที่มีลำดับชัดเจน เช่น การสร้างเทสต์ การรีวิวโค้ด และงานปรับปรุงแก้ไข
  • หลังจาก Claude Sonnet 3.5 ความสามารถของ LLM ดีขึ้นอย่างมาก ทำให้สามารถออกแบบเอเจนต์ที่มีความไดนามิกมากขึ้นได้
  • เดิมทีทำได้เพียงเวิร์กโฟลว์แบบตายตัว แต่ต้องการพัฒนาระบบที่ตอบสนองต่อคำขอของผู้ใช้ได้อย่างยืดหยุ่นโดยใช้โมเดลใหม่
  • ในระหว่างการมองหาเฟรมเวิร์กที่รองรับการทดลองและการตรวจสอบได้อย่างรวดเร็ว จึงเลือก LangGraph ซึ่งสามารถขยายจากการพิสูจน์แนวคิดในระยะแรกไปสู่ผลิตภัณฑ์จริงได้

การอยู่ร่วมกันของความยืดหยุ่นและกฎที่ชัดเจน

  • LangGraph มีโครงสร้างกราฟที่อิงกับ state machine
  • แต่ละโหนดรับผิดชอบแต่ละขั้นของเวิร์กโฟลว์ เช่น การรวบรวมบริบท การวางแผน การรันโค้ด และการตรวจสอบ ส่วนเส้นเชื่อม (edge) จะกำหนดกฎการเปลี่ยนผ่านระหว่างขั้นตอน
  • ระดับความหนาแน่นของเส้นเชื่อมส่งผลต่อระดับความยืดหยุ่นหรือความเป็นโครงสร้างของเวิร์กโฟลว์
    • sparse graph → โฟลว์คงที่และคาดการณ์ได้
    • dense graph → โฟลว์แบบไดนามิกและเลือกเส้นทางได้หลากหลาย
  • ข้อดีของ LangGraph คือเมื่อโมเดลพัฒนาขึ้น ก็สามารถปรับระดับความเป็นโครงสร้างของเวิร์กโฟลว์ได้ง่าย
  • โฟลว์หลักมีโครงสร้างดังนี้:
    • รวบรวมบริบท → วางแผนงาน → รันโค้ด → ตรวจสอบผลลัพธ์ → หากล้มเหลวให้วนซ้ำ

อินเทอร์เฟซที่กระชับและเข้าใจได้ตรงไปตรงมา

  • LangGraph สามารถนิยามเวิร์กโฟลว์แบบ declarative ได้ ทำให้โค้ดอ่านได้แทบเหมือนเอกสาร
  • ทำงานด้วยการประกาศ state graph แล้วเพิ่มโหนดและเส้นเชื่อม
  • รองรับการทำโฟลว์แบบมีเงื่อนไขได้ง่ายด้วย (เช่น หากการตรวจสอบล้มเหลวให้ลูปกลับไปยังโหนดรัน)
  • ต่างจาก abstraction ที่ซับซ้อนของ LangChain, LangGraph มีโครงสร้างที่มองเห็นลอจิกชัดเจน จึงให้ประสบการณ์นักพัฒนาที่ดี

การนำกลับมาใช้ซ้ำระหว่างเวิร์กโฟลว์ที่หลากหลาย

  • ด้วยโครงสร้างแบบโหนด จึงนำคอมโพเนนต์กลับมาใช้ซ้ำได้ง่าย
    • เช่น โหนดรวบรวมบริบทและโหนดตรวจสอบถูกใช้ซ้ำในโฟลว์ส่วนใหญ่
  • แม้จะสร้างโฟลว์เฉพาะทางใหม่ (เช่น TDD) ก็ยังขยายได้อย่างรวดเร็วด้วยการเชื่อมต่อโหนดเดิมใหม่

ความสามารถด้านการจัดการสถานะที่มีมาให้ในตัว

  • LangGraph มีฟังก์ชันจัดเก็บสถานะมาให้โดยพื้นฐาน ทำให้การทำ persistence ง่ายมาก
    • เช่น ฟังก์ชัน checkpointing ผ่าน Postgres สามารถตั้งค่าได้ด้วยโค้ดเพียงไม่กี่บรรทัด
  • สามารถบันทึกสถานะทั้งหมดได้ ไม่ว่าจะเป็นบริบทที่รวบรวมมา แผนงาน หรือผลการรัน และยังรองรับฟังก์ชัน branch กับ rollback
  • ยังสามารถสลับไปใช้วิธีอื่นอย่าง SQLite หรือ in-memory ได้อย่างง่ายดาย

จุดที่ยังต้องปรับปรุง

  • เนื่องจากเป็นเฟรมเวิร์กที่กำลังพัฒนาอย่างรวดเร็ว จึงมีบางครั้งที่เอกสารยังไม่สมบูรณ์หรืออัปเดตช้า
    • โชคดีที่การสื่อสารกับผู้ดูแลผ่าน Slack ทำได้รวดเร็วและมีความกระตือรือร้น
  • การทดสอบระบบ LLM แบบไม่เป็นเชิงกำหนดยังคงเป็นความท้าทาย
    • ในกรณีของเอเจนต์ที่โต้ตอบกับ IDE การสร้างสภาพแวดล้อมทดสอบอัตโนมัติทำได้ยาก
    • ฟังก์ชันบางอย่างของ IDE ทำ mock ได้ยากมาก จึงต้องพึ่งการทดสอบด้วยมือ และนั่นทำให้รอบการทำซ้ำช้าลง
  • เฟรมเวิร์กที่เติบโตเต็มที่มักมีโครงสร้างพื้นฐานสำหรับการทดสอบและการทำ mock ให้พร้อม และคาดหวังว่า LangGraph จะพัฒนาไปในทิศทางนี้เช่นกัน

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น