Xây dựng AI Agent đa tác nhân với CrewAI: Phân công và phối hợp nhiều AI agent trong Python

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Trong phát triển phần mềm hiện đại, chúng ta thường xuyên gặp các dự án đòi hỏi vô số kỹ năng khác nhau. Hãy thử hình dung việc xây dựng một hệ thống hoàn chỉnh: từ nghiên cứu thị trường, lên ý tưởng tính năng, viết mã, kiểm thử, đến tạo tài liệu hướng dẫn và chiến lược tiếp thị. Mỗi giai đoạn đều cần chuyên môn riêng biệt.

Hồi mới vào nghề, mình nhớ có lần phải tự tay xử lý gần như mọi thứ cho một dự án nhỏ. Cảm giác mình như một “người hùng” đa năng, nhưng thực tế, mình mất rất nhiều thời gian và dễ mắc lỗi do thiếu chuyên môn sâu ở từng mảng. Đó là lúc mình nhận ra, một dự án phức tạp cần một đội ngũ, chứ không phải một cá nhân đơn độc. Nguyên tắc này càng đúng hơn khi áp dụng Trí tuệ Nhân tạo (AI) vào các tác vụ phức tạp.

Vấn đề thực tế: Tại sao một AI Agent đơn lẻ lại chưa đủ?

Khi mới làm việc với AI, nhiều người có xu hướng nghĩ về một “siêu AI” vạn năng. Mình cũng từng như vậy. Chúng ta thường giao cho các mô hình ngôn ngữ lớn (LLM) một nhiệm vụ tổng thể và kỳ vọng chúng tự động giải quyết. Chẳng hạn, yêu cầu: “Viết một bài blog về chủ đề X, có ví dụ code và tối ưu SEO.”

Nghe có vẻ đơn giản, nhưng kết quả thường không như mong đợi. Bài viết có thể thiếu chiều sâu nghiên cứu, đoạn code chưa tối ưu, hoặc phần SEO chỉ ở mức cơ bản. Tại sao lại như vậy?

Phân tích nguyên nhân: Hạn chế của AI Agent đơn tác vụ

Vấn đề là ở chỗ, dù các LLM rất mạnh mẽ, nhưng chúng vẫn có giới hạn cố hữu khi xử lý các tác vụ đa chiều và đòi hỏi chuyên môn sâu. Mình thường hình dung nó như việc nhờ một người bạn giỏi mọi thứ nhưng lại không chuyên sâu vào lĩnh vực nào cả. Người bạn ấy có thể làm được nhiều việc, nhưng để đạt đến mức độ xuất sắc thì lại khó.

Thứ nhất, thiếu chuyên môn hóa: Một LLM khi được giao nhiều nhiệm vụ cùng lúc sẽ phải phân tán sự chú ý. Nó không thể vừa chuyên tâm nghiên cứu sâu một chủ đề, vừa đóng vai trò lập trình viên viết code tối ưu, và cuối cùng là một chuyên gia SEO để tối ưu từ khóa hiệu quả. Do đó, kết quả thường chung chung và không thực sự nổi bật.

Thứ hai, giới hạn về cửa sổ ngữ cảnh (context window): Khi một nhiệm vụ trở nên quá dài và phức tạp, thông tin cần xử lý có thể vượt quá giới hạn “cửa sổ ngữ cảnh” (context window) của LLM. Điều này khiến nó khó duy trì sự mạch lạc và liên kết giữa các phần khác nhau của nhiệm vụ.

Thứ ba, khó khăn trong điều phối và kiểm soát: Nếu chúng ta muốn AI làm việc theo một quy trình cụ thể (ví dụ: nghiên cứu trước, rồi mới viết, rồi mới tối ưu), một AI đơn lẻ sẽ khó tuân thủ một cách chính xác. Việc kiểm soát luồng công việc và can thiệp sửa lỗi cũng trở nên phức tạp hơn.

