CrewAI cho phép Agent tự chạy task, nhưng nếu crew phức tạp với nhiều Agent và nhiều Task thì kết quả đôi khi không theo ý muốn. Lý do? Agent hành động ngay mà chưa suy nghĩ kỹ. Planning và Reasoning là hai tính năng giúp Agent “dừng lại suy nghĩ” trước khi bắt tay vào việc.
Bài này nằm trong serie hướng dẫn CrewAI từ A-Z. Nếu bạn chưa nắm cách tạo Agent và Task, xem lại bài về Agent và bài về Task trước nhé.
Planning trong CrewAI là gì

Planning là tính năng ở cấp Crew. Khi bật, trước mỗi lần chạy, CrewAI sẽ dùng một AgentPlanner đặc biệt để phân tích toàn bộ thông tin crew (danh sách Agent, Task, tools, context) rồi tạo ra một kế hoạch chi tiết theo từng bước.
Kế hoạch này sau đó được gắn thêm vào mô tả của từng Task. Nôm na là thay vì Agent nhận task rồi tự xoay sở, nó sẽ nhận thêm một bản “hướng dẫn làm bài” kèm theo.
Ví dụ bạn có crew gồm Researcher và Writer. Không có Planning thì Researcher nhận task “Tìm thông tin về AI” rồi tự quyết định tìm ở đâu, tìm bao nhiêu, tổng hợp kiểu gì. Kết quả phụ thuộc hoàn toàn vào cách LLM interpret task description.
Với Planning bật, trước khi bất kỳ Agent nào bắt đầu, AgentPlanner sẽ lên kế hoạch kiểu:
- Researcher: xác định phạm vi nghiên cứu, liệt kê nguồn tin cậy, tổng hợp thành danh sách key points có dẫn nguồn
- Writer: nhận danh sách từ Researcher, mở rộng mỗi điểm thành một đoạn văn hoàn chỉnh, định dạng theo Markdown, đảm bảo mạch lạc giữa các phần
Plan này được inject vào task description, nên khi Researcher đọc task, nó thấy cả mô tả gốc lẫn hướng dẫn chi tiết từ planner. Kết quả là output có cấu trúc hơn, ít bị lệch hướng hơn.
Đặc biệt hữu ích khi crew có 3-4 Agent trở lên, vì lúc đó sự phối hợp giữa các Agent trở nên phức tạp. Planning giống như có một project manager ngồi phân công trước khi ai bắt tay vào việc.
Bật Planning cho Crew

Chỉ cần thêm planning=True khi khởi tạo Crew. Không cần config gì thêm:
from crewai import Crew, Agent, Task, Process
# Tạo agents
researcher = Agent(
role="Researcher",
goal="Tìm kiếm thông tin chính xác về AI",
backstory="Chuyên gia nghiên cứu dữ liệu với 10 năm kinh nghiệm."
)
writer = Agent(
role="Writer",
goal="Viết báo cáo dễ hiểu từ dữ liệu nghiên cứu",
backstory="Nhà báo công nghệ, giỏi diễn đạt kỹ thuật thành ngôn ngữ đơn giản."
)
# Tạo tasks
research_task = Task(
description="Nghiên cứu xu hướng AI năm 2025, tập trung vào AI Agent frameworks.",
expected_output="Danh sách 10 điểm chính dạng bullet point.",
agent=researcher
)
write_task = Task(
description="Viết báo cáo dựa trên kết quả nghiên cứu.",
expected_output="Bài báo cáo 500 từ, định dạng Markdown.",
agent=writer
)
# Bật planning cho crew
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential,
planning=True # Chỉ cần dòng này
)
Khi chạy crew.kickoff(), bạn sẽ thấy log hiện dòng [INFO]: Planning the crew execution trước khi Agent bắt đầu làm việc. Đó là lúc AgentPlanner đang phân tích crew và tạo plan.
ℹ️ Mặc định AgentPlanner dùng model gpt-4o-mini của OpenAI. Nếu Agent của bạn dùng model khác (Anthropic, Groq…), bạn vẫn cần OpenAI API key cho phần planning, hoặc chỉ định model khác qua tham số planning_llm.
Thay đổi model cho Planning
Nếu muốn dùng model mạnh hơn (hoặc model khác OpenAI) cho phần lên kế hoạch:
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential,
planning=True,
planning_llm="gpt-4o" # Dùng model mạnh hơn cho planning
)
Bạn có thể truyền bất kỳ LLM string nào mà CrewAI hỗ trợ. Ví dụ dùng Claude: planning_llm="anthropic/claude-sonnet-4-20250514", dùng Groq: planning_llm="groq/llama-3.3-70b", hay local model qua Ollama: planning_llm="ollama/llama3.2".
Gợi ý: dùng model nhỏ (gpt-4o-mini, Claude Haiku) cho planning nếu crew đơn giản, model lớn hơn (gpt-4o, Claude Sonnet) cho crew phức tạp nhiều Agent. Planning chỉ chạy một lần nên chi phí token không quá lớn.
Reasoning là gì

