Xây dựng hệ thống nhiều tác nhân

1. Giới thiệu

Trong phòng thí nghiệm này, bạn sẽ không chỉ tạo chatbot đơn giản mà còn xây dựng một hệ thống đa tác nhân phân tán.

Mặc dù một LLM có thể trả lời các câu hỏi, nhưng sự phức tạp trong thế giới thực thường đòi hỏi các vai trò chuyên biệt. Bạn không yêu cầu kỹ sư phụ trợ thiết kế giao diện người dùng và bạn cũng không yêu cầu nhà thiết kế tối ưu hoá các truy vấn cơ sở dữ liệu. Tương tự, chúng ta có thể tạo các tác nhân AI chuyên biệt tập trung vào một nhiệm vụ và phối hợp với nhau để giải quyết các vấn đề phức tạp.

Bạn sẽ xây dựng một Hệ thống tạo khoá học bao gồm:

  • Tác nhân nghiên cứu: Sử dụng google_search để tìm thông tin mới nhất.
  • Judge Agent: Đánh giá nghiên cứu về chất lượng và tính đầy đủ.
  • Tác nhân tạo nội dung: Biến thông tin nghiên cứu thành một khoá học có cấu trúc.
  • Nhân viên điều phối: Quản lý quy trình công việc và hoạt động giao tiếp giữa các chuyên gia này.

Kiến thức bạn sẽ học được

  • Xác định một tác nhân sử dụng công cụ (nhà nghiên cứu) có thể tìm kiếm trên web.
  • Triển khai đầu ra có cấu trúc bằng Pydantic cho giám khảo.
  • Kết nối với các tác nhân từ xa bằng giao thức Agent-to-Agent (A2A).
  • Xây dựng một LoopAgent để tạo vòng phản hồi giữa nhà nghiên cứu và người đánh giá.
  • Chạy hệ thống phân tán cục bộ bằng ADK.
  • Triển khai hệ thống đa tác nhân lên Google Cloud Run.
  • Sử dụng mô hình Gemma trên GPU Cloud Run cho tác nhân trình tạo nội dung.

Bạn cần có

  • Một trình duyệt web như Chrome
  • Một dự án trên Google Cloud đã bật tính năng thanh toán

2. Nguyên tắc về cấu trúc và điều phối

Trước tiên, hãy tìm hiểu cách các tác nhân này kết hợp với nhau. Chúng tôi đang xây dựng Quy trình tạo khoá học.

Thiết kế hệ thống

Sơ đồ kiến trúc

Điều phối bằng các tác nhân

Các tác nhân tiêu chuẩn (như Nhà nghiên cứu) sẽ thực hiện công việc. Tác nhân điều phối (chẳng hạn như LoopAgent hoặc SequentialAgent) quản lý các tác nhân khác. Họ không có công cụ riêng; "công cụ" của họ là uỷ quyền.

  1. LoopAgent: Thao tác này hoạt động như một vòng lặp while trong mã. Thao tác này chạy một chuỗi các tác nhân nhiều lần cho đến khi một điều kiện được đáp ứng (hoặc đạt đến số lần lặp tối đa). Chúng tôi sử dụng tính năng này cho Vòng lặp nghiên cứu:
    • Nhà nghiên cứu tìm thấy thông tin.
    • Giám khảo nhận xét về video đó.
    • Nếu Judge nói "Thất bại", thì EscalationChecker sẽ cho phép vòng lặp tiếp tục.
    • Nếu Judge nói "Pass" (Đạt), thì EscalationChecker sẽ kết thúc vòng lặp.
  2. SequentialAgent: Thao tác này giống như một hoạt động thực thi tập lệnh tiêu chuẩn. Nó chạy các tác nhân lần lượt. Chúng tôi sử dụng thông tin này cho Quy trình cấp cao:
    • Trước tiên, hãy chạy Vòng lặp nghiên cứu (cho đến khi vòng lặp này kết thúc với dữ liệu phù hợp).
    • Sau đó, hãy chạy Content Builder (Trình tạo nội dung) để viết khoá học.

