แผนการเรียนรู้
/

สัปดาห์ที่ 10: แนะนำ Agent Development Kit (ADK)

  • แนวคิดเรื่อง Agent AI ในงานวิทยาการข้อมูล
  • ส่วนประกอบสำคัญของ Agent Development Kit (ADK)
  • การออกแบบบทบาทและหน้าที่ของ Data Agent
  • การสร้าง Command-based Agent สำหรับการวิเคราะห์ข้อมูล
  • Personalized Learning: ใช้ AI ช่วยออกแบบ Logic ของ Agent

AI Agent คืออะไรในงาน Data Science?

ระบบที่รวม **ความฉลาดของโมเดล AI** เข้ากับการ **เข้าถึงเครื่องมือ (Tools)** เพื่อดำเนินการแทนเรา .

  • ไม่ใช่แค่การถาม-ตอบ แต่คือการรับ "เป้าหมายที่ซับซ้อน" ไปจัดการ .
  • สามารถวางแผนและเรียกใช้ฟังก์ชันต่างๆ เช่น การสืบค้นข้อมูลหรือประมวลผลทางสถิติ .
  • ทำงานแบบ Non-deterministic โดยใช้ LLM ตัดสินใจตามบริบท .

Agent Development Kit (ADK) คืออะไร?

ADK คือ open-source framework ที่ยืดหยุ่นและเป็นแบบโมดูลสำหรับการพัฒนาและปรับใช้ AI agents .

Model Agnostic: ใช้ได้กับ Gemini หรือโมเดลจากค่ายอื่น .
Deployment Agnostic: รันได้ทุกที่ทั้ง Local, Cloud Run หรือ GKE .
Developer-Centric: ใช้แนวคิดการเขียนโปรแกรมมาตรฐาน เช่น Classes และ Functions .
Interoperability: รองรับโปรโตคอล MCP และ A2A สำหรับเชื่อมต่อข้อมูลและเอเจนต์อื่น .

ส่วนประกอบหลัก: LlmAgent (The Brain)

`LlmAgent` เปรียบเสมือน "ส่วนที่ใช้คิด" ของแอปพลิเคชัน :

  • ใช้พลังของ LLM ในการให้เหตุผล (Reasoning) และเข้าใจภาษาธรรมชาติ .
  • ตัดสินใจแบบไดนามิกว่าจะใช้เครื่องมือใด หรือจะโอนงานให้เอเจนต์อื่น .
  • ต้องการการนิยาม Identity, Instructions และ Tools ที่ชัดเจน .
from google.adk.agents import Agent

data_analyst = Agent(
  name="data_analyst",
  model="gemini-2.5-flash",
  instruction="คุณเป็นนักวิเคราะห์ข้อมูล..."
)

การกำหนดอัตลักษณ์ของเอเจนต์ (Identity)

Identity เป็นส่วนสำคัญในการสร้างความร่วมมือระหว่างเอเจนต์ :

Name (Required):

ตัวระบุสตริงที่ไม่ซ้ำกัน ใช้สำหรับการเรียกใช้ภายในและการส่งต่องาน .

Description (Recommended):

สรุปความสามารถที่เอเจนต์ *อื่น* จะใช้ตัดสินใจว่าควรส่งงานมาให้เอเจนต์ตัวนี้หรือไม่ .

Model (Required):

ระบุ LLM ที่จะขับเคลื่อนการให้เหตุผล เช่น `"gemini-2.5-flash"` .

การกำหนดพฤติกรรมผ่านคำสั่ง (Instructions)

`instruction` คือพารามิเตอร์ที่สำคัญที่สุดในการกำหนดพฤติกรรมของ `LlmAgent` :

  • Goal: กำหนดเป้าหมายหลักของงาน .
  • Persona: กำหนดบุคลิกภาพ (เช่น "คุณคือนักสถิติผู้เชี่ยวชาญ") .
  • Constraints: ข้อจำกัดหรือสิ่งที่ไม่ควรทำ .
  • Tool Guidance: อธิบายว่าควรใช้เครื่องมือที่มีอยู่เมื่อใดและอย่างไร .
  • Output Format: รูปแบบผลลัพธ์ที่ต้องการ (เช่น "ตอบเป็น JSON เท่านั้น") .

*Tip: ใช้ Markdown เพื่อเพิ่มความชัดเจน และใส่ตัวอย่าง (Few-shot) เพื่อผลลัพธ์ที่แม่นยำ .*

