VnRobo
Về chúng tôiBảng giáBlogLiên hệ
🇺🇸ENĐăng nhậpDùng thử miễn phí
🇺🇸EN
VnRobo logo

Hạ tầng AI cho robot công nghiệp thế hệ mới.

Sản phẩm

  • Tính năng
  • Bảng giá
  • Kiến thức
  • Dịch vụ

Công ty

  • Về chúng tôi
  • Blog
  • Liên hệ

Pháp lý

  • Chính sách bảo mật
  • Điều khoản sử dụng

© 2026 VnRobo. Bảo lưu mọi quyền.

Được tạo với♥tại Việt Nam
VnRobo
Về chúng tôiBảng giáBlogLiên hệ
🇺🇸ENĐăng nhậpDùng thử miễn phí
🇺🇸EN
  1. Trang chủ
  2. Blog
  3. ALRM: Code-as-Policy vs Tool-as-Policy trong ReAct | AI Manipulation Agents #3
manipulationmanipulationalrmcode-as-policytool-as-policyreactllmbenchmarkroboticsairest-api

ALRM: Code-as-Policy vs Tool-as-Policy trong ReAct | AI Manipulation Agents #3

So sánh hai execution mode của ALRM: CaP sinh Python gọi robot API trong một lần chạy, TaP dùng ReAct lặp từng tool call. Benchmark 56 tasks, 10 LLMs — giúp bạn chọn đúng mode cho dự án.

Nguyễn Anh Tuấn15 tháng 6, 202612 phút đọc
ALRM: Code-as-Policy vs Tool-as-Policy trong ReAct | AI Manipulation Agents #3

Hãy tưởng tượng bạn là một robot đứng trước bàn bếp. Người dùng bảo: "Cầm cái muỗng lên và đặt vào rổ." Câu hỏi đặt ra: bạn nên viết một đoạn Python script, chạy hết một lần — hay nên hỏi từng câu nhỏ, làm từng bước một, đợi phản hồi rồi mới đi tiếp?

Đây không phải câu hỏi triết học. Đây là hai kiến trúc execution hoàn toàn khác nhau mà paper ALRM: Agentic LLM for Robotic Manipulation (arXiv 2601.19510) của Technology Innovation Institute (TII UAE) đặt ra, so sánh trực tiếp trên 56 task với 10 LLM khác nhau — từ Claude-4.1-Opus đến Falcon-H1-7B — và cho ra kết quả đáng bất ngờ.

Đọc xong bài này, bạn sẽ hiểu tại sao hai mode này tồn tại, khi nào nên chọn cái nào, và con số thực tế là bao nhiêu.


Roadmap series

# Bài Nội dung
1 Tại sao Multi-Agent thắng VLA? ManiAgent 86.8% vs pi0 55.7%
2 Perception Agent & Grasp Planning Florence-v2, AnyGrasp, tọa độ 3D
3 ALRM: CaP vs TaP trong ReAct ← bạn đang ở đây Hai execution mode, benchmark 10 LLMs
4 SAP Verifier: Self-Check trước khi thực hiện Tránh lỗi execution với verifier agent
5 Sim-to-Real Deploy Pipeline Từ Gazebo ra robot thật

ALRM là gì và nó giải quyết vấn đề gì?

Trước ALRM, hầu hết các hệ thống LLM-for-robotics đều mắc một vấn đề cơ bản: thiếu cơ chế closed-loop. LLM nhận lệnh, sinh ra hành động, robot chạy — xong. Nếu robot cầm nhầm đồ vật, hệ thống không tự biết để sửa. Nó cần người can thiệp thủ công.

ALRM giải quyết điều này bằng kiến trúc 3 tầng:

Tầng 1 — Task Planner Agent: Nhận lệnh tiếng tự nhiên từ người dùng (VD: "dọn bàn ăn sáng"), dùng framework ReAct để phân rã thành các subtask nhỏ có thể thực thi (VD: pick spoon → place bowl → move_to home). Planner liên tục nhận observation từ Executor để điều chỉnh kế hoạch nếu cần.

