เบื้องหลัง LLM API:
เมื่อโค้ด PHP ของคุณคุยกับ AI
เปิดฝากล่องดำ — ทำความเข้าใจว่าเกิดอะไรขึ้นจริงๆ ตั้งแต่กด send ไปจนถึงได้รับคำตอบ
ทำไมต้องรู้เรื่องนี้?
หลายคนเริ่มต้น integrate LLM เข้าโปรเจกต์ PHP ด้วยการ copy วาง curl จาก docs แล้ว "มันก็ทำงานได้" — แต่พอ response แปลก, token หมด, หรือ latency พุ่งขึ้น ก็ไม่รู้จะ debug จากไหน
บทความนี้จะพาคุณเปิดฝากล่องดำนั้น ตั้งแต่ HTTP request ออกไปจนถึง token ไหลกลับมา พร้อม code ตัวอย่างจริงสำหรับ CodeIgniter 4 และ Laravel ที่นำไปใช้ได้เลย
1. ภาพรวม: Request เดินทางอย่างไร?
เมื่อคุณเรียก LLM API เช่น OpenAI, Claude, หรือ Gemini สิ่งที่เกิดขึ้นจริงๆ คือ HTTP POST request ธรรมดาๆ ไปยัง endpoint ของ provider ไม่มีเวทมนตร์ซ่อนอยู่เลย
สิ่งที่ต่างจาก API ทั่วไปคือ ฝั่ง server ใช้เวลาประมวลผลนานกว่าปกติมาก (ตั้งแต่ 1 วินาทีไปจนถึงหลายสิบวินาที) และ response อาจส่งกลับมาแบบ streaming คือทยอยส่งทีละ chunk แทนที่จะรอให้ครบแล้วส่งพร้อมกัน
2. โครงสร้าง Request ที่ต้องรู้
ทุก LLM API มีโครงสร้าง JSON body คล้ายกัน ลองดู format ของ OpenAI-compatible API ซึ่งใช้ได้กับหลาย provider:
messages[] นับ token ทั้งหมด ถ้าคุณส่ง conversation ยาวๆ หรือ document ใหญ่ๆ ค่าใช้จ่ายพุ่งขึ้นแน่นอน วางแผน context management ตั้งแต่ต้น3. เรียก LLM API จาก CodeIgniter 4
CI4 มี CURLRequest built-in ใน HTTP Client ทำให้ไม่ต้องพึ่ง library ภายนอก:
เรียกใช้จาก Controller
4. เรียก LLM API จาก Laravel
Laravel มี HTTP Client ที่ wrap Guzzle ไว้ใช้งานง่ายมาก และรองรับ retry, timeout, และ async ได้ตั้งแต่ out-of-the-box:
config/services.php และอ่านจาก .env ผ่าน OPENAI_API_KEY=... อย่า hard-code API key ใน source code เด็ดขาด!5. อ่าน Response ให้เป็น
Response ที่ได้กลับมามีโครงสร้างที่ควรรู้จัก:
"id": "chatcmpl-abc123" ← unique id ของ request นี้
"choices": [{
"message": {
"role": "assistant" ← บทบาทของผู้ตอบ
"content": "คำตอบอยู่ตรงนี้..."
},
"finish_reason": "stop" ← stop/length/content_filter
}],
"usage": {
"prompt_tokens": 45 ← token ที่คุณส่งไป
"completion_tokens": 312← token ที่ AI ตอบกลับ
"total_tokens": 357← รวม = เงินที่เสียไป 💸
}
}
finish_reason สำคัญมาก — ถ้าเป็น length แปลว่าคำตอบถูกตัดออกเพราะ max_tokens หมด ต้องเพิ่ม limit หรือแบ่ง task ให้เล็กลง
6. เปรียบเทียบ LLM API ยอดนิยมสำหรับ PHP Dev
| Provider | Endpoint Base | Auth Header | Streaming | เหมาะสำหรับ |
|---|---|---|---|---|
| OpenAI | api.openai.com/v1 | Bearer token | ✅ SSE | Prototype เร็ว, ecosystem ใหญ่ |
| Anthropic Claude | api.anthropic.com/v1 | x-api-key header | ✅ SSE | Long context, เหตุผลซับซ้อน |
| Google Gemini | generativelanguage.googleapis.com | API key param | ✅ SSE | Context window ใหญ่ที่สุด |
| Ollama (local) | localhost:11434/api | ไม่ต้องใช้ | ✅ JSON stream | Dev/test ประหยัด, ข้อมูลลับ |
| OpenRouter | openrouter.ai/api/v1 | Bearer token | ✅ SSE | เปลี่ยนโมเดลได้ทีเดียว |
LlmInterface และ implement แต่ละ provider แยกกัน แล้วผูกผ่าน service container ของ Laravel หรือ DI ของ CI47. Streaming Response — ทำให้ UX ดีขึ้น
แทนที่ user จะรอ 10 วินาทีแล้วเห็นข้อความโผล่ทีเดียว — Streaming ทำให้ข้อความไหลออกมาทีละ chunk เหมือน ChatGPT พิมพ์ให้เห็น
8. LLM ไม่ใช่เพื่อนร่วมทีม — มันคือ Probabilistic Compiler
มีแนวคิดที่น่าสนใจจากชุมชน dev ในปี 2026 คือ "ถ้าคุณ treat LLM เหมือนเพื่อนร่วมทีม คุณจะผิดหวัง แต่ถ้า treat มันเหมือน compiler คุณจะส่ง product ได้จริง"
ความหมายในทางปฏิบัติสำหรับ PHP dev คือ:
- Input ต้องชัดเจน — ถ้า input มัว output ก็มัวแน่นอน ระบุ constraint ให้ครบ เช่น "ใช้ PHP 8.2, CI4, ห้ามแก้ public interface"
- Context ต้องพอดี — ส่งเฉพาะสิ่งที่ AI ต้องรู้จริงๆ อย่า paste ทั้งไฟล์ถ้าไม่จำเป็น
- ตรวจสอบ output เสมอ — LLM confident ได้แม้จะผิด (hallucination) อย่า merge โดยไม่ review
- ใช้ไฟล์เป็น long-term memory — ให้ LLM เขียน decision/summary ลง markdown ไฟล์ใน repo แทนการเล่าซ้ำในทุก conversation
สรุป
การ integrate LLM เข้าโปรเจกต์ PHP ไม่ได้ซับซ้อนกว่าการเรียก REST API ทั่วไปเลย — มันคือ HTTP POST + JSON ธรรมดา สิ่งที่ต่างออกไปคือ latency ที่สูงกว่า, การจัดการ token budget, และการเข้าใจว่า response อาจมาแบบ streaming
สรุปขั้นตอนที่ควรจำ:
- สร้าง Service class แยก — อย่าเรียก API ตรงใน Controller
- เก็บ API key ใน
.envเสมอ ห้าม commit เด็ดขาด - ตรวจ
finish_reasonทุกครั้ง —lengthหมายถึงคำตอบขาดหาย - Monitor
usage.total_tokensเพื่อควบคุมค่าใช้จ่าย - ออกแบบ prompt ให้ชัด ระบุ constraint ครบ ก่อนค่อย optimize