№ 20
Hệ thống AI Agent điều phối đội xe điện theo cung cầu thời gian thực trên 47 khu vực Hà Nội: phát hiện mất cân bằng cung cầu, rồi đề xuất phương án điều chuyển xe và surge pricing để người vận hành duyệt. Số liệu do OR-Tools tính, LLM chỉ diễn giải thành lời, và mọi quyết định điều xe đều phải qua màn hình duyệt của con người.
Bốn phần theo mẫu hồ sơ dự thi: bài toán, giải pháp kỹ thuật, tính khả thi, hướng phát triển. Số liệu lấy từ ../eval/results/report.md, sinh lại được bằng
python eval/run_eval.py.
Một hãng gọi xe điện vận hành hàng nghìn xe trên 47 khu vực Hà Nội. Cung và cầu lệch nhau liên tục và lệch rất nhanh:
Xe thì có, chỉ là nằm sai chỗ. Hiện điều phối viên phải tự nhìn bảng số liệu, tự đoán khu nào sắp vỡ trận, tự tính điều bao nhiêu xe từ đâu sang đâu cho đáng chi phí. Một ca trực có hàng chục tình huống như vậy, và mỗi phút chậm là một khách bỏ sang hãng khác. Đo trên dữ liệu mô phỏng 24h: thành phố để lỡ 5.613 lượt khách, phần lớn dồn vào 11 khung giờ cao điểm.
Ba câu hỏi cần trả lời trong vài giây, không phải vài phút:
OR-Tools (Min-Cost Flow) ──> điều bao nhiêu xe, từ đâu, hết bao nhiêu tiền
LLM (Gemini 2.5 Flash) ──> giải thích vì sao, bằng tiếng Việt dễ hiểu
Mọi con số hiện trên màn hình đều do bộ giải tối ưu tính. LLM không được phép sinh số — nếu nó trả về con số khác OR-Tools, con số đó bị ghi đè trước khi tới giao diện. Lý do: một agent điều phối bịa ra "tiết kiệm 3,6%" còn nguy hiểm hơn là không có agent. Ràng buộc này cũng khiến hệ thống chạy tốt với model nhỏ, rẻ, vì phần khó nhất đã giao cho thuật toán tất định.
Sơ đồ đầy đủ: architecture_diagram.md.
| Tuyến | Cách hoạt động | Có gọi Agent? |
|---|
| Luật ngưỡng | Đo lượng xe thiếu tuyệt đối trên trạng thái đang chạy | Có, khi thiếu ≥ 40 xe |
| Isolation Forest | Học không giám sát, tìm mẫu hiếm (mất GPS, cạn xe, cuốc ảo) | Không, chỉ hiện cảnh báo |
Tuyến chính cố ý không dùng tỷ lệ cung/cầu: 1h sáng một khu có 1 yêu cầu và 0 xe cho tỷ lệ bằng 0 — tệ nhất có thể — nhưng thực tế chỉ thiếu nửa chiếc xe. Ba tầng Isolation Forest giữ lại đều không gọi Agent, vì điều thêm xe vào khu đang có dấu hiệu gian lận chỉ làm hỏng nặng thêm.
Agent không bao giờ tự điều xe. Mỗi phương án hiện kèm tuyến đường, số xe, chi phí, ETA trước/sau và lý do bằng lời; điều phối viên hỏi lại được Agent, tự đặt hệ số giá và gói huy động, rồi mới duyệt. Mọi quyết định ghi lại kèm người duyệt.
Ba tầng dự phòng: Gemini hỏng → OR-Tools vẫn ra phương án thật (mất phần diễn giải); OR-Tools hỏng → bảng tổng quan cung cầu tính tại chỗ, không gọi LLM lần nào.
LangGraph + LangChain (agent), Gemini 2.5 Flash, OR-Tools SimpleMinCostFlow,
scikit-learn Isolation Forest, FastAPI + Pydantic v2, Supabase Auth (JWT) +
Postgres + RLS, H3 + Leaflet, React 19 + Vite + Tailwind 4, Docker + GitHub Actions.
Hệ thống đã chạy được, không phải bản mô tả. Hai bộ bằng chứng đều tái lập được bằng một lệnh:
| Phép đo | Kết quả |
|---|---|
| Kiểm thử | 25/25 test đạt, độ phủ mã 69% (CI chặn dưới 65%) |
| Chất lượng phát hiện | Luật ngưỡng bao phủ 88,9% thiệt hại trong ngày bằng 11 cảnh báo, so với 81,3% bằng 18 cảnh báo của Isolation Forest |
| Chất lượng bộ tối ưu | 100% ra phương án khả thi trên 22 tình huống, trung bình 0,44 ms |
| Chống bịa số | Chặn 3/3 trường bị làm giả |
| Hiệu năng API | /api/v1/status trung bình 0,62 ms, P95 0,9 ms |
| Chi phí | ~250đ mỗi lượt gọi Agent, 4–5 lượt gọi LLM cho một phương án |
Chi phí vận hành thấp là hệ quả trực tiếp của nguyên tắc kiến trúc: phần tính toán nặng nằm ở OR-Tools chạy dưới 1 ms trên CPU thường, LLM chỉ viết câu chữ nên dùng được model rẻ nhất.
loadScenario đã có sẵn, mới một tệp
phát lại 24h).