Tầng 2 — Task Executor Agent: Nhận từng subtask từ Planner và thực thi bằng một trong hai mode: Code-as-Policy (CaP) hoặc Tool-as-Policy (TaP). Đây là điểm khác biệt cốt lõi của ALRM.

Tầng 3 — REST API Server: Cầu nối giữa LLM và robot vật lý. Server cung cấp 8 action chuẩn hóa qua hai module nội bộ:

  • wx250sRobot: điều khiển robot arm qua MoveIt/ROS
  • SimPerception: phát hiện vật thể qua Gazebo

REST API — Ngôn ngữ chung giữa LLM và Robot

Trước khi đi vào CaP và TaP, cần hiểu ngữ vựng cơ bản. ALRM định nghĩa 8 primitive action chia thành 3 nhóm:

Nhóm Action Mô tả
Control pick(object_name) Cầm vật thể theo tên
Control place(location) Đặt xuống vị trí chỉ định
Control move_to(pose) Di chuyển đến tọa độ cụ thể
Control move_to_home_pos() Về vị trí home an toàn
Perception get_objects() Trả về danh sách vật thể trong scene
Perception get_reference_names() Lấy tên các reference point (basket, table, …)
Pose compute_grasp(object) Tính pose grasp tối ưu cho vật thể
Pose get_pose(object) Lấy pose hiện tại của vật thể

Tám action này là giao diện bất biến — dù bạn dùng CaP hay TaP, dù LLM là GPT-5 hay Falcon-H1-7B, cuối cùng đều phải gọi qua 8 lệnh này. Đây là thiết kế thông minh: tách biệt reasoning layer (LLM) khỏi execution layer (robot).


Code-as-Policy (CaP) — Viết script, chạy một lần

Cách hoạt động: LLM nhận mô tả subtask + định nghĩa đầy đủ của 8 hàm Python (signature, docstring, một ví dụ pick-and-place mẫu), rồi sinh ra toàn bộ đoạn Python code để xử lý subtask đó trong một lần duy nhất.

Ví dụ, với subtask "pick the spoon and place it in the basket", CaP sẽ sinh ra code tương tự:

# CaP output — toàn bộ logic trong 1 lần gọi LLM
objects = get_objects()
if "spoon" in objects:
    grasp_pose = compute_grasp("spoon")
    move_to(grasp_pose)
    pick("spoon")
    basket_pose = get_pose("basket")
    move_to(basket_pose)
    place("basket")
    move_to_home_pos()

Code này được gửi đến REST API server, thực thi từ đầu đến cuối, và trả về kết quả.

Ưu điểm của CaP:

  • Nhanh: Chỉ cần 1 lần gọi LLM cho toàn bộ subtask → latency thấp
  • Deterministic: Code sinh ra có thể đọc và kiểm tra trước khi chạy
  • Dễ debug: Nếu lỗi, bạn thấy ngay dòng code nào sai

Nhược điểm của CaP:

  • Không adaptive: Nếu get_objects() trả về scene khác với dự đoán, code đã sinh ra không tự sửa
  • Phụ thuộc vào LLM mạnh: Model yếu sinh code lỗi cú pháp hoặc logic sai
  • Không xử lý được conditional phức tạp: Task yêu cầu nhiều vòng lặp reasoning khó mã hóa trong 1 đoạn code

Tool-as-Policy (TaP) — Hỏi, làm, nhận phản hồi, lặp lại

Cách hoạt động: LLM được cung cấp các tool definition (schema JSON của 8 action), nhưng thay vì sinh code, nó gọi từng tool một mỗi bước. Kết quả của mỗi tool call được append vào conversation history và gửi lại cho LLM để nó quyết định bước tiếp theo.

Với cùng subtask "pick the spoon and place it in the basket", TaP hoạt động như vòng lặp ReAct sau:

Step 1: LLM → tool_call: get_objects()
         Obs: ["spoon", "spatula", "basket", "coke_can"]

Step 2: LLM → tool_call: compute_grasp("spoon")
         Obs: {position: [0.3, 0.1, 0.05], orientation: [0, 0, 0.7, 0.7]}

