Robot học thao tác thực tế luôn đối mặt với bài toán kinh điển: làm thế nào để biết robot đang "tiến bộ" hay chỉ đang ngẫu nhiên khua tay? Câu trả lời thông thường là thiết kế reward thủ công — viết hàm toán học đo khoảng cách, lực tiếp xúc, vị trí object. Nhưng mỗi task mới lại cần một reward function mới, tốn hàng tuần kỹ sư.
VLAC (Vision-Language-Action-Critic) — công bố bởi nhóm Shanghai AI Lab vào tháng 9/2025 — giải quyết vấn đề này theo một hướng hoàn toàn khác: thay vì thiết kế reward, hãy dạy một model học cách đánh giá tiến độ từ dữ liệu. Kết quả? Success rate tăng từ ~30% lên ~90% chỉ sau 200 episodes thực tế, không cần reward engineering, không cần simulator.
Vấn đề gốc rễ: Tại sao RL thực tế khó?
Reinforcement learning trong robotics thực tế gặp hai nút thắt lớn:
1. Sparse reward: Robot chỉ biết nó thành công hay thất bại khi task kết thúc. Với 200 episodes, robot có thể trải qua 190 lần thất bại hoàn toàn trước khi học được bất cứ điều gì hữu ích. Đây giống như dạy một đứa trẻ chơi bóng bằng cách chỉ nói "sai" hoặc "đúng" ở cuối trận đấu.
2. Reward engineering tốn công: Để RL hội tụ nhanh, cần dense reward — tín hiệu liên tục ở mỗi bước. Nhưng viết hàm reward chuẩn xác cho manipulation phức tạp (ví dụ: gấp khăn ăn, múc cơm vào bát) đòi hỏi nhiều kiến thức domain và thời gian debug lâu.
VLAC tấn công cả hai vấn đề này cùng lúc.
VLAC là gì?
VLAC là một process reward model (PRM) được xây trên nền InternVL — một vision-language model mạnh của Thượng Hải. Thay vì reward function viết tay, VLAC học cách đánh giá: "Giữa ảnh A và ảnh B, robot đang tiến gần hơn hay xa hơn mục tiêu?"
Điểm đột phá là pair-wise progress understanding: VLAC không đánh giá một frame đơn lẻ, mà so sánh cặp ảnh liên tiếp trong trajectory và xuất ra:
- Progress delta (Δp): Con số có dấu — dương = tiến, âm = lùi
- Done signal: Binary flag — task hoàn thành chưa?
- Action tokens: VLAC cũng có thể tự sinh ra hành động (đóng vai VLA thuần túy)
Tất cả trong một model duy nhất, dùng prompt control để chuyển đổi giữa vai trò critic và actor.

Kiến trúc chi tiết
Input: [Ảnh t-1] + [Ảnh t] + [Language goal] → InternVL backbone
↓
Autoregressive decoder
↙ ↓ ↘
Progress Δ Done signal Action tokens
(reward) (termination) (delta EE pose)
Nền tảng: InternVL
InternVL được chọn vì khả năng hiểu hình ảnh mạnh và hỗ trợ multi-image input tự nhiên — cần thiết để so sánh cặp ảnh. Model được fine-tune thêm với dữ liệu robotics để "nói chuyện" được với thế giới thao tác vật thể.
Pair-wise comparison
Thay vì hỏi "Robot đang ở đâu?", VLAC hỏi "Robot đã thay đổi thế nào từ t-1 đến t?" Cách đặt vấn đề này giúp model tập trung vào sự thay đổi thay vì state tuyệt đối — quan trọng khi background, ánh sáng, góc camera thay đổi giữa các setup.
Template structured output
Action tokens được encode theo delta end-effector pose (Δx, Δy, Δz, ΔRx, ΔRy, ΔRz, gripper) — đủ generic để dùng trên nhiều robot khác nhau.
Dữ liệu huấn luyện
Một trong những điểm mạnh nhất của VLAC là dữ liệu training đa dạng và quy mô:
| Nguồn | Lượng | Mục đích |
|---|---|---|
| Human egocentric video | 3,000+ giờ | Hiểu progress từ góc nhìn người |
| Public robotic datasets (Bridge, DROID, RoboSet, FMB, AGIBOT) | 1,200+ giờ | Action grounding |
| Self-collected manipulation | 15+ giờ | Fine-grained control |
| Vision-language datasets | Hàng chục triệu điểm | World knowledge |
| Tổng | ~40M data points |
Cách tạo label cho progress delta
Đây là phần thú vị: không cần human annotation! VLAC dùng temporal ordering để tự tạo label:
- Ảnh frame 5 so với frame 1: progress ≈ +0.4 (tiến nhiều)
- Ảnh frame 3 so với frame 5: progress ≈ -0.2 (lùi nhẹ)
- Ảnh frame cuối so với frame áp cuối: progress ≈ +0.9 nếu thành công
Kết hợp với dữ liệu negative: cặp ảnh không liên quan về mặt temporal → progress ≈ 0, cặp ảnh task khác → model học cách reject irrelevant input.