Bằng cách kết hợp những yếu tố này, chúng ta tạo ra một hệ thống mạnh mẽ có thể tự điều chỉnh trước khi tạo ra kết quả cuối cùng.

3. Thiết lập

Thiết lập dự án

Tạo một dự án trên Google Cloud

  1. Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.

Khởi động Cloud Shell

Cloud Shell là một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn các công cụ cần thiết.

  1. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Cloud.
  2. Sau khi kết nối với Cloud Shell, hãy xác minh thông tin xác thực của bạn:
    gcloud auth list
    
  3. Xác nhận rằng dự án của bạn đã được định cấu hình:
    gcloud config get project
    
  4. Nếu dự án của bạn không được thiết lập như mong đợi, hãy thiết lập dự án:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

Thiết lập môi trường

  1. Mở Cloud Shell: Nhấp vào biểu tượng Kích hoạt Cloud Shell ở trên cùng bên phải của Google Cloud Console.

Lấy đoạn mã khởi đầu

  1. Nhân bản kho lưu trữ khởi đầu vào thư mục gốc:Di chuyển vào thư mục gốc
      cd ~
    
    Sao chép mã cần thiết cho lớp học lập trình này từ thư mục Google Cloud DevRel Demos.
    git clone --depth 1 --filter=blob:none --sparse https://github.com/GoogleCloudPlatform/devrel-demos.git temp-repo && cd temp-repo && git sparse-checkout set agents/multi-agent-system && cd .. && mv temp-repo/agents/multi-agent-system . && rm -rf temp-repo
    
    Di chuyển vào thư mục chứa mã cho Lớp học lập trình này
    cd multi-agent-system
    
  2. Bật API: Chạy lệnh sau để bật các dịch vụ cần thiết của Google Cloud:
    gcloud services enable \
        run.googleapis.com \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        aiplatform.googleapis.com \
        compute.googleapis.com
    
  3. Mở thư mục này trong trình chỉnh sửa.
    cloudshell edit .
    

Thiết lập môi trường

  1. Thiết lập các biến môi trường.Chúng ta sẽ tạo một tệp .env để lưu trữ các biến này để bạn có thể dễ dàng tải lại nếu phiên của bạn bị ngắt kết nối.
    cat <<EOF > .env
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_LOCATION=europe-west4
    export GOOGLE_GENAI_USE_VERTEXAI=true
    EOF
    
  2. Nguồn các biến môi trường:
    source .env
    

4. 🕵️ Tác nhân nghiên cứu

Tác nhân nghiên cứu

Nhà nghiên cứu là một chuyên gia. Công việc duy nhất của nó là tìm thông tin. Để làm được việc này, Gemini cần có quyền truy cập vào một công cụ: Google Tìm kiếm.

Tại sao cần tách biệt Nhà nghiên cứu?

Phân tích chuyên sâu: Tại sao không chỉ có một tác nhân làm mọi việc?

Các tác nhân nhỏ, tập trung sẽ dễ dàng đánh giágỡ lỗi hơn. Nếu kết quả nghiên cứu không tốt, bạn sẽ lặp lại câu lệnh của Nhà nghiên cứu. Nếu định dạng khoá học không phù hợp, bạn có thể lặp lại quy trình trên Trình tạo nội dung. Trong một câu lệnh "làm tất cả" nguyên khối, việc sửa một thứ thường làm hỏng thứ khác.

  1. Nếu bạn đang làm việc trong Cloud Shell, hãy chạy lệnh sau để mở trình chỉnh sửa Cloud Shell:
    cloudshell workspace .
    
  2. Mở agents/researcher/agent.py.
  3. Xem lại đoạn mã sau đây để xác định tác nhân researcher:
    # ... existing imports ...
    
    # Define the Researcher Agent
    researcher = Agent(
        name="researcher",
        model=MODEL,
        description="Gathers information on a topic using Google Search.",
        instruction="""
        You are an expert researcher. Your goal is to find comprehensive and accurate information on the user's topic.
        Use the `google_search` tool to find relevant information.
        Summarize your findings clearly.
        If you receive feedback that your research is insufficient, use the feedback to refine your next search.
        """,
        tools=[google_search],
    )
    
    root_agent = researcher
    

