การทำ AI Orchestration: LangChain เทียบกับ Native Code
ความเร็วเป็นสิ่งสำคัญเมื่อคุณสร้างต้นแบบ AI (prototypes) นักพัฒนาต้องการเชื่อมต่อ prompt, vector stores และโมเดลอย่างรวดเร็ว ความต้องการนี้จึงผลักดันให้มีการใช้ framework อย่าง LangChain
แต่มุมมองของผมจะเปลี่ยนไปเมื่อต้องย้ายโค้ดจากขั้นตอนการทำต้นแบบไปสู่สภาพแวดล้อมการใช้งานจริง (production) ในระดับ production คุณต้องชั่งน้ำหนักทุก dependency เทียบกับหนี้ทางเทคนิค (technical debt) คุณต้องพิจารณาเรื่องการดีบั๊ก (debugging), การบำรุงรักษา (maintenance) และการเปลี่ยนแปลงที่อาจส่งผลกระทบต่อระบบ (breaking changes)
ผมได้เปรียบเทียบสองวิธีในการสร้าง GenAI data pipelines: การใช้ Pure Native Python และ LangChain Expression Language (LCEL)
นี่คือข้อดีและข้อเสียที่ต้องแลกเปลี่ยนกัน:
แนวทางแบบ Native Python
- ใช้ OpenAI client อย่างเป็นทางการที่มีน้ำหนักเบา
- ช่วยลดช่องโหว่ด้านความปลอดภัย (vulnerability surface) และป้องกันปัญหาเรื่อง dependency
- โค้ดเป็นไปตามลำดับการทำงานมาตรฐาน
- Stack traces จะระบุบรรทัดที่เกิดข้อผิดพลาดได้อย่างแม่นยำ
- คุณสามารถใช้ breakpoint และการทำ logging มาตรฐานได้อย่างง่ายดาย
- คุณใช้งานผ่าน API schema ดั้งเดิมจากผู้ให้บริการโดยตรง
แนวทางแบบ LangChain
- มีการนำ package ที่ซ้อนกันหลายชั้นเข้ามาใช้
- การปรับใช้ในระดับองค์กรขนาดใหญ่ต้องเผชิญกับภาระในการดำเนินงาน (operational overhead) ที่มากขึ้นเพื่อดูแลรักษา dependency เหล่านี้
- ใช้ custom pipe operator ในการประกาศ pipeline
- สิ่งนี้ทำให้การดีบั๊กทำได้ยากขึ้น เพราะ stack traces จะลึกลงไปในโค้ดของ framework
- ช่วยแยกคุณออกจากความเปลี่ยนแปลงของ API เฉพาะของแต่ละโมเดล
- คุณสามารถเปลี่ยนผู้ให้บริการโมเดล เช่น จาก OpenAI เป็น Anthropic ได้โดยมีการเปลี่ยนแปลงเพียงเล็กน้อย
วิธีการเลือก:
เลือก Native หาก pipeline ของคุณเป็นธุรกรรมขั้นตอนเดียวที่เรียบง่าย หากคุณทำการแปลง text-to-JSON โดยตรง ควรทำให้ระบบของคุณเบาและตรวจสอบได้ง่ายด้วยการเขียน wrapper code ที่สะอาดตา
เลือก LangChain เมื่อความต้องการของคุณเพิ่มขึ้น หากคุณต้องการการจัดการ prompt ที่ซับซ้อน, หน่วยความจำระยะยาว (long-term memory) หรือต้องเปลี่ยนผู้ให้บริการโมเดลหลายรายอย่างรวดเร็ว framework นี้ก็คุ้มค่ากับต้นทุนที่เสียไป
เป้าหมายของเราไม่ใช่แค่การเขียนโค้ดให้น้อยลง แต่เราต้องสร้างระบบที่บำรุงรักษาได้และรองรับการขยายตัว (scale) ได้
Optional learning community: https://t.me/GyaanSetuAi