การติดอาวุธให้เอเจนต์ด้วยเครื่องมือ (Tools)

เครื่องมือช่วยให้เอเจนต์โต้ตอบกับโลกภายนอกได้ :

  • Native Functions: ฟังก์ชัน Python ที่เอเจนต์เรียกใช้ได้โดยตรง .
  • API Connectors: เชื่อมต่อกับฐานข้อมูลหรือ API ภายนอก .
  • Agent-as-a-Tool: การส่งต่องานให้เอเจนต์เฉพาะทางตัวอื่น .
# ตัวอย่างการสร้างเครื่องมือ (Tool)
def get_dataset_summary(id: str) -> dict:
  """สืบค้นข้อมูลสรุปของชุดข้อมูลจาก UCI Repo"""
  # โค้ดดึงข้อมูล...
  return summary

# ใส่เครื่องมือลงใน Agent
agent = Agent(..., tools=[get_dataset_summary])

การจัดการข้อมูลด้วย Schemas

ในงาน Data Science เรามักต้องการข้อมูลที่มีโครงสร้าง (Structured Data) :

  • input_schema: กำหนดโครงสร้างข้อมูลที่เอเจนต์คาดหวังจากผู้ใช้ .
  • output_schema: บังคับให้ผลลัพธ์สุดท้ายเป็น JSON ตามรูปแบบที่กำหนด .
  • output_key: บันทึกผลลัพธ์ลงใน Session State เพื่อใช้ในขั้นตอนถัดไปอัตโนมัติ .

* ADK มักใช้ Pydantic (Python) หรือ Zod (JS) ในการนิยาม Schema .*

การร้อยเรียงงาน: ReAct Framework

ADK ใช้รูปแบบ **ReAct (Reason + Action)** ในการทำงานแบบวนรอบ :

1. Reason

เอเจนต์วิเคราะห์เป้าหมายและวางแผนขั้นต่อไป .

2. Act

เรียกใช้เครื่องมือ (Tool Call) ตามที่วางแผนไว้ .

3. Observe

รับผลลัพธ์จากเครื่องมือและนำเข้าสู่บริบทเพื่อคิดต่อ .

ตัวช่วยวางแผนขั้นสูง (Planners)

BuiltInPlanner

ใช้ความสามารถ "ความคิด" (Thinking) ภายในของ Gemini (เช่นในโมเดล 2.0 Flash) เพื่อแก้ปัญหายากๆ .

PlanReActPlanner

บังคับให้เอเจนต์เขียน Plan, Action, และ Reasoning อย่างชัดเจน เหมาะกับโมเดลที่ไม่มีระบบคิดในตัว .

"การวางแผนที่ดีช่วยลดข้อผิดพลาดและอาการหลอน (Hallucination) ของ AI" .

Workflow Agents: การทำงานแบบลำดับ

SequentialAgent

รันเอเจนต์ย่อยตามลำดับที่แน่นอน โดยส่งผลลัพธ์ของตัวแรกเป็นอินพุตให้ตัวถัดไป .

# ตัวอย่าง: ดึงข้อมูล -> วิเคราะห์ -> สรุป
workflow = SequentialAgent(
  sub_agents=[fetch_agent, analyze_agent, report_agent]
)

การทำงานแบบขนานและแบบวนซ้ำ

ParallelAgent

รันงานที่อิสระจากกันพร้อมกันเพื่อประสิทธิภาพสูงสุด เช่น การดึงข้อมูลจากหลายแหล่ง .

LoopAgent

รันงานวนซ้ำจนกว่าจะบรรลุเงื่อนไข เช่น การปรับจูนโค้ดจนกว่าจะผ่านการทดสอบ .

เอเจนต์แบบกำหนดเอง (Custom Agents)

ใช้เมื่อต้องการควบคุม Logic แบบ Hard-coded ที่ LLM ทำไม่ได้ :

  • สร้าง Class ใหม่ที่สืบทอดมาจาก `BaseAgent` .
  • เขียน Logic ในเมธอด `_run_async_impl` .
  • จัดการ Session State และส่งเหตุการณ์ (Events) ได้อย่างอิสระ .

ระบบหลายเอเจนต์และการส่งต่องาน