Khái niệm chính: Sử dụng công cụ

Lưu ý rằng chúng ta truyền tools=[google_search]. ADK xử lý sự phức tạp của việc mô tả công cụ này cho LLM. Khi mô hình quyết định cần thông tin, mô hình sẽ tạo một lệnh gọi công cụ có cấu trúc, ADK thực thi hàm Python google_search và truyền kết quả trở lại mô hình.

5. ⚖️ Tác nhân Giám khảo

Tác nhân đánh giá

Nhà nghiên cứu làm việc chăm chỉ, nhưng LLM có thể lười biếng. Chúng tôi cần một Giám khảo để xem xét tác phẩm. Giám khảo chấp nhận nghiên cứu và trả về kết quả đánh giá Đạt/Không đạt có cấu trúc.

Đầu ra có cấu trúc

Tìm hiểu chuyên sâu: Để tự động hoá quy trình công việc, chúng ta cần các kết quả dự đoán được. Rất khó phân tích một cách có lập trình một bài đánh giá dài dòng. Bằng cách thực thi một lược đồ JSON (bằng Pydantic), chúng tôi đảm bảo Judge trả về một giá trị Boolean pass hoặc fail mà mã của chúng tôi có thể hoạt động một cách đáng tin cậy.

  1. Mở agents/judge/agent.py.
  2. Xem lại đoạn mã sau đây để xác định giản đồ JudgeFeedback và tác nhân judge.
    # 1. Define the Schema
    class JudgeFeedback(BaseModel):
        """Structured feedback from the Judge agent."""
        status: Literal["pass", "fail"] = Field(
            description="Whether the research is sufficient ('pass') or needs more work ('fail')."
        )
        feedback: str = Field(
            description="Detailed feedback on what is missing. If 'pass', a brief confirmation."
        )
    
    # 2. Define the Agent
    judge = Agent(
        name="judge",
        model=MODEL,
        description="Evaluates research findings for completeness and accuracy.",
        instruction="""
        You are a strict editor.
        Evaluate the 'research_findings' against the user's original request.
        If the findings are missing key info, return status='fail'.
        If they are comprehensive, return status='pass'.
        """,
        output_schema=JudgeFeedback,
        # Disallow delegation because it should only output the schema
        disallow_transfer_to_parent=True,
        disallow_transfer_to_peers=True,
    )
    
    root_agent = judge
    

Khái niệm chính: Hạn chế hành vi của tác nhân

Chúng tôi đặt disallow_transfer_to_parent=Truedisallow_transfer_to_peers=True. Điều này buộc Judge chỉ trả về JudgeFeedback có cấu trúc. Không thể quyết định "trò chuyện" với người dùng hoặc uỷ quyền cho một nhân viên hỗ trợ khác. Điều này khiến nó trở thành một thành phần xác định trong luồng logic của chúng ta.

6. ✍️ Trợ lý tạo nội dung

Trình tạo nội dung

Content Builder là người viết nội dung quảng cáo. Công cụ này sẽ lấy nghiên cứu đã được phê duyệt và biến nghiên cứu đó thành một khoá học. Ứng dụng này sử dụng một mô hình Gemma do Cloud Run cung cấp.

Trước tiên, hãy xem dịch vụ Cloud Run lưu trữ mô hình

  1. Mở ollama_backend/Dockerfile
  2. Tại đây, bạn có thể thấy cách Dockerfile sử dụng hình ảnh Ollama, lắng nghe các yêu cầu trên cổng 8080 và lưu trữ mô hình được yêu cầu trong thư mục /model.
FROM ollama/ollama:latest

# Listen on all interfaces, port 8080 (Cloud Run default)
ENV OLLAMA_HOST 0.0.0.0:8080

# Store model weight files in /models
ENV OLLAMA_MODELS /models

