Python FastAPI cho backend AI 2026: Xây dựng API tối ưu tích hợp LLM và Machine Learning

2 tháng trước · 11 phút đọc
Tại sao FastAPI lại hot trong làng AI backend?
Mình nhớ hồi cuối 2023, team mình đang dùng Node.js/Express để wrap một model PyTorch. Mỗi request inference phải serialize data sang JSON, gọi một Python subprocess, rồi parse kết quả về. Latency thêm 200-300ms chỉ vì context switching giữa hai runtime. Đau.
Sau khi chuyển sang FastAPI, vấn đề đó biến mất hoàn toàn. Model chạy native trong cùng process, không overhead. Nhưng đó chỉ là một lý do nhỏ.
FastAPI loại bỏ lớp trung gian giữa Python ML code và HTTP layer
Lý do thật sự FastAPI đang thống trị AI backend năm 2025-2026 là sự kết hợp của ba thứ:
Async-native từ đầu. FastAPI xây trên Starlette và ASGI, nghĩa là concurrency không cần thread pool. Khi LLM đang stream token, server vẫn nhận request mới bình thường.
Type hints = validation tự động. Pydantic v2 validate input/output không cần viết thêm code. Với AI API thường có payload phức tạp (messages array, model params, tool definitions), đây là cứu tinh.
Python ecosystem trực tiếp. import torch, import transformers, import langchain - dùng thẳng, không wrapper, không bridge. Phần lớn các ML engineer chọn Python làm ngôn ngữ chính cho production AI systems.
Node.js/Express không phải lựa chọn tệ, nhưng khi corelogic là Python ML, thêm một lớp Node ở giữa chỉ tạo thêm điểm thất bại.
FastAPI vs Express: so sánh thực tế cho AI workload
So sánh benchmark thuần thường misleading. Một FastAPI endpoint trả JSON đơn giản có thể nhanh hơn Express, nhưng số đó không nói gì nhiều về real-world AI workload. Mình sẽ đi vào các tiêu chí thực tế hơn.
Mỗi tiêu chí có trade-off riêng - chọn theo use case thực tế
Throughput khi inference ML model
Express tốt cho I/O-bound tasks (gọi API ngoài, query DB). Nhưng ML inference là CPU/GPU-bound. Khi dùng Express, bạn phải chạy Python model trong worker process riêng và communicate qua IPC hoặc HTTP nội bộ. FastAPI chạy thẳng trong Python runtime, dùng asyncio để handle concurrent requests trong khi GPU đang xử lý batch.
Streaming response cho LLM
Đây là điểm mạnh rõ nhất của FastAPI. Server-Sent Events (SSE) và StreamingResponse là built-in:
Với Express, bạn vẫn làm được SSE nhưng phải setup thêm headers thủ công và manage backpressure tự. Không phải không thể, nhưng FastAPI làm mượt hơn nhiều.
Dependency injection và middleware
FastAPI có DI system built-in khá elegant. Dùng để inject model instances, auth, rate limiter mà không cần global state:
Pattern này tránh load model mỗi request - critical với model nặng vài GB.
Khi nào vẫn nên dùng Node.js?
Nếu AI feature chỉ là một phần nhỏ của app lớn viết bằng Node (BFF pattern, gateway chung), thì không cần convert toàn bộ sang Python. Gọi FastAPI service riêng từ Node hoàn toàn ổn. Microservice architecture giải quyết vấn đề này tốt hơn là đổi toàn bộ stack.
Async processing và batch inference
Một vấn đề thực tế: model inference chậm (1-5 giây/request), trong khi user muốn kết quả ngay. Có hai pattern phổ biến để xử lý.
Pattern 1: Background task cho non-blocking response
Pattern polling này giúp frontend không bị block khi model inference chậm
Pattern 2: Batch inference để tối ưu GPU
GPU hoạt động hiệu quả nhất khi xử lý batch. Thay vì chạy inference từng request riêng lẻ, gom requests trong một time window:
Batch inference có thể tăng throughput lên đáng kể khi load cao, vì GPU utilization tăng từ 20-30% (single request) lên 80-90% (batched). Trade-off là latency tăng nhẹ do phải đợi đủ batch hoặc hết timeout. Với embedding API hoặc classification service, đây là pattern worth doing.
Bảo mật API AI: những điểm không được bỏ qua
AI API có attack surface đặc thù mà REST API thông thường không có. Prompt injection, model abuse, và chi phí inference bị lạm dụng là ba vấn đề thường gặp nhất.
Bảo mật AI API không chỉ là auth - còn phải kiểm soát input tới model
Rate limiting và cost control
Input validation cho prompt
Pydantic validate structure, nhưng bạn cần thêm content validation để block prompt injection:
API Key và JWT authentication
Một điểm hay của FastAPI DI: Depends chain lại được. verify_token có thể depend vào check_rate_limit, tạo thành security middleware stack mà không cần decorator riêng.
Case study: xây dựng chatbot AI backend với FastAPI
Đủ lý thuyết rồi. Mình sẽ walk through một backend chatbot AI thực tế, có streaming, conversation history, và tích hợp OpenAI API.
Cấu trúc project
chatbot-api/
├── main.py # FastAPI app entry point
├── routers/
│ └── chat.py # Chat endpoints
├── services/
│ └── llm_service.py # Logic gọi LLM
├── models/
│ └── schemas.py # Pydantic schemas
├── middleware/
│ └── auth.py # Auth middleware
└── requirements.txt
Schema và service layer
Router và endpoint chính
Cấu trúc router-service tách biệt rõ logic HTTP và logic AI
Chạy production với Uvicorn + Gunicorn
Số workers nên là (2 × CPU cores) + 1. Với server 4 core thì 9 workers. Tuy nhiên nếu workload là GPU inference, quá nhiều workers sẽ tranh nhau GPU memory - cần cân nhắc theo VRAM thực tế.
Toàn bộ code mẫu đầy đủ có tại FastAPI LLM Chatbot template trên GitHub.
Deploy và monitoring FastAPI AI service
Code chạy local xong, bước tiếp theo khiến nhiều người toát mồ hôi hơn: production deployment.
Dockerfile cho FastAPI + ML
Nếu bạn cần PyTorch với CUDA, dùng base image từ NVIDIA thay vì python:slim:
Size image sẽ lớn hơn (~5-8GB), nhưng đó là cái giá cho GPU support.
Structured logging cho AI API
Logs của AI API cần capture thêm metadata: model dùng, số tokens, latency inference:
Structured logs giúp debug production issues nhanh hơn rất nhiều
Health check endpoint
Nếu bạn muốn đi sâu hơn về Docker và deployment pipeline, khóa Devops for Engineers của F8 cover phần này khá chi tiết - từ Docker cơ bản đến CI/CD.
Một lưu ý quan trọng: với AI service có GPU, autoscaling không đơn giản như stateless web app. Mỗi instance cần GPU memory để load model, cold start chậm (30-60 giây cho model lớn). Giải pháp thực tế là pre-warm instances và dùng min-replicas > 0 thay vì scale-to-zero.