Step 3: LLM → tool_call: move_to({position: [0.3, 0.1, 0.05], ...})
         Obs: "Move successful"

Step 4: LLM → tool_call: pick("spoon")
         Obs: "Pick successful"

Step 5: LLM → tool_call: get_pose("basket")
         Obs: {position: [0.5, -0.2, 0.1], ...}

Step 6: LLM → tool_call: place("basket")
         Obs: "Place successful"

Step 7: LLM → tool_call: move_to_home_pos()
         Obs: "Home position reached"
         → DONE

Mỗi bước, LLM thấy toàn bộ lịch sử — nó biết robot đang ở đâu, đã làm gì, và phản hồi là gì. Nếu bước 4 (pick) thất bại vì object bị che khuất, LLM có thể điều chỉnh chiến lược ở bước 5 thay vì tiếp tục mù quáng.

Ưu điểm của TaP:

  • Adaptive: Phản hồi real-time từ robot ảnh hưởng trực tiếp đến quyết định tiếp theo
  • Xử lý tốt task phức tạp: Multi-step conditional logic, error recovery tự nhiên
  • Model lớn tận dụng được toàn bộ: GPT-5, Claude-4.1-Opus hiệu quả hơn vì có context đầy đủ

Nhược điểm của TaP:

  • Chậm hơn đáng kể: Mỗi tool call = 1 lần round-trip LLM → latency tích lũy nhanh
  • Model nhỏ hay thất bại: Yêu cầu LLM hiểu schema tool call chính xác — model 7B thường không đủ reliable
  • Token cost cao hơn: Conversation history tăng dần theo mỗi bước

Benchmark — 56 task, 3 môi trường, 10 LLM

Để so sánh khách quan, ALRM xây dựng benchmark với thiết kế rất kỹ:

3 môi trường Gazebo:

  • Kitchen Utensils: muỗng, spatula, lon coke, rổ đựng
  • Boxes: thùng giấy, thùng gỗ, thùng kim loại, container
  • Fruits: dâu tây, mận, chanh, đào, tô, thùng rác

56 task — mỗi task có 6 biến thể ngôn ngữ khác nhau (từ lệnh rõ ràng "pick the red apple" đến mô tả gián tiếp "the round fruit that tastes sweet, put it away") để test khả năng hiểu ngữ cảnh của LLM.

Scoring — 3 judge models (majority voting):

  • Score 2: Tất cả subtask hoàn thành đúng với tham số chính xác
  • Score 1: Ít nhất 1 subtask đúng, nhưng có lỗi hoặc thiếu sót
  • Score 0: Không có subtask nào hoàn thành đúng

Ba judge là GPT-4.1, Claude-Sonnet-4, và Gemini-2.5-Flash — dùng majority voting để tránh bias từ một model duy nhất.


Kết quả — Ai thắng, ai thua?

Success rate của 10 LLMs trên 56 manipulation tasks — CaP vs TaP comparison — nguồn: tiiuae.github.io/ALRM
Success rate của 10 LLMs trên 56 manipulation tasks — CaP vs TaP comparison — nguồn: tiiuae.github.io/ALRM

Large-scale models

Model CaP Success CaP Latency TaP Success TaP Latency
Claude-4.1-Opus 92.6% 33.4s 93.5% 82.6s
GPT-5 90.7% 145.6s 85.2% 113.9s
DeepSeek-V3.1 84.3% 69.8s 85.2% 161.7s
Gemini-2.5-Pro 73.1% 52.6s 87.0% 117.4s

Quan sát đáng chú ý: Claude-4.1-Opus không chỉ dẫn đầu về accuracy mà còn nhanh nhất trong nhóm large model ở CaP (33.4s so với GPT-5 145.6s — nhanh hơn 4.3 lần). Với TaP, accuracy của Opus tăng nhẹ (93.5% vs 92.6%), nhưng latency tăng gấp 2.5 lần.

Gemini-2.5-Pro có hành vi ngược: CaP 73.1% nhưng TaP 87.0% — model này có khả năng reasoning theo bước tốt hơn nhiều so với việc tổng hợp code một lần.