⚙️ Khi triển khai, bạn sẽ thiết lập các cấu hình sau:

  • GPU: NVIDIA L4 được chọn vì có tỷ lệ hiệu suất trên giá tuyệt vời cho khối lượng công việc suy luận. L4 cung cấp bộ nhớ GPU 24 GB và các hoạt động tối ưu hoá tensor, giúp L4 trở thành lựa chọn lý tưởng cho các mô hình có 270 triệu tham số như Gemma
  • Bộ nhớ: Bộ nhớ hệ thống 16 GB để xử lý việc tải mô hình, các thao tác CUDA và hoạt động quản lý bộ nhớ của Ollama
  • CPU: 8 lõi để xử lý I/O và các tác vụ tiền xử lý tối ưu
  • Đồng thời: 4 yêu cầu trên mỗi phiên thể giúp cân bằng thông lượng với mức sử dụng bộ nhớ GPU
  • Thời gian chờ: 600 giây để đáp ứng việc tải mô hình ban đầu và khởi động vùng chứa

Bây giờ, hãy xem xét tác nhân Content Builder sử dụng mô hình Gemma.

  1. Mở agents/content_builder/agent.py.
  2. Xem lại đoạn mã sau đây để xác định tác nhân content_builder.
# the `ollama-gemma-gpu` Cloud Run service URL which hosts the Gemma model
target_url = os.environ.get("OLLAMA_API_BASE")

# ... existing code ...

# (Note: We use 'ollama/gemma3:270m' to align with ADK's expected prefix)
gemma_model_name = os.environ.get("GEMMA_MODEL_NAME", "gemma3:270m")
model = LiteLlm(
    model=f"ollama_chat/{gemma_model_name}",
    api_base=target_url
)

# 5. Define the Agent
content_builder = Agent(
    name="content_builder",
    model=model,
    description="Transforms research findings into a structured course.",
    instruction="""
    You are an expert course creator.
    Take the approved 'research_findings' and transform them into a well-structured, engaging course module.

    **Formatting Rules:**
    1. Start with a main title using a single `#` (H1).
    2. Use `##` (H2) for main section headings. These will be used for the Table of Contents.
    3. Use `###` (H3) for sub-sections within main sections.
    4. Use bullet points and clear paragraphs.
    5. Maintain a professional but engaging tone.

    **Structure Requirements:**
    - Begin with a brief Introduction section explaining what the learner will gain.
    - Organize content into 3-5 main sections with clear headings.
    - Include Key Takeaways at the end as a bulleted summary.
    - Keep each section focused and concise.

    Ensure the content directly addresses the user's original request.
    Do not include any preamble or explanation outside the course content itself.
    """,
)

root_agent = content_builder

Khái niệm chính: Lan truyền bối cảnh

Bạn có thể thắc mắc: "Làm cách nào mà Content Builder biết được những gì Researcher tìm thấy?" Trong ADK, các tác nhân trong một quy trình chia sẻ một session.state. Sau đó, trong Orchestrator, chúng ta sẽ định cấu hình Researcher và Judge để lưu đầu ra của chúng vào trạng thái dùng chung này. Câu lệnh của Trình tạo nội dung có quyền truy cập hiệu quả vào nhật ký này.

7. 🎻 Orchestrator

Tác nhân điều phối

Orchestrator là người quản lý nhóm gồm nhiều tác nhân của chúng tôi. Không giống như các đặc vụ chuyên trách (Nhà nghiên cứu, Giám khảo, Nhà tạo nội dung) thực hiện các nhiệm vụ cụ thể, công việc của Điều phối viên là điều phối quy trình làm việc và đảm bảo thông tin được truyền tải chính xác giữa các đặc vụ.

🌐 Cấu trúc: Từ tác nhân đến tác nhân (A2A)

Kiến trúc A2A

Trong lớp học lập trình này, chúng ta sẽ xây dựng một hệ thống phân tán. Thay vì chạy tất cả các tác nhân trong một quy trình Python duy nhất, chúng tôi triển khai các tác nhân này dưới dạng các vi dịch vụ độc lập. Điều này cho phép mỗi tác nhân mở rộng quy mô độc lập và gặp lỗi mà không làm hỏng toàn bộ hệ thống.