Trong quá trình làm việc thực tế, mình nhận ra đây là một kỹ năng quan trọng cần nắm vững: khả năng phân rã vấn đề lớn thành các phần nhỏ hơn và giao cho các “thành phần” chuyên trách xử lý. Khi áp dụng tư duy này vào AI, chúng ta sẽ thấy tiềm năng vô cùng lớn.

Các cách giải quyết: Từ thủ công đến tự động hóa

1. Cách thủ công: Tự mình điều phối từng bước

Ban đầu, mình đã áp dụng cách này: Sử dụng một LLM để nghiên cứu, sau đó tự sao chép kết quả, rồi dùng chính LLM đó (hoặc một LLM khác) để viết, sau đó tự điều chỉnh cho SEO. Phương pháp này giúp mình kiểm soát toàn diện từng bước và dễ dàng sửa chữa khi cần. Tuy nhiên, cách này cực kỳ tốn thời gian, mang tính lặp đi lặp lại và khó mở rộng khi số lượng hoặc quy mô nhiệm vụ tăng lên.

2. Tự xây dựng hệ thống điều phối

Tiến thêm một bước, mình tự viết các đoạn mã Python để gọi LLM nhiều lần, mỗi lần với một prompt khác nhau, sau đó kết nối các kết quả này lại. Ví dụ, gọi một LLM để “nghiên cứu”, lưu kết quả, sau đó gọi LLM thứ hai với kết quả của bước một và yêu cầu “viết bài”.

Cách này giúp tự động hóa phần nào, nhưng mình lại phải đầu tư rất nhiều công sức xây dựng logic điều phối, xử lý lỗi và đảm bảo các bước chạy đúng trình tự. Điều này giống như việc tự xây một đường ống nước riêng cho từng ngôi nhà, vừa tốn kém lại không hiệu quả về lâu dài.

3. Sử dụng các framework AI Agent đa tác nhân

Đây chính là giải pháp tối ưu mình muốn giới thiệu đến bạn. Thay vì tự mình làm mọi thứ, chúng ta sử dụng các thư viện hoặc framework được thiết kế đặc biệt để tạo và điều phối nhiều AI Agent. Mỗi Agent sẽ có một vai trò (role) và mục tiêu (goal) cụ thể, giống như một đội ngũ chuyên nghiệp. Chúng có thể giao tiếp, trao đổi thông tin và cùng nhau hoàn thành một nhiệm vụ lớn.

Những framework này giúp chúng ta vượt qua giới hạn của AI Agent đơn lẻ, tận dụng tối đa sức mạnh của LLM, cho phép chúng tập trung vào chuyên môn riêng.

Cách tốt nhất: Xây dựng AI Agent đa tác nhân với CrewAI

Trong số các framework đa tác nhân hiện có (như AutoGen của Microsoft), CrewAI nổi bật nhờ sự đơn giản, dễ tiếp cận và cấu trúc rõ ràng, đặc biệt phù hợp cho những người mới bắt đầu làm quen với khái niệm này trong Python.

CrewAI là gì?

CrewAI là một framework mã nguồn mở được xây dựng trên Python, cho phép chúng ta tạo, quản lý và điều phối các AI Agent hoạt động độc lập nhưng hợp tác với nhau. Hãy hình dung một phòng ban trong công ty, nơi có các chuyên gia như người nghiên cứu thị trường, người viết nội dung, người thiết kế, v.v. CrewAI giúp bạn xây dựng một “phòng ban ảo” gồm các AI Agent tương tự.

Mục tiêu của CrewAI là giải quyết các vấn đề phức tạp bằng cách phân chia chúng thành các nhiệm vụ nhỏ hơn, sau đó giao cho các Agent chuyên biệt xử lý. Các Agent này có thể giao tiếp với nhau, sử dụng các công cụ (tools) bên ngoài (ví dụ: tìm kiếm web, đọc tài liệu) và đưa ra quyết định dựa trên quy trình đã định nghĩa.

Thành phần chính của CrewAI

