- 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 จะพัฒนาไปในทิศทางนี้เช่นกัน
ยังไม่มีความคิดเห็น