รูปแบบการทำงานร่วมกัน:

  • Agent-as-a-Tool: เอเจนต์แม่เรียกใช้เอเจนต์ลูกเหมือนเป็นฟังก์ชันหนึ่ง .
  • A2A Protocol: มาตรฐานเปิดที่ช่วยให้เอเจนต์สื่อสารกันข้ามระบบได้ .
  • Agent Card: "นามบัตรดิจิทัล" ที่เอเจนต์ใช้โฆษณาความสามารถเพื่อให้ตัวอื่นค้นพบ .

เครื่องมือทดสอบและ Debug: ADK Web

ใช้คำสั่ง `adk web` เพื่อเปิดหน้าจอ Playground ในเครื่อง :

  • Chat Interface: ทดลองคุยกับเอเจนต์ได้ทันที .
  • Event Tab: ดูขั้นตอนการทำงานและการส่งต่องาน (Delegation) .
  • Trace View: ตรวจสอบ Request/Response แบบทีละขั้นตอน .

Command:

adk web --port 8000

*ใช้สำหรับพัฒนาและทดสอบเท่านั้น ไม่ควรใช้จริงใน Production .*

การจัดการหน่วยความจำ (Sessions & Memory)

Working Memory

ใช้จัดการบริบทปัจจุบันของการสนทนา .

Long-term Memory

บันทึกข้อมูลสำคัญข้ามเซสชันผ่าน Vertex AI Memory Bank .

ADK ช่วยให้เรา "Resume" หรือ "Replay" เซสชันที่บันทึกไว้เป็น JSON ได้ .

การสร้างความน่าเชื่อถือด้วย Grounding

Vertex AI Search Tool:

เชื่อมต่อเอเจนต์กับเอกสารภายในบริษัทเพื่อให้ตอบคำถามตามข้อเท็จจริง .

Benefits:

เข้าถึงข้อมูลล่าสุด, มีการอ้างอิงแหล่งที่มา (Citations), และลดอาการหลอน .

"Grounding คือหัวใจของความน่าเชื่อถือในเอเจนต์ระดับองค์กร" .

การวัดผลและความปลอดภัย (AgentOps)

ADK มีระบบประเมินผลในตัวเพื่อตรวจสอบประสิทธิภาพ :

  • Trajectory Evaluation: ตรวจสอบว่าขั้นตอนการคิด (ReAct steps) ถูกต้องหรือไม่ .
  • Outcome Evaluation: วัดคุณภาพของคำตอบสุดท้ายเทียบกับเกณฑ์ที่กำหนด .
  • Guardrails: การตรวจสอบอินพุต/เอาต์พุตเพื่อป้องกันเนื้อหาอันตราย .
  • Tool Confirmation: ระบบที่ขอการยืนยันจากมนุษย์ (HITL) ก่อนดำเนินการสำคัญ .

Personalized AI Learning Tip

ในการทำแล็บวันนี้ ให้นักศึกษาใช้ AI (ChatGPT/Copilot) เป็น "ผู้ช่วยพัฒนา" :

  • Prompt Designing: ถาม AI ให้ช่วยร่าง Instruction ที่มีประสิทธิภาพสำหรับเอเจนต์ .
  • Tool Debugging: หากฟังก์ชัน Tool ทำงานผิดพลาด ให้ใช้ AI ช่วยหาสาเหตุจาก Error log .
  • Logic Visualization: ให้ AI ช่วยอธิบายการไหลของข้อมูลใน Multi-agent system ของคุณ .

สรุปเนื้อหาและก้าวต่อไป

  • Concepts: เข้าใจ ADK ในฐานะเครื่องมือสร้าง "เอเจนต์ที่คิดและทำได้" .
  • Key Features: การใช้ Tools, Planners, และ Workflow Agents .
  • Lab Today: ลงมือสร้าง Command-based Data Agent ตัวแรก .

"เตรียมตัวพบกับภาคปฏิบัติในสไลด์ถัดไป!"

Lab Part 1: ADK Data Agent Overview

ภารกิจ: พัฒนา Agent ที่สามารถสืบค้นข้อมูลจาก UCI ML Repository และประมวลผลผ่านคำสั่ง (Commands) :

  • Environment Setup: ติดตั้ง ADK และ ucimlrepo .
  • Tool Definition: สร้างฟังก์ชันสำหรับดึง Metadata ของชุดข้อมูล .
  • Agent Configuration: กำหนด Identity และ Instructions ให้ Agent .
  • Local Testing: รันและ Debug ผ่าน ADK Web UI .