Để xây dựng một “đội ngũ” với CrewAI, bạn cần hiểu 4 khái niệm chính:

  • Agent: Là “thành viên” của đội ngũ AI. Mỗi Agent được định nghĩa bởi:
    • role (vai trò): Ví dụ: “Chuyên gia nghiên cứu thị trường”.
    • goal (mục tiêu): Ví dụ: “Tìm kiếm thông tin xu hướng công nghệ mới nhất”.
    • backstory (bối cảnh): Mô tả ngắn gọn về kinh nghiệm, tính cách của Agent, ví dụ: “Tỉ mỉ, cẩn trọng, thích phân tích dữ liệu”.
    • llm (mô hình ngôn ngữ): Mô hình AI mà Agent sẽ sử dụng (như GPT-4, Claude 3).
    • tools (công cụ): Các công cụ mà Agent có thể sử dụng (ví dụ: Google Search, truy cập API, đọc file PDF).
  • Task: Là “nhiệm vụ” cụ thể mà một Agent cần hoàn thành. Mỗi Task có:
    • description (mô tả): Nội dung chi tiết của nhiệm vụ.
    • expected_output (kết quả mong đợi): Định dạng hoặc nội dung của kết quả cần trả về, ví dụ: “một báo cáo 500 từ ở định dạng Markdown”.
    • agent: Agent được giao nhiệm vụ này.
  • Tool: Là các chức năng mở rộng giúp Agent tương tác với thế giới bên ngoài. CrewAI cung cấp sẵn một số công cụ (ví dụ: SerperDevTool để tìm kiếm web), hoặc bạn có thể tự định nghĩa công cụ riêng.
  • Crew: Là “đội ngũ” tập hợp các Agent và Tasks lại với nhau, định nghĩa quy trình làm việc.
    • agents: Danh sách các Agent tham gia.
    • tasks: Danh sách các Task cần hoàn thành.
    • process: Quy trình làm việc. Hai loại chính là Process.sequential (các Agent thực hiện tuần tự: Agent này xong mới đến Agent khác) hoặc Process.hierarchical (có một Agent quản lý và điều phối các Agent khác).

Cài đặt và ví dụ cơ bản với CrewAI

Đầu tiên, bạn cần cài đặt thư viện CrewAI và CrewAI Tools. CrewAI Tools chứa các công cụ hữu ích mà Agent có thể dùng.


pip install crewai crewai-tools

Tiếp theo, bạn cần thiết lập API key cho mô hình ngôn ngữ bạn muốn sử dụng (ví dụ: OpenAI, Anthropic Claude). Nên lưu trữ các khóa này trong biến môi trường để đảm bảo an toàn và dễ quản lý.


import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
os.environ["OPENAI_MODEL_NAME"] = "gpt-4-turbo" # Hoặc gpt-3.5-turbo

Bây giờ, chúng ta sẽ xây dựng một ví dụ đơn giản: một “Đội ngũ Viết Blog” với một Agent “Nghiên cứu viên” và một Agent “Biên tập viên”.


from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# 1. Khởi tạo LLM
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.7)

# 2. Định nghĩa các Agent
researcher = Agent(
    role='Chuyên gia Nghiên cứu Thị trường',
    goal='Tìm kiếm thông tin và xu hướng mới nhất về Trí tuệ Nhân tạo',
    backstory='Là một nhà phân tích dày dặn kinh nghiệm, luôn cập nhật các đột phá công nghệ AI.',
    verbose=True,
    allow_delegation=False,
    llm=llm
)

writer = Agent(
    role='Biên tập viên Nội dung',
    goal='Viết một bài blog hấp dẫn và dễ hiểu dựa trên kết quả nghiên cứu',
    backstory='Là một cây bút lão luyện, có khả năng biến thông tin phức tạp thành nội dung thu hút.',
    verbose=True,
    allow_delegation=True, # Có thể giao việc lại nếu cần
    llm=llm
)

# 3. Định nghĩa các Task
research_task = Task(
    description='Tìm kiếm 3 xu hướng nổi bật nhất về AI trong năm 2024 và phân tích tiềm năng của chúng.',
    expected_output='Một bản tóm tắt chi tiết về 3 xu hướng AI hàng đầu, kèm theo giải thích.',
    agent=researcher
)