Để làm được điều này, chúng tôi sử dụng giao thức Agent-to-Agent (A2A).

Giao thức A2A

Tìm hiểu sâu: Trong hệ thống sản xuất, các tác nhân chạy trên nhiều máy chủ (hoặc thậm chí là nhiều đám mây). Giao thức A2A tạo ra một cách chuẩn để các tác nhân này khám phá và giao tiếp với nhau qua HTTP. RemoteA2aAgent là ứng dụng ADK cho giao thức này.

  1. Mở agents/orchestrator/agent.py.
  2. Xem lại cách đoạn mã sau đây xác định các kết nối.
    # ... existing code ...
    
    # Connect to the Researcher (Localhost port 8001)
    researcher_url = os.environ.get("RESEARCHER_AGENT_CARD_URL", "http://localhost:8001/a2a/agent/.well-known/agent-card.json")
    researcher = RemoteA2aAgent(
        name="researcher",
        agent_card=researcher_url,
        description="Gathers information using Google Search.",
        # IMPORTANT: Save the output to state for the Judge to see
        after_agent_callback=create_save_output_callback("research_findings"),
        # IMPORTANT: Use authenticated client for communication
        httpx_client=create_authenticated_client(researcher_url)
    )
    
    # Connect to the Judge (Localhost port 8002)
    judge_url = os.environ.get("JUDGE_AGENT_CARD_URL", "http://localhost:8002/a2a/agent/.well-known/agent-card.json")
    judge = RemoteA2aAgent(
        name="judge",
        agent_card=judge_url,
        description="Evaluates research.",
        after_agent_callback=create_save_output_callback("judge_feedback"),
        httpx_client=create_authenticated_client(judge_url)
    )
    
    # Content Builder (Localhost port 8003)
    content_builder_url = os.environ.get("CONTENT_BUILDER_AGENT_CARD_URL", "http://localhost:8003/a2a/agent/.well-known/agent-card.json")
    content_builder = RemoteA2aAgent(
        name="content_builder",
        agent_card=content_builder_url,
        description="Builds the course.",
        httpx_client=create_authenticated_client(content_builder_url)
    )
    

8. 🛑 Công cụ kiểm tra việc đệ trình

Vòng lặp cần có cách để dừng. Nếu Giám khảo nói "Đạt", chúng ta cần thoát khỏi vòng lặp ngay lập tức và chuyển sang Content Builder.

Logic tuỳ chỉnh với BaseAgent

Tìm hiểu sâu: Không phải nhân viên hỗ trợ nào cũng sử dụng LLM. Đôi khi, bạn cần logic Python đơn giản. BaseAgent cho phép bạn xác định một tác nhân chỉ chạy mã. Trong trường hợp này, chúng ta kiểm tra trạng thái phiên và sử dụng EventActions(escalate=True) để báo hiệu cho LoopAgent dừng.

  1. Vẫn còn trong agents/orchestrator/agent.py.
  2. Xem xét những mã nguồn sau đây, đánh giá ý kiến phản hồi của người đánh giá và chuyển sang bước tiếp theo khi đã sẵn sàng
    class EscalationChecker(BaseAgent):
        """Checks the judge's feedback and escalates (breaks the loop) if it passed."""
    
        async def _run_async_impl(
            self, ctx: InvocationContext
        ) -> AsyncGenerator[Event, None]:
            # Retrieve the feedback saved by the Judge
            feedback = ctx.session.state.get("judge_feedback")
            print(f"[EscalationChecker] Feedback: {feedback}")
    
            # Check for 'pass' status
            is_pass = False
            if isinstance(feedback, dict) and feedback.get("status") == "pass":
                is_pass = True
            # Handle string fallback if JSON parsing failed
            elif isinstance(feedback, str) and '"status": "pass"' in feedback:
                is_pass = True
    
            if is_pass:
                # 'escalate=True' tells the parent LoopAgent to stop looping
                yield Event(author=self.name, actions=EventActions(escalate=True))
            else:
                # Continue the loop
                yield Event(author=self.name)
    
    escalation_checker = EscalationChecker(name="escalation_checker")
    