Vòng lặp RL thực tế với VLAC
Đây là điểm sáng tạo thứ hai: VLAC không chỉ là một reward model standalone, mà được tích hợp vào asynchronous real-world RL loop:
┌─────────────────────────────────────────┐
│ Vòng lặp RL bất đồng bộ │
│ │
│ Robot thực thi → Thu thập (obs, action)│
│ ↓ │
│ VLAC Critic đánh giá progress │
│ → xuất dense reward Δp │
│ ↓ │
│ Policy update (offline RL / online RL) │
│ ↓ │
│ Policy mới được deploy lên robot │
│ ↑ │
│ [Human-in-the-loop can intervene here] │
└─────────────────────────────────────────┘
Bất đồng bộ có nghĩa là robot không dừng để chờ training — nó tiếp tục thu thập data trong khi model cập nhật ở máy khác.
Human-in-the-Loop: 3 tầng can thiệp
Phần độc đáo nhất của VLAC là protocol can thiệp của con người có cấu trúc 3 tầng, được áp dụng tùy theo giai đoạn học:
Tầng 1: Offline Demonstration Replay
Khi nào dùng: Đầu training khi policy chưa biết gì.
Cách làm: Pre-populate replay buffer với human demonstrations. Policy không học từ demo ngay — thay vào đó, VLAC critic đánh giá lại demo này và trích xuất reward, rồi policy học từ (obs, action, reward) như data RL bình thường.
Tại sao hiệu quả: Human demo thường là những trajectory "hoàn chỉnh" — robot học được concept thế nào là "tiến gần đến thành công" ngay từ đầu, thay vì khám phá ngẫu nhiên từ zero.
Tầng 2: Return and Explore
Khi nào dùng: Khi policy đã học được "skeleton" của task nhưng vẫn stuck ở một số failure mode.
Cách làm: Operator theo dõi real-time. Khi robot rơi vào failure state mà nó không thể tự thoát (ví dụ: object bị đẩy ra ngoài tầm với), operator reset robot về đúng failure state đó và để robot thử lại nhiều lần.
Tại sao hiệu quả: Giải quyết exploration bottleneck — robot không cần phải tình cờ gặp failure state hiếm, operator "teleport" nó đến đó.
Tầng 3: Human Guided Explore
Khi nào dùng: Khi có những sub-behavior robot không thể tự khám phá (ví dụ: cách tiếp cận vật thể ở góc khó).
Cách làm: Operator teleop robot qua đoạn khó, sau đó trả lại quyền điều khiển cho policy. Data này được đưa vào replay buffer kèm VLAC reward.
Tại sao hiệu quả: Cung cấp "scaffolding" cho những skill phức tạp mà exploration thuần túy sẽ mất hàng nghìn episodes để tìm ra.
Cài đặt và sử dụng
Yêu cầu hệ thống
- Python ≥ 3.9
- PyTorch ≥ 2.0
- CUDA 12 (khuyến nghị)
- RAM GPU: 8GB+ cho VLAC-2B, 24GB+ cho VLAC-8B
Cài đặt
git clone https://github.com/InternRobotics/VLAC.git
cd VLAC
pip install -e .
Tải model
Hai phiên bản có sẵn trên HuggingFace:
from huggingface_hub import snapshot_download
# VLAC-2B (nhẹ hơn, phù hợp inference nhanh)
snapshot_download("InternRobotics/VLAC", local_dir="./models/vlac-2b")
# VLAC-8B (chính xác hơn, cần GPU mạnh)
snapshot_download("InternRobotics/VLAC-8b", local_dir="./models/vlac-8b")
Sử dụng VLAC làm Critic (đánh giá trajectory)
from vlac import VLACCritic
# Khởi tạo critic
critic = VLACCritic.from_pretrained("InternRobotics/VLAC")
# Đưa vào cặp ảnh và task description
result = critic.web_trajectory_critic(
images=["frame_001.jpg", "frame_002.jpg", "frame_003.jpg"],
task_description="Pick up the bowl and place it on the tray",
)
# Kết quả
print(result["progress_deltas"]) # [0.1, 0.3, 0.5, ...]
print(result["done_signals"]) # [False, False, True, ...]
print(result["value_scores"]) # Overall trajectory quality
Sử dụng VLAC làm VLA thuần túy (sinh action)
from vlac import VLACPolicy
policy = VLACPolicy.from_pretrained("InternRobotics/VLAC")
# Dự đoán action từ observation
obs = {
"image": current_frame,
"task": "Unfold the mat on the table"
}
action = policy.predict(obs)
# action = [Δx, Δy, Δz, ΔRx, ΔRy, ΔRz, gripper_open]
Tích hợp vào vòng lặp RL
import gymnasium as gym
from vlac import VLACCritic
critic = VLACCritic.from_pretrained("InternRobotics/VLAC")
env = YourRobotEnv()
replay_buffer = ReplayBuffer()
for episode in range(200):
obs_history = []
obs, _ = env.reset()
for step in range(max_steps):
action = policy.act(obs)
next_obs, _, done, _, _ = env.step(action)
obs_history.append((obs, next_obs))
# VLAC tính reward thay vì reward function thủ công
if len(obs_history) >= 2:
reward_info = critic.web_trajectory_critic(
images=[obs_history[-2][0]["image"], obs_history[-1][0]["image"]],
task_description=env.task_description
)
reward = reward_info["progress_deltas"][-1]
else:
reward = 0.0
replay_buffer.add(obs, action, reward, next_obs, done)
obs = next_obs
if done:
break
# Update policy every N episodes
if episode % 10 == 0:
policy.update(replay_buffer.sample(batch_size=64))
Kết quả thực nghiệm
VLAC được thử nghiệm trên 4 task thao tác thực tế với robot arm:
| Task | Baseline (không VLAC) | VLAC + HiL | Final |
|---|---|---|---|
| Desktop Sweep (quét mặt bàn) | ~30% | ~90% | 100% |
| Pick & Place Bowl (gắp bát) | ~30% | ~90% | 100% |
| Unfold Mat (trải thảm) | ~30% | ~90% | 100% |
| Rice Transfer (múc cơm) | ~30% | ~80% | 70-100% |
Điểm đáng chú ý: với 8 robot song song, mỗi robot chỉ cần 64 episodes (tổng 512 episodes, nhưng thời gian thực tế giảm 8x) để đạt 80% success — so với 325 episodes cho setup 1 robot.
So sánh với baseline
- Dense reward thủ công: Cần 3-5 ngày kỹ sư để thiết kế và tune mỗi task. VLAC: zero engineering mới cho task mới.
- Sparse reward (chỉ binary done signal): Hội tụ chậm hơn ~4x, hoặc không hội tụ trong budget 200 episodes.
- One-shot transfer: VLAC có thể đánh giá task hoàn toàn mới (chưa thấy trong training) chỉ cần 1 demo video — không cần retrain.

