Các giai đoạn từ 0 đến 2 để triển khai một tác nhân chiến lược F1 có thể đo lường được: mô hình thế giới, học máy cơ bản, sau đó là ra quyết định có cấu trúc bằng LLM.
Bạn muốn trở thành một kỹ sư đường đua. Không phải kiểu làm podcast, mà là kiểu ở trên tường pit. Một vòng đua vừa hoàn thành. Vòng tiếp theo đã bắt đầu. Vị trí, khoảng cách, tuổi lốp, loại lốp, số vòng còn lại, xe an toàn. Bảng thông tin ồn ào. Thời gian rất ngắn. Trong tích tắc, bạn phải quyết định: vào pit, hay tiếp tục chạy.
Đó là công việc mà dự án này hướng tới. Xây dựng một kỹ sư đường đua AI phức tạp hơn vẻ ngoài của nó. Mọi quyết định đều phụ thuộc vào tuổi thọ lốp, khoảng cách, tình hình giao thông, độ dài chặng, thời tiết, xe an toàn và chiến lược của đối thủ.
Các giai đoạn từ 0 đến 2 trong việc triển khai một tác nhân chiến lược F1 có thể đo lường được: mô hình thế giới, học máy cơ bản, sau đó là ra quyết định bằng LLM có cấu trúc.
Bạn muốn trở thành một kỹ sư đường đua. Không phải kiểu làm podcast. Mà là kiểu ở trên tường pit. Một vòng đua vừa hoàn thành. Vòng tiếp theo đã bắt đầu. Vị trí, khoảng cách, tuổi thọ lốp, loại lốp, số vòng còn lại, xe an toàn. Bảng thông tin ồn ào. Thời gian ra quyết định cực kỳ ngắn. Trong tích tắc, bạn phải quyết định: vào pit, hay ở lại.
Đó chính là công việc mà dự án này hướng tới. Xây dựng một kỹ sư đường đua AI phức tạp hơn vẻ ngoài của nó. Mọi quyết định phụ thuộc vào tuổi thọ lốp, khoảng cách, tình hình giao thông, thời lượng chặng, thời tiết, xe an toàn và chiến lược của đối thủ. Các lần vào pit rất hiếm, và một LLM tự tin sẽ vui vẻ bịa ra một khoảng cách chưa từng tồn tại.
Vì vậy, tôi bắt đầu từ những bước nhỏ. Không phải "tường pit đa tác nhân hoàn chỉnh". Không phải "radio đường đua trực tiếp". Chỉ ba giai đoạn đơn giản, có thể đo lường được:
Tải một ảnh chụp nhanh tường pit có thể tìm kiếm cho bất kỳ (cuộc đua, tay đua, vòng đua) nào.
Dự đoán liệu tay đua đó có vào pit ở vòng tiếp theo hay không: chỉ dùng học máy (ML) thuần túy, không dùng LLM.
Quyết định bằng một lệnh gọi chiến lược JSON có cấu trúc: dùng LLM khi có sẵn, dùng heuristic khi không.
Bảng thông tin luôn giống nhau: Hamilton, British GP 2024, vòng 22. Câu hỏi tương tự khi mô hình thế giới đã tồn tại: vào pit hay ở lại? Các đánh giá được giữ lại/đóng băng tương tự để bảng điểm không bị lệch. Chúng ta hãy cùng xem xét.
Khái niệm: Dữ liệu thời gian lịch sử → một quyết định
Về cơ bản, dự án này biến dữ liệu F1 tương thích với Ergast (cộng với dữ liệu vòng lốp FastF1) thành một cái nhìn duy nhất từ tường pit: vị trí, khoảng cách, tuổi thọ chặng, loại lốp, cờ xe an toàn. Sau đó đặt câu hỏi: Liệu tay đua này có vào pit ở vòng +1 không?
Điều này được giới hạn một cách có chủ đích. Các lần vào pit rất thưa thớt trong thực tế, vì vậy chỉ số F1 của bộ phân loại trông không đẹp mắt ở giai đoạn đầu. Điều đó không sao cả. Giai đoạn 0 cung cấp cho bạn một bảng thông tin mà bạn có thể tin tưởng. Giai đoạn 1 cung cấp cho bạn một đường cơ sở có thể tái tạo. Giai đoạn 2 thay thế giá trị số bằng một thẻ chiến lược có thể giải thích được. Mọi ý tưởng sau này đều phải dựa trên cùng một ảnh chụp nhanh đó.
Phân tích khái niệm:
Bộ tải phát lại cuộc đua: RaceReplay.get_state(...) → RaceState với các kiểm tra tính toàn vẹn.
Bộ phân loại pit cơ bản: HistGradientBoosting trên các đặc trưng về thời gian/đường đua/SC/loại lốp.
Tác nhân trưởng đội: cùng một bề mặt nhãn, nhưng là JSON {action, tyre, push, rationale}.
Giai đoạn 0: Bộ tải phát lại cuộc đua (Mô hình thế giới)
Trước bất kỳ mô hình hoặc tác nhân nào, bạn cần một hàm trả lời câu hỏi: tường pit đang nhìn thấy gì ngay bây giờ?
python scripts/print_sample_state.py \
--year 2024 --name-contains British --driver-id 1 --lap 22
Race: British Grand Prix (2024)
Driver: HAM
Circuit: Silverstone Circuit
Lap: 22 / 52
Current Position: P3
Gap Ahead: +1.001s
Gap Behind: -1.688s
Tyres:
Compound: MEDIUM
Age: 22 laps (set)
Safety Car: No
Pit this lap: No
Pit stops so far: 0
Last lap: 91095 ms
Cars on track: 19
Bên trong: tải dữ liệu cuộc đua/tay đua/thời gian vòng đua/lần vào pit, tính toán khoảng cách từ thời gian vòng đua tích lũy, suy ra tuổi thọ chặng từ lần vào pit cuối cùng, kết hợp các cửa sổ xe an toàn và loại/tuổi thọ lốp. Đầu ra là một RaceState được định kiểu (và một pit_wall_view thân thiện với con người).
Tính toàn vẹn: lấy mẫu ngẫu nhiên các bảng (cuộc đua, tay đua, vòng đua) và kiểm tra xem mô hình thế giới có tự mâu thuẫn hay không.
Tính toàn vẹn của Giai đoạn 0 trên các bảng ngẫu nhiên: chỉ mô hình thế giới, chưa có quyết định vào pit.
Chưa có quyết định nào. Chỉ là một bảng thông tin mà bạn có thể tìm kiếm như một đầu ghi hình kỹ thuật số (DVR). Mọi thứ bên dưới đều dựa vào điều này.
Giai đoạn 1: Bộ phân loại pit cơ bản (Không dùng LLM)
Trước khi bất kỳ tác nhân nào có thể tỏ ra thông minh, bạn cần một mô hình đơn giản dự đoán nhãn từ bảng thông tin đó.
Nhãn: y = 1 Nếu tay đua vào pit ở vòng +1.
Đặc trưng: phần trăm vòng đua, tuổi thọ chặng, khoảng cách, vị trí, số lần vào pit, chênh lệch tốc độ, đường đua, cờ xe an toàn, loại lốp, tuổi thọ lốp.
Phân chia: huấn luyện 2018–2022, kiểm định 2023, thử nghiệm 2024–2025. Ngưỡng được điều chỉnh trên tập kiểm định để đạt F1 tối đa.
python scripts/train_pit_baseline
.py
python scripts/score_pit_sample.py \
--year 2024 --name-contains British --driver-id 1 --lap 22
Đối với trường hợp của Hamilton, lịch sử cho thấy nên giữ nguyên (y_true=0). Tuy nhiên, mô hình vẫn đưa ra tín hiệu vào pit với điểm số cao: một trường hợp dương tính giả điển hình. Các bảng thông số giữa chặng đua thường trông "giống như vào pit" đối với một bộ phân loại thô sơ.
Kiểm thử trên tập dữ liệu giữ lại (chính = HGB):
Điểm số vào pit ở vòng tiếp theo trên tập dữ liệu giữ lại (HGB, các năm kiểm thử 2024–2025). Đúng vậy, chỉ số F1 còn thô. Dự đoán vào pit ở vòng tiếp theo là một lớp dương tính thưa thớt; chỉ số AUROC cho thấy thứ hạng không phải ngẫu nhiên. Dự đoán vào pit ở vòng tiếp theo là một vấn đề cực kỳ mất cân bằng. Hầu hết các vòng đều là "tiếp tục chạy", vì vậy một mô hình có thể xếp hạng các tình huống tốt nhưng vẫn gặp khó khăn trong việc xác định các cửa sổ vào pit hiếm hoi. Việc bổ sung thông tin về đường đua / xe an toàn (SC) / loại lốp đã giúp tăng tính thực tế hơn là chỉ số F1; riêng yếu tố thời gian đã mang phần lớn tín hiệu cho nhãn này. Đó là đường cơ sở. Triển khai. Vẽ biểu đồ. Tiếp tục.
Giai đoạn 2: Tác nhân Trưởng đội kỹ thuật (Crew Chief Agent) (Đầu ra có cấu trúc)
Bề mặt quyết định tương tự. Hợp đồng khác: không trả về một số thực. Trả về một thẻ chiến lược.
Lời nhắc được xây dựng từ một góc nhìn tường pit đã được ẩn danh hóa: loại bỏ thông tin về cuộc đua/năm/tay đua để mô hình không thể "gian lận" bằng cách ghi nhớ cuộc đua. Thông tin về đường đua, tổn thất thời gian khi vào pit và bối cảnh undercut vẫn được giữ lại.
Lời nhắc hệ thống (viết tắt):
Bạn là kỹ sư chiến lược F1 trên tường pit.
Quyết định: vào pit ở vòng tiếp theo (L+1) hay tiếp tục chạy.
Thông tin nhận dạng (cuộc đua / năm / tay đua) được giữ kín; thông tin đường đua được giữ lại.
Trả lời CHỈ bằng JSON: {action, tyre, push, reason, rationale}.
Không tự bịa ra số liệu. Không nêu tên tay đua hoặc sự kiện.
Cuộc đua khô ráo: ít nhất một lần dừng thay lốp khác loại trước khi kết thúc.
Lời nhắc người dùng (viết tắt):
Trạng thái cuộc đua (nguồn cấp dữ liệu tường pit):
Cuộc đua/Tay đua: (thông tin nhận dạng được giữ kín)
Đường đua: Silverstone Circuit
Vòng: 22 / 52 · P3 · Khoảng cách phía trước +1.001s · Khoảng cách phía sau -1.688s
Lốp: MEDIUM, tuổi 22 · SC: Không · Số lần vào pit cho đến nay: 0
Quyết định: vào pit ở vòng tiếp theo, hay tiếp tục chạy?
Thông tin nhận dạng (cuộc đua/năm/tay đua) được giữ kín để mô hình không thể "gian lận" bằng cách nhớ lại cuối tuần thực tế; thông tin đường đua được giữ lại vì tổn thất thời gian khi vào pit và các cửa sổ undercut phụ thuộc vào đường đua.
# ngoại tuyến / CI
python scripts/decide_once.py --backend heuristic \
--year 2024 --name-contains British --driver-id 1 --lap 22
# LLM khi được cấu hình (cùng CLI, cùng khóa JSON)
export OPENAI_API_KEY=...
python scripts/decide_once.py --backend openai \
--year 2024 --name-contains British --driver-id 1 --lap 22
Cùng bảng, backend heuristic:
{
"action": "stay",
"tyre": null,
"push": "med",
"reason": "Current stint still viable",
"rationale": "Current stint still viable; stay out."
}
Cùng bảng, backend OpenAI (một lần chạy, n
Nguồn tin: Medium Towards AI — Tác giả: Tapan Babbar. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.