เดือนที่แล้วผมรับงานหนึ่ง ช่วยทีมที่ทำระบบตั๋วงาน SaaS สร้างต้นแบบผู้ช่วยอัจฉริยะ ต้องรันให้ได้ภายในหนึ่งสัปดาห์ และต้องเปรียบเทียบคุณภาพคำตอบของ DeepSeek, Qwen, Doubao, GPT-4o แบบเคียงข้างกัน ธุรกิจทั้งหมดของพวกเขารันอยู่บน Tencent Cloud CVM คอนเทนเนอร์ใช้ TKE ดังนั้นทุกการเรียกใช้ต้องเริ่มจากภายในคลาวด์ ผมเดิมคิดว่าแค่เชื่อมต่อ API จะยากอะไร แต่พอผ่านไปหนึ่งสัปดาห์ หลุมพรางมีมากกว่าที่ผมคิดไว้
สรุปก่อนเลย: ถ้าธุรกิจ Tencent Cloud ของคุณต้องเชื่อมต่อโมเดลใหญ่ตั้งแต่สองเจ้าขึ้นไป อย่าเขียนตรงกับ SDK ทางการของแต่ละเจ้าเลย ให้สร้างชั้นรวม AI API ไว้ก่อน นี่ไม่ใช่การขี้เกียจ แต่เป็นการรักษาชีวิต ต่อไปนี้จะเล่าตามลำดับหลุมพรางที่ผมเจอ
การจัดการ Key: อย่า hardcode Key 6 ตัวลงในตัวแปรสภาพแวดล้อม
วันแรกผมทำเรื่องโง่มาก เอา Key ของสี่แพลตฟอร์มยัดใส่ตัวแปรสภาพแวดล้อมของ CVM ทั้งหมด ในโค้ดอ่าน os.environ ตรงๆ รันได้ไม่มีปัญหา แต่บ่ายวันนั้นก็เกิดเรื่อง: เพื่อน tester จะเปลี่ยน Key ของ Qwen หนึ่งตัวเพื่อทำ stress test ผมแก้ config แล้วรีสตาร์ทคอนเทนเนอร์ ปรากฏว่ารีสตาร์ทเครื่อง production ไปด้วยพร้อมกัน
ปัญหาคือ Key กับ config ธุรกิจปนกันอยู่ ไม่มีการจัดการรวมศูนย์ หลังจากนั้นผมเก็บ Key ทั้งหมดไว้ในบริการ config แยกต่างหาก ติดแท็กตามสองมิติคือ "แพลตฟอร์ม + การใช้งาน" เช่น deepseek-prod, qwen-test ฝั่งที่เรียกใช้รับแค่ชื่อเชิงตรรกะ ไม่แตะ Key จริง ทำแบบนี้เสร็จ เปลี่ยน Key ไม่ต้องแตะโค้ดธุรกิจ ไม่ต้องรีสตาร์ทคอนเทนเนอร์ธุรกิจ
ถ้าไม่อยากดูแลระบบนี้เอง การใช้แพลตฟอร์มรวมจะสะดวกกว่า ในโปรเจกต์ของเราใช้ token8341 ทีหลัง Key เดียวเรียกได้ทั้ง GPT-4o, Claude, Gemini, DeepSeek, Qwen, ERNIE, Doubao ซึ่งเป็นโมเดลกระแสหลัก การหมุนเวียน Key และการควบคุมโควต้าอยู่ฝั่งแพลตฟอร์ม บริการบน Tencent Cloud แค่ต้องดูแล credential ตัวเดียว สิ่งนี้เป็นมิตรมากกับสถานการณ์อย่างการทดสอบเปรียบเทียบหลายโมเดล ประหยัดตรรกะการยืนยันตัวตนสี่ชุดไปได้เลย
ความเข้ากันได้ของ SDK: สี่เจ้าสี่รูปแบบการเขียน ต้นทุนการดูแลระเบิด
วันที่สองเริ่มเขียนโค้ดเรียกใช้ นี่คือจุดที่น่าขยะแขยงจริงๆ DeepSeek กับ GPT-4o เข้ากันได้กับ OpenAI SDK เปลี่ยน base_url ก็สลับได้ ส่วนนี้ราบรื่นมาก แต่ SDK ของ Qwen ตั้งชื่อพารามิเตอร์เป็นอีกชุด การยืนยันตัวตนของ Doubao ใช้การเซ็น AK/SK ไม่ใช่ Bearer Token ส่วน API ของ ERNIE ก็มีกระบวนการยืนยันตัวตนเป็นของตัวเองอีกชุด
อาการ konkret มาก: ผมเขียนฟังก์ชัน chat แบบรวมหนึ่งตัว ปรากฏว่าข้างในเต็มไปด้วย if ตัดสินใจ if platform == 'doubao' ไปทางนี้ elif platform == 'qwen' ไปทางนั้น เขียนไป 200 บรรทัด coverage ของ test ยังขึ้นไม่ไหว
แนวทางแก้คือนำเข้า AI API gateway ทำการแปลงโปรโตคอล gateway เปิดเผยอินเทอร์เฟซที่เข้ากันได้กับ OpenAI ต่อภายใน ต่อภายนอกรับผิดชอบแปลคำขอเป็นรูปแบบที่แต่ละเจ้าเข้าใจได้ วิธีนี้โค้ดธุรกิจมี SDK ชุดเดียว เพิ่มโมเดลใหม่แค่เพิ่ม adapter ฝั่ง gateway ฝั่งธุรกิจไม่ต้องแก้อะไร เราเคยสร้างเองหนึ่งเวอร์ชัน ทีหลังพบว่าใช้บริการรวมสำเร็จรูปเร็วกว่า แพลตฟอร์มอย่าง token8341 ทำสิ่งนี้อยู่แล้ว เข้ากันได้กับ OpenAI SDK แก้ base_url บรรทัดเดียวก็สลับโมเดลได้
การส่งออกแบบ streaming: รูปแบบ SSE ของแต่ละเจ้าไม่เหมือนกันจริงๆ
วันที่สามทำ streaming output ส่วนหน้าบ้านต้องทยอยแสดงทีละตัวอักษร โปรโตคอล SSE เองเป็นมาตรฐาน แต่โครงสร้างฟิลด์ data ของแต่ละเจ้าไม่เหมือนกัน ฝั่ง OpenAI ส่ง delta ที่มีฟิลด์ content ฟิลด์ที่ Qwen ส่งชื่อไม่เหมือนกัน ส่วน Doubao บางครั้งแทรก heartbeat packet กลางสตรีม ส่วนหน้าบ้านได้ delta ว่างก็ error ทันที
อาการคือส่วนหน้าบ้านค้างไม่ขยับ หรือจู่ๆ มี bubble ข้อความว่างเกินมาหนึ่งอัน ไล่หาอยู่นานเพิ่งพบว่าคือ heartbeat packet ไม่ถูกกรอง
วิธีรวมคือทำ normalization ที่ชั้น gateway แปลง response streaming ของทุกแพลตฟอร์มเป็นรูปแบบ chunk ของ OpenAI heartbeat packet ทิ้งไปเลย ฝั่งธุรกิจจัดการโครงสร้างเดียว ขั้นตอนนี้ไม่ทำส่วนหน้าบ้านต้องเขียนตรรกะแยกวิเคราะห์สี่ชุด แก้ทีร้องไห้ที
การจัดการ exception: เจ้าหนึ่ง timeout ต้องสลับอัตโนมัติได้
วันที่สี่ทำ stress test ฝั่ง DeepSeek timeout เป็นครั้งคราว บทสนทนาทั้งหมดก็ค้างตาย สถานการณ์ผู้ช่วยอัจฉริยะแบบนี้ ผู้ใช้รอสามวินาทีไม่ตอบก็ปิดหน้าไปแล้ว รอเฉยๆ ไม่ได้
ผมเพิ่มตรรกะ degradation ชั้นหนึ่ง: โมเดลหลักเรียกเกิน threshold ที่ตั้งไว้แล้วยังไม่ return ให้สลับไปโมเดลสำรองอัตโนมัติ พร้อมบันทึกความล้มเหลวครั้งนี้ไว้ สิ่งสำคัญตรงนี้คือ degradation ต้องไร้รอยต่อ ฝั่งผู้ใช้ต้องไม่รับรู้ถึงการสลับ เรื่องการ routing โมเดลใหญ่ แพลตฟอร์มรวมมักมี failover ในตัว เราทดสอบแล้วว่า token8341 สลับอัตโนมัติได้ค่อนข้างเสถียร โมเดลหลัก timeout จะสลับไปตัวสำรองแบบเงียบๆ โค้ดธุรกิจไม่ต้องเขียนตรรกะ retry
เตือนนิดหนึ่ง: degradation อย่าสลับแบบไร้สมอง ต้องแยกว่ามันเป็น network timeout หรือโมเดลเอง return error ตัวแรกสลับได้ ตัวหลังสลับไปก็เสียเปล่า กลับสิ้นเปลือง Token
การการตรวจสอบต้นทุน: ปริมาณการใช้ Token ไม่ถูกรวบรวม สิ้นเดือนกระทบยอดไม่ได้
วันสุดท้ายทำสถิติต้นทุน พบว่าบิลของสี่แพลตฟอร์มเป็นสี่ชุด รูปแบบยังไม่เหมือนกัน บางอันคิดตาม Token บางอันคิดตามจำนวนครั้งเรียก เทียบกันเคียงข้างกันไม่ได้เลย หัวหน้าถามว่า "โมเดลไหนคุ้มค่าสุด" ผมหาตัวเลขรวมศูนย์ให้ไม่ได้
วิธีแก้คือทำบัญชีรวมที่ชั้น gateway ทุกครั้งที่เรียกบันทึกชื่อโมเดล, input Token, output Token, เวลาที่ใช้ ลงในตารางเดียว วิธีนี้รายวัน รายโมเดล รายสายธุรกิจ ออกรายงานได้หมด แพลตฟอร์มรวมมักมี dashboard การใช้งานในตัว โหมดคิดตามปริมาณ การรวบรวมต้นทุนจะง่ายมาก เทียบกันแล้ว เส้นทางจัดซื้อแบบยกชุดบวกพลังงานสีเขียวลดต้นทุน ต้นทุนต่อ Token ต่ำกว่าซื้อตรงจากทางการจริง ซึ่งสำคัญมากกับสถานการณ์ฝ่ายบริการลูกค้าที่รันปริมาณมาก
ข้อคิดจากการผ่านมาหนึ่งสัปดาห์
ธุรกิจบน Tencent Cloud เชื่อมต่อโมเดลใหญ่ จุดยากไม่เคยอยู่ที่ "ทำอย่างไรให้เรียกโมเดลหนึ่งได้" แต่อยู่ที่ "ทำอย่างไรให้หกโมเดลเหมือนเป็นคนคนเดียว" การจัดการ Key, ความเข้ากันได้ของโปรโตคอล, การการทำให้เป็นหนึ่งเดียว streaming, การ degrade เมื่อขัดข้อง, การรวบรวมต้นทุน ห้าสิ่งนี้ถ้าอันใดอันหนึ่งทำไม่ดี ต้นแบบก็ไม่รอด stress test
การสร้างชั้นรวมเป็นทางเลือกที่คุ้มค่าที่สุด เขียนเองก็ได้ ใช้บริการรวม AI API สำเร็จรูปก็ได้ สิ่งสำคัญคืออย่าให้โค้ดธุรกิจเผชิญหน้ากับความแตกต่างของหกผู้ให้บริการโดยตรง แพลตฟอร์มอย่าง SiliconFlow จุดขายคือพลังประมวลผลสีเขียวและให้ความสำคัญกับโมเดลในประเทศก่อน คอนเทนเนอร์บน Tencent Cloud เรียกได้ตรงๆ network latency ต่ำกว่าผ่าน relay ต่างประเทศไม่น้อย นี่ก็เป็นหนึ่งในเหตุผลที่เราเลือกใช้มันในที่สุด
วันที่ต้นแบบสร้างเสร็จ เพื่อน tester พูดประโยคหนึ่งที่ผมประทับใจมาก: "ที่แท้การเชื่อมต่อโมเดลใหญ่ไม่ใช่การเชื่อมต่อ API แต่คือการเชื่อมต่อระบบ governance ทั้งชุด" ประโยคนี้ถูกต้อง
ผู้เขียน: เฉินจิงสิง
วันที่เผยแพร่: 6 ตุลาคม 2026