Step 1: Environment & SDK Installation

ติดตั้งชุดเครื่องมือสำหรับพัฒนาเอเจนต์และไลบรารีเชื่อมต่อข้อมูล :

# 1. ติดตั้ง Google ADK
pip install google-adk

# 2. ติดตั้ง UCI ML Repository API
pip install -U ucimlrepo

*Personalized Learning: หากพบปัญหา Installation Error ให้ส่ง Log ให้ AI ช่วยวิเคราะห์วิธีแก้ .*

Step 2: Connecting to UCI Repository

ทดสอบฟังก์ชันการดึงข้อมูลเพื่อนำไปสร้างเป็น Tool ให้เอเจนต์ :

from ucimlrepo import fetch_ucirepo


# ดึงข้อมูลเบาหวาน (Diabetes ID=225)

diabetes = fetch_ucirepo(id=225)


# ตรวจสอบ Metadata ที่จะส่งให้ Agent

print(diabetes.metadata.additional_info.summary)

print(diabetes.variables[['name', 'role', 'type']])

*Metadata เหล่านี้จะทำหน้าที่เป็น Context ให้ Agent เข้าใจบริบทของชุดข้อมูล .*

Step 3: Creating the Tool Contract

ADK บังคับให้ต้องใช้ **Type Hints** และ **Docstring** เพื่อให้ LLM รู้วิธีเรียกใช้เครื่องมือ :

def get_uci_metadata(dataset_id: int) -> dict:

  """สืบค้นข้อมูล Metadata ของชุดข้อมูลจาก UCI Repo โดยใช้ ID"""

  from ucimlrepo import fetch_ucirepo

  data = fetch_ucirepo(id=dataset_id)

  return {

    "name": data.metadata.name,

    "instances": data.metadata.num_instances,

    "summary": data.metadata.additional_info.summary

  }

LLM จะใช้คำอธิบายใน Docstring เพื่อตัดสินใจเรียกใช้ Tool เมื่อผู้ใช้ถาม .

Step 4: Agent Identity & Instructions

กำหนดคุณลักษณะ (Identity) และเป้าหมายการทำงาน (Instructions) :

from google.adk.agents.llm_agent import Agent

root_agent = Agent(
  name="uci_query_expert",
  model="gemini-2.5-flash",
  description="Expert in querying UCI datasets.",
  instruction="คุณคือนักวิทยาศาสตร์ข้อมูล ใช้เครื่องมือ get_uci_metadata เพื่อตอบคำถามเกี่ยวกับสถิติและบริบทของข้อมูล",
  tools=[get_uci_metadata]
)

Step 5: Test & Visualize Traces

ใช้คำสั่ง **ADK Web** เพื่อเปิด Playground สำหรับทดสอบ logic :

$ adk web --port 8000
  • เปิด `http://localhost:8000` ใน Browser .
  • พิมพ์คำสั่ง: "ขอข้อมูลสรุปของชุดข้อมูล ID 225 หน่อย"
  • ตรวจสอบ **Event Tab** เพื่อดูขั้นตอนการ Reason -> Act -> Observe .

Step 6: AI-led Iteration

ให้นักศึกษาใช้ AI (ChatGPT/Gemini) ปรับปรุงคุณภาพของ Agent :

"ฉันต้องการให้ Agent ตอบเป็นตาราง Markdown เท่านั้น ช่วยร่างคำสั่งใน instruction สำหรับ ADK Agent ให้หน่อย"

Action: นำคำแนะนำของ AI มาอัปเดตค่า `instruction` ในโค้ด และสั่ง Restart `adk web` เพื่อดูผลลัพธ์ที่เปลี่ยนไป .

บทสรุปบทปฏิบัติการและการส่งงาน

  • GitHub Submission: อัปโหลดไฟล์ `agent.py` ที่มี Tool และ Agent ครบถ้วน .
  • Report: ส่งภาพถ่ายหน้าจอ (Screenshot) ของ **Trace View** ที่แสดงการเรียกใช้ Tool สำเร็จ .
  • Next Step: สัปดาห์ถัดไปเราจะนำ Agent นี้ไป Build เป็น Docker Image และฝัง Metadata MCP .

"ยินดีด้วย! คุณได้สร้าง Data Agent ตัวแรกที่สามารถสืบค้นข้อมูลจริงได้แล้ว"