Small-scale (open-source) models

Model CaP Success CaP Latency TaP Success
Falcon-H1-7B 84.3% 24.9s Không ổn định
Llama-3.1-8B 68.5% 20.1s Thất bại
Qwen3-8B 64.8% 343.3s 53.7%
Granite-3.3-8B 53.7% 24.5s Thất bại
DeepSeek-R1-7B 21.3% 53.6s Thất bại
Mistral-7B 8.3% 19.0s Thất bại

Latency benchmark: TaP chậm hơn CaP nhưng linh hoạt hơn với multi-step tasks — nguồn: tiiuae.github.io/ALRM
Latency benchmark: TaP chậm hơn CaP nhưng linh hoạt hơn với multi-step tasks — nguồn: tiiuae.github.io/ALRM

Falcon-H1-7B là bất ngờ lớn nhất của benchmark. Với 84.3% CaP success rate và latency chỉ 24.9s, nó ngang ngửa với DeepSeek-V3.1 (một model lớn gấp nhiều lần) và vượt xa mọi open-source 7-8B khác. Đây là lý do TII UAE phát triển Falcon-H1 với kiến trúc Hybrid SSM-Transformer — tối ưu cho tool-use và code generation.

Qwen3-8B là trường hợp kỳ lạ: CaP latency 343.3s (chậm nhất trong toàn bộ benchmark!) nhưng lại là open-source model duy nhất có TaP hoạt động được (53.7%). Điều này gợi ý Qwen3-8B mạnh về structured reasoning nhưng yếu về code generation tốc độ cao.


Khi nào nên dùng CaP, khi nào dùng TaP?

Đây là câu hỏi thực tế nhất. Dựa trên kết quả benchmark, có thể rút ra nguyên tắc rõ ràng:

Chọn CaP khi:

  • Task có cấu trúc rõ ràng, ít conditional branching (pick → place, không cần kiểm tra trung gian)
  • Bạn ưu tiên latency thấp (robot warehouse tốc độ cao, số lần gọi/phút cao)
  • LLM bạn dùng là open-source model 7-8B (CaP là lựa chọn DUY NHẤT vì TaP quá khó với model nhỏ)
  • Bạn muốn code có thể inspect và validate trước khi chạy trên robot thật

Chọn TaP khi:

  • Task phức tạp, cần error recovery real-time (VD: nếu object bị che, phải tìm cách khác)
  • Bạn dùng large model (GPT-5, Claude-4.1-Opus, Gemini-2.5-Pro) và accuracy quan trọng hơn tốc độ
  • Môi trường robot không ổn định, scene thay đổi trong khi thực thi
  • Task yêu cầu nhiều vòng perception-action (nhìn → quyết định → làm → nhìn lại → quyết định tiếp)

Bảng quyết định nhanh:

Điều kiện Khuyến nghị
Open-source model 7-8B CaP (TaP không reliable)
Large model + task đơn giản CaP (nhanh hơn 2-3x)
Large model + task phức tạp TaP (accuracy cao hơn)
Latency < 30s là requirement CaP (hoặc Claude-4.1-Opus + CaP)
Robot thật, môi trường dynamic TaP (adaptive hơn)
Simulation testing/development Bắt đầu CaP, nâng lên TaP nếu cần

Tại sao Claude-4.1-Opus thắng cả hai chiều?

Đây là điều thú vị nhất từ benchmark. Thông thường, một model mạnh về code generation (CaP) chưa chắc mạnh về tool-calling iterative (TaP) và ngược lại. Nhưng Opus đạt top 1 ở cả hai.

Lý do theo phân tích của paper: Opus có khả năng instruction following cực kỳ chính xác — khi sinh code Python, nó tuân thủ API contract (signature đúng, type đúng, edge case xử lý đúng). Khi dùng TaP, nó cũng parse tool call schema chính xác và không hallucinate parameter không tồn tại. Cả hai mode đều yêu cầu precision cao — và đây là thế mạnh của Opus.

Điều này cũng giải thích tại sao Mistral-7B chỉ đạt 8.3% CaP: model này thiếu khả năng generate syntactically correct Python với API constraints chặt.