Nếu Planning là “lên kế hoạch cho cả team” thì Reasoning là “mỗi Agent tự suy nghĩ trước khi làm”. Đây là tính năng ở cấp Agent, không phải cấp Crew.
Khi bật Reasoning, trước khi thực thi task, Agent sẽ trải qua một quá trình tự phản ánh (reflection):
- Đọc và phân tích task description kỹ lưỡng
- Tự tạo một kế hoạch chi tiết: các bước cần thực hiện, thứ tự, cách tiếp cận
- Đánh giá bản thân xem đã sẵn sàng chưa
- Nếu chưa ổn, tinh chỉnh kế hoạch (lặp lại cho đến khi hài lòng hoặc đạt giới hạn)
- Gắn kế hoạch vào task rồi mới bắt đầu thực thi
Nôm na thì nó giống việc bạn nhận một bài thi, đọc đề xong ngồi gạch ý ra nháp trước khi viết, thay vì cầm bút viết luôn. Agent có reasoning thường cho ra output có cấu trúc chặt chẽ hơn vì nó đã “nghĩ trước” rồi.
Output của quá trình reasoning trông kiểu như thế này:
Task: Phân tích dữ liệu bán hàng và tìm xu hướng.
Reasoning Plan:
1. Hiểu yêu cầu: cần phân tích dữ liệu bán hàng, tìm top 3 xu hướng
2. Các bước thực hiện:
- Kiểm tra cấu trúc dữ liệu, xem có những field nào
- Phân tích theo thời gian (monthly, quarterly trends)
- Phân tích theo danh mục sản phẩm, phân khúc khách hàng
- Tìm pattern nổi bật nhất
3. Thách thức có thể gặp:
- Dữ liệu thiếu → lọc hoặc bổ sung giá trị trung bình
- Outlier → kiểm tra xem là lỗi hay data point hợp lệ
- Xu hướng không rõ ràng → dùng phương pháp thống kê
4. Tools sẽ dùng: data analysis tools, statistical tools
5. Kết quả mong đợi: báo cáo 3 xu hướng chính kèm bằng chứng từ data
READY: Sẵn sàng thực thi.
Bạn thấy đó, reasoning plan khá chi tiết. Agent liệt kê cả thách thức có thể gặp và cách xử lý, điều mà khi không bật reasoning thì Agent hiếm khi tự nghĩ đến.
Bật Reasoning cho Agent