write_task = Task(
    description=(
        'Viết một bài blog dài khoảng 800 từ dựa trên bản tóm tắt xu hướng AI đã nghiên cứu. '
        'Bài viết cần có cấu trúc rõ ràng, sử dụng ngôn ngữ dễ hiểu và hấp dẫn đối với độc giả phổ thông.'
    ),
    expected_output='Toàn bộ nội dung bài blog dưới định dạng Markdown.',
    agent=writer
)

# 4. Xây dựng Crew (Đội ngũ)
blog_crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential, # Quy trình tuần tự: Nghiên cứu xong rồi mới viết
    verbose=True
)

# 5. Khởi chạy Crew và xem kết quả
print("### Bắt đầu quá trình tạo blog với CrewAI ###")
result = blog_crew.kickoff()
print("\n### Kết quả cuối cùng của blog: ###")
print(result)

Ví dụ nâng cao: Phân công và phối hợp trong thực tế với công cụ

Để các Agent thực sự hữu ích, chúng cần có khả năng tương tác với thế giới bên ngoài. Đây là lúc Tools phát huy tác dụng. Giả sử bạn muốn Agent có thể tìm kiếm thông tin trên internet.

Chúng ta sẽ sử dụng SerperDevTool, một công cụ tìm kiếm web được cung cấp bởi CrewAI Tools. Để sử dụng, bạn cần có API key của Serper (có thể đăng ký miễn phí với một lượng query nhất định).


# Cài đặt thư viện Serper nếu chưa có
pip install google-search-results

import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
from langchain_openai import ChatOpenAI

# Thiết lập API keys
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
os.environ["SERPER_API_KEY"] = "YOUR_SERPER_API_KEY" # Đăng ký tại serper.dev

llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.7)

# Khởi tạo công cụ tìm kiếm
search_tool = SerperDevTool()

# Định nghĩa Agent Nghiên cứu viên với công cụ tìm kiếm
researcher_with_tool = Agent(
    role='Chuyên gia Phân tích Dữ liệu Thị trường',
    goal='Tìm kiếm và phân tích xu hướng công nghệ mới nhất trên Internet',
    backstory='Là một nhà nghiên cứu kỳ cựu, luôn sử dụng công cụ tìm kiếm để thu thập thông tin chính xác và kịp thời.',
    verbose=True,
    allow_delegation=False,
    tools=[search_tool], # Gán công cụ tìm kiếm cho Agent này
    llm=llm
)

# Định nghĩa Agent Chiến lược Nội dung
content_strategist = Agent(
    role='Chuyên gia Chiến lược Nội dung',
    goal='Lập kế hoạch nội dung chi tiết dựa trên xu hướng thị trường đã nghiên cứu',
    backstory='Có khả năng biến dữ liệu thành chiến lược nội dung hấp dẫn, thu hút độc giả mục tiêu.',
    verbose=True,
    allow_delegation=True,
    llm=llm
)

# Định nghĩa Task Nghiên cứu sử dụng công cụ
research_task_with_tool = Task(
    description='Sử dụng công cụ tìm kiếm để tìm 5 xu hướng công nghệ nổi bật nhất có thể ảnh hưởng đến ngành IT trong 2 năm tới. Sau đó tóm tắt từng xu hướng.',
    expected_output='Một danh sách 5 xu hướng công nghệ hàng đầu, mỗi xu hướng kèm theo mô tả ngắn gọn và tiềm năng ảnh hưởng.',
    agent=researcher_with_tool,
)

# Định nghĩa Task Lập kế hoạch nội dung
strategy_task = Task(
    description=(
        'Dựa trên 5 xu hướng công nghệ đã được nghiên cứu, hãy lập một kế hoạch nội dung chi tiết cho một loạt 3 bài blog. '
        'Mỗi bài blog cần có tiêu đề, dàn ý chính (H2/H3), và đối tượng độc giả mục tiêu. '
        'Đảm bảo các bài blog có tính liên kết và bao quát các khía cạnh khác nhau của xu hướng.'
    ),
    expected_output='Một kế hoạch nội dung chi tiết cho 3 bài blog, bao gồm tiêu đề, dàn ý, và đối tượng mục tiêu cho từng bài, dưới định dạng JSON.',
    agent=content_strategist,
)

