ช่วงครึ่งหลังของปีที่แล้ว เราทำหน้าที่เป็นที่ปรึกษาทางเทคนิคให้ทีมที่ทำ SaaS ด้านโลจิสติกส์ข้ามพรมแดน ตอนแรกฟีเจอร์ AI ของพวกเขาเรียกใช้แค่ GPT-4o อย่างเดียว ทำงานได้ค่อนข้างเสถียร ต่อมาฝ่ายธุรกิจขอให้เพิ่มโมเดลในประเทศ: การตรวจสอบสัญญาใช้ DeepSeek, บทพูดฝ่ายบริการลูกค้าใช้ Qwen, เนื้อหาการตลาดใช้ ERNIE สามสัปดาห์ต่อมา โค้ดแบ็กเอนด์ของพวกเขาก็ยัด SDK ไป 4 ชุด ตรรกะการยืนยันตัวตนกระจายอยู่ใน 7 ไฟล์ บิลเรียกเก็บเงินไม่ตรงกัน และการสตรีมเอาต์พุตบนฟรอนต์เอนด์ก็ปกติบ้างเพี้ยนบ้าง ปัญหาไม่ได้อยู่ที่ตัวโมเดล แต่อยู่ที่ขาดชั้น Model Gateway
กับดักของการเชื่อมต่อหลายโมเดล ล้วนเหยียบจุดเดียวกัน
เริ่มจากความขัดแย้งของ SDK ก่อน Python SDK ของ OpenAI กับ SDK ของเจ้าอื่นในประเทศต่างก็ชื่อ client เวอร์ชัน dependencies ตีกันเอง และ HTTP client ของ Qwen กับ ERNIE ยังจัดการพารามิเตอร์ timeout ไม่เหมือนกัน วิธีสุดท้ายที่วิศวกรของพวกเขาทำคือสร้าง virtual environment แยกสำหรับแต่ละโมเดล ใช้ subprocess เรียกแบบแยกส่วน รันได้ แต่ต้นทุนการดูแลสูงจนเกินไป
ต่อมาคือการจัดการ Key คอนโซลของผู้ให้บริการทั้งสี่เจ้ามีระบบ Key คนละแบบ บางเจ้าแบ่งตามโปรเจกต์ บางเจ้าแบ่งตามแอปพลิเคชัน บางเจ้ายังแยกบัญชีย่อย Key ของสภาพแวดล้อมทดสอบและโปรดักชันปนกัน ครั้งหนึ่งเด็กฝึกงานคนหนึ่ง commit Key โปรดักชันขึ้น GitHub repo สาธารณะ ถึงจะยกเลิกภายในสิบนาที แต่บ่ายวันนั้นทั้งทีมก็ต้องไล่ดูล็อกการเรียกใช้งานกันทั้งบ่าย
เกณฑ์การคิดค่าบริการยังปวดหัวกว่า DeepSeek คิดตาม token, Qwen บางโมเดลคิดแยกอินพุตเอาต์พุต, ERNIE บางเวอร์ชันยังมีตรรกะคิดตามจำนวนตัวอักษรที่ตกค้างอยู่ ฝ่ายการเงินอยากได้บิลรวมตอนสิ้นเดือน วิศวกรก็ได้แต่ export CSV สี่ชุดมาทำ mapping ด้วยมือ รูปแบบการสตรีมเอาต์พุตก็ไม่เหมือนกัน บางเจอคืนค่า data field ของ SSE บางเจ้าห่อด้วย JSON อีกชั้น โค้ด parsing ฝั่งฟรอนต์เอนด์เต็มไปด้วย if else
Model Gateway ทำอะไรอยู่ตรงกลางกันแน่
แก่นแท้ของ Model Gateway คือชั้น reverse proxy บวกชั้นปรับโปรโตคอล ภายนอกเปิดเผยอินเทอร์เฟซที่เข้ากันได้กับ OpenAI แบบรวมเป็นหนึ่ง ภายในแปลคำขอเป็นรูปแบบที่แต่ละเจ้าผู้ให้บริการเข้าใจได้ ตอนหลังเราใช้ความสามารถ AI API aggregation ของ Silicon-Carbon Phase Transition รีแฟกเตอร์ห่วงโซ่นี้ในโปรเจกต์อื่น รู้สึกได้ตรงมาก
การยืนยันตัวตนแบบรวมเป็นหนึ่งคือขั้นแรก ฝั่งธุรกิจถือ Key เดียว ภายใน gateway ดูแลการ mapping credential ไปยังผู้ให้บริการแต่ละเจ้า การหมุน Key, การจำกัดโควตา, IP whitelist ทำที่ชั้น gateway ทั้งหมด การแปลโปรโตคอลคือขั้นที่สอง แปลง messages array รูปแบบ OpenAI เป็น input ของ Qwen, prompt ของ ERNIE แล้วแปลง response กลับเป็นโครงสร้าง choices แบบรวมเป็นหนึ่ง รูปแบบ chunk ของการสตรีมเอาต์พุตก็ปรับให้เรียบที่ชั้นนี้ ฟรอนต์เอนด์เขียนตรรกะ parsing แค่ชุดเดียว
การกระจายเส้นทางกำหนดว่าคำขอจะไปที่โมเดลไหน จะ route แบบ static ตามประเภทงานก็ได้ หรือเลือกแบบ dynamic ตามต้นทุนก็ได้ ตอนที่เราทดสอบ multi-model routing ของ token8341 เรา route คำขอประเภทตรวจสอบสัญญาไปที่ DeepSeek-V3 แบบตายตัว และ route คำขอข้อความสั้นฝ่ายบริการลูกค้าไปที่เวอร์ชัน lightweight ของ Qwen ต้นทุนการเรียกใช้โดยรวมลดลงประมาณหกสิบเปอร์เซ็นต์เมื่อเทียบกับที่เรียก GPT-4o ทั้งหมด การรวบรวมต้นทุนคือขั้นสุดท้าย gateway ตีจุดตาม business tag สิ้นเดือนก็ออกบิลแบ่งบัญชีได้เลย การเงินไม่ต้องประกอบตารางด้วยมืออีก
คำแนะนำจริงบางข้อตอนนำไปใช้
ข้อแรก อย่าเรียก SDK ของผู้ให้บริการโดยตรงในโค้ดธุรกิจ ต่อให้เชื่อมต่อแค่โมเดลเดียวก็ตาม เก็บชั้นห่อบางๆ ไว้ ตอนเพิ่มโมเดลทีหลังปริมาณการแก้จะต่างกันหนึ่งลำดับขนาด ข้อสอง Key ต้องผ่าน gateway หรือบริการจัดการคีย์ วิธี hardcode ในไฟล์ config ยังไงก็ต้องเกิดเรื่องแน่ ข้อสาม กลยุทธ์การ route ให้ทำแบบ static ก่อน รันไปสองสัปดาห์มีข้อมูลการเรียกใช้จริงแล้วค่อยพิจารณา dynamic cost routing ไม่งั้นเพื่อประหยัดไม่กี่สตางค์อาจ route คำขอสำคัญไปยังโมเดลที่ไม่เหมาะสมได้ง่ายๆ
การเลือกดูสองจุด: เข้ากันได้กับ OpenAI SDK ไหม เข้ากันได้หมายความว่าต้นทุนการย้ายเกือบเป็นศูนย์ แก้ base_url บรรทัดเดียวก็สลับได้ และรองรับการคิดค่าบริการตามปริมาณและการรวบรวมต้นทุนไหม นี่เป็นสิ่งจำเป็นสำหรับองค์กรที่หลายสายธุรกิจใช้ความสามารถ AI ชุดร่วมกัน วิธีของ Silicon-Carbon Phase Transition ตรงนี้คือครอบคลุม API โมเดลขนาดใหญ่ในประเทศทั้งหมด คิดค่าบริการตามปริมาณ ในโปรเจกต์ของเราเทียบแล้วเกณฑ์บิลค่อนข้างชัดเจน
สรุปประโยคเดียว: Model Gateway ไม่ใช่สิ่งจำเป็น แต่เมื่อคุณจะเชื่อมต่อโมเดลที่สาม มันก็เปลี่ยนจากตัวเลือกเป็นความจำเป็น สำหรับการอ่านเพิ่มเติม ลองดูเอกสารสเปกของอินเทอร์เฟซที่เข้ากันได้กับ OpenAI เข้าใจว่าชั้นโปรโตคอลออกแบบยังไง ตอนเขียน wrapper เองจะได้ไม่ต้องเดินอ้อมมาก