Thêm reasoning=True khi tạo Agent:
from crewai import Agent
analyst = Agent(
role="Data Analyst",
goal="Phân tích dữ liệu và đưa ra insight có giá trị",
backstory="Chuyên gia phân tích dữ liệu, giỏi tìm pattern từ số liệu thô.",
reasoning=True, # Bật reasoning
max_reasoning_attempts=3 # Tối đa 3 lần tinh chỉnh kế hoạch
)
Tham số max_reasoning_attempts là tùy chọn. Nếu không đặt, Agent sẽ tinh chỉnh kế hoạch cho đến khi tự đánh giá là “sẵn sàng” (khi output có dòng “READY”). Đặt giới hạn giúp tránh trường hợp Agent cứ lặp mãi, đặc biệt khi task quá mơ hồ khiến Agent không bao giờ tự tin rằng mình đã sẵn sàng.
Trong thực tế, max_reasoning_attempts=2 hoặc 3 là con số hợp lý. Nếu sau 3 lần mà Agent vẫn chưa “READY” thì nhiều khả năng task description cần viết lại rõ hơn, chứ thêm lần nữa cũng không giúp được gì.
💡 Reasoning tốn thêm token vì Agent phải gọi LLM thêm 1-3 lần trước khi thực thi. Chỉ nên bật cho những Agent xử lý task phức tạp, cần suy nghĩ nhiều bước. Agent làm task đơn giản (format text, gửi email) thì không cần.
Một điểm hay là nếu quá trình reasoning gặp lỗi (API timeout, model trả về rỗng…), Agent vẫn tiếp tục chạy task bình thường mà không crash. CrewAI thiết kế fallback khá tốt ở chỗ này: reasoning lỗi thì bỏ qua, task vẫn chạy.
import logging
# Bật logging để theo dõi quá trình reasoning
logging.basicConfig(level=logging.INFO)
agent = Agent(
role="Data Analyst",
goal="Phân tích dữ liệu bán hàng",
backstory="Chuyên gia data với 5 năm kinh nghiệm.",
reasoning=True,
max_reasoning_attempts=3
)
# Nếu reasoning gặp lỗi, Agent vẫn chạy task bình thường
# Log sẽ ghi lại chi tiết: reasoning thành công hay bị skip
Kết hợp Planning và Reasoning

Planning và Reasoning hoạt động ở hai tầng khác nhau nên hoàn toàn có thể dùng cùng lúc. Cách chúng phối hợp:
- Planning (cấp Crew): AgentPlanner nhìn toàn bộ bức tranh lớn, lên kế hoạch tổng thể cho cả đội. Ai làm gì, theo thứ tự nào, output của người này feed vào đâu cho người kia
- Reasoning (cấp Agent): Từng Agent nhận task (đã có plan tổng thể gắn kèm), rồi tự suy nghĩ sâu hơn về cách thực hiện cụ thể phần việc của mình
Khi kết hợp, luồng xử lý sẽ là:
- Bạn gọi
crew.kickoff() - AgentPlanner phân tích toàn bộ crew: agents, tasks, tools, context dependencies
- Plan tổng thể được tạo ra và gắn vào mô tả từng Task
- Task 1 bắt đầu. Agent nhận Task (đã có plan tổng thể kèm theo)
- Nếu Agent có
reasoning=True: đọc plan tổng thể + task description, tự tạo thêm plan chi tiết cá nhân - Agent thực thi task theo cả hai lớp plan
- Output được truyền sang Task tiếp theo, lặp lại từ bước 4
Kết quả là Agent có cả “cái nhìn toàn cục” từ planning lẫn “kế hoạch cá nhân” từ reasoning. Giảm đáng kể tình trạng output lệch hướng, đặc biệt ở những task cần phối hợp context từ nhiều Agent trước đó.
⚠️ Kết hợp cả hai sẽ tốn thêm token đáng kể (planning gọi LLM 1 lần cho toàn crew, reasoning gọi thêm 1-3 lần cho mỗi Agent bật reasoning). Với crew nhỏ 2 Agent và task đơn giản, chỉ cần bật một trong hai là đủ. Crew phức tạp 4+ Agent, task nhiều bước thì mới nên dùng cả hai.
Một chiến lược hay là: bật Planning cho crew, nhưng chỉ bật Reasoning cho 1-2 Agent quan trọng nhất (Agent phân tích, Agent ra quyết định). Những Agent làm việc đơn giản (tìm kiếm, format, gửi kết quả) thì để reasoning tắt để tiết kiệm token.
Ví dụ hoàn chỉnh: crew có Planning và Reasoning