Kết nối với pipeline thực tế

Bài trước về Perception Agent cho thấy Florence-v2 + AnyGrasp sinh ra tọa độ 3D cho vật thể. Output đó chính là input của compute_grasp() và get_pose() trong ALRM API.

Bài tiếp theo về SAP Verifier sẽ giải thích cách thêm một verification layer trước khi Executor thực thi — đặc biệt quan trọng khi dùng CaP vì code sinh ra cần được validate trước khi chạy trên robot thật.


Tóm tắt

  • ALRM dùng kiến trúc 3 tầng: Task Planner (ReAct) → Task Executor (CaP/TaP) → REST API Server
  • CaP sinh toàn bộ Python code trong 1 lần gọi LLM → nhanh, deterministic, phù hợp model nhỏ
  • TaP gọi từng tool một, nhận observation, quyết định bước tiếp → chậm hơn, adaptive hơn, yêu cầu model lớn
  • Claude-4.1-Opus dẫn đầu cả hai mode: 92.6% CaP (33.4s) và 93.5% TaP
  • Falcon-H1-7B là champion open-source: 84.3% CaP với latency 24.9s — ngang DeepSeek-V3.1
  • Nguyên tắc chọn mode: Open-source/latency-critical → CaP. Large model/task phức tạp → TaP.

Bài viết liên quan

  • Tại sao Multi-Agent đánh bại VLA đơn thuần? — AI Manipulation Agents #1
  • Perception Agent & Grasp Planning: Florence-v2 + AnyGrasp — AI Manipulation Agents #2
  • SAP Verifier: Self-Check trước khi thực hiện — AI Manipulation Agents #4
NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Fleet MonitoringROS 2 IntegrationAMR Solutions
ai-manipulation-agents — Phần 3/4
← Perception Agent: Florence-v2 + AnyGrasp | AI Manipulation Agents #2Agentic Robot: SAP Protocol + Temporal Verifier →

Bài viết liên quan

NEWNghiên cứu
Tại sao Multi-Agent đánh bại VLA đơn thuần? | AI Manipulation Agents #1
manipulationvlamulti-agentPhần 1
manipulation

Tại sao Multi-Agent đánh bại VLA đơn thuần? | AI Manipulation Agents #1

ManiAgent đạt 86.8% trên SimplerEnv — vượt xa pi0 55.7% và CogACT 51.3%. Phân tích kiến trúc 3-agent và lý do phân rã pipeline thắng end-to-end VLA.

15/6/202613 phút đọc
NT
NEWTutorial
Agentic Robot: SAP Protocol + Temporal Verifier
manipulationvlaliberoPhần 4
manipulation

Agentic Robot: SAP Protocol + Temporal Verifier

Chạy ds.py (DeepSeek-V3 decompose subgoals) và main.py (OpenVLA trên LIBERO). Implement Temporal Verifier sliding window — SAP protocol đạt 79.6% LIBERO avg.

15/6/202614 phút đọc
NT
NEWDeep Dive
Perception Agent: Florence-v2 + AnyGrasp | AI Manipulation Agents #2
manipulationflorence2anygraspPhần 2
manipulation

Perception Agent: Florence-v2 + AnyGrasp | AI Manipulation Agents #2

Deep dive vào Perception Agent của ManiAgent: Florence-v2 nhận diện vật thể zero-shot qua open-vocabulary detection, AnyGrasp sinh 6-DoF grasp pose từ point cloud. Hướng dẫn Python build perception module hoàn chỉnh.

15/6/202617 phút đọc
NT
VnRobo logo

Hạ tầng AI cho robot công nghiệp thế hệ mới.

Sản phẩm

  • Tính năng
  • Bảng giá
  • Kiến thức
  • Dịch vụ

Công ty

  • Về chúng tôi
  • Blog
  • Liên hệ

Pháp lý

  • Chính sách bảo mật
  • Điều khoản sử dụng

© 2026 VnRobo. Bảo lưu mọi quyền.

Được tạo với♥tại Việt Nam