Khái niệm chính: Luồng điều khiển thông qua các sự kiện

Các tác nhân không chỉ giao tiếp bằng văn bản mà còn bằng Sự kiện. Bằng cách tạo ra một sự kiện bằng escalate=True, tác nhân này sẽ gửi tín hiệu lên cấp trên (LoopAgent). LoopAgent được lập trình để bắt tín hiệu này và chấm dứt vòng lặp.

9. 🔁 Vòng lặp nghiên cứu

Research Loop

Chúng ta cần một vòng lặp phản hồi: Nghiên cứu -> Đánh giá -> (Thất bại) -> Nghiên cứu -> ...

  1. Trong agents/orchestrator/agent.py.
  2. Xem cách đoạn mã sau đây xác định định nghĩa research_loop.
    research_loop = LoopAgent(
        name="research_loop",
        description="Iteratively researches and judges until quality standards are met.",
        sub_agents=[researcher, judge, escalation_checker],
        max_iterations=3,
    )
    

Khái niệm chính: LoopAgent

LoopAgent sẽ chuyển qua sub_agents theo thứ tự.

  1. researcher: Tìm dữ liệu.
  2. judge: Đánh giá dữ liệu.
  3. escalation_checker: Quyết định có yield Event(escalate=True) hay không. Nếu escalate=True xảy ra, vòng lặp sẽ bị gián đoạn sớm. Nếu không, quá trình này sẽ bắt đầu lại ở người nghiên cứu (tối đa max_iterations).

10. 🔗 Đường ống cuối cùng

Quy trình cuối cùng

Đang tổng hợp toàn bộ dữ liệu...

  1. Trong agents/orchestrator/agent.py.
  2. Xem cách xác định root_agent ở cuối tệp.
    root_agent = SequentialAgent(
        name="course_creation_pipeline",
        description="A pipeline that researches a topic and then builds a course from it.",
        sub_agents=[research_loop, content_builder],
    )
    

Khái niệm chính: Thành phần phân cấp

Lưu ý rằng research_loop là một tác nhân (LoopAgent). Chúng ta coi tác nhân này giống như mọi tác nhân phụ khác trong SequentialAgent. Khả năng kết hợp này cho phép bạn tạo logic phức tạp bằng cách lồng các mẫu đơn giản (vòng lặp bên trong các chuỗi, các chuỗi bên trong bộ định tuyến, v.v.).

11. 🚀 Triển khai lên Cloud Run

Chúng ta sẽ triển khai từng tác nhân dưới dạng một dịch vụ riêng biệt trên Cloud Run, bao gồm cả dịch vụ Cloud Run cho giao diện người dùng của nhà sáng tạo khoá học và dịch vụ Cloud Run sử dụng GPU cho mô hình Gemma.

Tìm hiểu về cấu hình triển khai

Khi triển khai các tác nhân vào Cloud Run, chúng tôi sẽ truyền một số biến môi trường để định cấu hình hành vi và khả năng kết nối của các tác nhân:

  • GOOGLE_CLOUD_PROJECT: Đảm bảo tác nhân sử dụng đúng dự án trên đám mây của Google Cloud để ghi nhật ký và gọi Vertex AI.
  • GOOGLE_GENAI_USE_VERTEXAI: Yêu cầu khung tác nhân (ADK) sử dụng Vertex AI để suy luận mô hình thay vì gọi trực tiếp Gemini API.
  • [AGENT]_AGENT_CARD_URL: Điều này rất quan trọng đối với Orchestrator. Nó cho Trình điều phối biết nơi tìm các tác nhân từ xa. Bằng cách đặt giá trị này thành URL Cloud Run đã triển khai (cụ thể là đường dẫn thẻ tác nhân), chúng ta cho phép Orchestrator khám phá và giao tiếp với Researcher, Judge và Content Builder qua Internet.