Dưới đây là ví dụ đầy đủ. Crew gồm 3 Agent: Researcher tìm thông tin, Analyst phân tích dữ liệu, Writer viết báo cáo. Planning bật ở cấp crew, Reasoning bật cho Analyst vì task phân tích cần suy nghĩ kỹ nhất.
from crewai import Agent, Task, Crew, Process
# === AGENTS ===
# Researcher: task tìm kiếm khá rõ ràng, không cần reasoning
researcher = Agent(
role="Market Researcher",
goal="Thu thập dữ liệu thị trường AI Agent năm 2025",
backstory="Chuyên gia nghiên cứu thị trường công nghệ, "
"có kỹ năng tìm kiếm và tổng hợp thông tin nhanh."
)
# Analyst: bật reasoning vì task phân tích cần suy nghĩ sâu
analyst = Agent(
role="Data Analyst",
goal="Phân tích dữ liệu thị trường và tìm xu hướng nổi bật",
backstory="Chuyên gia phân tích với khả năng nhìn ra pattern "
"từ dữ liệu thô mà người khác bỏ qua.",
reasoning=True, # Bật reasoning cho Agent này
max_reasoning_attempts=2 # Tối đa 2 lần tinh chỉnh plan
)
# Writer: task viết báo cáo cũng không cần reasoning
writer = Agent(
role="Report Writer",
goal="Viết báo cáo chuyên nghiệp từ kết quả phân tích",
backstory="Nhà báo công nghệ với 8 năm kinh nghiệm viết "
"cho các tạp chí tech hàng đầu."
)
# === TASKS ===
research_task = Task(
description="Thu thập thông tin về thị trường AI Agent frameworks "
"(CrewAI, LangGraph, AutoGen, Swarm). Tập trung vào: "
"số lượng người dùng, tính năng nổi bật, điểm yếu, "
"và hướng phát triển trong năm tới.",
expected_output="Bảng so sánh 4 framework dạng Markdown table "
"với ít nhất 6 tiêu chí đánh giá.",
agent=researcher
)
analysis_task = Task(
description="Phân tích bảng so sánh từ Researcher. Xác định "
"framework nào phù hợp cho từng use case: startup "
"cần ship nhanh, enterprise cần stability, và side "
"project cần đơn giản. Giải thích lý do cho mỗi "
"khuyến nghị.",
expected_output="Báo cáo phân tích 300 từ với khuyến nghị "
"cụ thể cho từng đối tượng người dùng.",
agent=analyst,
context=[research_task] # Nhận output từ research_task
)
write_task = Task(
description="Viết báo cáo hoàn chỉnh dựa trên bảng so sánh "
"và phần phân tích. Gộp thành một bài viết mạch lạc, "
"có structure rõ ràng: tổng quan, so sánh chi tiết, "
"khuyến nghị, kết luận.",
expected_output="Bài báo cáo 800 từ, Markdown, có tiêu đề "
"và mục lục rõ ràng.",
agent=writer,
context=[research_task, analysis_task] # Nhận từ cả 2 task trước
)
# === CREW (bật Planning) ===
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, write_task],
process=Process.sequential,
planning=True, # Planning ở cấp crew
planning_llm="gpt-4o", # Dùng model mạnh cho planning
verbose=True # Xem chi tiết quá trình chạy
)
# Chạy crew
result = crew.kickoff()
print(result)
Khi chạy đoạn code trên với verbose=True, bạn sẽ thấy log hiện theo thứ tự:
[INFO]: Planning the crew executionkèm plan tổng thể: Researcher làm gì, Analyst làm gì, Writer làm gì- Researcher nhận task (task description + plan gắn kèm), bắt đầu tìm kiếm
- Analyst nhận task, reasoning kicks in: Agent tạo plan riêng trước, rồi mới phân tích
- Writer nhận task kèm output từ 2 Agent trước, viết báo cáo cuối cùng
Chỗ đáng chú ý là Analyst. So với khi không bật reasoning, output của Analyst thường có cấu trúc chặt chẽ hơn: liệt kê tiêu chí rõ ràng, giải thích logic cho từng khuyến nghị thay vì kết luận chung chung.
Khi nào nên dùng Planning, Reasoning, hay cả hai?
Dưới đây là bảng tham khảo nhanh dựa trên kinh nghiệm thực tế:
| Tình huống | Planning | Reasoning | Ghi chú |
|---|---|---|---|
| Crew 2 Agent, task đơn giản | Không cần | Không cần | Đơn giản thì chạy thẳng cho nhanh |
| Crew 3+ Agent, task liên kết nhau | Nên bật | Tùy từng Agent | Planning giúp phối hợp giữa các Agent |
| Agent xử lý task phân tích phức tạp | Tùy crew | Nên bật | Reasoning giúp output chặt chẽ, có logic |
| Crew lớn, task phức tạp, output quan trọng | Nên bật | Bật cho Agent chính | Tốn token nhưng chất lượng cao hơn rõ rệt |
| Crew chạy tự động, không có người review | Nên bật | Nên bật | Không có người kiểm tra thì cần Agent tự kiểm soát |
Mẹo thực tế: chạy crew cùng một input hai lần, một lần không bật Planning/Reasoning và một lần bật cả hai. So sánh output sẽ thấy rõ sự khác biệt, từ đó quyết định có cần dùng hay không cho use case cụ thể của bạn.
Câu hỏi thường gặp
Có, nhưng không quá nhiều. AgentPlanner gọi LLM thêm một lần trước khi crew chạy. Với crew 3-4 task, phần planning thường tốn thêm 1000-3000 token tùy độ phức tạp. Bạn có thể dùng model rẻ hơn như gpt-4o-mini cho planning_llm để tiết kiệm chi phí.
Có. Planning hoạt động với cả Sequential và Hierarchical Process. Với Hierarchical, plan sẽ bao gồm cả gợi ý phân công Agent nào làm task nào, giúp Manager Agent ra quyết định tốt hơn thay vì phải tự suy luận từ đầu.
Không nên. Reasoning tốn thêm 1-3 lần gọi LLM cho mỗi Agent trước khi thực thi task. Chỉ nên bật cho Agent xử lý task phức tạp, cần phân tích hoặc ra quyết định. Agent làm task đơn giản như tìm kiếm, định dạng văn bản, gửi kết quả thì không cần bật.
Agent vẫn chạy task bình thường mà không bị crash. CrewAI có cơ chế fallback: nếu reasoning thất bại do timeout, model trả lỗi hay bất kỳ lý do gì, Agent sẽ bỏ qua bước reasoning và thực thi task trực tiếp như khi reasoning tắt. Bật logging để theo dõi chi tiết.
Planning hoạt động ở cấp Crew: AgentPlanner lên kế hoạch tổng thể cho tất cả task trước khi ai bắt đầu làm. Reasoning hoạt động ở cấp Agent: mỗi Agent tự suy nghĩ và lên kế hoạch chi tiết cho task riêng của mình. Planning giống project manager phân công, Reasoning giống mỗi thành viên tự lên to-do list cá nhân. Hai tính năng bổ trợ nhau và có thể dùng đồng thời.
Bài tiếp theo mình sẽ hướng dẫn cách đóng gói project CrewAI bằng Docker và triển khai lên VPS để chạy production. Nếu bạn đã từng chạy crew thành công trên máy local, đây là bước tiếp theo để đưa nó ra thực tế.
Có thể bạn cần xem thêm
- Agent trong CrewAI: tạo AI worker chuyên biệt
- Tool trong CrewAI: mở rộng khả năng agent
- CrewAI là gì? Hướng dẫn xây dựng hệ thống Multi-Agent AI với Python
- Memory và Knowledge trong CrewAI: agent nhớ và học
- Task trong CrewAI: giao việc cho AI agent
- Flow trong CrewAI: xây dựng workflow phức tạp theo sự kiện
Về tác giả
Trần Thắng
Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.