Pitfalls và lưu ý khi triển khai
1. Camera setup quan trọng hơn bạn nghĩ
VLAC dựa vào visual progress — nếu camera bị rung, thay đổi ánh sáng đột ngột, hoặc robot che khuất object của interest, critic sẽ cho reward noise cao. Cố định camera, dùng ánh sáng ổn định.
2. Task description phải nhất quán
Dùng đúng một phrasing cho task trong toàn bộ episode. "Pick up the bowl" và "grab the bowl and move it" là hai task khác nhau trong mắt VLAC. Định nghĩa task string một lần duy nhất và không thay đổi.
3. Human-in-the-loop cần training
Ba tầng HiL không phải "nhờ ai cũng được". Operator cần hiểu khi nào nên can thiệp — can thiệp sai lúc có thể làm policy học wrong behavior.
4. VLAC-2B vs VLAC-8B
Cho inference real-time trên edge (Jetson AGX Orin), dùng VLAC-2B. Cho offline data refinement (lọc lại replay buffer), dùng VLAC-8B cho độ chính xác cao hơn.
5. Progress delta có thể âm — đó là tín hiệu tốt
Nhiều người ngạc nhiên khi thấy reward âm ở giữa episode. Đây là feature, không phải bug — critic phạt robot khi nó đi lùi, giúp policy học tránh những hành động phá vỡ tiến độ.
Tại sao VLAC quan trọng cho robotics Việt Nam?
Cách tiếp cận của VLAC giải quyết một pain point cực kỳ thực tế: không phải lab nào cũng có đủ kỹ sư để viết reward function tinh vi cho từng task. Với VLAC:
- Giảm thời gian setup từ tuần xuống còn ngày
- Transfer sang task mới bằng one-shot demo, không cần retrain
- Scale tuyến tính với số robot — thêm robot là giảm thời gian thực tế theo tỷ lệ tương ứng
Đặc biệt với bối cảnh nhà máy tự động hóa (THACO Chu Lai, Ford Hải Dương đang tăng tốc tự động hóa), khả năng deploy RL thực tế không cần chuyên gia reward engineering là một lợi thế cạnh tranh lớn.
Tổng kết
VLAC chứng minh rằng bottleneck của real-world robot RL không phải thuật toán RL — mà là reward signal chất lượng cao. Bằng cách học reward từ dữ liệu thay vì thiết kế thủ công, kết hợp với human-in-the-loop protocol có cấu trúc, VLAC đưa real-world RL từ "lab-only" trở thành thứ có thể triển khai thực tế trong 200 episodes.
Paper: arXiv:2509.15937 | GitHub: InternRobotics/VLAC | Model: HuggingFace VLAC



