№ 09
Trợ lý VLM biến video dashcam và log từ xe tự hành của một sự cố lái tự động thành báo cáo kỹ thuật có bằng chứng truy vết được, để kỹ sư duyệt thay vì tự viết. Mỗi kết luận đều có thể truy vết, hệ thống dựng bản báo cáo kĩ thuật có thể sửa được trong khoảng một phút rồi trả quyền quyết định cuối cho kỹ sư.
Hệ thống phân tích sự cố disengagement cho xe tự hành — bằng chứng trước, mô hình sau.
Tài khoản: chau.nguyen Mật khẩu: 121212
Một đội an toàn xe tự hành nhận về hàng nghìn clip disengagement mỗi tuần và phải trả lời vì sao hệ thống bỏ cuộc — chứ không chỉ khi nào.
Nghiên cứu của Bộ Giao thông Hoa Kỳ (US DOT HASS COE, 08/2024), phân tích toàn bộ báo cáo disengagement mà các hãng nộp cho California DMV giai đoạn 2022–2023, đo được quy mô của khoảng trống:
| Chỉ số | Giá trị | Hệ quả |
|---|---|---|
| Disengagement do người lái khởi phát | 86% | Phần lớn sự kiện phụ thuộc phán đoán chủ quan, hiếm khi được giải |
| Báo cáo có mô tả riêng biệt | 4% | 96% còn lại lặp lại vài mẫu câu cố định |
96% báo cáo lặp mẫu câu nghĩa là: không sự cố nào được mô tả riêng, không bài học nào rút ra được, không cải tiến nào đo được. Không thể cải thiện thứ không đo lường được nhất quán.
| Vấn đề | Chi tiết |
|---|---|
| Chậm | Mỗi clip mất 10–20 phút làm tay: tua video, dò log, gõ báo cáo. Số clip vào lớn hơn số clip xử lý được, nên phần tồn đọng chính là phần rủi ro chưa ai biết. |
| Không nhất quán | Báo cáo tự do định dạng thì không thống kê được; hai kỹ sư đọc cùng một clip cho hai kết luận và không ai đo được độ lệch. |
US DOT khuyến nghị báo cáo cần bổ sung bảy yếu tố: kịch bản lái · vị trí đường · nút giao · thiết bị điều khiển giao thông · điều kiện mặt đường · điều kiện môi trường · tình huống giao thông. Đó đúng là những gì IncidentLens sinh ra tự động.
log.jsonl
│
├─► ingest ─► analyze_log ─► EvidenceBundle
│ (v, a, TTC, ứng viên t_critical)
│ │
│ │ cùng một log ⇒ cùng một bundle
│
└────── NỬA DÙNG MODEL (src/agents/, chỉ được ĐỌC bundle)
│
├─► describe_scene
├─► extract_factors
└─► classify_taxonomy (7 nhóm × 38 thuộc tính)
│
▼
assemble ─► validate V1–V9
│ │
│ ├─ sạch
│ └─ vi phạm → chèn nguyên văn vào prompt lượt sau
Khung phân loại lấy nguyên Table 7 của US DOT — 7 nhóm × 38 thuộc tính, không tự nghĩ ra, để kết quả so sánh được với dữ liệu ngành.
Lệch khỏi Table 7: Control/System chia 8/4 thay vì 9/3; 4 dòng không ánh xạ được; 3 dòng ánh xạ chéo nhóm — được ghi công khai.
Rào chắn giữa mô hình và người duyệt. Ba luật đáng chú ý nhất:
| Luật | Mô tả |
|---|---|
| V1 | Mô hình không được tự chọn thời điểm then chốt; khâu phân tích log chấm điểm tối đa 5 ứng viên và mô hình chỉ được chọn trong danh sách đó. |
| V6 | Mọi con số nhắc trong lời văn phải khớp số liệu log trong dung sai. |
| V7 | Chỉ báo lỗi khi mô hình khai không thấy tác nhân nào trong khi nó khai là nhìn được. Camera bị che thì mô hình được phép nói không thấy gì; một hệ thống phạt cả sự trung thực sẽ dạy mô hình nói dối. |
Xử lý vi phạm: Vi phạm được chèn nguyên văn lên đầu prompt của lượt sinh lại, tối đa 2 vòng. Hết lượt mà còn vi phạm thì báo cáo vẫn được trả ra kèm vi phạm còn lại, hiện rõ trên giao diện — giấu đi sẽ khiến người review duyệt nhầm.
Adapter đọc dữ liệu thô qua ba hàng rào:
Không có ba hàng rào đó thì mọi con số accuracy đều đáng ngờ.
| Thành phần | Chi tiết |
|---|---|
| Màn hình chính | Chia ba vùng trong một khung hình, không cuộn — video + dòng thời gian tín hiệu bên trái, báo cáo bên phải, thanh hành động phía trên |
| Trường enum | Ô chọn dựng từ schema server gửi xuống, không ô nào cho gõ tự do; trình soạn hành vi ép luật V2 và V5 ngay ở tầng điều khiển |
| Xuất báo cáo | PDF / Markdown / JSON từ một bố cục duy nhất, kèm khối truy vếtreport_sha256 (JCS/RFC 8785) và băm prompt |
Backend: FastAPI · Pydantic · LangGraph · SQLite
Frontend: React 18 · Vite · Recharts
Model: Qwen2.5-VL-3B (fine-tuned) / OpenAI / Anthropic / Google
Toàn bộ phụ thuộc là MIT / BSD / Apache-2.0 / OFL — không có giấy phép copyleft mạnh nào. Nhà cung cấp model đổi bằng biến cấu hình
LLM_PROVIDER, không sửa dòng code nào.
| Hạng mục | Số đo |
|---|---|
| Quy mô mã | 18 661 dòng Python · 6 044 dòng web · 6 387 dòng test |
| Kiểm thử | 557 test · 554 passed · coverage 72% · chạy không cần API key, 0 token |
| Hàng đợi 5 000 ca | 10 350 ms → 11,7 ms (nhanh gấp885 lần sau chỉ mục SQLite) |
| Xử lý một case (model local) | Trung vị0,714 giây |
| Đóng gói | Docker một image, API và giao diện cùng origin |
Chạy trọn 832/832 case ADAS-TO — dữ liệu quay từ xe thật — không một lỗi, mỗi case một tệp JSON hợp lệ schema.
Trên trục truy vết:
| Tầng | Đo gì | Kết quả chính |
|---|---|---|
| A. Agent đầu-cuối | gpt-4o trên 92 clip CARLA v3 | Nhóm taxonomy 21,7% (baseline lớp đa số 17,4%) · nhận đúng unlabelable 98,9% · đọc đúng ánh sáng 83,7% · qua sạch V1–V9 69,6% · MAE t_critical 3,24 s (sàn dữ liệu 1,20 s) |
| B1. Validation khi train | Qwen2.5-VL-3B, 83 mẫu | 96,20% token-level teacher-forced → 33,73% khi sinh tự do |
| B2. Audit toàn corpus | 832 case ADAS-TO | Weather 94,83% thô / 94,00% balanced / κ 0,850 · action micro-F1 44,78% |
| B3. Chuyển miền | CARLA → ADAS-TO | Action transfer 0,00 → 0,20; category vẫn 0,00 |
Khoảng cách 96,20% → 33,73% trên cùng một model, cùng một bộ eval, là lý do bốn tầng phải tách. Gộp chúng thành "một độ chính xác của sản phẩm" là kết luận sai.
| Mức | Hạn chế |
|---|---|
| P0 | Không dùng model làm bộ phát hiện sự cố tự động. Exact action-set 18,27%, và model sinh 1 541 nhãn cho 875 nhãn thật — nói dư gấp gần đôi. |
| P0 | 4/8 lớp taxonomy có F1 = 0,000, chiếm 54,3% bộ dữ liệu. Planning (16 clip) và Prediction (12 clip) chưa từng được dự đoán một lần nào trong 92 lượt — đúng hai nhóm chiếm 45% số vụ ngoài đời. |
| P1 | Chưa có held-out benchmark cân bằng. Split 749/83 không chia theo driver/route, nên đó là validation chọn checkpoint, không phải test độc lập. |
| P1 | Bộ CARLA v3 còn lỗi ở khâu sinh: 60,9% clip đóng băng, 63,0% gai gia tốc phi vật lý, 50/92 chạy sai bản đồ cấu hình, 0/2 clip nominal sạch. |
| P2 | SQLite chạm trần ở ~2 000 ca hoặc > 10 kỹ sư đồng thời. |
Vì sao 21,7% vẫn tạo ra giá trị: Toàn bộ luồng sản phẩm được thiết kế theo giả định "AI dựng bản nháp, người quyết định cuối". Kỹ sư sửa một báo cáo đã có sẵn dòng thời gian, tác nhân và bằng chứng vẫn nhanh hơn viết từ trang trắng — kể cả khi phải sửa nhóm nguyên nhân. Và 98,9% nhận đúng clip không đủ bằng chứng nghĩa là công cụ hiếm khi dẫn người dùng đi sai hướng bằng một kết luận bịa.
Về chất lượng phép đo: Khi đổi từ bộ 30 clip sang bộ 92 clip, điểm phân loại tụt từ 30,0% xuống 21,7% — và đó là tin tốt. Bộ cũ có 4 mẫu mỗi lớp; với n = 4, một câu đúng nhờ may cũng thành 25% cho lớp đó. Bộ 92 clip mới đủ để tính precision/recall theo từng lớp, và chính bảng đó phơi ra bốn lớp F1 = 0. 21,7% trên 92 clip đáng tin hơn 30,0% trên 30 clip.
Chia theo driver + route + scenario thay vì ngẫu nhiên theo frame; cân bằng lớp hành vi; thêm case đối chứng âm; công bố confusion matrix và macro-F1.
Không có bước này thì mọi con số sau đều không so sánh được với ai. Chi phí thấp bất ngờ: chỉ cần chia lại và chấm lại, 0 GPU-hour nếu chưa train lại.
Control + System đang nuốt 83,7% dự đoán trong khi nhãn thật của hai nhóm chỉ 28,3%. Ba đường nhầm lẫn dày nhất — Planning → Control 11 clip, Non-ADS → Control 9, Perception → Control 8 — mỗi cái là một dòng cụ thể thêm vào trường distinguish_from của taxonomy.
Song song, kéo độ ổn định day/dusk (hiện 58,7%) lên: chỉ số này đo được không cần nhãn, nên nó là thứ duy nhất giám sát được chất lượng sau khi triển khai.
Physics freeze, gai gia tốc, map fallback, clip nominal lẫn vào cụm trùng dấu vết. Không sửa được ở phía agent — đây là trần của cả tầng A lẫn tầng chuyển miền. Log sai thì mọi luật V1–V9 đối chiếu với nó cũng sai theo.
Thu sequence 3–8 khung mỗi case thay vì một khung; gắn t_critical, bằng chứng khung/thời gian và log facts đã kiểm chứng; ghi narrative thật của người review, không dùng câu tổng hợp giả; train với mục tiêu ưu tiên "không đủ bằng chứng" hơn là bịa.
Nút cổ chai là ~42 giờ người để gán nhãn category US DOT cho 832 case — con số nên đưa lên bàn như một dòng ngân sách, không phải một lời than.
Kích hoạt khi > 2 000 ca hoặc > ~10 kỹ sư đồng thời. Toàn bộ SQL đã cô lập vào một module nên chuyển sang Postgres là đổi phương ngữ, không phải viết lại.
Video chiếm 99,9% dung lượng (1 000 clip ≈ 4,7 GB) nên khoản phải quy hoạch là object storage, không phải cơ sở dữ liệu.
run_metricsblur_recallPOST /incidents để nạp clip qua APIincident_id để chạy được eval trên bộ v3 mà không trượt schema