Để triển khai tất cả các tác nhân vào các dịch vụ Cloud Run, hãy chạy tập lệnh sau.

Trước tiên, hãy đảm bảo rằng tập lệnh có thể thực thi.

chmod u+x ~/multi-agent-system/deploy.sh

Lưu ý Quá trình này sẽ mất vài phút để chạy vì mỗi dịch vụ được triển khai tuần tự.

~/multi-agent-system/deploy.sh

12. Tạo khoá học!

Truy cập trang web dành cho nhà sáng tạo khoá học. Dịch vụ Cloud Run của Nhà sáng tạo khoá học là dịch vụ cuối cùng được triển khai từ tập lệnh. Bạn có thể xác định URL cho nhà sáng tạo khoá học là https://course-creator-..run.app. Đây phải là dòng đầu ra cuối cùng của tập lệnh triển khai.

Sau đó, hãy nhập ý tưởng về khoá học, ví dụ: "đại số tuyến tính".

Các tác nhân sẽ bắt đầu xử lý khoá học của bạn.

Quy trình cuối cùng

13. Dọn dẹp

Để tránh phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được dùng trong lớp học lập trình này, hãy làm theo các bước sau để xoá các dịch vụ và hình ảnh vùng chứa.

1. Xoá dịch vụ Cloud Run

Cách hiệu quả nhất để dọn dẹp là xoá các dịch vụ mà bạn đã triển khai cho Cloud Run.

# Delete the main agent and app services
gcloud run services delete researcher content-builder judge orchestrator course-creator \
    --region $REGION --quiet

# Delete the GPU backend (Ollama)
gcloud run services delete ollama-gemma-gpu \
    --region $OLLAMA_REGION --quiet

2. Xoá hình ảnh trong Artifact Registry

Khi bạn sử dụng cờ --source để triển khai, Google Cloud sẽ tạo một kho lưu trữ trong Artifact Registry để lưu trữ hình ảnh vùng chứa của bạn. Để xoá các bản sao này và tiết kiệm chi phí lưu trữ, hãy xoá kho lưu trữ:

gcloud artifacts repositories delete cloud-run-source-deploy --location us-east4 --quiet

3. Xoá tệp và môi trường cục bộ

Để giữ cho môi trường Cloud Shell luôn gọn gàng, hãy xoá thư mục dự án và mọi cấu hình cục bộ:

cd ~
rm -rf multi-agent-system

4. (Không bắt buộc) Xoá dự án

Nếu chỉ tạo một dự án cho lớp học lập trình này, bạn có thể tắt dự án đó thông qua trang Quản lý tài nguyên để đảm bảo không phát sinh thêm phí.

14. Xin chúc mừng!

Bạn đã tạo và triển khai thành công một hệ thống nhiều tác nhân phân tán sẵn sàng cho hoạt động sản xuất.

Thành tích bạn đã đạt được

  • Phân tách một tác vụ phức tạp: Thay vì một câu lệnh khổng lồ, chúng tôi chia công việc thành các vai trò chuyên biệt (Nhà nghiên cứu, Giám khảo, Nhà xây dựng nội dung).
  • Triển khai Quản lý chất lượng: Chúng tôi đã sử dụng LoopAgentJudge có cấu trúc để đảm bảo chỉ thông tin chất lượng cao mới đến được bước cuối cùng.
  • Được xây dựng cho hoạt động sản xuất: Bằng cách sử dụng giao thức Agent-to-Agent (A2A)Cloud Run, chúng tôi đã tạo ra một hệ thống trong đó mỗi tác nhân là một vi dịch vụ độc lập, có khả năng mở rộng. Cách này mạnh mẽ hơn nhiều so với việc chạy mọi thứ trong một tập lệnh Python duy nhất.
  • Điều phối: Chúng tôi đã sử dụng SequentialAgentLoopAgent để xác định các mẫu luồng điều khiển rõ ràng. *. GPU Cloud Run: Triển khai một mô hình Gemma vào GPU Cloud Run