1. Giới thiệu
Tổng quan
Trong phòng thí nghiệm này, bạn sẽ vượt ra ngoài những chatbot đơn giản và 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. - Tác nhân đánh giá: Đá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.
Điều kiện tiên quyết
- Có kiến thức cơ bản về Python.
- Quen thuộc với Google Cloud Console.
Bạn sẽ thực hiện
- Xác định một tác nhân sử dụng công cụ (
researcher) có thể tìm kiếm trên web. - Triển khai đầu ra có cấu trúc bằng Pydantic cho
judge. - Kết nối với các tác nhân từ xa bằng giao thức Tác nhân với tác nhân (A2A).
- Xây dựng
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 nhiều tác nhân trên Google Cloud Run.
Nguyên tắc về kiến trúc và điều phối
Trước khi viết mã, hãy tìm hiểu cách các tác nhân này phối 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

Điều phối bằng 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.
LoopAgent: Thao tác này hoạt động như một vòng lặpwhiletrong 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 phê bình 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.
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.
2. Thiết lập
Thiết lập môi trường
Mở Cloud Shell: Mở một thẻ mới rồi nhập shell.cloud.google.com
Lấy đoạn mã khởi đầu
- Sao chép kho lưu trữ khởi đầu vào thư mục gốc:
cd ~ git clone https://github.com/amitkmaraj/prai-roadshow-lab-1-starter.git cd prai-roadshow-lab-1-starter - Chạy tập lệnh init để liên kết tín dụng từ nhà cung cấp bên thứ ba với hoạt động thanh toán.
chmod +x ./init.sh ./init.sh - Mở thư mục này trong trình chỉnh sửa.
Bật API
Bây giờ, bạn đã có một dự án mới, hãy 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
Quá trình này có thể mất vài giây.
Cài đặt phần phụ thuộc
Chúng tôi sử dụng uv để quản lý phần phụ thuộc một cách nhanh chóng.
- Cài đặt các phần phụ thuộc của dự án:
# Ensure you have uv installed: pip install uv uv sync - Đặt mã dự án trên Google Cloud.
- Lưu ý: Bạn có thể tìm thấy mã dự án trong trang tổng quan Cloud Console hoặc bằng cách chạy
gcloud config get-value project.
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project) - Lưu ý: Bạn có thể tìm thấy mã dự án trong trang tổng quan Cloud Console hoặc bằng cách chạy
- Thiết lập các biến môi trường còn lại:
Cảnh báo: Các biến môi trường không được duy trì trong các phiên cửa sổ dòng lệnh mới. Nếu mở một thẻ terminal mới, bạn phải chạy lại các lệnh xuất này.export GOOGLE_CLOUD_LOCATION=us-central1 export GOOGLE_GENAI_USE_VERTEXAI=true
3. 🕵️ 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á và gỡ lỗi hơn. Nếu kết quả nghiên cứu không tốt, bạn có thể 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 này 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.
- 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:
Nếu bạn đang làm việc trong môi trường cục bộ, hãy mở IDE mà bạn yêu thích.cloudshell workspace . - Mở
agents/researcher/agent.py. - Bạn sẽ thấy một cấu trúc có một việc CẦN LÀM.
- Thêm mã sau để 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.
4. ⚖️ Tác nhân Giám khảo

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 công việc. Thẩm phán chấp nhận nghiên cứu và trả về kết quả đánh giá có cấu trúc là Đạt/Không đạt.
Đầ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 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.
- Mở
agents/judge/agent.py. - Xác định giản đồ
JudgeFeedbackvà tác nhânjudge.# 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=True và disallow_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.
5. 🧪 Kiểm thử riêng biệt
Trước khi kết nối, chúng ta có thể xác minh rằng mỗi nhân viên hỗ trợ đều hoạt động. ADK cho phép bạn chạy từng tác nhân.
Khái niệm chính: Thời gian chạy tương tác
adk run tạo ra một môi trường đơn giản, trong đó bạn là "người dùng". Điều này cho phép bạn kiểm thử riêng biệt hướng dẫn và cách sử dụng công cụ của tác nhân. Nếu không thực hiện được bước này (ví dụ: không thể sử dụng Google Tìm kiếm), thì chắc chắn tác nhân sẽ không thực hiện được trong quá trình điều phối.
- Chạy Researcher theo cách tương tác. Xin lưu ý rằng chúng tôi trỏ đến thư mục tác nhân cụ thể:
# This runs the researcher agent in interactive mode uv run adk run agents/researcher - Trong câu lệnh trò chuyện, hãy nhập:
Bạn nên sử dụng công cụ Tìm kiếm của Google và trả về câu trả lời.Lưu ý: Nếu bạn thấy lỗi cho biết dự án, vị trí và việc sử dụng đỉnh chưa được đặt, hãy đảm bảo rằng bạn đã đặt mã dự án và thực thi như sau:Find the population of Tokyo in 2020export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project) export GOOGLE_CLOUD_LOCATION=us-central1 export GOOGLE_GENAI_USE_VERTEXAI=true - Thoát khỏi cuộc trò chuyện (Ctrl+C).
- Chạy Judge theo cách tương tác:
uv run adk run agents/judge - Trong câu lệnh trò chuyện, hãy mô phỏng nội dung đầu vào:
Hàm này sẽ trả vềTopic: Tokyo. Findings: Tokyo is a city.status='fail'vì các kết quả quá ngắn gọn.
6. ✍️ Trợ lý 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.
- Mở
agents/content_builder/agent.py. - Xác định tác nhân
content_builder.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. 3. Use bullet points and clear paragraphs. 4. Maintain a professional but engaging tone. Ensure the content directly addresses the user's original request. """, ) root_agent = content_builder
Khái niệm chính: Truyền bối cảnh
Bạn có thể thắc mắc: "Làm cách nào mà Trình tạo nội dung biết được những gì mà Nhà nghiên cứu 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. 🎻 The Orchestrator

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ác nhân với tác nhân (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ô một cách độc lập và gặp lỗi mà không làm hỏng toàn bộ hệ thống.
Để thực hiện việc 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 AI khám phá và giao tiếp với nhau qua HTTP. RemoteA2aAgent là ứng dụng ADK cho giao thức này.
- Mở
agents/orchestrator/agent.py. - Tìm bình luận
# TODO: Define Remote Agentshoặc phần định nghĩa về nhân viên hỗ trợ từ xa. - Thêm mã sau để xác định các kết nối. Hãy nhớ đặt sau các lệnh nhập và trước mọi định nghĩa tác nhân khác.
# ... 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 chuyển lên cấp trên
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.
- Vẫn còn trong
agents/orchestrator/agent.py. - Tìm phần giữ chỗ
EscalationCheckerTODO. - Thay thế bằng cách triển khai sau:
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

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 -> ...
- Vẫn còn trong
agents/orchestrator/agent.py. - Thêm định nghĩa
research_loop. Đặt sau lớpEscalationCheckervà thực thểescalation_checkernày.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ự.
researcher: Tìm dữ liệu.judge: Đánh giá dữ liệu.escalation_checker: Quyết định cóyield Event(escalate=True)hay không. Nếuescalate=Truexảy ra, vòng lặp sẽ kết thúc 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 đamax_iterations).
10. 🔗 Quy trình cuối cùng

Cuối cùng, hãy ghép tất cả lại với nhau.
- Vẫn còn trong
agents/orchestrator/agent.py. - Xác định
root_agentở cuối tệp. Đảm bảo rằng phần giữ chỗ này thay thế mọi phần giữ chỗroot_agent = Nonehiện có.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. 💻 Chạy cục bộ
Trước khi chạy mọi thứ, hãy xem cách ADK mô phỏng môi trường phân tán cục bộ.
Tìm hiểu chuyên sâu: Cách hoạt động của hoạt động phát triển tại địa phương
Trong cấu trúc vi dịch vụ, mọi tác nhân đều chạy dưới dạng máy chủ riêng. Khi triển khai, bạn sẽ có 4 dịch vụ Cloud Run khác nhau. Việc mô phỏng này trên máy cục bộ có thể gây khó chịu nếu bạn phải mở 4 thẻ terminal và chạy 4 lệnh.
Tập lệnh này bắt đầu các quy trình uvicorn cho Nhà nghiên cứu (cổng 8001), Người đánh giá (8002) và Trình tạo nội dung (8003). Thao tác này sẽ đặt các biến môi trường như RESEARCHER_AGENT_CARD_URL và truyền chúng đến Orchestrator (cổng 8004). Đây chính xác là cách chúng ta sẽ định cấu hình nó trên đám mây sau này!

- Chạy tập lệnh điều phối:
Lệnh này sẽ bắt đầu 4 quy trình riêng biệt../run_local.sh - Kiểm thử:
- Nếu bạn đang dùng Cloud Shell: Nhấp vào nút Xem trước trên web (ở trên cùng bên phải của thiết bị đầu cuối) -> Xem trước trên cổng 8080 -> Thay đổi cổng thành
8000. - Nếu chạy cục bộ: Mở
http://localhost:8000trong trình duyệt. - Câu lệnh: "Tạo một khoá học về lịch sử của cà phê."
- Quan sát: Orchestrator sẽ gọi cho Researcher. Kết quả sẽ được gửi đến Judge. Nếu Thẩm phán không vượt qua được, vòng lặp sẽ tiếp tục!
- "Internal Server Error" (Lỗi máy chủ nội bộ)/Lỗi xác thực: Nếu bạn thấy lỗi xác thực (ví dụ: liên quan đến
google-auth), hãy đảm bảo bạn đã chạygcloud auth application-default loginnếu đang chạy trên máy cục bộ. Trong Cloud Shell, hãy đảm bảo bạn đã đặt biến môi trườngGOOGLE_CLOUD_PROJECTmột cách chính xác. - Lỗi dòng lệnh: Nếu lệnh không thành công trong cửa sổ dòng lệnh mới, hãy nhớ xuất lại các biến môi trường (
GOOGLE_CLOUD_PROJECT, v.v.).
- Nếu bạn đang dùng Cloud Shell: Nhấp vào nút Xem trước trên web (ở trên cùng bên phải của thiết bị đầu cuối) -> Xem trước trên cổng 8080 -> Thay đổi cổng thành
- Kiểm thử các tác nhân riêng biệt: Ngay cả khi toàn bộ hệ thống đang chạy, bạn vẫn có thể kiểm thử các tác nhân cụ thể bằng cách nhắm đến trực tiếp các cổng của chúng. Điều này hữu ích khi bạn gỡ lỗi một thành phần cụ thể mà không cần kích hoạt toàn bộ chuỗi.
- Chỉ dành cho nhà nghiên cứu (Cổng 8001):
http://localhost:8001 - Chỉ đánh giá (Cổng 8002):
http://localhost:8002 - Chỉ Content Builder (Cổng 8003):
http://localhost:8003 - Orchestrator (Cổng 8004):
http://localhost:8004(Truy cập trực tiếp vào logic của Orchestrator)
- Chỉ dành cho nhà nghiên cứu (Cổng 8001):
12. 🚀 Triển khai lên Cloud Run
Quá trình xác thực cuối cùng đang diễn ra trên đám mây. Chúng tôi sẽ triển khai từng tác nhân dưới dạng một dịch vụ riêng biệt.
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 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 tôi cho phép Orchestrator khám phá và giao tiếp với Researcher, Judge và Content Builder qua Internet.
- Triển khai Researcher:
Ghi lại URL:gcloud run deploy researcher \ --source agents/researcher/ \ --region us-central1 \ --allow-unauthenticated \ --labels dev-tutorial=prod-ready-1 \ --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \ --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"RESEARCHER_URL=$(gcloud run services describe researcher --region us-central1 --format='value(status.url)') echo $RESEARCHER_URL - Triển khai Judge:
Ghi lại URL:gcloud run deploy judge \ --source agents/judge/ \ --region us-central1 \ --allow-unauthenticated \ --labels dev-tutorial=prod-ready-1 \ --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \ --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"JUDGE_URL=$(gcloud run services describe judge --region us-central1 --format='value(status.url)') echo $JUDGE_URL - Triển khai Content Builder:
Ghi lại URL:gcloud run deploy content-builder \ --source agents/content_builder/ \ --region us-central1 \ --allow-unauthenticated \ --labels dev-tutorial=prod-ready-1 \ --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \ --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"CONTENT_BUILDER_URL=$(gcloud run services describe content-builder --region us-central1 --format='value(status.url)') echo $CONTENT_BUILDER_URL - Triển khai Orchestrator: Sử dụng các biến môi trường đã ghi lại để định cấu hình Orchestrator.
Ghi lại URL:gcloud run deploy orchestrator \ --source agents/orchestrator/ \ --region us-central1 \ --allow-unauthenticated \ --labels dev-tutorial=prod-ready-1 \ --set-env-vars RESEARCHER_AGENT_CARD_URL=$RESEARCHER_URL/a2a/agent/.well-known/agent-card.json \ --set-env-vars JUDGE_AGENT_CARD_URL=$JUDGE_URL/a2a/agent/.well-known/agent-card.json \ --set-env-vars CONTENT_BUILDER_AGENT_CARD_URL=$CONTENT_BUILDER_URL/a2a/agent/.well-known/agent-card.json \ --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \ --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"ORCHESTRATOR_URL=$(gcloud run services describe orchestrator --region us-central1 --format='value(status.url)') echo $ORCHESTRATOR_URL - Triển khai giao diện người dùng:
gcloud run deploy course-creator \ --source app \ --region us-central1 \ --allow-unauthenticated \ --labels dev-tutorial=prod-ready-1 \ --set-env-vars AGENT_SERVER_URL=$ORCHESTRATOR_URL \ --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT - Kiểm thử việc triển khai từ xa: Mở URL của Orchestrator mà bạn đã triển khai. Giờ đây, ứng dụng này hoàn toàn chạy trên đám mây, tận dụng cơ sở hạ tầng phi máy chủ của Google để mở rộng quy mô các tác nhân của bạn!Gợi ý: Bạn sẽ tìm thấy tất cả các vi dịch vụ và URL của chúng trong giao diện Cloud Run
13. Tóm tắt
Xin chúc mừng! Bạn đã tạo và triển khai thành công một hệ thống đa tác nhân phân tán sẵn sàng cho hoạt động sản xuất.
Những thành tựu chúng tôi đạt được
- Chia nhỏ một việc 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 quy trình Kiểm soát chất lượng: Chúng tôi đã sử dụng
LoopAgentvàJudgecó 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) và 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
SequentialAgentvàLoopAgentđể xác định các mẫu luồng điều khiển rõ ràng.
Các bước tiếp theo
Giờ đây, khi đã có nền tảng, bạn có thể mở rộng hệ thống này:
- Thêm công cụ: Cấp cho Nhà nghiên cứu quyền truy cập vào các tài liệu hoặc API nội bộ.
- Cải thiện Judge: Thêm tiêu chí cụ thể hơn hoặc thậm chí là bước "Có sự tham gia của con người".
- Đổi mô hình: Thử dùng các mô hình khác nhau cho các tác nhân khác nhau (ví dụ: mô hình nhanh hơn cho Giám khảo, mô hình mạnh hơn cho Người viết nội dung).
Giờ đây, bạn đã sẵn sàng xây dựng các quy trình công việc phức tạp, đáng tin cậy dựa trên tác nhân trên Google Cloud!