# Xây dựng Crew
marketing_crew = Crew(
    agents=[researcher_with_tool, content_strategist],
    tasks=[research_task_with_tool, strategy_task],
    process=Process.sequential,
    verbose=True
)

# Chạy Crew
print("### Bắt đầu quá trình lập kế hoạch nội dung với CrewAI và công cụ tìm kiếm ###")
result_advanced = marketing_crew.kickoff()
print("\n### Kế hoạch nội dung hoàn chỉnh: ###")
print(result_advanced)

Lưu ý khi sử dụng CrewAI

Để đạt hiệu quả tốt nhất khi xây dựng các AI Agent đa tác nhân với CrewAI, mình có vài kinh nghiệm muốn chia sẻ:

  1. Kỹ thuật prompt hiệu quả cho Agent và Task: Đây là chìa khóa. Vai trò (role), mục tiêu (goal), bối cảnh (backstory) của Agent và mô tả (description), kết quả mong đợi (expected_output) của Task cần phải thật rõ ràng, chi tiết. Càng cụ thể, Agent càng hiểu rõ nhiệm vụ và đưa ra kết quả chính xác.
  2. Chọn LLM phù hợp: Các LLM khác nhau có khả năng và chi phí khác nhau. Với các tác vụ quan trọng và đòi hỏi sự sáng tạo, mình ưu tiên các mô hình mạnh như GPT-4 (hiện có giá khoảng 0.03 USD/1K token cho input và 0.06 USD/1K token cho output). Với các tác vụ đơn giản hơn, GPT-3.5 Turbo (rẻ hơn 10-20 lần) hoặc các mô hình khác có thể là lựa chọn tiết kiệm hơn.
  3. Quản lý chi phí: Mỗi lần Agent gọi LLM đều tốn token và chi phí. Hãy theo dõi output của CrewAI (khi verbose=True) để hiểu luồng hoạt động và tối ưu hóa số lượng lời gọi LLM không cần thiết. Một lời khuyên là hãy đặt giới hạn token cho mỗi lời gọi hoặc sử dụng các công cụ theo dõi chi phí API.
  4. Thử nghiệm và lặp lại: Việc xây dựng một CrewAI hoàn hảo không diễn ra ngay lập tức. Bạn cần thử nghiệm, xem xét kết quả, điều chỉnh prompt, vai trò của Agent, hoặc quy trình làm việc cho đến khi đạt được hiệu suất mong muốn. Đừng ngại thay đổi và cải tiến liên tục!
  5. Sử dụng Tools hiệu quả: Hãy tận dụng các công cụ có sẵn hoặc tự xây dựng công cụ riêng để Agent có thể thực hiện các hành động thực tế, giúp giải quyết vấn đề vượt ra ngoài khả năng suy luận thuần túy của LLM.

Kết luận

AI Agent đa tác nhân không chỉ là một khái niệm thú vị mà còn là một phương pháp tiếp cận mạnh mẽ để giải quyết các thách thức phức tạp trong phát triển phần mềm và nhiều lĩnh vực khác. Với CrewAI, bạn sẽ có ngay trong tay một trợ thủ đắc lực để biến ý tưởng về các “đội ngũ AI” thành hiện thực, tự động hóa các quy trình làm việc, và nâng cao năng suất đáng kể.

Việc học cách phân chia vấn đề, định nghĩa vai trò rõ ràng cho từng Agent và cho phép chúng phối hợp nhịp nhàng là một kỹ năng vô cùng giá trị. Mình tin rằng, khi bạn nắm vững cách sử dụng CrewAI, bạn sẽ mở ra một kỷ nguyên mới trong việc xây dựng các ứng dụng AI thông minh và hiệu quả hơn. Đừng ngần ngại bắt tay vào thử nghiệm ngay hôm nay nhé!

Share: