สร้างระบบหลายเอเจนต์ด้วย ADK

1. บทนำ

ภาพรวม

แล็บนี้สอนวิธีจัดระเบียบระบบแบบหลายเอเจนต์ที่ซับซ้อนโดยใช้ Agent Development Kit (Google ADK) ของ Google คุณจะเปลี่ยนจากลำดับชั้นของ Agent แบบง่ายๆ ไปเป็นการสร้างเวิร์กโฟลว์อัตโนมัติที่ทำงานร่วมกัน

สิ่งที่คุณจะสร้าง

คุณจะสร้างระบบแบบหลายเอเจนต์ที่แตกต่างกัน 2 ระบบ ดังนี้

  • เอเจนต์วางแผนการเดินทางแบบง่ายๆ ที่เรียนรู้การโอนการสนทนาระหว่างเอเจนต์ "ระดมความคิด" กับเอเจนต์ "วางแผนสถานที่ท่องเที่ยว"
  • เครื่องมือสร้างการเสนอภาพยนตร์ขั้นสูงที่ใช้ "ห้องนักเขียน" ของเอเจนต์อัตโนมัติ (เช่น นักวิจัย นักเขียนบท และนักวิจารณ์) เพื่อทำงานร่วมกันในลูปเพื่อสร้างพล็อตภาพยนตร์เต็มรูปแบบ

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างความสัมพันธ์ระหว่างเอเจนซีหลักและเอเจนซีย่อย
  • วิธีเขียนข้อมูลไปยังเซสชัน state จากเครื่องมือ
  • วิธีอ่านจาก state โดยใช้การสร้างเทมเพลตคีย์ (เช่น {my_key?})
  • วิธีใช้ SequentialAgent สำหรับเวิร์กโฟลว์แบบทีละขั้นตอน
  • วิธีใช้ LoopAgent เพื่อสร้างวงจรการปรับแต่งซ้ำๆ
  • วิธีใช้ ParallelAgent เพื่อเรียกใช้ฟังก์ชันพร้อมกัน

2. ระบบหลายเอเจนต์

ชุดพัฒนา Agent (ADK) ช่วยให้นักพัฒนาแอปได้รับพฤติกรรมที่ซับซ้อนหลายขั้นตอนจากโมเดล Generative ที่น่าเชื่อถือมากขึ้น ADK ช่วยให้คุณสร้างโฟลว์ของ Agent หลายตัวที่เรียบง่ายกว่าซึ่งทำงานร่วมกันเพื่อแก้ปัญหาด้วยการแบ่งงาน แทนที่จะใช้พรอมต์ที่ซับซ้อนเพียงรายการเดียว

แนวทางนี้มีข้อดีหลายประการเมื่อเทียบกับการใช้พรอมต์แบบโมโนลิธรายการเดียว ดังนี้

  • การออกแบบที่ง่ายขึ้น: การออกแบบและจัดระเบียบโฟลว์ของเอเจนต์ขนาดเล็กที่เชี่ยวชาญเฉพาะทางนั้นง่ายกว่าการออกแบบพรอมต์ขนาดใหญ่ที่ซับซ้อน
  • ความน่าเชื่อถือ: เอเจนต์เฉพาะทางมีความน่าเชื่อถือในงานที่เฉพาะเจาะจงมากกว่าเอเจนต์ขนาดใหญ่ที่ซับซ้อน
  • การบำรุงรักษา: การแก้ไขหรือปรับปรุงเอเจนต์ขนาดเล็กที่เชี่ยวชาญเฉพาะทางจะทำได้ง่ายกว่าโดยไม่กระทบต่อส่วนอื่นๆ ของระบบ
  • ความสามารถในการแยกส่วน: คุณสามารถนำเอเจนต์ที่สร้างขึ้นสำหรับเวิร์กโฟลว์หนึ่งไปใช้ซ้ำในเวิร์กโฟลว์อื่นๆ ได้อย่างง่ายดาย

แผนผังตัวแทนแบบลำดับชั้น

โครงสร้างแบบต้นไม้ที่แสดงเอเจนต์แบบลำดับชั้น

ใน ADK คุณจะจัดระเบียบเอเจนต์ในโครงสร้างแบบต้นไม้ ลำดับชั้นนี้เป็นกุญแจสำคัญในการควบคุมลำดับการสนทนา เนื่องจากจะจำกัดว่าตัวแทนคนใดสามารถ "ส่งต่อ" การสนทนาไปยังตัวแทนคนอื่นๆ ได้ ซึ่งจะช่วยให้คาดการณ์พฤติกรรมของระบบได้มากขึ้นและแก้ไขข้อบกพร่องได้ง่ายขึ้น สิทธิประโยชน์มีดังนี้

  • การออกแบบที่ใช้งานง่าย: โครงสร้างได้รับแรงบันดาลใจจากทีมในโลกแห่งความเป็นจริง จึงทำให้เข้าใจได้ง่ายขึ้น
  • โฟลว์ที่ควบคุมได้: ลำดับชั้นช่วยให้คุณควบคุมการมอบหมายงานได้อย่างแม่นยำ ซึ่งจะช่วยในการแก้ไขข้อบกพร่อง ตัวอย่างเช่น โครงสร้างแบบต้นไม้จะช่วยให้ระบบเรียกใช้ตัวแทนการเขียนรายงานที่ถูกต้องได้ แม้ว่าคุณจะมีตัวแทน 2 คนที่มีคำอธิบายคล้ายกันก็ตาม

โครงสร้างทั้งหมดเริ่มต้นด้วย root_agent เอเจนต์นี้ทำหน้าที่เป็นเอเจนต์หลักและอาจมีเอเจนต์ย่อยอย่างน้อย 1 ราย ซึ่งเอเจนต์ย่อยเหล่านี้ก็อาจเป็นเอเจนต์หลักของเอเจนต์ย่อยของตนเองได้เช่นกัน ทำให้เกิดโครงสร้างแบบต้นไม้

3. การตั้งค่าโปรเจ็กต์

บัญชี Google

หากยังไม่มีบัญชี Google ส่วนบุคคล คุณต้องสร้างบัญชี Google

ใช้บัญชีส่วนตัวแทนบัญชีของที่ทำงานหรือโรงเรียน

ลงชื่อเข้าใช้ Google Cloud Console

ลงชื่อเข้าใช้ Google Cloud Console โดยใช้บัญชี Google ส่วนตัว

เปิดใช้การเรียกเก็บเงิน

แลกรับเครดิต Google Cloud มูลค่า $5 (ไม่บังคับ)

หากต้องการจัดเวิร์กช็อปนี้ คุณต้องมีบัญชีสำหรับการเรียกเก็บเงินที่มีเครดิตอยู่บ้าง หากวางแผนที่จะใช้การเรียกเก็บเงินของคุณเอง ให้ข้ามขั้นตอนนี้

  1. คลิกลิงก์นี้ แล้วลงชื่อเข้าใช้ด้วยบัญชี Google ส่วนบุคคล คุณจะเห็นข้อความคล้ายกับนี้คลิกที่นี่เพื่อไปที่หน้าเครดิต
  2. คลิกปุ่มคลิกที่นี่เพื่อเข้าถึงเครดิต ระบบจะนำคุณไปยังหน้าเพื่อตั้งค่าโปรไฟล์การเรียกเก็บเงินตั้งค่าหน้าโปรไฟล์การเรียกเก็บเงิน
  3. คลิกยืนยัน

ตอนนี้คุณเชื่อมต่อกับบัญชีสำหรับการเรียกเก็บเงินของ Google Cloud Platform เวอร์ชันทดลองใช้งานแล้ว

ภาพหน้าจอของภาพรวมการเรียกเก็บเงิน

ตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว

หากตั้งค่าการเรียกเก็บเงินโดยใช้เครดิต Google Cloud คุณจะข้ามขั้นตอนนี้ได้

หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว ให้ไปที่นี่เพื่อเปิดใช้การเรียกเก็บเงินใน Cloud Console

ข้อควรทราบ

  • การทำแล็บนี้ควรมีค่าใช้จ่ายน้อยกว่า $1 USD ในทรัพยากรระบบคลาวด์
  • คุณสามารถทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
  • ผู้ใช้ใหม่มีสิทธิ์ใช้ช่วงทดลองใช้ฟรีมูลค่า$300 USD

สร้างโปรเจ็กต์ (ไม่บังคับ)

หากไม่มีโปรเจ็กต์ปัจจุบันที่ต้องการใช้สำหรับแล็บนี้ ให้สร้างโปรเจ็กต์ใหม่ที่นี่

4. เปิดเครื่องมือแก้ไข Cloud Shell

  1. คลิกลิงก์นี้เพื่อไปยัง Cloud Shell Editor โดยตรง
  2. หากระบบแจ้งให้ให้สิทธิ์ในวันนี้ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อคลิกเพื่อให้สิทธิ์ Cloud Shell
  3. หากเทอร์มินัลไม่ปรากฏที่ด้านล่างของหน้าจอ ให้เปิดโดยทำดังนี้
    • คลิกดู
    • คลิก Terminalเปิดเทอร์มินัลใหม่ใน Cloud Shell Editor
  4. ในเทอร์มินัล ให้ตั้งค่าโปรเจ็กต์ด้วยคำสั่งนี้
    gcloud config set project [PROJECT_ID]
    
    • ตัวอย่าง
      gcloud config set project lab-project-id-example
      
    • หากจำรหัสโปรเจ็กต์ไม่ได้ คุณสามารถแสดงรหัสโปรเจ็กต์ทั้งหมดได้โดยใช้คำสั่งต่อไปนี้
      gcloud projects list
      
      ตั้งค่ารหัสโปรเจ็กต์ในเทอร์มินัลของ Cloud Shell Editor
  5. คุณควรเห็นข้อความต่อไปนี้
    Updated property [core/project].
    

5. เปิดใช้ API

หากต้องการใช้ Vertex AI API และโต้ตอบกับโมเดล Gemini คุณต้องเปิดใช้ Vertex AI API ในโปรเจ็กต์ Google Cloud

  1. เปิดใช้ API ในเทอร์มินัลโดยทำดังนี้
    gcloud services enable aiplatform.googleapis.com
    

ข้อมูลเบื้องต้นเกี่ยวกับ Vertex AI SDK สำหรับ Python

หากต้องการโต้ตอบกับโมเดลที่โฮสต์ใน Vertex AI จากแอปพลิเคชัน Python คุณจะต้องใช้ Vertex AI SDK สำหรับ Python SDK นี้ช่วยลดความซับซ้อนของกระบวนการส่งพรอมต์ การระบุพารามิเตอร์ของโมเดล และการรับการตอบกลับโดยไม่ต้องจัดการความซับซ้อนของการเรียก API พื้นฐานโดยตรง

คุณดูเอกสารประกอบที่ครอบคลุมสำหรับ Vertex AI SDK สำหรับ Python ได้ที่ข้อมูลเบื้องต้นเกี่ยวกับ Vertex AI SDK สำหรับ Python | Google Cloud

6. ตั้งค่าสภาพแวดล้อมของโปรเจ็กต์

โคลนที่เก็บ

  1. ในเทอร์มินัล ให้โคลนที่เก็บที่มีไฟล์เริ่มต้น
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git devrel-demos-multiagent-lab
    
    แฟล็ก --depth 1 จะโคลนเฉพาะเวอร์ชันล่าสุด ซึ่งเร็วกว่า
  2. ในเทอร์มินัล ให้ย้ายโฟลเดอร์เฉพาะของแล็บไปยังไดเรกทอรีหลัก แล้วเปลี่ยนชื่อให้ตรงกับโครงสร้างที่คาดไว้ของแล็บ
    mv devrel-demos-multiagent-lab/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems ~
    
  3. ในเทอร์มินัล ให้ไปที่ไดเรกทอรีการทำงานที่ถูกต้องสำหรับแล็บนี้ (adk_multiagent_systems)
    cd ~/adk_multiagent_systems
    

ตรวจสอบโครงสร้างไฟล์

เมื่อสร้างไฟล์ทั้งหมดแล้ว ให้เปิดโฟลเดอร์ adk_multiagent_systems ใน Explorer เพื่อดูโครงสร้างทั้งหมด

  1. ในเมนู Cloud Shell Editor ให้เลือกไฟล์ > เปิดโฟลเดอร์...
    เมนูไฟล์ของ Cloud Shell Editor ที่เลือก "เปิดโฟลเดอร์"
  2. ในช่องที่ปรากฏขึ้น ให้เพิ่มข้อมูลโฟลเดอร์ต่อไปนี้หลังชื่อผู้ใช้ adk_multiagent_systems/ คลิกตกลง
    โดยควรมีลักษณะดังนี้
    เปิดกล่องโต้ตอบโฟลเดอร์ที่มีเส้นทางโปรเจ็กต์
  3. แผง Explorer ทางด้านซ้ายจะรีเฟรช ตอนนี้คุณควรเห็นโครงสร้างโปรเจ็กต์ที่สมบูรณ์พร้อมไดเรกทอรีย่อย parent_and_subagents และ workflow_agents ซึ่งพร้อมสำหรับขั้นตอนถัดไป
    แผง Explorer แสดงโฟลเดอร์ adk_multiagent_systems ที่เปิดอยู่

เปิดใช้งานสภาพแวดล้อมเสมือน

  1. ในเทอร์มินัล ให้สร้างและเปิดใช้งานสภาพแวดล้อมเสมือนโดยใช้ uv วิธีนี้ช่วยให้มั่นใจได้ว่าการขึ้นต่อกันของโปรเจ็กต์จะไม่ขัดแย้งกับ Python ของระบบหรือโปรเจ็กต์อื่นๆ
    uv venv
    source .venv/bin/activate
    
  2. ในเทอร์มินัล ให้ติดตั้ง google-adk และการอ้างอิงอื่นๆ จากไฟล์ requirements.txt โดยใช้คำสั่งต่อไปนี้
    uv pip install -r requirements.txt
    

ตั้งค่าตัวแปรสภาพแวดล้อม

  1. คุณอยู่ในไดเรกทอรี adk_multiagent_systems อยู่แล้ว ในเทอร์มินัล ให้สร้างไฟล์ .env เพื่อจัดเก็บตัวแปรสภาพแวดล้อม
    cloudshell edit .env
    
  2. วางโค้ดต่อไปนี้ลงในไฟล์ .env ที่เปิดในเครื่องมือแก้ไข
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. แทนที่ [YOUR-PROJECT-ID] ด้วยรหัสโปรเจ็กต์ Google Cloud จริง (เช่น PROJECT_ID = "google-cloud-labs")
    หากจำรหัสโปรเจ็กต์ไม่ได้ ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล โดยจะแสดงรายการโปรเจ็กต์ทั้งหมดและรหัสของโปรเจ็กต์
    gcloud projects list
    
  4. ในเทอร์มินัล ให้คัดลอกไฟล์ .env นี้ลงในไดเรกทอรีย่อยของ Agent เพื่อให้ Agent เข้าถึงตัวแปรได้ด้วย
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    ตอนนี้โครงสร้างไฟล์ควรมีลักษณะดังนี้
    แผง Explorer แสดงโฟลเดอร์ adk_multiagent_systems ที่เปิดอยู่

7. ดูข้อมูลเกี่ยวกับการโอนระหว่างเอเจนต์หลัก เอเจนต์ย่อย และเอเจนต์ที่เป็นเพียร์

การสนทนาจะเริ่มต้นด้วย root_agent เสมอ โดยค่าเริ่มต้น ตัวแทนหลักจะใช้ description ของตัวแทนย่อยเพื่อตัดสินใจว่าจะโอนการสนทนาเมื่อใด นอกจากนี้ คุณยังแนะนำการโอนเหล่านี้อย่างชัดเจนใน instruction ของผู้ปกครองได้โดยใช้ name ของตัวแทนย่อย

มาทดสอบกัน

  1. ใน Cloud Shell Editor ให้เปิด adk_multiagent_systems/parent_and_subagents/agent.py สังเกตเอเจนต์ 3 รายในไฟล์ agent.py ดังนี้
    • root_agent (ชื่อ steering): ถามคำถามผู้ใช้เพื่อตัดสินใจว่าจะโอนไปยังตัวแทนย่อยรายใด ในตอนแรกจะอาศัยเพียง description ของตัวแทนย่อยเท่านั้น
    • travel_brainstormer: ช่วยผู้ใช้ระดมความคิดเกี่ยวกับจุดหมายปลายทาง
    • attractions_planner: ช่วยให้ผู้ใช้แสดงรายการสิ่งที่ต้องทำในประเทศที่เฉพาะเจาะจง
  2. สร้าง travel_brainstormer และ attractions_planner เป็น Agent ย่อยของ root_agent โดยเพิ่มบรรทัดต่อไปนี้ในการสร้าง root_agent
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. ในเทอร์มินัล ให้แชทกับเอเจนต์โดยทำดังนี้
    cd ~/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. ที่พรอมต์ [user]: ในเทอร์มินัล ให้พิมพ์
    hello
    
    ตัวอย่างเอาต์พุต (ของคุณอาจแตกต่างออกไปเล็กน้อย)
    [steering]: Hi there! Do you already have a country in mind for your trip, or would you like some help deciding where to go?
    
  5. ตอนนี้ให้บอก Agent ในเทอร์มินัลว่า
    I could use some help deciding.
    
    ตัวอย่างเอาต์พุต (ของคุณอาจแตกต่างออกไปเล็กน้อย)
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    สังเกตแท็ก [travel_brainstormer] root_agent การควบคุมที่โอนจะอิงตาม เฉพาะ description ของตัวแทนย่อย
  6. ที่พรอมต์ user: ในเทอร์มินัล ให้พิมพ์ exit แล้วกด ENTER เพื่อสิ้นสุดการสนทนา
  7. ทีนี้มาดูตัวอย่างที่ชัดเจนขึ้นกัน ใน agent.py ให้เพิ่มรายการต่อไปนี้ลงใน instruction ของ root_agent
            If they need help deciding, send them to 'travel_brainstormer'.
            If they know what country they'd like to visit, send them to the 'attractions_planner'.
    
  8. ในเทอร์มินัล ให้เรียกใช้ Agent อีกครั้ง
    adk run parent_and_subagents
    
  9. ที่พรอมต์ [user]: ในเทอร์มินัล ให้พิมพ์
    hello
    
  10. ให้ตอบว่า
    I would like to go to Japan.
    
    ตัวอย่างเอาต์พุต (ของคุณอาจแตกต่างออกไปเล็กน้อย)
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    โปรดสังเกตการโอนไปยัง attractions_planner ตามคำแนะนำใหม่
  11. ตอนนี้ให้ตอบว่า
    Actually I don't know what country to visit.
    
    ตัวอย่างเอาต์พุต (ของคุณอาจแตกต่างออกไปเล็กน้อย)
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    โปรดทราบว่าระบบได้โอนคุณไปยัง travel_brainstormer ซึ่งเป็นเพียร์ของ attractions_planner ซึ่งจะอนุญาตโดยค่าเริ่มต้น
  12. ที่พรอมต์ผู้ใช้ ให้พิมพ์ exit เพื่อสิ้นสุดเซสชัน

สรุป

ในส่วนนี้ คุณได้เรียนรู้พื้นฐานของลำดับชั้นของตัวแทนและโฟลว์การสนทนาแล้ว ดังนี้

  • การสนทนาจะเริ่มต้นด้วย root_agent เสมอ
  • เอเจนต์หลักจะโอนสายไปยังเอเจนต์ย่อยโดยอัตโนมัติตามdescription
  • คุณควบคุมขั้นตอนการทำงานนี้ได้อย่างชัดเจนโดยให้สิทธิ์ผู้ปกครอง instruction ในการโอนไปยังตัวแทนย่อยโดย name
  • โดยค่าเริ่มต้น ตัวแทนจะโอนสายไปยังตัวแทน peer (ตัวแทนที่อยู่ในระดับเดียวกันในลำดับชั้น) ได้

8. ใช้สถานะเซสชันเพื่อจัดเก็บและเรียกข้อมูล

การสนทนา ADK ทุกครั้งจะมี Session ซึ่งรวมถึงพจนานุกรมสถานะเซสชัน เอเจนต์ทุกคนสามารถเข้าถึงสถานะนี้ได้ จึงเป็นวิธีที่เหมาะที่สุดในการส่งต่อข้อมูลระหว่างเอเจนต์หรือเก็บรักษาข้อมูล (เช่น รายการ) ตลอดการสนทนา

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มและการอ่านจากสถานะ ให้ทำดังนี้

  1. กลับไปที่ไฟล์ adk_multiagent_systems/parent_and_subagents/agent.py
  2. วางคำจำกัดความฟังก์ชันต่อไปนี้หลังส่วนหัว # Tools
    def save_attractions_to_state(
    tool_context: ToolContext,
    attractions: List[str]
    ) -> dict[str, str]:
        """Saves the list of attractions to state["attractions"].
    
        Args:
            attractions [str]: a list of strings to add to the list of attractions
    
        Returns:
            None
        """
        # Load existing attractions from state. If none exist, start an empty list
        existing_attractions = tool_context.state.get("attractions", [])
    
        # Update the 'attractions' key with a combo of old and new lists.
        # When the tool is run, ADK will create an event and make
        # corresponding updates in the session's state.
        tool_context.state["attractions"] = existing_attractions + attractions
    
        # A best practice for tools is to return a status message in a return dict
        return {"status": "success"}
    
    ในโค้ดนี้ ให้สังเกตสิ่งต่อไปนี้
    • ฟังก์ชันจะได้รับ tool_context: ToolContext ออบเจ็กต์นี้คือเกตเวย์ไปยังเซสชัน
    • บรรทัด tool_context.state["attractions"] = ... จะอ่านและเขียนลงในพจนานุกรมสถานะของเซสชันโดยตรง ส่วน ADK จะจัดการที่เหลือให้
  3. เพิ่มเครื่องมือลงใน attractions_planner Agent โดยเพิ่มพารามิเตอร์ tools ดังนี้
        tools=[save_attractions_to_state]
    
  4. เพิ่มหัวข้อย่อยต่อไปนี้ลงในattractions_plannerinstructionที่มีอยู่ของตัวแทน
            - When they reply, use your tool to save their selected attraction and then provide more possible attractions.
            - If they ask to view the list, provide a bulleted list of { attractions? } and then suggest some more.
    
  5. เปิดใช้ UI บนเว็บของ Agent Development Kit ด้วยคำสั่งต่อไปนี้ในเทอร์มินัล
    adk web
    
    เอาต์พุต
    INFO:     Started server process [2434]
    INFO:     Waiting for application startup.
    +-------------------------------------------------------+
    | ADK Web Server started                                |
    |                                                       |
    | For local testing, access at http://localhost:8000.   |
    +-------------------------------------------------------+
    
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    
  6. ในเทอร์มินัล Cloud Shell ให้คลิกหากต้องการดูอินเทอร์เฟซเว็บในแท็บใหม่ ให้คลิกปุ่มตัวอย่างเว็บ แล้วเลือกเปลี่ยนพอร์ต
    เมนูตัวอย่างเว็บ
  7. ป้อนหมายเลขพอร์ต 8000 แล้วคลิกเปลี่ยนและแสดงตัวอย่าง แท็บเบราว์เซอร์ใหม่จะเปิดขึ้นพร้อมกับ UI สำหรับนักพัฒนา ADK
    เปลี่ยนช่องป๊อปอัปพอร์ตโดยป้อน 8000 ในกล่องข้อความ
  8. จากเมนูแบบเลื่อนลงเลือกตัวแทนทางด้านซ้าย ให้เลือก parent_and_subagents
  9. เริ่มการสนทนาด้วยข้อความต่อไปนี้ hello
  10. หลังจากตัวแทนกล่าวทักทายแล้ว ให้ตอบกลับด้วยข้อความต่อไปนี้
    I'd like to go to Egypt.
    
    ระบบจะโอนสายไปยัง attractions_planner และแสดงรายการสถานที่ท่องเที่ยวให้คุณ
  11. เลือกสถานที่ท่องเที่ยว เช่น
    I'll go to the Sphinx
    
  12. คุณควรได้รับคำตอบเช่น โอเค ฉันบันทึกสฟิงซ์ลงในลิสต์ของคุณแล้ว...
  13. คลิกกล่องเครื่องมือตอบกลับ (ทำเครื่องหมายด้วยเครื่องหมายถูก) เพื่อดูกิจกรรมที่สร้างขึ้นจากการตอบกลับของเครื่องมือ
    โปรดทราบว่าฟิลด์นี้มีฟิลด์ actions ซึ่งมี stateDelta ที่อธิบายการเปลี่ยนแปลงสถานะ
  14. ตอบกลับด้วยสถานที่ท่องเที่ยวอื่นจากรายการของตัวแทน
  15. ในเมนูการนำทางด้านซ้าย ให้คลิก "X" เพื่อออกจากโฟกัสที่เหตุการณ์ที่คุณตรวจสอบก่อนหน้านี้
  16. คลิกแท็บสถานะในแถบด้านข้างทางซ้าย ตอนนี้คุณจะเห็นอาร์เรย์ attractions ในสถานะของเซสชัน ซึ่งควรมีทั้ง 2 รายการที่คุณเลือกตัวอย่างสถานะเซสชันในเว็บ UI
  17. ส่งข้อความนี้ถึงตัวแทน
    What is on my list?
    
    ตอนนี้ Agent ควรจะอ่านจากสถานะและแสดงรายการของคุณ
  18. เมื่อทดสอบเอเจนต์เสร็จแล้ว ให้ปิดแท็บเว็บเบราว์เซอร์และกด CTRL + C ในเทอร์มินัล Cloud Shell เพื่อหยุดเซิร์ฟเวอร์

สรุปส่วน

ในส่วนนี้ คุณได้เรียนรู้วิธีใช้สถานะ Session เพื่อแชร์ข้อมูลแล้ว ดังนี้

  • หากต้องการเขียนสถานะ: คุณจะเขียนไปยังพจนานุกรมสถานะจากภายในเครื่องมือได้โดยใช้ออบเจ็กต์ tool_context.state (เช่น tool_context.state["my_list"] = [...])
  • อ่านสถานะ: คุณจะแทรกข้อมูลสถานะลงใน instruction ของเอเจนต์โดยตรงได้โดยใช้การสร้างเทมเพลตคีย์ (เช่น Here is your list: {my_list?})
  • หากต้องการตรวจสอบสถานะ คุณสามารถตรวจสอบสถานะเซสชันแบบเรียลไทม์ใน ADK Dev UI ได้โดยใช้แท็บสถานะ

9. Agent เวิร์กโฟลว์

ที่ผ่านมา คุณได้เห็นวิธีที่เอเจนต์หลักโอนสายไปยังเอเจนต์ย่อยแล้วรอผู้ใช้ เอเจนต์เวิร์กโฟลว์จะแตกต่างออกไป โดยจะเรียกใช้เอเจนต์ย่อยทีละตัวในโฟลว์อัตโนมัติโดยไม่ต้องรออินพุตจากผู้ใช้

ซึ่งเหมาะอย่างยิ่งสำหรับงานแบบหลายขั้นตอนที่ทำงานอัตโนมัติ เช่น ไปป์ไลน์ "วางแผนและดำเนินการ" หรือ "ร่างและแก้ไข" ADK มี Agent เวิร์กโฟลว์ในตัว 3 รายการเพื่อจัดการเรื่องนี้

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

ส่วนที่เหลือของแล็บนี้จะมุ่งเน้นที่การสร้างระบบหลายเอเจนต์โดยใช้เอเจนต์เวิร์กโฟลว์ทั้ง 3 รายการนี้

คุณจะสร้างเอเจนต์ที่พัฒนาเอกสารการเสนอขายสำหรับภาพยนตร์เรื่องใหม่เกี่ยวกับบุคคลในประวัติศาสตร์ เอเจนต์จะจัดการการค้นคว้า การเขียนแบบวนซ้ำ และการสร้างรายงาน

ในท้ายที่สุด ระบบของคุณจะมีลักษณะดังนี้

แผนภาพระบบหลายเอเจนต์ของทีมแนวคิดภาพยนตร์

คุณจะสร้างระบบนี้ทีละขั้นตอน โดยเริ่มจากเวิร์กโฟลว์ที่ง่ายที่สุด

10. สร้างระบบหลายเอเจนต์ด้วย SequentialAgent

SequentialAgent คือตัวแทนเวิร์กโฟลว์ที่เรียกใช้ตัวแทนย่อยตามลำดับเชิงเส้นอย่างง่าย ระบบจะเรียกใช้เอเจนต์แต่ละตัวในsub_agentsรายการทีละตัวตามลำดับ ซึ่งเหมาะอย่างยิ่งสำหรับไปป์ไลน์ที่ต้องทำงานตามลำดับที่เฉพาะเจาะจง เช่น เอเจนต์เสนอภาพยนตร์ที่คุณจะสร้างในตอนนี้

เวอร์ชันแรกนี้จะมีโครงสร้างดังนี้

Film_concept_team multi-agent system step 1

  • root_agent (greeter) จะต้อนรับผู้ใช้และรับหัวข้อภาพยนตร์
  • จากนั้นระบบจะโอนไปยังSequentialAgentชื่อ film_concept_team ซึ่งจะดำเนินการต่อไปนี้
    1. เรียกใช้เอเจนต์ researcher เพื่อดูข้อเท็จจริงจาก Wikipedia
    2. เรียกใช้ Agent screenwriter เพื่อใช้ข้อเท็จจริงเหล่านั้นในการเขียนโครงเรื่อง
    3. เรียกใช้เอเจนต์ file_writer เพื่อบันทึกพล็อตสุดท้ายลงในไฟล์

มาเริ่มกันเลย

  1. เปิด adk_multiagent_systems/workflow_agents/agent.py ใน Cloud Shell Editor
    อ่านไฟล์คำจำกัดความของเอเจนต์นี้ เนื่องจากต้องกำหนดเอเจนต์ย่อยก่อนจึงจะกำหนดให้กับเอเจนต์หลักได้ คุณจึงอ่านเอเจนต์จากด้านล่างของไฟล์ขึ้นไปด้านบนเพื่ออ่านไฟล์ตามลำดับของโฟลว์การสนทนาได้
  2. สังเกตเครื่องมือ append_to_state ฟังก์ชันตัวช่วยนี้ช่วยให้ Agent สามารถผนวกข้อมูลลงในรายการในสถานะเซสชัน ซึ่งเป็นวิธีที่ researcher และ screenwriter จะส่งต่องานของตน
  3. ลองใช้ Agent ในเทอร์มินัล ให้เปิดอินเทอร์เฟซเว็บโดยเปิดใช้การโหลดซ้ำแบบเรียลไทม์
    cd ~/adk_multiagent_systems
    adk web --reload_agents
    
  4. ในเทอร์มินัล Cloud Shell ให้คลิกหากต้องการดูอินเทอร์เฟซเว็บในแท็บใหม่ ให้คลิกปุ่มตัวอย่างเว็บ แล้วเลือกเปลี่ยนพอร์ต
    เมนูตัวอย่างเว็บ
  5. ป้อนหมายเลขพอร์ต 8000 แล้วคลิกเปลี่ยนและแสดงตัวอย่าง แท็บเบราว์เซอร์ใหม่จะเปิดขึ้นพร้อมกับ UI สำหรับนักพัฒนา ADK
    เปลี่ยนช่องป๊อปอัปพอร์ตโดยป้อน 8000 ในกล่องข้อความ
  6. เลือก workflow_agents จากเมนูแบบเลื่อนลงเลือกตัวแทน
  7. เริ่มการสนทนาด้วย hello ตัวแทน greeter จะตอบกลับ
  8. เมื่อได้รับข้อความแจ้ง ให้ป้อนบุคคลสำคัญในประวัติศาสตร์ คุณสามารถใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้หรือใช้ตัวเลือกของคุณเองก็ได้
    • จางจงจิ่ง
    • Ada Lovelace
    • มาร์คัส ออเรลิอัส
  9. ตอนนี้ SequentialAgent จะเป็นผู้รับช่วงต่อ คุณจะไม่เห็นข้อความใดๆ ที่อยู่ระหว่างกลาง researcher, screenwriter และ file_writer จะทำงานต่อกัน ตัวแทนจะตอบกลับเมื่อลำดับทั้งหมดเสร็จสมบูรณ์แล้วเท่านั้น
    หากไม่สำเร็จ ให้คลิก + เซสชันใหม่ที่ด้านขวาบน แล้วลองอีกครั้ง
  10. เมื่อตัวแทนยืนยันว่าเขียนไฟล์แล้ว ให้ค้นหาและเปิดไฟล์ .txt ใหม่ในไดเรกทอรี movie_pitches ใน Cloud Shell Editor เพื่อดูเอาต์พุต
  11. ใน UI ของ ADK Dev ให้คลิกไอคอนตัวแทนสุดท้ายในประวัติการแชทเพื่อเปิดมุมมองเหตุการณ์
  12. มุมมองเหตุการณ์จะแสดงกราฟภาพของโครงสร้าง Agent คุณจะเห็นว่า greeter เรียกใช้ film_concept_team อย่างไร ซึ่งจะเรียกใช้ตัวแทนย่อยแต่ละรายตามลำดับกราฟเว็บ ADK
  13. คุณสามารถคลิกแท็บคำขอและการตอบกลับสำหรับเอเจนต์ใดก็ได้ในกราฟเพื่อตรวจสอบข้อมูลที่ส่งผ่านอย่างละเอียด รวมถึงสถานะเซสชัน

สรุปส่วน

ในส่วนนี้ คุณได้เรียนรู้วิธีใช้เอเจนต์เวิร์กโฟลว์แล้ว

  • SequentialAgent จะเรียกใช้เอเจนต์ย่อยทีละตัวตามลำดับโดยไม่ต้องรอข้อมูลจากผู้ใช้ระหว่างขั้นตอน
  • นี่คือ "เวิร์กโฟลว์" เนื่องจากผู้ใช้พูดคุยกับ root_agent ซึ่งจะส่งงานให้ SequentialAgent ดำเนินการต่อ
  • เอเจนต์ย่อยในลำดับจะใช้สถานะเซสชัน (เช่น { PLOT_OUTLINE? }) เพื่อเข้าถึงผลงานของเอเจนต์ก่อนหน้า
  • คุณสามารถใช้กราฟเหตุการณ์ใน UI สำหรับนักพัฒนาซอฟต์แวร์เพื่อแสดงภาพและแก้ไขข้อบกพร่องของเวิร์กโฟลว์ทั้งหมดจากเอเจนต์หนึ่งไปยังอีกเอเจนต์หนึ่ง

11. เพิ่ม LoopAgent สำหรับงานที่ต้องทำซ้ำ

LoopAgent คือเอเจนต์เวิร์กโฟลว์ที่เรียกใช้เอเจนต์ย่อยตามลำดับแล้วทำซ้ำโดยเริ่มจากจุดเริ่มต้น "ลูป" นี้จะทำงานต่อไปจนกว่าจะตรงตามเงื่อนไข เช่น ถึงmax_iterations หรือเอเจนต์ย่อยเรียกใช้เครื่องมือ exit_loop ในตัว

ซึ่งมีประโยชน์สำหรับงานที่ต้องมีการปรับแต่งซ้ำๆ คุณจะเพิ่ม LoopAgent นี้เพื่อสร้าง "ห้องนักเขียน" สำหรับเอเจนต์ที่รับหน้าที่นำเสนอภาพยนตร์ ซึ่งจะช่วยให้ researcher, screenwriter และเอเจนต์ critic คนใหม่ทำงานเป็นวงจร ปรับปรุงพล็อตเรื่องในแต่ละรอบจนกว่า critic จะตัดสินใจว่าพร้อมแล้ว นอกจากนี้ยังช่วยให้เอเจนต์จัดการอินพุตของผู้ใช้ที่คลุมเครือมากขึ้น (เช่น "หมอโบราณ") ได้ด้วยการให้เอเจนต์ค้นคว้าและปรับแต่งไอเดีย

Film_concept_team multi-agent system step 2

วิธีทำการเปลี่ยนแปลงเหล่านี้

  1. ใน adk_multiagent_systems/workflow_agents/agent.py ให้เพิ่มการนำเข้าสำหรับ exit_loop (ใกล้กับการนำเข้า google.adk อื่นๆ) ดังนี้
    from google.adk.tools import exit_loop
    
  2. เพิ่มเอเจนต์ critic ใหม่ ตัวแทนจะตรวจสอบเนื้อเรื่อง หากเป็นค่าที่ดี ฟังก์ชันจะเรียกใช้ exit_loop หากไม่ ระบบจะเพิ่มความคิดเห็นลงในสถานะสำหรับลูปถัดไป
    วางคำจำกัดความของ Agent ต่อไปนี้ในส่วน # Agents
    critic = Agent(
        name="critic",
        model=model_name,
        description="Reviews the outline so that it can be improved.",
        instruction="""
        INSTRUCTIONS:
        Consider these questions about the PLOT_OUTLINE:
        - Does it meet a satisfying three-act cinematic structure?
        - Do the characters' struggles seem engaging?
        - Does it feel grounded in a real time period in history?
        - Does it sufficiently incorporate historical details from the RESEARCH?
    
        If the PLOT_OUTLINE does a good job with these questions, exit the writing loop with your 'exit_loop' tool.
        If significant improvements can be made, use the 'append_to_state' tool to add your feedback to the field 'CRITICAL_FEEDBACK'.
        Explain your decision and briefly summarize the feedback you have provided.
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        RESEARCH:
        { research? }
        """,
        before_model_callback=log_query_to_model,
        after_model_callback=log_model_response,
        tools=[append_to_state, exit_loop]
    )
    
  3. สร้าง writers_room LoopAgent ซึ่งจะมีเอเจนต์ 3 รายที่จะทำงานในลูป
    วางโค้ดต่อไปนี้เหนือคำจำกัดความของเอเจนต์ film_concept_team
    writers_room = LoopAgent(
        name="writers_room",
        description="Iterates through research and writing to improve a movie plot outline.",
        sub_agents=[
            researcher,
            screenwriter,
            critic
        ],
        max_iterations=5,
    )
    
  4. อัปเดต film_concept_team SequentialAgent เพื่อใช้ลูป writers_room ใหม่ แทนที่ researcher และ screenwriter ด้วยเอเจนต์ writers_room รายเดียว แทนที่คำจำกัดความ film_concept_team ที่มีอยู่ด้วยคำจำกัดความนี้
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            file_writer
        ],
    )
    
  5. กลับไปที่แท็บ UI สำหรับนักพัฒนา ADK แล้วคลิก + เซสชันใหม่ที่ด้านขวาบน
  6. เริ่มการสนทนาใหม่กับ hello
  7. เมื่อระบบแจ้ง ให้ระบุหัวข้อที่กว้างขึ้นแก่ตัวแทนในครั้งนี้ ตัวอย่างบางส่วนมีดังต่อไปนี้
    • นักออกแบบอุตสาหกรรมที่สร้างผลิตภัณฑ์สำหรับมวลชน
    • นักเขียนแผนที่
    • ชายคนนั้นที่ทำให้พืชผลผลิตอาหารได้มากขึ้น
    ตอนนี้เอเจนต์จะทำงานผ่านลูป ใน UI ของ ADK Dev คุณจะเห็นบันทึกเมื่อเอเจนต์ทํางานหลายครั้ง (เช่น "[นักวิจัย]" "[คนเขียนบท]" "[นักวิจารณ์]" "[นักวิจัย]" "[คนเขียนบท]" "[นักวิจารณ์]...")
  8. เมื่อลูปเสร็จสมบูรณ์แล้ว เอเจนต์จะเขียนไฟล์ ตรวจสอบไฟล์ที่สร้างขึ้นในไดเรกทอรี adk_multiagent_systems/movie_pitches
  9. ตรวจสอบกราฟเหตุการณ์ใน UI สำหรับนักพัฒนาแอปเพื่อดูโครงสร้างลูป

สรุปส่วน

ในส่วนนี้ คุณได้เรียนรู้วิธีใช้LoopAgent

  • LoopAgent คือตัวแทนเวิร์กโฟลว์ที่ทำซ้ำลำดับของตัวแทนย่อย ซึ่งสร้าง "ลูปด้านใน" สำหรับงานที่ต้องทำซ้ำ
  • ตัวแทนภายในลูปจะใช้สถานะเซสชันเพื่อส่งต่องาน (เช่น PLOT_OUTLINE) และความคิดเห็น (เช่น CRITICAL_FEEDBACK) ให้กันในการส่งบอลครั้งต่อๆ ไป
  • คุณหยุดลูปได้โดยกดmax_iterationsขีดจำกัดหรือโดยตัวแทนที่เรียกใช้เครื่องมือ exit_loop

12. ใช้ ParallelAgent สำหรับ "Fan Out and Gather"

ParallelAgent คือ Agent เวิร์กโฟลว์ที่เรียกใช้ Agent ย่อยทั้งหมดพร้อมกัน (พร้อมกัน) ซึ่งมีประโยชน์สำหรับงานที่แบ่งออกเป็นงานย่อยที่ไม่ขึ้นต่อกันได้ เช่น การเรียกใช้งานงานวิจัย 2 งานที่แตกต่างกัน

คุณจะใช้ ParallelAgent เพื่อสร้าง "ทีมก่อนการผลิต" ที่ทำงานควบคู่กันไป ตัวแทนคนหนึ่งจะค้นคว้าศักยภาพของบ็อกซ์ออฟฟิศ ขณะที่ตัวแทนอีกคนจะระดมความคิดเรื่องการคัดเลือกนักแสดงไปพร้อมๆ กัน ซึ่งมักเรียกว่ารูปแบบ "กระจายและรวบรวม" โดย ParallelAgent จะ "กระจาย" งาน และเอเจนต์ในภายหลัง (file_writer ของเรา) จะ "รวบรวม" ผลลัพธ์

Film_concept_team multi-agent system step 3

ขั้นตอนสุดท้ายของ Agent จะเป็นดังนี้

  1. greeter (รูท) จะเริ่มแชท
  2. โดยจะโอนไปยัง film_concept_team (SequentialAgent) ซึ่งจะทำงานดังนี้
    • writers_room (LoopAgent) เพื่อสร้างพล็อต
    • preproduction_team (ParallelAgent) ใหม่เพื่อค้นหารายได้และรายชื่อนักแสดงพร้อมกัน
    • file_writer เพื่อรวบรวมผลลัพธ์ทั้งหมดและบันทึกไฟล์

วิธีทำการเปลี่ยนแปลงเหล่านี้

  1. ใน adk_multiagent_systems/workflow_agents/agent.py ให้วาง ParallelAgent ใหม่และตัวแทนย่อยของ ParallelAgent ไว้ใต้ส่วนหัว # Agents
    box_office_researcher = Agent(
        name="box_office_researcher",
        model=model_name,
        description="Considers the box office potential of this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Write a report on the box office potential of a movie like that described in PLOT_OUTLINE based on the reported box office performance of other recent films.
        """,
        output_key="box_office_report"
    )
    
    casting_agent = Agent(
        name="casting_agent",
        model=model_name,
        description="Generates casting ideas for this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Generate ideas for casting for the characters described in PLOT_OUTLINE
        by suggesting actors who have received positive feedback from critics and/or
        fans when they have played similar roles.
        """,
        output_key="casting_report"
    )
    
    preproduction_team = ParallelAgent(
        name="preproduction_team",
        sub_agents=[
            box_office_researcher,
            casting_agent
        ]
    )
    
  2. อัปเดตรายการ sub_agents ของ SequentialAgent film_concept_team ให้มี preproduction_team ใหม่ (ระหว่าง writers_room กับ file_writer) แทนที่คำจำกัดความ film_concept_team ที่มีอยู่ด้วยคำจำกัดความนี้
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            preproduction_team,
            file_writer
        ],
    )
    
  3. อัปเดตfile_writerinstruction ของเอเจนต์เพื่อให้ "รวบรวม" รายงานใหม่จากรัฐและเพิ่มลงในไฟล์
    แทนที่สตริง instruction สำหรับ file_writer ด้วยสตริงนี้
        instruction="""
        INSTRUCTIONS:
        - Create a marketable, contemporary movie title suggestion for the movie described in the PLOT_OUTLINE.
        If a title has been suggested in PLOT_OUTLINE, you can use it, or replace it with a better one.
        - Use your 'write_file' tool to create a new txt file with the following arguments:
        - for a filename, use the movie title
        - Write to the 'movie_pitches' directory.
        - For the 'content' to write, include:
        - The PLOT_OUTLINE
        - The BOX_OFFICE_REPORT
        - The CASTING_REPORT
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        BOX_OFFICE_REPORT:
        { box_office_report? }
    
        CASTING_REPORT:
        { casting_report? }
        """,
    
  4. กลับไปที่แท็บ UI สำหรับนักพัฒนา ADK แล้วคลิก + เซสชันใหม่
  5. ป้อน hello เพื่อเริ่มการสนทนา
  6. เมื่อได้รับข้อความแจ้ง ให้ป้อนไอเดียตัวละครใหม่ ตัวอย่างบางส่วนมีดังต่อไปนี้
    • นักแสดงหญิงที่คิดค้นเทคโนโลยีสำหรับ Wi-Fi
    • เชฟที่น่าตื่นเต้น
    • ผู้เล่นหลักในนิทรรศการเวิลด์แฟร์
  7. เมื่อเอเจนต์ทำงานเสร็จแล้ว ให้ตรวจสอบไฟล์สุดท้ายในไดเรกทอรี adk_multiagent_systems/movie_pitches ตอนนี้เอกสารควรมีเนื้อเรื่อง รายงานรายได้ และรายงานการคัดเลือกนักแสดงทั้งหมดในเอกสารเดียว

สรุปส่วน

ในส่วนนี้ คุณได้เรียนรู้วิธีใช้ParallelAgent

  • ParallelAgentงาน "กระจาย" ซึ่งเรียกใช้ Agent ย่อยทั้งหมดพร้อมกันแทนที่จะเรียกใช้ตามลำดับ
  • ซึ่งมีประสิทธิภาพสูงสำหรับงานที่ไม่ขึ้นต่อกัน (เช่น การค้นคว้า 2 หัวข้อที่แตกต่างกัน)
  • Agent ที่ทำงานแบบคู่ขนานจะ "รวบรวม" ผลลัพธ์โดย Agent ที่ทำงานในภายหลัง โดยทำได้ด้วยการให้เอเจนต์แบบคู่ขนานบันทึกงานของตนลงในสถานะเซสชัน (ใช้ output_key) และให้เอเจนต์สุดท้าย (เช่น file_writer) อ่านคีย์เหล่านั้น

13. Agent เวิร์กโฟลว์ที่กำหนดเอง

เมื่อเอเจนต์เวิร์กโฟลว์ที่กำหนดไว้ล่วงหน้าของ SequentialAgent, LoopAgent และ ParallelAgent ไม่เพียงพอต่อความต้องการของคุณ CustomAgent จะช่วยให้คุณมีความยืดหยุ่นในการใช้ตรรกะเวิร์กโฟลว์ใหม่

คุณสามารถกำหนดรูปแบบสำหรับการควบคุมโฟลว์ การดำเนินการแบบมีเงื่อนไข หรือการจัดการสถานะระหว่างเอเจนต์ย่อยได้ ซึ่งจะเป็นประโยชน์สำหรับเวิร์กโฟลว์ที่ซับซ้อน การจัดระเบียบแบบมีสถานะ หรือการผสานรวมตรรกะทางธุรกิจที่กำหนดเองเข้ากับเลเยอร์การจัดระเบียบของเฟรมเวิร์ก

การสร้าง CustomAgent อยู่นอกขอบเขตของแล็บนี้ แต่คุณควรทราบว่ามีฟีเจอร์นี้อยู่หากต้องการใช้

14. ยินดีด้วย

คุณสร้างระบบแบบหลายเอเจนต์ที่ซับซ้อนโดยใช้ Google Agent Development Kit (ADK) ได้สำเร็จแล้ว คุณได้พัฒนาจากความสัมพันธ์แบบ Agent หลักกับ Agent ย่อยอย่างง่ายไปสู่การจัดระเบียบเวิร์กโฟลว์ที่ซับซ้อนและอัตโนมัติ ซึ่งสามารถค้นคว้า เขียน และปรับแต่งโปรเจ็กต์ครีเอทีฟโฆษณาได้

สรุป

ในแล็บนี้ คุณได้ทำสิ่งต่อไปนี้

  • จัดระเบียบตัวแทนในแผนผังลำดับชั้นที่มีความสัมพันธ์ระหว่างตัวแทนหลักและตัวแทนย่อย
  • การโอนจากตัวแทนไปยังตัวแทนที่ควบคุม ทั้งโดยอัตโนมัติ (ใช้ description) และโดยชัดแจ้ง (ใช้ instruction)
  • ใช้เครื่องมือเพื่อเขียนข้อมูลลงในพจนานุกรม tool_context.state
  • ใช้การสร้างเทมเพลตคีย์ (เช่น { PLOT_OUTLINE? }) เพื่ออ่านจากสถานะเซสชันและแนะนำพรอมต์ของ Agent
  • ใช้ SequentialAgent เพื่อสร้างเวิร์กโฟลว์แบบทีละขั้นตอนง่ายๆ (ค้นคว้า -> เขียน -> บันทึก)
  • ใช้ LoopAgent กับเอเจนต์ critic และเครื่องมือ exit_loop เพื่อสร้างวงจรการปรับแต่งแบบวนซ้ำ
  • ใช้ ParallelAgent เพื่อ "กระจาย" งานอิสระ (เช่น การแคสต์และการวิจัยรายได้จากภาพยนตร์) ให้ทำงานพร้อมกัน

การทดสอบอย่างต่อเนื่อง

คุณสามารถนำสิ่งที่ได้เรียนรู้ไปต่อยอดได้หลายวิธี ลองดูแนวคิดบางส่วนกัน

  • เพิ่มเอเจนต์: ลองเพิ่มเอเจนต์ใหม่ลงใน preproduction_team ParallelAgent เช่น คุณอาจสร้าง marketing_agent ที่เขียนสโลแกนสำหรับภาพยนตร์โดยอิงตามPLOT_OUTLINE
  • เพิ่มเครื่องมือ: มอบเครื่องมือเพิ่มเติมให้researcher Agent คุณสามารถสร้างเครื่องมือที่ใช้ Google Search API เพื่อค้นหาข้อมูลที่ไม่มีใน Wikipedia ได้
  • สำรวจCustomAgent: ห้องทดลองได้กล่าวถึงCustomAgentสำหรับเวิร์กโฟลว์ที่ไม่เหมาะกับเทมเพลตมาตรฐาน ลองสร้างฟังก์ชันที่เรียกใช้ Agent แบบมีเงื่อนไขเฉพาะในกรณีที่มีคีย์ที่เฉพาะเจาะจงอยู่ในสถานะเซสชัน เป็นต้น