▶SUBTHAIแปลไทย · ซับ · พากย์⚙
บทความแปลภาษาไทย · YouTube

Day 2A: Agent Tools — How AI Agents Use Tools (Hands-On Demo)

0:000:00
เล่นเสียงต้นฉบับของวิดีโอ พร้อมแสดงซับไทยซิงก์ตามเวลา
กำลังโหลดวิดีโอ…
01

สรุปย่อ

ประเด็นสำคัญจากวิดีโอ

- **ช่อง:** Adspolitan Knowledge Studio · **ความยาว:** ~26 นาที · **ลิงก์:** https://www.youtube.com/watch?v=KgUsl7UGGFA

# สรุป: Day 2A: Agent Tools — How AI Agents Use Tools (Hands-On Demo)
- **ช่อง:** Adspolitan Knowledge Studio · **ความยาว:** ~26 นาที · **ลิงก์:** https://www.youtube.com/watch?v=KgUsl7UGGFA

## ประเด็นหลัก
- แบบฝึกหัด Day 2 Part A ของคอร์ส Google × Kaggle 5-Day AI Agents Intensive พาทำ code lab บน Kaggle notebook ด้วย Google ADK
- Custom tool คือ Python function ที่แปลงเป็น agent tool เพื่อรองรับ business logic เฉพาะของเรา ซึ่ง built-in tool แบบ generic ตอบโจทย์ไม่ได้
- แนวปฏิบัติที่ดีเวลาเขียน function tool: return เป็น dictionary มี status, docstring ชัดเจน, ใส่ type hints และมี error handling
- ตัวอย่างหลักคือ currency converter agent ที่ใช้ tool สองตัว คือ get_fee_for_payment_method (หาค่าธรรมเนียม) และ get_exchange_rate (ดึงอัตราแลกเปลี่ยน)
- ให้ agent สร้าง Python code แล้วรันผ่าน built-in code executor น่าเชื่อถือกว่าปล่อยให้ LLM คิดเลขเอง เพราะ LLM อาจคำนวณผิดหรือใช้สูตรไม่สอดคล้อง
- Calculation agent ถูกออกแบบให้ตอบกลับเป็น Python code เท่านั้น แล้วใช้ code execution ของ Gemini รันใน sandbox โดยไม่ต้องมี production environment
- ความต่างสำคัญ: agent tool คือการ agent A เรียก agent B เป็นเครื่องมือ แล้ว B ตอบกลับมาที่ A ซึ่ง A ยังคุมบทสนทนาต่อ (ใช้กรณี delegation)
- Sub-agent คือการโอนการควบคุมทั้งหมดให้ agent B แล้ว B รับช่วงดูแลผู้ใช้ต่อเอง (ใช้กรณี handoff) เช่น ชั้น level 1/2/3 ของฝ่าย support
- ภาพรวม tool ของ ADK แบ่งเป็น custom (function tool, long-running function tool, agent tool, MCP tool, OpenAPI tool) และ built-in (Gemini tool, Google tool เช่น BigQuery, third-party tool เช่น GitHub และ Hugging Face)
- MCP tool เชื่อมบริการที่รองรับ MCP ได้ทันทีโดยไม่ต้องเขียน integration เอง ส่วน OpenAPI tool เปลี่ยน REST API endpoint ให้กลายเป็น tool ที่เรียกใช้ได้ ด้วยการให้ API spec อย่างเดียว

## ความเห็นสรุป
วิดีโอนี้เหมาะกับผู้เริ่มต้นสร้าง agent ด้วย Google ADK เพราะเดินตาม code lab ทีละขั้นตอนแบบละเอียด ตั้งแต่เตรียม environment จนถึงภาพรวม tool ทั้งหมด จุดเด่นคือตัวอย่าง currency converter ที่ต่อยอดจาก tool ธรรมดาไปเป็น multi-tool agent พร้อม calculation agent แบบ step by step ทำให้เห็นภาพการใช้งานจริงชัดเจน และคำอธิบายเรื่อง agent tool กับ sub-agent ที่เทียบกับ pattern จาก Day 1 ช่วยให้เข้าใจความต่างของการควบคุมบทสนทนาได้ดีมากครับ
02

คำแปลเต็ม

แปลตามบทสนทนาต้นฉบับ ปรับเป็นภาษาไทยธรรมชาติ

สวัสดีทุกคนครับ ยินดีต้อนรับเข้าสู่บทเรียน Day 2 ของคอร์ส Google Intensive Training on AI Agents ครับ ในหน่วยที่สองนี้เรามีแบบฝึกหัดสองส่วนเหมือนเดิม คือ Day 2 Part A กับ Day 2 Part B ส่วนวิดีโอนี้เราจะพูดถึง Part A ครับ เหมือนที่เคยแจ้งไว้ในวิดีโอก่อน ๆ แบบฝึกหัดนี้ก็มีตอนสรุปแบบพอดแคสต์ (summary podcast) ให้ฟังด้วย กดตรงนี้เพื่อไปฟังได้เลยครับ ตอนนั้นสร้างขึ้นด้วย NotebookLM (เครื่องมือสรุปเนื้อหาเป็นบทสนทนาด้วย AI ของ Google) ผมจะใส่ลิงก์ไว้ในคำอธิบายของวิดีโอนี้ด้วย นอกจากนี้ผมจะใส่ลิงก์ของ white paper (เอกสารสรุปแนวคิดหลักของหัวข้อนี้) ไว้ให้ด้วย สำหรับใครที่ยังไม่ได้อ่าน แนะนำให้อ่านหลังจากทำ code lab เสร็จนะครับ มันจะช่วยคุณในระยะยาวเพราะข้อมูลในนั้นมีประโยชน์มากครับ แบบฝึกหัดนี้เกี่ยวกับการสำรวจ tool ใหม่ ๆ ของ ADK เพื่อขยายขอบเขตสิ่งที่ agent ทำได้ แล้วจึงไปต่อที่แนวปฏิบัติที่ดี (best practices) ของ tool เหล่านั้น รวมถึงการใช้ MCP (Model Context Protocol — โปรโตคอลกลางสำหรับเชื่อมต่อเครื่องมือกับ agent) และ long-running operations (งานที่ทำต่อเนื่องนาน) ครับ

ผมกำลังกดปุ่ม Explore เพื่อเข้าสู่แบบฝึกหัดแรกของ Day 2 ครับ ระบบจะสร้าง notebook ให้เรา จากนั้นเราถูกพาไปยัง notebook แบบแก้ไขไม่ได้ ให้กดปุ่ม Edit my copy ทางด้านขวามือด้านบน ก็จะได้สำเนาที่แก้ไขได้สำหรับรันโค้ดของเราครับ ในคอร์สนี้เราจะเรียนอะไรบ้าง? เราจะเรียนวิธีสร้าง agent ที่มาพร้อม built-in tool (เครื่องมือสำเร็จรูป) อย่าง Google Search เราจะเริ่มจากการเปลี่ยน Python function ธรรมดาให้กลายเป็น agent tool จากนั้นเราจะสร้าง agent ขึ้นมาหนึ่งตัวแล้วใช้มันเป็น tool ของอีก agent หนึ่ง สร้าง multi-tool agent ตัวแรกของเรา และสำรวจประเภทของ tool ต่าง ๆ ใน ADK ครับ

ต่อไปเป็น Section 1 ซึ่งเป็นการเตรียมสภาพแวดล้อม (environment setup) ครับ เนื่องจากเราใช้สภาพแวดล้อมของ Kaggle อยู่แล้ว เราจึงไม่ต้องติดตั้งไลบรารี Google ADK สำหรับ Python แต่ถ้าใครใช้สภาพแวดล้อมภายนอกก็กรุณาติดตั้งเพิ่มนะครับ กลับมาที่ขั้นตอนตั้งค่า (configuration) เหมือนที่เราเคยทำในวิดีโอก่อน ๆ ของแบบฝึกหัดก่อน ๆ ให้ไปที่ Add-ons แล้วกด Secret ตอนนี้มันถูกเลือกไว้แล้ว ปกติบางครั้งพอกดเข้า Secret ค่าอาจยังเป็น unset อยู่ ดังนั้นให้เช็คดูว่าตั้งค่าไว้แล้วหรือยัง ถ้ายังไม่ตั้งก็ตั้งขึ้นมาก่อนแล้วค่อยรันโค้ดนี้ครับ โค้ดส่วนนี้ผมอธิบายไปแล้วในสองวิดีโอก่อนหน้า จึงขอไม่พูดถึงอีกนะครับ ตอนนี้เราตั้งค่าและยืนยันตัวตน (authenticate) กับ API key สำเร็จเรียบร้อยแล้วครับ

ขั้นต่อไปเราจะ import คอมโพเนนต์ของ ADK ครับ ตรงนี้เราเห็น import เพิ่มขึ้นมาสองรายการนอกเหนือจากที่เราเคยทำในสองวิดีโอที่ผ่านมา ผมขอรันโค้ดก่อน แล้วระหว่างรอค่อยเล่าให้ฟังว่าข้างในมีอะไรครับ ก่อนหน้านี้ agent ที่เราใช้คือ LLM agent (agent ที่ขับเคลื่อนด้วยโมเดลภาษาขนาดใหญ่) โดยโมเดลของ Google ที่เราใช้คือ Gemini ตัว runner ที่เราใช้คือ InMemoryRunner (ตัวรัน agent ในหน่วยความจำ) และตัวจัดการ session ที่ใช้คือ InMemorySessionService (บริการจัดการเซสชันในหน่วยความจำ) เราทำงานกับ Google Search มาโดยตลอดในแบบฝึกหัดก่อน ๆ ครับ คราวนี้เรามี agent tool (การใช้ agent เป็นเครื่องมือ) และ tool context (บริบทของเครื่องมือที่ส่งเข้าไปให้ฟังก์ชัน) เพิ่มเข้ามาด้วย ซึ่งจะได้ใช้ในโค้ดถัด ๆ ไป แล้วก็มี built-in code executor (ตัวรันโค้ดสำเร็จรูป) อีกตัวที่เราจะใช้สำหรับการคำนวณที่ agent ต้องการ ผมจะอธิบายละเอียดเมื่อไปถึงแต่ละขั้นตอนครับ ตอนนี้คอมโพเนนต์ของ ADK import สำเร็จเรียบร้อยแล้ว

ต่อไปรัน helper function ตัวนี้ครับ เราทำเฉพาะเมื่อใช้ Kaggle เท่านั้น ถ้าอยู่ในสภาพแวดล้อมภายนอกก็ไม่ต้องนิยามฟังก์ชันนี้ เสร็จแล้ว ต่อไปเป็นการตั้งค่า retry option ครับ ในโค้ดของคุณอาจไม่เห็นคำสั่ง print บรรทัดนี้ คุณพิมพ์เพิ่มเองได้ ผมใส่ไว้เพราะอยากรู้ว่ามันรันผ่านจริง ๆ ถึงตรงนี้การเตรียมความพร้อมก็เสร็จสมบูรณ์ครับ

ต่อไปเข้าสู่ Section 2 ครับ ในส่วนนี้เราจะเข้าใจก่อนว่า custom tool (เครื่องมือที่เราสร้างขึ้นเอง) คืออะไร ในแบบฝึกหัดของ Day 1 เราใช้ built-in tool ซึ่งเป็นเครื่องมือแบบทั่วไปมาก นำไปใช้กับ business logic (ตรรกะทางธุรกิจ) เฉพาะของเราหรือความต้องการเฉพาะทางไม่ได้ tool แบบ generic อาจจัดการงานเหล่านั้นได้ไม่ตรงตาม requirement พอดี ดังนั้นเพื่อแก้ปัญหานั้นเราจึงมี custom tool ที่ให้อำนาจควบคุมการทำงานของ tool ได้อย่างเต็มที่ครับ ADK มี custom tool หลายประเภทสำหรับรองรับสถานการณ์แบบนี้ ถ้าอยากรู้รายละเอียด ท้าย section นี้มีบทความให้อ่าน ผมจะใส่ลิงก์ไว้ในคำอธิบายวิดีโอให้อ่านจากที่นั่นได้ด้วยครับ

ตัวอย่างที่ใช้สาธิตการสร้าง custom function tool คือ currency converter agent หรือ agent แปลงสกุลเงิน ก็คือ agent ที่แปลงเงินจากสกุลหนึ่งไปเป็นอีกสกุลหนึ่ง พร้อมกับคำนวณค่าธรรมเนียมของการแปลงครับ ที่นี่เราต้องใช้ custom tool สองตัว คือ get_fee_for_payment_method กับ get_exchange_rate ตัวแรกจะหาค่าธรรมเนียมธุรกรรมสำหรับการแปลง ส่วนตัวที่สองจะดึงอัตราแลกเปลี่ยนของสกุลเงินครับ วิธีที่ flowchart ทำงานคือ ผู้ใช้จะส่ง prompt บอกว่าต้องการแปลงสกุลเงินหนึ่งไปเป็นอีกสกุลหนึ่ง จากนั้น currency agent จะอ้างอิงข้อมูลที่ได้ (observations) จาก tool ทั้งสองตัวนี้ แล้วส่งผลลัพธ์กลับไปให้ผู้ใช้ โดยตัว currency agent เองจะเป็นคนคำนวณเลขนี้เองครับ

แล้วเราจะนิยาม tool อย่างไร? tool โดยพื้นฐานแล้วก็คือ Python function ที่กลายมาเป็น agent tool ครับ เราจะสร้าง Python function ขึ้นมาโดยยึดแนวปฏิบัติที่ดีที่ระบุไว้ แล้วนำฟังก์ชันนั้นไปใส่ในลิสต์ tools ครับ แนวปฏิบัติที่ดีเวลาสร้าง Python function มีอะไรบ้าง? ข้อแรกคือให้ return เป็น dictionary ที่บอกสถานะของ tool ว่าสำเร็จหรือว่ามี error อะไร ข้อสองต้องเขียน docstring (ข้อความคำอธิบายฟังก์ชัน) ให้ชัดเจน เพราะ LLM ใช้ docstring ในการทำความเข้าใจว่าควรใช้ tool นั้นเมื่อไหร่และใช้อย่างไร ข้อสามคือใช้ type hints (การกำกับชนิดข้อมูลของพารามิเตอร์) เช่น dict หรือ str เพราะช่วยให้ ADK สร้าง schema ที่ถูกต้อง ข้อสี่คือใส่การจัดการข้อผิดพลาด (error handling) เพราะช่วยให้เราจัดโครงสร้าง error response ได้เป็นระบบ และช่วยให้ LLM รับมือกับความล้มเหลวได้อย่างเหมาะสมในกรณีเกิด error ว่า LLM ควรทำอะไรต่อ ทั้งหมดนี้เราจะใส่ลงไปใน Python function เพื่อให้ tool น่าเชื่อถือและให้ LLM ใช้งานถูกต้องได้ง่ายขึ้นครับ

โค้ดตรงนี้คือ tool แรกที่ชื่อ get_fee_for_payment_method ครับ ในส่วนคำอธิบายระบุว่า เมื่อฟังก์ชันนี้ถูกเรียก มันจะค้นหาเปอร์เซ็นต์ค่าธรรมเนียมธุรกรรมของวิธีการชำระเงินที่กำหนด tool นี้จำลองการค้นหาโครงสร้างค่าธรรมเนียมภายในบริษัท จากชื่อวิธีชำระเงินที่ผู้ใช้ระบุมาครับ อาร์กิวเมนต์คือชื่อวิธีชำระเงิน ซึ่งควรระบุแบบละเอียด เช่น platinum credit card หรือ bank transfer เมื่อได้รับแล้วมันจะ return เป็น dictionary ที่มีข้อมูล status กับ fee เช่น status เป็น success เมื่อสำเร็จ และ fee_percentage เป็น 2% ส่วนกรณี error จะถูกส่งกลับมาเมื่อ status เป็น error โดยข้อความ error จะบอกว่า payment method not found คือ ถ้าผู้ใช้ให้ชื่อวิธีชำระเงินที่ไม่มีอยู่จริง มันก็จะโยน error นี้ออกมาครับ

จากนั้นเรากำหนด fee database หรือฐานข้อมูลค่าธรรมเนียมตามที่ระบุไว้ตรงนี้ ก็คือ ถ้าเป็น platinum credit card จะคิด 2% ถ้าเป็น gold card กับ debit card คิด 3.5% และ bank transfer คิด 1% ครับ ทีนี้เราต้องดึงข้อมูลนี้ออกมาโดยแบ่งเป็นสองเงื่อนไข ทางแรก ถ้า fee ไม่เป็น none คือมีค่าอยู่จริง return status จะเป็น success และแสดงเปอร์เซ็นต์ค่าธรรมเนียมออกมา ทางที่สอง ถ้า fee เป็น none กรณีนั้นจะเป็น error โดยข้อความ error จะระบุชื่อวิธีชำระเงินที่ผู้ใช้ป้อนเข้ามาว่าไม่พบ (not found) ครับ ผมจะรันอันนี้ กด Shift+Enter บนคีย์บอร์ด ก็เสร็จเรียบร้อย อย่างที่เคยแจ้งไว้ คุณสามารถกดปุ่ม play ตรงนี้เพื่อรันชุดโค้ดก็ได้ ไม่เช่นนั้น Shift+Enter ก็ทำงานเหมือนกันครับ

ต่อไปนิยาม tool ถัดไปซึ่งก็คือ get_exchange_rate ครับ ที่นี่ base currency จะเป็น string และ target currency ก็เป็น string เช่นกัน docstring บอกไว้ว่า เมื่อ tool นี้ถูกเรียก มันจะค้นหาและส่งกลับอัตราแลกเปลี่ยนระหว่างสกุลเงินสองสกุลครับ อาร์กิวเมนต์ base currency คือรหัสสกุลเงินต้นทางที่เราแปลง จาก เช่น จาก USD ไป INR หรือจาก USD ไปเยนญี่ปุ่น ส่วน target currency คือรหัสสกุลเงินปลายทางที่เราแปลง ไป เหมือนตัวอย่างที่ยกไป ถ้าแปลง USD เป็น INR แล้ว INR คือ target currency และ USD คือ base currency ครับ ตัวฟังก์ชันจะ return ค่า success เมื่อ status สำเร็จ พร้อมค่า rate เช่น rate เท่ากับ 93 กว่า ๆ และกรณี error จะระบุ error พร้อมข้อความว่า unsupported currency pair คือ มันจะให้ rate ที่ต้องการพร้อมตัวเลขนั้น แล้วถ้าข้อมูลที่จำเป็นไม่ครบก็จะได้ข้อความ error นี้ครับ

ทีนี้ค่า rate ที่ตั้งไว้เป็นอย่างไร? ผมบอกว่า 93 เพราะนั่นคือ rate ของ euro ครับ เยนญี่ปุ่นอยู่ที่ 157.50 เมื่อแปลงกับ USD และ USD กับ INR เท่ากับ 83.58 ณ วันนี้ครับ ต่อไปเราจะตรวจสอบความถูกต้อง (validate) และประมวลผล input ทั้ง base currency และ target currency จากนั้นจัดโครงสร้างผลลัพธ์ของ rate โดยมี status กำกับ ก็คือระบุ base กับ target ถ้า rate ไม่เป็น none แปลว่าสำเร็จ เราก็แสดง rate ออกมา ถ้า rate เป็น none มันก็แสดง error และโยน error ว่า unsupported currency pair พร้อมระบุชื่อ base currency และ target currency ที่ผู้ใช้ป้อนเข้ามาครับ ผมรันอันนี้เช่นกัน ตอนนี้เราสร้าง function tool หรือ agent tool เสร็จเรียบร้อยแล้วครับ

ต่อไปเราต้องสร้าง currency agent โดยใช้คลาส Agent ที่เตรียมไว้ครับ สำหรับ currency agent เราได้นิยามชื่อ (name) กับโมเดล (model) ไว้เหมือน agent อื่น ๆ ที่เราเคยนิยาม แล้วก็มี instructions หรือคำสั่งกำกับ เหมือนที่ให้กับ agent อื่น ๆ เช่นกันครับ คำสั่งกำกับตรงนี้คือ คุณคือผู้ช่วยแปลงสกุลเงินอัจฉริยะ สำหรับคำขอแปลงสกุลเงิน ให้ใช้ get_fee_for_payment_method หรือใช้ get_exchange_rate เพื่อดึงอัตราแลกเปลี่ยน เช็คฟิลด์ status ในผลตอบกลับของทุก tool เพื่อดู error คำนวณยอดสุดท้ายหักค่าธรรมเนียม จากผลลัพธ์ของสองวิธีนี้ แล้วให้คำอธิบายแบบแจกแจงชัดเจน โดยระบุยอดแปลงสุดท้ายก่อน แล้วค่อยอธิบายว่าได้ตัวเลขนั้นมาอย่างไร โดยแสดงจำนวนเงินระหว่างทาง คำอธิบายต้องระบุเปอร์เซ็นต์ค่าธรรมเนียมพร้อมมูลค่าในสกุลเงินต้นฉบับ จำนวนเงินที่เหลือหลังหักค่าธรรมเนียม และอัตราแลกเปลี่ยนที่ใช้ในการแปลงขั้นสุดท้าย ถ้า tool ใดส่ง status เป็น error ให้อธิบายปัญหาให้ผู้ใช้เข้าใจชัดเจนครับ เพราะเราบอกให้ agent ใช้ tool นี้กับ tool นี้ เราจึงต้องนิยาม tool เหล่านั้นไว้ตรงนี้ด้วย จึงใส่ tool ทั้งสองตัวไว้ในลิสต์ tools ตามแผนภาพ และจะ print ข้อความเหล่านี้ออกมาเมื่อรันครับ

ต่อไปเราจะทดสอบ currency agent โดยสร้าง runner ขึ้นมารัน currency agent แล้วผมเห็น response เป็นคำตอบกลับมา โดยมีค่า default ว่า I want to convert 500 USD ซึ่งน่าจะเป็นค่าเดิมจากตอนที่ผมลองทำไว้ที่เครื่องผมเอง ตัวเลขเลยเปลี่ยนไป แต่โจทย์คือ I want to convert $120 to INR using a platinum card. How much will I receive? ผมจะรันอันนี้ครับ เริ่ม session ใหม่ บอกว่าผู้ใช้ถามคำถามนี้ คุณสามารถละเลย error นี้ได้ เพราะถ้ารันซ้ำมันจะหายไปเอง แล้วก็ขึ้นว่า currency agent ตอบกลับมาว่าจะได้รับเงินจำนวนกว่า ๆ นี้ และอธิบายวิธีคำนวณว่า platinum card มีค่าธรรมเนียม 2% ยอดเงิน 1250 USD คูณ 0.02 ได้เท่ากับ $25 ยอดหลังหักค่าธรรมเนียมคือ 1250 ลบ 25 เท่ากับ 1225 สำหรับการแปลงสกุลเงิน อัตราแลกเปลี่ยนจาก USD ไป INR อยู่ที่ 83.58 ดังนั้นเอาสองจำนวนนี้คูณกัน ยอดสุดท้ายจึงเป็น 102,385.54 INR ครับ

ต่อไปเป็น Section 3 ซึ่งพูดถึงว่าเราจะปรับปรุงความน่าเชื่อถือของ agent ด้วยโค้ดอย่างไรครับ เพราะเมื่อเราให้ LLM ทำการคำนวณทางคณิตศาสตร์ ไม่ใช่ว่าเราจะเชื่อถือ LLM ด้านคณิตศาสตร์ได้เสมอไป มันอาจคำนวณผิดพลาดหรือใช้สูตรที่ไม่สอดคล้องกันได้ ดังนั้นเราจึงให้ agent สร้าง Python code มาทำการคำนวณ แล้วรันโค้ดนั้นเพื่อให้ได้ผลลัพธ์สุดท้ายมาครับ ในกรณีนี้การรันโค้ดจึงน่าเชื่อถือกว่าการปล่อยให้ LLM คิดเลขเอาเองในหัวมาก ถ้าเทียบกับ flowchart ก่อนหน้าที่เราคุยกันไป currency agent ดั้งเดิมเป็น agent แบบง่ายที่เรียกใช้ function หรือ agent tool สองตัวนี้ แต่ในโมเดลใหม่ที่ปรับปรุงแล้ว คุณจะเห็นว่า currency agent ยังไปปฏิสัมพันธ์กับ calculation agent ด้วย ซึ่งเป็น agent ไม่ใช่ tool นะครับ โปรดสังเกตว่าสองตัวนี้เป็น tool แต่ตัวนี้เป็น agent และตัว agent นี้จะปฏิสัมพันธ์กับ built-in code executor เพื่อรันโค้ด Python ดึงผลลัพธ์ออกมา ด้วยเหตุนี้เราจึงเปลี่ยนชื่อจาก currency agent เป็น enhanced currency agent ครับ ADK มี built-in code executor ซึ่งสามารถรันโค้ดใน sandbox (สภาพแวดล้อมแยกส่วนทดลองโค้ดได้ปลอดภัย) ด้วย คุณไม่จำเป็นต้องมี production environment เลย และโปรดทราบว่านี่ใช้ความสามารถ code execution ของ Gemini ครับ

ทีนี้ลองสร้าง calculation agent กัน แล้วดูว่ามันใช้ built-in code executor อย่างไร รูปแบบของทุก agent ก็คือ คุณจะนิยาม agent เขียน name, model และ retry option ซึ่งเป็นสิ่งที่เราทำให้ calculation agent เรียบร้อยแล้ว จากนั้นเราให้ instructions ที่ชัดเจนเจาะจงว่าคาดหวังอะไรจาก agent นี้ ตรงนี้ระบุว่า คุณคือเครื่องคำนวณเฉพาะทางที่ตอบกลับเป็น Python code เท่านั้น ห้ามให้คำอธิบายเชิงข้อความหรือการตอบโต้แบบสนทนาโดยเด็ดขาด ซึ่งหมายความว่า calculation agent จะไม่เข้าไปคุยกับผู้ใช้หรือแย่งการควบคุมจาก enhanced currency agent เพื่อไปหาผู้ใช้โดยตรงครับ มาดูกฎข้อ ๆ ไป มันบอกว่า ผลลัพธ์ของคุณต้องเป็น Python code block เท่านั้น ห้ามเขียนข้อความใด ๆ ก่อนหรือหลัง code block โค้ด Python ต้องคำนวณผลลัพธ์ โค้ดต้อง print ผลลัพธ์สุดท้ายไปที่ stdout คุณถูกห้ามทำการคำนวณด้วยตัวเอง หน้าที่เดียวของคุณคือสร้างโค้ดที่จะทำการคำนวณนั้น และหากไม่ปฏิบัติตามกฎเหล่านี้จะถือเป็น error ครับ ดังนั้นมันจึงต้องใช้ code executor นั่นก็คือ built-in code executor ครับ มีส่วนหนึ่งไม่ได้อยู่ในโค้ดเดิมที่ผมเพิ่มเข้ามาเอง เพราะตอนรันผมอยากรู้ว่ามันรันสำเร็จจริง ๆ ขั้นถัดไปคือผมจะปรับปรุงคำสั่งกำกับของ agent เราสร้างส่วน calculation agent เสร็จแล้ว ตอนนี้ต้องผนวกมันเข้าไว้ใน instructions ของ currency agent ครับ ในคำสั่งกำกับนี้เราจะบอก currency agent ว่า ตอนนี้ให้คุณสร้าง Python code เพื่อคำนวณยอดสุดท้าย และใช้ calculation agent รันโค้ดนั้นเพื่อคำนวณยอดสุดท้าย ไม่ใช่ทำเองเหมือนคำสั่งคณิตศาสตร์ยาว ๆ ที่เคยมีก่อนหน้านี้ และในส่วนของ tool ถ้าย้อนดู tool ก่อนหน้า จะมี get_fee_for_payment_method กับ get_exchange_rate แต่ตอนนี้ tool ของคุณไม่ใช่แค่สองตัวนั้น แต่รวมถึง agent tool ด้วย ตามที่แผนภาพนี้แสดงไว้ ดังนั้นทุกครั้งที่ผู้ใช้ส่ง prompt มาขอข้อมูลการแปลง agent จะไปติดต่อกับ tool ทั้งสามตัวนี้ แล้วกลับมาหาผู้ใช้พร้อมผลลัพธ์สุดท้ายครับ ผมรันอันนี้ไปแล้ว แต่คิดว่ายังไม่ได้อธิบาย instructions เลย งั้นมาดูคำสั่งกำกับกันครับ

ตรงนี้ระบุว่า คุณคือผู้ช่วยแปลงสกุลเงินอัจฉริยะ คุณต้องทำตามขั้นตอนเหล่านี้อย่างเคร่งครัด และใช้ tool ที่มีให้สำหรับคำขอแปลงสกุลเงินทุกครั้ง ขั้นแรกดึงค่าธรรมเนียมธุรกรรม ดึงอัตราแลกเปลี่ยน เช็ค error คำนวณยอดสุดท้ายซึ่งเป็นขั้นสำคัญ และเราระบุอย่างชัดเจนว่า ห้ามคุณทำการคำนวณเลขคณิตด้วยตัวเองโดยเด็ดขาดครับ เหมือน agent ก่อนหน้า ต่อไปให้คำอธิบายแบบละเอียดในสรุป โดยต้องระบุยอดแปลงสุดท้าย แล้วจึงอธิบายว่าคุณคำนวณทั้งหมดอย่างไร เหมือนเดิมครับ ต่อไปเราจะรัน runner โดยตั้งชื่อว่า enhanced runner และใช้ตัว agent ของ enhanced runner เสร็จเรียบร้อย ทีนี้ลองทดสอบ agent แล้วดูว่าตอบถูกต้องหรือไม่ คำสั่งคือ convert 1250 USD to INR using a bank transfer. Show me the precise calculation. อย่าเป็นห่วงกับ warning ตรงนี้เลยนะครับ บางครั้งมันเกิดขึ้นถ้ามี notebook หรือ session หลายตัวกำลังรันอยู่ และถ้ารันซ้ำมันก็จะหายไปครับ ตรงนี้ขึ้นว่าให้แปลงจำนวนนี้ enhanced currency agent จึงตอบว่า การแปลงจากสกุลนี้เป็นสกุลนี้ นี่คือรายละเอียดการคำนวณ ยอดอยู่ที่ 1 lakh 4,140.5 โดยรายละเอียดคือค่าธรรมเนียมธุรกรรมของ bank transfer คิด 1% ยอดค่าธรรมเนียมจึงเป็น 12.5 หลังหักค่าธรรมเนียมยอดเหลือเท่านี้ แล้วด้วยอัตราแลกเปลี่ยน 1 USD ต่อสกุลนี้ ยอดสุดท้ายจึงเป็นเท่านี้ครับ มันให้คำตอบมาแบบนี้

ทีนี้มาดูกันว่ามันส่ง Python code ที่สร้างขึ้นไปอย่างไร และ calculation agent คำนวณผลนี้ด้วย built-in code executor อย่างไร เราทำได้โดยรัน helper function ที่เรานิยามไว้ตั้งแต่ต้น แล้วตอนนี้คุณเห็นว่ามันสร้าง Python response ว่า USD เท่ากับเท่านี้ exchange rate และ fee ก็คือมันคำนวณค่าธรรมเนียมโอนเงินเป็น INR แล้วบอกให้ print ยอด INR ออกมา จากนั้นมันสร้างส่วนค่าธรรมเนียมอีกครั้ง แล้ว print ข้อมูลทั้งหมดเกี่ยวกับ rate และการโอนออกมา และนี่คือวิธีที่คุณได้ตัวเลขเหล่านี้มาในคำตอบครับ

ผมแน่ใจว่าหลายคนคงมีคำถามนี้ คือความแตกต่างระหว่าง agent tool กับ sub-agent คืออะไร? เพราะใน code lab ก่อน ๆ เราใช้ sub-agent (agent ลูกที่ถูกเรียกใช้โดย agent หลัก) ควบคู่กับ function tool มาแล้ว และตรงนี้เราใช้ agent tool ซึ่งดูเหมือนทำงานคล้ายกัน แต่นั่นไม่ถูกต้องนะครับ พวกมันทำงานต่างกันมาก ขอเล่าให้ฟังว่าความต่างคืออะไร ก่อนจะพูดถึง ขอยกตัวอย่างจากวิดีโอที่ผ่านมาเลยครับ ถ้าจำ pattern การไหลของงาน (flow pattern) ที่เราเรียนในวิดีโอ Part B ของ Day 1 ได้ ก็มี sequential flow (การไหลแบบเรียงลำดับ) ซึ่งเป็น flow แบบพึ่งพิงกัน ผลลัพธ์ของ A เป็น input ของ B และผลลัพธ์ของ B เป็น input ของ C ตรงนี้ให้สังเกตว่าผู้ใช้ส่ง prompt ไปหา agent A แต่เมื่อจบกระบวนการ คำตอบสุดท้ายถูกส่งให้ผู้ใช้โดย agent C ครับ แปลว่า agent A เสียการควบคุมไปแล้ว และตอนนี้ agent C เป็นผู้ควบคุมบทสนทนาแทน นี่คือสิ่งที่เกิดใน sub-agent ครับ ส่วน agent tool ไม่ได้เป็นแบบนั้น ถ้าย้อนกลับไปดู flowchart เราจะเห็นว่ามีเพียง agent หลักตัวเดียวที่ปฏิสัมพันธ์กับผู้ใช้ แม้มันจะไปขอคำนวณจาก agent ตัวนี้แล้วกลับมาแชร์ให้ผู้ใช้ มันขอความช่วยเหลือแต่ไม่ได้เสียการควบคุมผู้ใช้ไปครับ ถ้ากลับมาอ่านตรงนี้อีกครั้ง คุณจะเข้าใจมากขึ้น คือ agent A เรียก agent B ในฐานะ tool ผลตอบกลับของ agent B วนกลับไปที่ agent A แล้ว agent A ยังคงควบคุมอยู่และสานต่อบทสนทนาต่อไป ดังนั้น use case ในโลกจริงคือการมอบหมายงาน (delegation) ให้ผู้เชี่ยวชาญเฉพาะทาง เช่น การคำนวณครับ

ในทางกลับกัน sub-agent เป็น pattern อีกแบบที่เราเคยทำในแบบฝึกหัดก่อน ๆ agent A โอนการควบคุมทั้งหมดให้ agent B แล้ว agent B เข้ามารับช่วงต่อและจัดการ input ของผู้ใช้ทั้งหมดในอนาคต agent A หลุดออกจากวงจรไปเลย use case คือการส่งต่อผู้เชี่ยวชาญ (handoff) เหมือนชั้นของฝ่ายบริการลูกค้าที่มี level 1, level 2, level 3 อย่างนั้นครับ ในตัวอย่างของเรา เราต้องการให้ currency agent ได้ผลการคำนวณมาแล้วยังทำงานต่อกับผลนั้นได้ เราจึงใช้ agent tool ไม่ใช่ sub-agent หวังว่าจะเข้าใจชัดขึ้นนะครับ

ตอนนี้มาถึง Section 4 ของแบบฝึกหัดนี้ ซึ่งเป็นคู่มือครบวงจรเรื่อง tool ของ ADK ครับ ในส่วนนี้เราจะเข้าใจประเภทของ tool ที่ชุดเครื่องมือ ADK จัดเตรียมให้ โดยพื้นฐานแล้วมีสองหมวดใหญ่ คือ custom (สร้างเอง) กับ built-in (สำเร็จรูป) ครับ custom tool หมายถึงอะไรตามที่กล่าวไปแล้ว? ก็คือคุณควบคุมการทำงานของ tool เองได้ คุณจะสร้างสิ่งที่ agent ต้องทำให้คุณได้ตรงตามต้องการ ตัวอย่างคือ function tool อย่างที่เราใช้ในตัวอย่างวันนี้ครับ จากนั้นมี long-running function tool ซึ่งช่วยในงานประมวลผลไฟล์และการอนุมัติแบบ human-in-the-loop (มีมนุษย์เข้ามามีส่วนร่วมในกระบวนการ) ข้อดีคือ agent เริ่มงานนั้นไว้แล้วไปทำงานอื่นต่อได้ ระหว่างรอให้การประมวลผลไฟล์หรืองานนั้นเสร็จครับ ต่อไปมี MCP tool และมี OpenAI tool ด้วย ส่วน agent tool นั้นเป็นสิ่งที่เราเพิ่งทำเสร็จมาเอง เป็นเหมือน agent ผู้เชี่ยวชาญเฉพาะทางที่เรานิยามไว้แล้ว จึงนำกลับมาใช้ซ้ำได้ในหลายระบบครับ MCP tool คือ tool ที่มาจาก MCP server (เซิร์ฟเวอร์ที่ให้บริการเครื่องมือผ่านโปรโตคอล MCP) ตัวอย่างเช่น Google Maps ฐานข้อมูล ฯลฯ ข้อดีคือเมื่อคุณเชื่อมต่อ คุณสามารถเชื่อมกับบริการที่รองรับ MCP ใดก็ได้ โดยไม่ต้องหาวิธี integrate แบบ custom เองเลย และท้ายสุดคือ OpenAPI tool ซึ่งทุกคนรู้จักกันดี คือการเปลี่ยน REST API endpoint ให้กลายเป็น tool ที่เรียกใช้ได้ ข้อดีคือไม่ต้องเขียนโค้ดเองเลย แค่ให้ API spec มาก็เริ่มใช้ tool ได้เลยครับ

ต่อไปเป็น built-in tool ครับ ตามความหมายของคำ นี่คือ tool สำเร็จรูปที่ชุดเครื่องมือ ADK เตรียมให้ ข้อดีคือนำไปใช้ได้ทันที ไม่ต้องตั้งค่าอะไร และไม่ต้องเสียเวลาพัฒนาเองครับ Gemini tool คือตัวที่เราใช้ในแบบฝึกหัดมาจนถึงตอนนี้ ถัดมาคือ Google tool ซึ่งได้แก่ชุด BigQuery tool, Places API, hub toolset ฯลฯ โดยรวมแล้วเป็น tool สำหรับบริการ Google Cloud และการเชื่อมต่อระดับองค์กร (enterprise) ครับ และท้ายสุดคือ third-party tool (tool จากผู้ให้บริการภายนอก) อย่าง GitHub และ Hugging Face ข้อดีของการใช้ tool เหล่านี้คือคุณนำการลงทุนที่มีอยู่แล้วกลับมาใช้ซ้ำได้ ไม่ต้องสร้างใหม่ในสิ่งที่มีอยู่แล้วครับ สิ่งที่ทำคือ tool เหล่านี้เป็นเหมือน wrapper (ตัวห่อหุ้ม) ของระบบ tool ที่มีอย่าง นั่นเองครับ

เอาล่ะครับ ยินดีด้วยนะครับ เราสำเร็จสมบูรณ์ Day 2 Part 1 เรียบร้อยแล้ว ซึ่งเราได้เรียนวิธีสร้าง agent ที่ก้าวข้างจากการตอบแบบง่าย ๆ ไปสู่การลงมือทำสิ่งที่ฉลาดแบบมีเป้าหมายด้วย custom tool โปรดต่อไปยังวิดีโอถัดไปเพื่อเรียนเรื่อง tool pattern ซึ่งเป็นแบบฝึกหัด Part B ของ Day 2 ครับ ขอบคุณครับ

03

หมายเหตุการแปล

ความโปร่งใสเกี่ยวกับความไม่แน่นอนในต้นฉบับ

  • ## จุดที่ใช้สัญลักษณ์ฟังไม่ชัด
04

อภิธานศัพท์เทคนิค

คำศัพท์และชื่อผลิตภัณฑ์ที่คงรูปภาษาอังกฤษ

ศัพท์คำแปล / คำอธิบาย
AI agentเอเจนต์ AI — โปรแกรมที่ทำงานเป็นตัวแทนผู้ใช้โดยอาศัยโมเดลภาษาตัดสินใจและลงมือทำ
Google ADK (Agent Development Kit)ชุดเครื่องมือของ Google สำหรับพัฒนา agent
Geminiโมเดลภาษาขนาดใหญ่ของ Google ที่ใช้ขับเคลื่อน agent
Kaggleแพลตฟอร์ม data science ของ Google ที่ใช้รัน notebook ของคอร์สนี้
NotebookLMเครื่องมือของ Google ที่สรุปเนื้อหาเป็นพอดแคสต์สรุปให้ฟัง
toolเครื่องมือ — ความสามารถที่ต่อขยายสิ่งที่ agent ทำได้ เช่น ค้นหา คำนวณ เรียก API
built-in toolเครื่องมือสำเร็จรูปที่ ADK เตรียมให้ใช้ได้ทันที
custom toolเครื่องมือที่เราเขียนขึ้นเองเพื่อควบคุมการทำงานได้เต็มที่
function toolcustom tool ที่เกิดจากการเปลี่ยน Python function ให้เป็น tool ของ agent
agent toolการใช้ agent หนึ่งเป็น tool ของ agent อีกตัว โดยตัวเรียกยังคุมบทสนทนาต่อ (delegation)
sub-agentagent ลูกที่รับการโอนการควบคุมทั้งหมดจาก agent หลัก แล้วดูแลผู้ใช้ต่อเอง (handoff)
MCP (Model Context Protocol)โปรโตคอลกลางสำหรับเชื่อม tool/บริการภายนอกเข้ากับ agent
MCP serverเซิร์ฟเวอร์ที่ให้บริการเครื่องมือผ่านโปรโตคอล MCP เช่น Google Maps
OpenAPI tooltool ที่สร้างจาก REST API endpoint โดยให้ API spec โดยไม่ต้องเขียนโค้ดเอง
long-running function tooltool สำหรับงานที่ใช้เวลานาน เช่น ประมวลผลไฟล์ หรืออนุมัติแบบ human-in-the-loop
human-in-the-loopรูปแบบที่มีมนุษย์เข้ามาอนุมัติหรือมีส่วนร่วมในกระบวนการของ agent
code executorตัวรันโค้ด — ให้ agent สร้าง Python code แล้วรันจริงเพื่อให้ได้ผลลัพธ์คำนวณ
sandboxสภาพแวดล้อมแยกส่วนสำหรับรันโค้ดทดลองอย่างปลอดภัย
LLM (Large Language Model)โมเดลภาษาขนาดใหญ่ที่ขับเคลื่อนการตัดสินใจของ agent
docstringข้อความคำอธิบายฟังก์ชันในโค้ด ซึ่ง LLM อ่านเพื่อตัดสินใจว่าจะใช้ tool เมื่อไหร่ อย่างไร
type hintsการกำกับชนิดข้อมูลของพารามิเตอร์ใน Python ช่วยให้ ADK สร้าง schema ถูกต้อง
error handlingการจัดการข้อผิดพลาดในโค้ด ให้ tool ตอบ error กลับมาเป็นระบบ
sessionเซสชัน — บริบทบทสนทนาระหว่างผู้ใช้กับ agent ในการทำงานหนึ่งรอบ
InMemoryRunner / InMemorySessionServiceตัวรัน agent และบริการจัดการ session แบบเก็บในหน่วยความจำของ ADK
sequential flowpattern การทำงานเรียงลำดับ ผลลัพธ์ของ agent ก่อนหน้าเป็น input ของตัวถัดไป
delegationการมอบหมายงานให้ผู้เชี่ยวชาญเฉพาะทาง โดยผู้มอบหมายยังคุมงานต่อ
handoffการส่งต่อผู้ใช้ให้ผู้เชี่ยวชาญดูแลแทนทั้งหมด เช่น ชั้น support level 1/2/3
BigQueryบริการคลังข้อมูลของ Google Cloud ในกลุ่ม Google tool ของ ADK
Hugging Face / GitHubตัวอย่าง third-party tool ที่ ADK ห่อเป็น built-in tool ให้ใช้ซ้ำได้
white paperเอกสารสรุปแนวคิดหลักของหัวข้อที่เรียน
05

ซับไตเติ้ลภาษาไทย

ดาวน์โหลดหรือดูซับทั้งหมด

1
00:00:00,000 --> 00:00:03,953
สวัสดีทุกคนครับ ยินดีต้อนรับเข้าสู่บทเรียน Day

2
00:00:03,953 --> 00:00:07,562
2 ของคอร์ส Google Intensive Training on AI

3
00:00:07,562 --> 00:00:08,660
Agents ครับ

4
00:00:08,660 --> 00:00:12,699
ในหน่วยที่สองนี้เรามีแบบฝึกหัดสองส่วนเหมือนเดิม
thai-subtitles.srt
SubRip — ใช้กับเครื่องเล่นวิดีโอส่วนใหญ่
↓ ดาวน์โหลด
thai-subtitles.vtt
WebVTT — ใช้กับเว็บ / YouTube
↓ ดาวน์โหลด
เปิดดูซับไตเติ้ลทั้งหมด (484 segments)
1
00:00:00,000 --> 00:00:03,953
สวัสดีทุกคนครับ ยินดีต้อนรับเข้าสู่บทเรียน Day

2
00:00:03,953 --> 00:00:07,562
2 ของคอร์ส Google Intensive Training on AI

3
00:00:07,562 --> 00:00:08,660
Agents ครับ

4
00:00:08,660 --> 00:00:12,699
ในหน่วยที่สองนี้เรามีแบบฝึกหัดสองส่วนเหมือนเดิม

5
00:00:12,699 --> 00:00:15,535
คือ Day 2 Part A กับ Day 2 Part B

6
00:00:15,535 --> 00:00:18,628
ส่วนวิดีโอนี้เราจะพูดถึง Part A ครับ

7
00:00:18,628 --> 00:00:21,464
เหมือนที่เคยแจ้งไว้ในวิดีโอก่อน ๆ

8
00:00:21,464 --> 00:00:25,160
แบบฝึกหัดนี้ก็มีตอนสรุปแบบพอดแคสต์ (summary

9
00:00:25,160 --> 00:00:26,792
podcast) ให้ฟังด้วย

10
00:00:26,792 --> 00:00:29,199
กดตรงนี้เพื่อไปฟังได้เลยครับ

11
00:00:29,199 --> 00:00:31,863
ตอนนั้นสร้างขึ้นด้วย NotebookLM

12
00:00:31,863 --> 00:00:35,644
(เครื่องมือสรุปเนื้อหาเป็นบทสนทนาด้วย AI ของ

13
00:00:35,644 --> 00:00:36,741
Google)

14
00:00:36,741 --> 00:00:40,265
ผมจะใส่ลิงก์ไว้ในคำอธิบายของวิดีโอนี้ด้วย

15
00:00:40,265 --> 00:00:43,358
นอกจากนี้ผมจะใส่ลิงก์ของ white paper

16
00:00:43,358 --> 00:00:47,225
(เอกสารสรุปแนวคิดหลักของหัวข้อนี้) ไว้ให้ด้วย

17
00:00:47,225 --> 00:00:49,374
สำหรับใครที่ยังไม่ได้อ่าน

18
00:00:49,374 --> 00:00:52,983
แนะนำให้อ่านหลังจากทำ code lab เสร็จนะครับ

19
00:00:52,983 --> 00:00:57,710
มันจะช่วยคุณในระยะยาวเพราะข้อมูลในนั้นมีประโยชน์มากครับ

20
00:00:57,710 --> 00:01:01,577
แบบฝึกหัดนี้เกี่ยวกับการสำรวจ tool ใหม่ ๆ ของ

21
00:01:01,577 --> 00:01:04,842
ADK เพื่อขยายขอบเขตสิ่งที่ agent ทำได้

22
00:01:04,842 --> 00:01:07,936
แล้วจึงไปต่อที่แนวปฏิบัติที่ดี (best

23
00:01:07,936 --> 00:01:11,889
practices) ของ tool เหล่านั้น รวมถึงการใช้ MCP

24
00:01:11,889 --> 00:01:14,037
(Model Context Protocol —

25
00:01:14,037 --> 00:01:17,475
โปรโตคอลกลางสำหรับเชื่อมต่อเครื่องมือกับ

26
00:01:17,475 --> 00:01:20,396
agent) และ long-running operations

27
00:01:20,396 --> 00:01:23,920
(งานที่ทำต่อเนื่องนาน) ครับ ผมกำลังกดปุ่ม

28
00:01:23,920 --> 00:01:27,873
Explore เพื่อเข้าสู่แบบฝึกหัดแรกของ Day 2 ครับ

29
00:01:27,873 --> 00:01:30,193
ระบบจะสร้าง notebook ให้เรา

30
00:01:30,193 --> 00:01:33,974
จากนั้นเราถูกพาไปยัง notebook แบบแก้ไขไม่ได้

31
00:01:33,974 --> 00:01:37,584
ให้กดปุ่ม Edit my copy ทางด้านขวามือด้านบน

32
00:01:37,584 --> 00:01:41,537
ก็จะได้สำเนาที่แก้ไขได้สำหรับรันโค้ดของเราครับ

33
00:01:41,537 --> 00:01:44,029
ในคอร์สนี้เราจะเรียนอะไรบ้าง?

34
00:01:44,029 --> 00:01:47,896
เราจะเรียนวิธีสร้าง agent ที่มาพร้อม built-in

35
00:01:47,896 --> 00:01:51,849
tool (เครื่องมือสำเร็จรูป) อย่าง Google Search

36
00:01:51,849 --> 00:01:55,200
เราจะเริ่มจากการเปลี่ยน Python function

37
00:01:55,200 --> 00:01:59,153
ธรรมดาให้กลายเป็น agent tool จากนั้นเราจะสร้าง

38
00:01:59,153 --> 00:02:03,106
agent ขึ้นมาหนึ่งตัวแล้วใช้มันเป็น tool ของอีก

39
00:02:03,106 --> 00:02:06,028
agent หนึ่ง สร้าง multi-tool agent

40
00:02:06,028 --> 00:02:09,895
ตัวแรกของเรา และสำรวจประเภทของ tool ต่าง ๆ ใน

41
00:02:09,895 --> 00:02:12,301
ADK ครับ ต่อไปเป็น Section 1

42
00:02:12,301 --> 00:02:15,825
ซึ่งเป็นการเตรียมสภาพแวดล้อม (environment

43
00:02:15,825 --> 00:02:19,348
setup) ครับ เนื่องจากเราใช้สภาพแวดล้อมของ

44
00:02:19,348 --> 00:02:23,043
Kaggle อยู่แล้ว เราจึงไม่ต้องติดตั้งไลบรารี

45
00:02:23,043 --> 00:02:25,106
Google ADK สำหรับ Python

46
00:02:25,106 --> 00:02:29,746
แต่ถ้าใครใช้สภาพแวดล้อมภายนอกก็กรุณาติดตั้งเพิ่มนะครับ

47
00:02:29,746 --> 00:02:33,098
กลับมาที่ขั้นตอนตั้งค่า (configuration)

48
00:02:33,098 --> 00:02:35,762
เหมือนที่เราเคยทำในวิดีโอก่อน ๆ

49
00:02:35,762 --> 00:02:39,371
ของแบบฝึกหัดก่อน ๆ ให้ไปที่ Add-ons แล้วกด

50
00:02:39,371 --> 00:02:42,035
Secret ตอนนี้มันถูกเลือกไว้แล้ว

51
00:02:42,035 --> 00:02:45,558
ปกติบางครั้งพอกดเข้า Secret ค่าอาจยังเป็น

52
00:02:45,558 --> 00:02:46,656
unset อยู่

53
00:02:46,656 --> 00:02:50,093
ดังนั้นให้เช็คดูว่าตั้งค่าไว้แล้วหรือยัง

54
00:02:50,093 --> 00:02:54,476
ถ้ายังไม่ตั้งก็ตั้งขึ้นมาก่อนแล้วค่อยรันโค้ดนี้ครับ

55
00:02:54,476 --> 00:02:58,257
โค้ดส่วนนี้ผมอธิบายไปแล้วในสองวิดีโอก่อนหน้า

56
00:02:58,257 --> 00:03:00,234
จึงขอไม่พูดถึงอีกนะครับ

57
00:03:00,234 --> 00:03:04,101
ตอนนี้เราตั้งค่าและยืนยันตัวตน (authenticate)

58
00:03:04,101 --> 00:03:07,109
กับ API key สำเร็จเรียบร้อยแล้วครับ

59
00:03:07,109 --> 00:03:10,890
ขั้นต่อไปเราจะ import คอมโพเนนต์ของ ADK ครับ

60
00:03:10,890 --> 00:03:12,609
ตรงนี้เราเห็น import

61
00:03:12,609 --> 00:03:17,937
เพิ่มขึ้นมาสองรายการนอกเหนือจากที่เราเคยทำในสองวิดีโอที่ผ่านมา

62
00:03:17,937 --> 00:03:19,226
ผมขอรันโค้ดก่อน

63
00:03:19,226 --> 00:03:23,179
แล้วระหว่างรอค่อยเล่าให้ฟังว่าข้างในมีอะไรครับ

64
00:03:23,179 --> 00:03:26,616
ก่อนหน้านี้ agent ที่เราใช้คือ LLM agent

65
00:03:26,616 --> 00:03:30,225
(agent ที่ขับเคลื่อนด้วยโมเดลภาษาขนาดใหญ่)

66
00:03:30,225 --> 00:03:33,835
โดยโมเดลของ Google ที่เราใช้คือ Gemini ตัว

67
00:03:33,835 --> 00:03:37,444
runner ที่เราใช้คือ InMemoryRunner (ตัวรัน

68
00:03:37,444 --> 00:03:40,967
agent ในหน่วยความจำ) และตัวจัดการ session

69
00:03:40,967 --> 00:03:43,717
ที่ใช้คือ InMemorySessionService

70
00:03:43,717 --> 00:03:47,584
(บริการจัดการเซสชันในหน่วยความจำ) เราทำงานกับ

71
00:03:47,584 --> 00:03:51,451
Google Search มาโดยตลอดในแบบฝึกหัดก่อน ๆ ครับ

72
00:03:51,451 --> 00:03:54,631
คราวนี้เรามี agent tool (การใช้ agent

73
00:03:54,631 --> 00:03:57,381
เป็นเครื่องมือ) และ tool context

74
00:03:57,381 --> 00:04:01,076
(บริบทของเครื่องมือที่ส่งเข้าไปให้ฟังก์ชัน)

75
00:04:01,076 --> 00:04:04,685
เพิ่มเข้ามาด้วย ซึ่งจะได้ใช้ในโค้ดถัด ๆ ไป

76
00:04:04,685 --> 00:04:07,349
แล้วก็มี built-in code executor

77
00:04:07,349 --> 00:04:09,154
(ตัวรันโค้ดสำเร็จรูป)

78
00:04:09,154 --> 00:04:12,591
อีกตัวที่เราจะใช้สำหรับการคำนวณที่ agent

79
00:04:12,591 --> 00:04:13,689
ต้องการ

80
00:04:13,689 --> 00:04:17,384
ผมจะอธิบายละเอียดเมื่อไปถึงแต่ละขั้นตอนครับ

81
00:04:17,384 --> 00:04:19,962
ตอนนี้คอมโพเนนต์ของ ADK import

82
00:04:19,962 --> 00:04:23,744
สำเร็จเรียบร้อยแล้ว ต่อไปรัน helper function

83
00:04:23,744 --> 00:04:27,611
ตัวนี้ครับ เราทำเฉพาะเมื่อใช้ Kaggle เท่านั้น

84
00:04:27,611 --> 00:04:31,993
ถ้าอยู่ในสภาพแวดล้อมภายนอกก็ไม่ต้องนิยามฟังก์ชันนี้

85
00:04:31,993 --> 00:04:35,603
เสร็จแล้ว ต่อไปเป็นการตั้งค่า retry option

86
00:04:35,603 --> 00:04:38,954
ครับ ในโค้ดของคุณอาจไม่เห็นคำสั่ง print

87
00:04:38,954 --> 00:04:41,446
บรรทัดนี้ คุณพิมพ์เพิ่มเองได้

88
00:04:41,446 --> 00:04:44,798
ผมใส่ไว้เพราะอยากรู้ว่ามันรันผ่านจริง ๆ

89
00:04:44,798 --> 00:04:48,665
ถึงตรงนี้การเตรียมความพร้อมก็เสร็จสมบูรณ์ครับ

90
00:04:48,665 --> 00:04:50,985
ต่อไปเข้าสู่ Section 2 ครับ

91
00:04:50,985 --> 00:04:54,337
ในส่วนนี้เราจะเข้าใจก่อนว่า custom tool

92
00:04:54,337 --> 00:04:57,602
(เครื่องมือที่เราสร้างขึ้นเอง) คืออะไร

93
00:04:57,602 --> 00:05:01,125
ในแบบฝึกหัดของ Day 1 เราใช้ built-in tool

94
00:05:01,125 --> 00:05:04,649
ซึ่งเป็นเครื่องมือแบบทั่วไปมาก นำไปใช้กับ

95
00:05:04,649 --> 00:05:07,313
business logic (ตรรกะทางธุรกิจ)

96
00:05:07,313 --> 00:05:11,180
เฉพาะของเราหรือความต้องการเฉพาะทางไม่ได้ tool

97
00:05:11,180 --> 00:05:15,047
แบบ generic อาจจัดการงานเหล่านั้นได้ไม่ตรงตาม

98
00:05:15,047 --> 00:05:16,422
requirement พอดี

99
00:05:16,422 --> 00:05:20,203
ดังนั้นเพื่อแก้ปัญหานั้นเราจึงมี custom tool

100
00:05:20,203 --> 00:05:23,039
ที่ให้อำนาจควบคุมการทำงานของ tool

101
00:05:23,039 --> 00:05:26,305
ได้อย่างเต็มที่ครับ ADK มี custom tool

102
00:05:26,305 --> 00:05:29,484
หลายประเภทสำหรับรองรับสถานการณ์แบบนี้

103
00:05:29,484 --> 00:05:32,320
ถ้าอยากรู้รายละเอียด ท้าย section

104
00:05:32,320 --> 00:05:33,867
นี้มีบทความให้อ่าน

105
00:05:33,867 --> 00:05:38,937
ผมจะใส่ลิงก์ไว้ในคำอธิบายวิดีโอให้อ่านจากที่นั่นได้ด้วยครับ

106
00:05:38,937 --> 00:05:42,632
ตัวอย่างที่ใช้สาธิตการสร้าง custom function

107
00:05:42,632 --> 00:05:46,413
tool คือ currency converter agent หรือ agent

108
00:05:46,413 --> 00:05:48,476
แปลงสกุลเงิน ก็คือ agent

109
00:05:48,476 --> 00:05:51,999
ที่แปลงเงินจากสกุลหนึ่งไปเป็นอีกสกุลหนึ่ง

110
00:05:51,999 --> 00:05:55,351
พร้อมกับคำนวณค่าธรรมเนียมของการแปลงครับ

111
00:05:55,351 --> 00:05:58,702
ที่นี่เราต้องใช้ custom tool สองตัว คือ

112
00:05:58,702 --> 00:06:01,280
get_fee_for_payment_method กับ

113
00:06:01,280 --> 00:06:02,741
get_exchange_rate

114
00:06:02,741 --> 00:06:06,350
ตัวแรกจะหาค่าธรรมเนียมธุรกรรมสำหรับการแปลง

115
00:06:06,350 --> 00:06:10,475
ส่วนตัวที่สองจะดึงอัตราแลกเปลี่ยนของสกุลเงินครับ

116
00:06:10,475 --> 00:06:14,342
วิธีที่ flowchart ทำงานคือ ผู้ใช้จะส่ง prompt

117
00:06:14,342 --> 00:06:18,467
บอกว่าต้องการแปลงสกุลเงินหนึ่งไปเป็นอีกสกุลหนึ่ง

118
00:06:18,467 --> 00:06:22,248
จากนั้น currency agent จะอ้างอิงข้อมูลที่ได้

119
00:06:22,248 --> 00:06:25,428
(observations) จาก tool ทั้งสองตัวนี้

120
00:06:25,428 --> 00:06:29,295
แล้วส่งผลลัพธ์กลับไปให้ผู้ใช้ โดยตัว currency

121
00:06:29,295 --> 00:06:32,303
agent เองจะเป็นคนคำนวณเลขนี้เองครับ

122
00:06:32,303 --> 00:06:35,139
แล้วเราจะนิยาม tool อย่างไร? tool

123
00:06:35,139 --> 00:06:38,146
โดยพื้นฐานแล้วก็คือ Python function

124
00:06:38,146 --> 00:06:41,584
ที่กลายมาเป็น agent tool ครับ เราจะสร้าง

125
00:06:41,584 --> 00:06:42,873
Python function

126
00:06:42,873 --> 00:06:46,053
ขึ้นมาโดยยึดแนวปฏิบัติที่ดีที่ระบุไว้

127
00:06:46,053 --> 00:06:49,576
แล้วนำฟังก์ชันนั้นไปใส่ในลิสต์ tools ครับ

128
00:06:49,576 --> 00:06:53,013
แนวปฏิบัติที่ดีเวลาสร้าง Python function

129
00:06:53,013 --> 00:06:56,107
มีอะไรบ้าง? ข้อแรกคือให้ return เป็น

130
00:06:56,107 --> 00:06:58,685
dictionary ที่บอกสถานะของ tool

131
00:06:58,685 --> 00:07:02,552
ว่าสำเร็จหรือว่ามี error อะไร ข้อสองต้องเขียน

132
00:07:02,552 --> 00:07:06,419
docstring (ข้อความคำอธิบายฟังก์ชัน) ให้ชัดเจน

133
00:07:06,419 --> 00:07:08,396
เพราะ LLM ใช้ docstring

134
00:07:08,396 --> 00:07:11,060
ในการทำความเข้าใจว่าควรใช้ tool

135
00:07:11,060 --> 00:07:14,841
นั้นเมื่อไหร่และใช้อย่างไร ข้อสามคือใช้ type

136
00:07:14,841 --> 00:07:18,708
hints (การกำกับชนิดข้อมูลของพารามิเตอร์) เช่น

137
00:07:18,708 --> 00:07:22,403
dict หรือ str เพราะช่วยให้ ADK สร้าง schema

138
00:07:22,403 --> 00:07:26,013
ที่ถูกต้อง ข้อสี่คือใส่การจัดการข้อผิดพลาด

139
00:07:26,013 --> 00:07:29,794
(error handling) เพราะช่วยให้เราจัดโครงสร้าง

140
00:07:29,794 --> 00:07:33,317
error response ได้เป็นระบบ และช่วยให้ LLM

141
00:07:33,317 --> 00:07:37,184
รับมือกับความล้มเหลวได้อย่างเหมาะสมในกรณีเกิด

142
00:07:37,184 --> 00:07:39,418
error ว่า LLM ควรทำอะไรต่อ

143
00:07:39,418 --> 00:07:42,856
ทั้งหมดนี้เราจะใส่ลงไปใน Python function

144
00:07:42,856 --> 00:07:45,864
เพื่อให้ tool น่าเชื่อถือและให้ LLM

145
00:07:45,864 --> 00:07:49,473
ใช้งานถูกต้องได้ง่ายขึ้นครับ โค้ดตรงนี้คือ

146
00:07:49,473 --> 00:07:53,082
tool แรกที่ชื่อ get_fee_for_payment_method

147
00:07:53,082 --> 00:07:55,316
ครับ ในส่วนคำอธิบายระบุว่า

148
00:07:55,316 --> 00:07:57,379
เมื่อฟังก์ชันนี้ถูกเรียก

149
00:07:57,379 --> 00:08:03,051
มันจะค้นหาเปอร์เซ็นต์ค่าธรรมเนียมธุรกรรมของวิธีการชำระเงินที่กำหนด

150
00:08:03,051 --> 00:08:04,148
tool

151
00:08:04,148 --> 00:08:08,273
นี้จำลองการค้นหาโครงสร้างค่าธรรมเนียมภายในบริษัท

152
00:08:08,273 --> 00:08:11,539
จากชื่อวิธีชำระเงินที่ผู้ใช้ระบุมาครับ

153
00:08:11,539 --> 00:08:14,203
อาร์กิวเมนต์คือชื่อวิธีชำระเงิน

154
00:08:14,203 --> 00:08:17,812
ซึ่งควรระบุแบบละเอียด เช่น platinum credit

155
00:08:17,812 --> 00:08:21,593
card หรือ bank transfer เมื่อได้รับแล้วมันจะ

156
00:08:21,593 --> 00:08:25,460
return เป็น dictionary ที่มีข้อมูล status กับ

157
00:08:25,460 --> 00:08:29,241
fee เช่น status เป็น success เมื่อสำเร็จ และ

158
00:08:29,241 --> 00:08:32,421
fee_percentage เป็น 2% ส่วนกรณี error

159
00:08:32,421 --> 00:08:35,601
จะถูกส่งกลับมาเมื่อ status เป็น error

160
00:08:35,601 --> 00:08:39,382
โดยข้อความ error จะบอกว่า payment method not

161
00:08:39,382 --> 00:08:40,479
found คือ

162
00:08:40,479 --> 00:08:44,261
ถ้าผู้ใช้ให้ชื่อวิธีชำระเงินที่ไม่มีอยู่จริง

163
00:08:44,261 --> 00:08:48,128
มันก็จะโยน error นี้ออกมาครับ จากนั้นเรากำหนด

164
00:08:48,128 --> 00:08:49,225
fee database

165
00:08:49,225 --> 00:08:53,006
หรือฐานข้อมูลค่าธรรมเนียมตามที่ระบุไว้ตรงนี้

166
00:08:53,006 --> 00:08:56,702
ก็คือ ถ้าเป็น platinum credit card จะคิด 2%

167
00:08:56,702 --> 00:09:00,569
ถ้าเป็น gold card กับ debit card คิด 3.5% และ

168
00:09:00,569 --> 00:09:02,717
bank transfer คิด 1% ครับ

169
00:09:02,717 --> 00:09:07,100
ทีนี้เราต้องดึงข้อมูลนี้ออกมาโดยแบ่งเป็นสองเงื่อนไข

170
00:09:07,100 --> 00:09:10,881
ทางแรก ถ้า fee ไม่เป็น none คือมีค่าอยู่จริง

171
00:09:10,881 --> 00:09:13,287
return status จะเป็น success

172
00:09:13,287 --> 00:09:17,154
และแสดงเปอร์เซ็นต์ค่าธรรมเนียมออกมา ทางที่สอง

173
00:09:17,154 --> 00:09:20,420
ถ้า fee เป็น none กรณีนั้นจะเป็น error

174
00:09:20,420 --> 00:09:21,795
โดยข้อความ error

175
00:09:21,795 --> 00:09:26,006
จะระบุชื่อวิธีชำระเงินที่ผู้ใช้ป้อนเข้ามาว่าไม่พบ

176
00:09:26,006 --> 00:09:29,873
(not found) ครับ ผมจะรันอันนี้ กด Shift+Enter

177
00:09:29,873 --> 00:09:32,279
บนคีย์บอร์ด ก็เสร็จเรียบร้อย

178
00:09:32,279 --> 00:09:35,630
อย่างที่เคยแจ้งไว้ คุณสามารถกดปุ่ม play

179
00:09:35,630 --> 00:09:38,896
ตรงนี้เพื่อรันชุดโค้ดก็ได้ ไม่เช่นนั้น

180
00:09:38,896 --> 00:09:42,591
Shift+Enter ก็ทำงานเหมือนกันครับ ต่อไปนิยาม

181
00:09:42,591 --> 00:09:46,200
tool ถัดไปซึ่งก็คือ get_exchange_rate ครับ

182
00:09:46,200 --> 00:09:50,068
ที่นี่ base currency จะเป็น string และ target

183
00:09:50,068 --> 00:09:53,505
currency ก็เป็น string เช่นกัน docstring

184
00:09:53,505 --> 00:09:56,255
บอกไว้ว่า เมื่อ tool นี้ถูกเรียก

185
00:09:56,255 --> 00:10:01,497
มันจะค้นหาและส่งกลับอัตราแลกเปลี่ยนระหว่างสกุลเงินสองสกุลครับ

186
00:10:01,497 --> 00:10:03,731
อาร์กิวเมนต์ base currency

187
00:10:03,731 --> 00:10:07,512
คือรหัสสกุลเงินต้นทางที่เราแปลง จาก เช่น จาก

188
00:10:07,512 --> 00:10:10,950
USD ไป INR หรือจาก USD ไปเยนญี่ปุ่น ส่วน

189
00:10:10,950 --> 00:10:12,239
target currency

190
00:10:12,239 --> 00:10:15,247
คือรหัสสกุลเงินปลายทางที่เราแปลง ไป

191
00:10:15,247 --> 00:10:18,856
เหมือนตัวอย่างที่ยกไป ถ้าแปลง USD เป็น INR

192
00:10:18,856 --> 00:10:22,723
แล้ว INR คือ target currency และ USD คือ base

193
00:10:22,723 --> 00:10:26,676
currency ครับ ตัวฟังก์ชันจะ return ค่า success

194
00:10:26,676 --> 00:10:30,371
เมื่อ status สำเร็จ พร้อมค่า rate เช่น rate

195
00:10:30,371 --> 00:10:34,152
เท่ากับ 93 กว่า ๆ และกรณี error จะระบุ error

196
00:10:34,152 --> 00:10:38,020
พร้อมข้อความว่า unsupported currency pair คือ

197
00:10:38,020 --> 00:10:41,371
มันจะให้ rate ที่ต้องการพร้อมตัวเลขนั้น

198
00:10:41,371 --> 00:10:44,980
แล้วถ้าข้อมูลที่จำเป็นไม่ครบก็จะได้ข้อความ

199
00:10:44,980 --> 00:10:47,301
error นี้ครับ ทีนี้ค่า rate

200
00:10:47,301 --> 00:10:50,222
ที่ตั้งไว้เป็นอย่างไร? ผมบอกว่า 93

201
00:10:50,222 --> 00:10:52,886
เพราะนั่นคือ rate ของ euro ครับ

202
00:10:52,886 --> 00:10:56,753
เยนญี่ปุ่นอยู่ที่ 157.50 เมื่อแปลงกับ USD และ

203
00:10:56,753 --> 00:11:00,019
USD กับ INR เท่ากับ 83.58 ณ วันนี้ครับ

204
00:11:00,019 --> 00:11:03,370
ต่อไปเราจะตรวจสอบความถูกต้อง (validate)

205
00:11:03,370 --> 00:11:06,808
และประมวลผล input ทั้ง base currency และ

206
00:11:06,808 --> 00:11:10,675
target currency จากนั้นจัดโครงสร้างผลลัพธ์ของ

207
00:11:10,675 --> 00:11:14,284
rate โดยมี status กำกับ ก็คือระบุ base กับ

208
00:11:14,284 --> 00:11:17,808
target ถ้า rate ไม่เป็น none แปลว่าสำเร็จ

209
00:11:17,808 --> 00:11:21,159
เราก็แสดง rate ออกมา ถ้า rate เป็น none

210
00:11:21,159 --> 00:11:24,940
มันก็แสดง error และโยน error ว่า unsupported

211
00:11:24,940 --> 00:11:28,807
currency pair พร้อมระบุชื่อ base currency และ

212
00:11:28,807 --> 00:11:32,159
target currency ที่ผู้ใช้ป้อนเข้ามาครับ

213
00:11:32,159 --> 00:11:35,768
ผมรันอันนี้เช่นกัน ตอนนี้เราสร้าง function

214
00:11:35,768 --> 00:11:39,463
tool หรือ agent tool เสร็จเรียบร้อยแล้วครับ

215
00:11:39,463 --> 00:11:43,159
ต่อไปเราต้องสร้าง currency agent โดยใช้คลาส

216
00:11:43,159 --> 00:11:46,940
Agent ที่เตรียมไว้ครับ สำหรับ currency agent

217
00:11:46,940 --> 00:11:50,291
เราได้นิยามชื่อ (name) กับโมเดล (model)

218
00:11:50,291 --> 00:11:52,182
ไว้เหมือน agent อื่น ๆ

219
00:11:52,182 --> 00:11:59,143
ที่เราเคยนิยาม แล้วก็มี instructions หรือคำสั่งกำกับ เหมือนที่ให้กับ agent อื่น ๆ

220
00:11:59,143 --> 00:12:01,892
เช่นกันครับ คำสั่งกำกับตรงนี้คือ

221
00:12:01,892 --> 00:12:04,728
คุณคือผู้ช่วยแปลงสกุลเงินอัจฉริยะ

222
00:12:04,728 --> 00:12:07,220
สำหรับคำขอแปลงสกุลเงิน ให้ใช้

223
00:12:07,220 --> 00:12:10,142
get_fee_for_payment_method หรือใช้

224
00:12:10,142 --> 00:12:13,666
get_exchange_rate เพื่อดึงอัตราแลกเปลี่ยน

225
00:12:13,666 --> 00:12:17,017
เช็คฟิลด์ status ในผลตอบกลับของทุก tool

226
00:12:17,017 --> 00:12:20,798
เพื่อดู error คำนวณยอดสุดท้ายหักค่าธรรมเนียม

227
00:12:20,798 --> 00:12:22,775
จากผลลัพธ์ของสองวิธีนี้

228
00:12:22,775 --> 00:12:25,353
แล้วให้คำอธิบายแบบแจกแจงชัดเจน

229
00:12:25,353 --> 00:12:27,501
โดยระบุยอดแปลงสุดท้ายก่อน

230
00:12:27,501 --> 00:12:30,853
แล้วค่อยอธิบายว่าได้ตัวเลขนั้นมาอย่างไร

231
00:12:30,853 --> 00:12:33,087
โดยแสดงจำนวนเงินระหว่างทาง

232
00:12:33,087 --> 00:12:38,845
คำอธิบายต้องระบุเปอร์เซ็นต์ค่าธรรมเนียมพร้อมมูลค่าในสกุลเงินต้นฉบับ

233
00:12:38,845 --> 00:12:41,938
จำนวนเงินที่เหลือหลังหักค่าธรรมเนียม

234
00:12:41,938 --> 00:12:45,720
และอัตราแลกเปลี่ยนที่ใช้ในการแปลงขั้นสุดท้าย

235
00:12:45,720 --> 00:12:48,469
ถ้า tool ใดส่ง status เป็น error

236
00:12:48,469 --> 00:12:51,821
ให้อธิบายปัญหาให้ผู้ใช้เข้าใจชัดเจนครับ

237
00:12:51,821 --> 00:12:55,688
เพราะเราบอกให้ agent ใช้ tool นี้กับ tool นี้

238
00:12:55,688 --> 00:12:59,383
เราจึงต้องนิยาม tool เหล่านั้นไว้ตรงนี้ด้วย

239
00:12:59,383 --> 00:13:02,649
จึงใส่ tool ทั้งสองตัวไว้ในลิสต์ tools

240
00:13:02,649 --> 00:13:04,453
ตามแผนภาพ และจะ print

241
00:13:04,453 --> 00:13:07,203
ข้อความเหล่านี้ออกมาเมื่อรันครับ

242
00:13:07,203 --> 00:13:11,156
ต่อไปเราจะทดสอบ currency agent โดยสร้าง runner

243
00:13:11,156 --> 00:13:14,938
ขึ้นมารัน currency agent แล้วผมเห็น response

244
00:13:14,938 --> 00:13:18,891
เป็นคำตอบกลับมา โดยมีค่า default ว่า I want to

245
00:13:18,891 --> 00:13:20,180
convert 500 USD

246
00:13:20,180 --> 00:13:24,820
ซึ่งน่าจะเป็นค่าเดิมจากตอนที่ผมลองทำไว้ที่เครื่องผมเอง

247
00:13:24,820 --> 00:13:28,258
ตัวเลขเลยเปลี่ยนไป แต่โจทย์คือ I want to

248
00:13:28,258 --> 00:13:31,867
convert $120 to INR using a platinum card.

249
00:13:31,867 --> 00:13:35,476
How much will I receive? ผมจะรันอันนี้ครับ

250
00:13:35,476 --> 00:13:39,085
เริ่ม session ใหม่ บอกว่าผู้ใช้ถามคำถามนี้

251
00:13:39,085 --> 00:13:41,406
คุณสามารถละเลย error นี้ได้

252
00:13:41,406 --> 00:13:44,929
เพราะถ้ารันซ้ำมันจะหายไปเอง แล้วก็ขึ้นว่า

253
00:13:44,929 --> 00:13:46,132
currency agent

254
00:13:46,132 --> 00:13:49,484
ตอบกลับมาว่าจะได้รับเงินจำนวนกว่า ๆ นี้

255
00:13:49,484 --> 00:13:52,491
และอธิบายวิธีคำนวณว่า platinum card

256
00:13:52,491 --> 00:13:56,187
มีค่าธรรมเนียม 2% ยอดเงิน 1250 USD คูณ 0.02

257
00:13:56,187 --> 00:14:00,054
ได้เท่ากับ $25 ยอดหลังหักค่าธรรมเนียมคือ 1250

258
00:14:00,054 --> 00:14:03,491
ลบ 25 เท่ากับ 1225 สำหรับการแปลงสกุลเงิน

259
00:14:03,491 --> 00:14:07,186
อัตราแลกเปลี่ยนจาก USD ไป INR อยู่ที่ 83.58

260
00:14:07,186 --> 00:14:11,053
ดังนั้นเอาสองจำนวนนี้คูณกัน ยอดสุดท้ายจึงเป็น

261
00:14:11,053 --> 00:14:14,405
102,385.54 INR ครับ ต่อไปเป็น Section 3

262
00:14:14,405 --> 00:14:18,186
ซึ่งพูดถึงว่าเราจะปรับปรุงความน่าเชื่อถือของ

263
00:14:18,186 --> 00:14:22,139
agent ด้วยโค้ดอย่างไรครับ เพราะเมื่อเราให้ LLM

264
00:14:22,139 --> 00:14:26,092
ทำการคำนวณทางคณิตศาสตร์ ไม่ใช่ว่าเราจะเชื่อถือ

265
00:14:26,092 --> 00:14:28,412
LLM ด้านคณิตศาสตร์ได้เสมอไป

266
00:14:28,412 --> 00:14:32,623
มันอาจคำนวณผิดพลาดหรือใช้สูตรที่ไม่สอดคล้องกันได้

267
00:14:32,623 --> 00:14:36,061
ดังนั้นเราจึงให้ agent สร้าง Python code

268
00:14:36,061 --> 00:14:37,158
มาทำการคำนวณ

269
00:14:37,158 --> 00:14:41,111
แล้วรันโค้ดนั้นเพื่อให้ได้ผลลัพธ์สุดท้ายมาครับ

270
00:14:41,111 --> 00:14:45,236
ในกรณีนี้การรันโค้ดจึงน่าเชื่อถือกว่าการปล่อยให้

271
00:14:45,236 --> 00:14:49,189
LLM คิดเลขเอาเองในหัวมาก ถ้าเทียบกับ flowchart

272
00:14:49,189 --> 00:14:52,369
ก่อนหน้าที่เราคุยกันไป currency agent

273
00:14:52,369 --> 00:14:56,322
ดั้งเดิมเป็น agent แบบง่ายที่เรียกใช้ function

274
00:14:56,322 --> 00:14:58,470
หรือ agent tool สองตัวนี้

275
00:14:58,470 --> 00:15:02,079
แต่ในโมเดลใหม่ที่ปรับปรุงแล้ว คุณจะเห็นว่า

276
00:15:02,079 --> 00:15:06,032
currency agent ยังไปปฏิสัมพันธ์กับ calculation

277
00:15:06,032 --> 00:15:09,814
agent ด้วย ซึ่งเป็น agent ไม่ใช่ tool นะครับ

278
00:15:09,814 --> 00:15:13,681
โปรดสังเกตว่าสองตัวนี้เป็น tool แต่ตัวนี้เป็น

279
00:15:13,681 --> 00:15:16,946
agent และตัว agent นี้จะปฏิสัมพันธ์กับ

280
00:15:16,946 --> 00:15:20,556
built-in code executor เพื่อรันโค้ด Python

281
00:15:20,556 --> 00:15:21,845
ดึงผลลัพธ์ออกมา

282
00:15:21,845 --> 00:15:25,798
ด้วยเหตุนี้เราจึงเปลี่ยนชื่อจาก currency agent

283
00:15:25,798 --> 00:15:29,235
เป็น enhanced currency agent ครับ ADK มี

284
00:15:29,235 --> 00:15:32,844
built-in code executor ซึ่งสามารถรันโค้ดใน

285
00:15:32,844 --> 00:15:33,942
sandbox

286
00:15:33,942 --> 00:15:37,723
(สภาพแวดล้อมแยกส่วนทดลองโค้ดได้ปลอดภัย) ด้วย

287
00:15:37,723 --> 00:15:41,590
คุณไม่จำเป็นต้องมี production environment เลย

288
00:15:41,590 --> 00:15:45,457
และโปรดทราบว่านี่ใช้ความสามารถ code execution

289
00:15:45,457 --> 00:15:48,981
ของ Gemini ครับ ทีนี้ลองสร้าง calculation

290
00:15:48,981 --> 00:15:52,332
agent กัน แล้วดูว่ามันใช้ built-in code

291
00:15:52,332 --> 00:15:55,855
executor อย่างไร รูปแบบของทุก agent ก็คือ

292
00:15:55,855 --> 00:15:59,637
คุณจะนิยาม agent เขียน name, model และ retry

293
00:15:59,637 --> 00:16:03,246
option ซึ่งเป็นสิ่งที่เราทำให้ calculation

294
00:16:03,246 --> 00:16:07,199
agent เรียบร้อยแล้ว จากนั้นเราให้ instructions

295
00:16:07,199 --> 00:16:10,808
ที่ชัดเจนเจาะจงว่าคาดหวังอะไรจาก agent นี้

296
00:16:10,808 --> 00:16:11,925
ตรงนี้ระบุว่า

297
00:16:11,925 --> 00:16:15,363
คุณคือเครื่องคำนวณเฉพาะทางที่ตอบกลับเป็น

298
00:16:15,363 --> 00:16:17,082
Python code เท่านั้น

299
00:16:17,082 --> 00:16:21,980
ห้ามให้คำอธิบายเชิงข้อความหรือการตอบโต้แบบสนทนาโดยเด็ดขาด

300
00:16:21,980 --> 00:16:24,816
ซึ่งหมายความว่า calculation agent

301
00:16:24,816 --> 00:16:28,511
จะไม่เข้าไปคุยกับผู้ใช้หรือแย่งการควบคุมจาก

302
00:16:28,511 --> 00:16:30,487
enhanced currency agent

303
00:16:30,487 --> 00:16:33,667
เพื่อไปหาผู้ใช้โดยตรงครับ มาดูกฎข้อ ๆ

304
00:16:33,667 --> 00:16:40,714
ไป มันบอกว่า ผลลัพธ์ของคุณต้องเป็น Python code block เท่านั้น ห้ามเขียนข้อความใด ๆ

305
00:16:40,714 --> 00:16:43,722
ก่อนหรือหลัง code block โค้ด Python

306
00:16:43,722 --> 00:16:46,386
ต้องคำนวณผลลัพธ์ โค้ดต้อง print

307
00:16:46,386 --> 00:16:48,620
ผลลัพธ์สุดท้ายไปที่ stdout

308
00:16:48,620 --> 00:16:51,198
คุณถูกห้ามทำการคำนวณด้วยตัวเอง

309
00:16:51,198 --> 00:16:55,409
หน้าที่เดียวของคุณคือสร้างโค้ดที่จะทำการคำนวณนั้น

310
00:16:55,409 --> 00:16:59,190
และหากไม่ปฏิบัติตามกฎเหล่านี้จะถือเป็น error

311
00:16:59,190 --> 00:17:02,541
ครับ ดังนั้นมันจึงต้องใช้ code executor

312
00:17:02,541 --> 00:17:05,721
นั่นก็คือ built-in code executor ครับ

313
00:17:05,721 --> 00:17:10,018
มีส่วนหนึ่งไม่ได้อยู่ในโค้ดเดิมที่ผมเพิ่มเข้ามาเอง

314
00:17:10,018 --> 00:17:13,541
เพราะตอนรันผมอยากรู้ว่ามันรันสำเร็จจริง ๆ

315
00:17:13,541 --> 00:17:17,322
ขั้นถัดไปคือผมจะปรับปรุงคำสั่งกำกับของ agent

316
00:17:17,322 --> 00:17:20,760
เราสร้างส่วน calculation agent เสร็จแล้ว

317
00:17:20,760 --> 00:17:24,455
ตอนนี้ต้องผนวกมันเข้าไว้ใน instructions ของ

318
00:17:24,455 --> 00:17:28,236
currency agent ครับ ในคำสั่งกำกับนี้เราจะบอก

319
00:17:28,236 --> 00:17:31,931
currency agent ว่า ตอนนี้ให้คุณสร้าง Python

320
00:17:31,931 --> 00:17:35,712
code เพื่อคำนวณยอดสุดท้าย และใช้ calculation

321
00:17:35,712 --> 00:17:38,892
agent รันโค้ดนั้นเพื่อคำนวณยอดสุดท้าย

322
00:17:38,892 --> 00:17:42,158
ไม่ใช่ทำเองเหมือนคำสั่งคณิตศาสตร์ยาว ๆ

323
00:17:42,158 --> 00:17:45,337
ที่เคยมีก่อนหน้านี้ และในส่วนของ tool

324
00:17:45,337 --> 00:17:47,743
ถ้าย้อนดู tool ก่อนหน้า จะมี

325
00:17:47,743 --> 00:17:50,321
get_fee_for_payment_method กับ

326
00:17:50,321 --> 00:17:53,071
get_exchange_rate แต่ตอนนี้ tool

327
00:17:53,071 --> 00:17:57,024
ของคุณไม่ใช่แค่สองตัวนั้น แต่รวมถึง agent tool

328
00:17:57,024 --> 00:17:59,345
ด้วย ตามที่แผนภาพนี้แสดงไว้

329
00:17:59,345 --> 00:18:02,266
ดังนั้นทุกครั้งที่ผู้ใช้ส่ง prompt

330
00:18:02,266 --> 00:18:05,876
มาขอข้อมูลการแปลง agent จะไปติดต่อกับ tool

331
00:18:05,876 --> 00:18:06,993
ทั้งสามตัวนี้

332
00:18:06,993 --> 00:18:10,516
แล้วกลับมาหาผู้ใช้พร้อมผลลัพธ์สุดท้ายครับ

333
00:18:10,516 --> 00:18:14,126
ผมรันอันนี้ไปแล้ว แต่คิดว่ายังไม่ได้อธิบาย

334
00:18:14,126 --> 00:18:17,821
instructions เลย งั้นมาดูคำสั่งกำกับกันครับ

335
00:18:17,821 --> 00:18:18,938
ตรงนี้ระบุว่า

336
00:18:18,938 --> 00:18:21,774
คุณคือผู้ช่วยแปลงสกุลเงินอัจฉริยะ

337
00:18:21,774 --> 00:18:25,297
คุณต้องทำตามขั้นตอนเหล่านี้อย่างเคร่งครัด

338
00:18:25,297 --> 00:18:26,395
และใช้ tool

339
00:18:26,395 --> 00:18:29,660
ที่มีให้สำหรับคำขอแปลงสกุลเงินทุกครั้ง

340
00:18:29,660 --> 00:18:32,152
ขั้นแรกดึงค่าธรรมเนียมธุรกรรม

341
00:18:32,152 --> 00:18:34,645
ดึงอัตราแลกเปลี่ยน เช็ค error

342
00:18:34,645 --> 00:18:37,395
คำนวณยอดสุดท้ายซึ่งเป็นขั้นสำคัญ

343
00:18:37,395 --> 00:18:39,457
และเราระบุอย่างชัดเจนว่า

344
00:18:39,457 --> 00:18:43,582
ห้ามคุณทำการคำนวณเลขคณิตด้วยตัวเองโดยเด็ดขาดครับ

345
00:18:43,582 --> 00:18:45,386
เหมือน agent ก่อนหน้า

346
00:18:45,386 --> 00:18:48,136
ต่อไปให้คำอธิบายแบบละเอียดในสรุป

347
00:18:48,136 --> 00:18:50,285
โดยต้องระบุยอดแปลงสุดท้าย

348
00:18:50,285 --> 00:18:53,550
แล้วจึงอธิบายว่าคุณคำนวณทั้งหมดอย่างไร

349
00:18:53,550 --> 00:18:56,558
เหมือนเดิมครับ ต่อไปเราจะรัน runner

350
00:18:56,558 --> 00:19:00,511
โดยตั้งชื่อว่า enhanced runner และใช้ตัว agent

351
00:19:00,511 --> 00:19:03,433
ของ enhanced runner เสร็จเรียบร้อย

352
00:19:03,433 --> 00:19:07,386
ทีนี้ลองทดสอบ agent แล้วดูว่าตอบถูกต้องหรือไม่

353
00:19:07,386 --> 00:19:11,339
คำสั่งคือ convert 1250 USD to INR using a bank

354
00:19:11,339 --> 00:19:14,948
transfer. Show me the precise calculation.

355
00:19:14,948 --> 00:19:18,300
อย่าเป็นห่วงกับ warning ตรงนี้เลยนะครับ

356
00:19:18,300 --> 00:19:22,253
บางครั้งมันเกิดขึ้นถ้ามี notebook หรือ session

357
00:19:22,253 --> 00:19:23,886
หลายตัวกำลังรันอยู่

358
00:19:23,886 --> 00:19:26,292
และถ้ารันซ้ำมันก็จะหายไปครับ

359
00:19:26,292 --> 00:19:30,245
ตรงนี้ขึ้นว่าให้แปลงจำนวนนี้ enhanced currency

360
00:19:30,245 --> 00:19:34,026
agent จึงตอบว่า การแปลงจากสกุลนี้เป็นสกุลนี้

361
00:19:34,026 --> 00:19:37,635
นี่คือรายละเอียดการคำนวณ ยอดอยู่ที่ 1 lakh

362
00:19:37,635 --> 00:19:41,588
4,140.5 โดยรายละเอียดคือค่าธรรมเนียมธุรกรรมของ

363
00:19:41,588 --> 00:19:45,283
bank transfer คิด 1% ยอดค่าธรรมเนียมจึงเป็น

364
00:19:45,283 --> 00:19:48,635
12.5 หลังหักค่าธรรมเนียมยอดเหลือเท่านี้

365
00:19:48,635 --> 00:19:52,072
แล้วด้วยอัตราแลกเปลี่ยน 1 USD ต่อสกุลนี้

366
00:19:52,072 --> 00:19:54,479
ยอดสุดท้ายจึงเป็นเท่านี้ครับ

367
00:19:54,479 --> 00:19:58,002
มันให้คำตอบมาแบบนี้ ทีนี้มาดูกันว่ามันส่ง

368
00:19:58,002 --> 00:20:01,182
Python code ที่สร้างขึ้นไปอย่างไร และ

369
00:20:01,182 --> 00:20:05,135
calculation agent คำนวณผลนี้ด้วย built-in code

370
00:20:05,135 --> 00:20:08,400
executor อย่างไร เราทำได้โดยรัน helper

371
00:20:08,400 --> 00:20:11,236
function ที่เรานิยามไว้ตั้งแต่ต้น

372
00:20:11,236 --> 00:20:15,017
แล้วตอนนี้คุณเห็นว่ามันสร้าง Python response

373
00:20:15,017 --> 00:20:18,798
ว่า USD เท่ากับเท่านี้ exchange rate และ fee

374
00:20:18,798 --> 00:20:22,236
ก็คือมันคำนวณค่าธรรมเนียมโอนเงินเป็น INR

375
00:20:22,236 --> 00:20:24,814
แล้วบอกให้ print ยอด INR ออกมา

376
00:20:24,814 --> 00:20:28,595
จากนั้นมันสร้างส่วนค่าธรรมเนียมอีกครั้ง แล้ว

377
00:20:28,595 --> 00:20:31,431
print ข้อมูลทั้งหมดเกี่ยวกับ rate

378
00:20:31,431 --> 00:20:32,634
และการโอนออกมา

379
00:20:32,634 --> 00:20:36,845
และนี่คือวิธีที่คุณได้ตัวเลขเหล่านี้มาในคำตอบครับ

380
00:20:36,845 --> 00:20:39,251
ผมแน่ใจว่าหลายคนคงมีคำถามนี้

381
00:20:39,251 --> 00:20:43,204
คือความแตกต่างระหว่าง agent tool กับ sub-agent

382
00:20:43,204 --> 00:20:46,555
คืออะไร? เพราะใน code lab ก่อน ๆ เราใช้

383
00:20:46,555 --> 00:20:50,251
sub-agent (agent ลูกที่ถูกเรียกใช้โดย agent

384
00:20:50,251 --> 00:20:53,344
หลัก) ควบคู่กับ function tool มาแล้ว

385
00:20:53,344 --> 00:20:55,579
และตรงนี้เราใช้ agent tool

386
00:20:55,579 --> 00:20:57,727
ซึ่งดูเหมือนทำงานคล้ายกัน

387
00:20:57,727 --> 00:21:01,594
แต่นั่นไม่ถูกต้องนะครับ พวกมันทำงานต่างกันมาก

388
00:21:01,594 --> 00:21:05,289
ขอเล่าให้ฟังว่าความต่างคืออะไร ก่อนจะพูดถึง

389
00:21:05,289 --> 00:21:08,985
ขอยกตัวอย่างจากวิดีโอที่ผ่านมาเลยครับ ถ้าจำ

390
00:21:08,985 --> 00:21:11,992
pattern การไหลของงาน (flow pattern)

391
00:21:11,992 --> 00:21:15,859
ที่เราเรียนในวิดีโอ Part B ของ Day 1 ได้ ก็มี

392
00:21:15,859 --> 00:21:19,812
sequential flow (การไหลแบบเรียงลำดับ) ซึ่งเป็น

393
00:21:19,812 --> 00:21:23,765
flow แบบพึ่งพิงกัน ผลลัพธ์ของ A เป็น input ของ

394
00:21:23,765 --> 00:21:26,687
B และผลลัพธ์ของ B เป็น input ของ C

395
00:21:26,687 --> 00:21:30,554
ตรงนี้ให้สังเกตว่าผู้ใช้ส่ง prompt ไปหา agent

396
00:21:30,554 --> 00:21:32,359
A แต่เมื่อจบกระบวนการ

397
00:21:32,359 --> 00:21:36,054
คำตอบสุดท้ายถูกส่งให้ผู้ใช้โดย agent C ครับ

398
00:21:36,054 --> 00:21:39,835
แปลว่า agent A เสียการควบคุมไปแล้ว และตอนนี้

399
00:21:39,835 --> 00:21:42,499
agent C เป็นผู้ควบคุมบทสนทนาแทน

400
00:21:42,499 --> 00:21:46,366
นี่คือสิ่งที่เกิดใน sub-agent ครับ ส่วน agent

401
00:21:46,366 --> 00:21:49,632
tool ไม่ได้เป็นแบบนั้น ถ้าย้อนกลับไปดู

402
00:21:49,632 --> 00:21:52,640
flowchart เราจะเห็นว่ามีเพียง agent

403
00:21:52,640 --> 00:21:55,647
หลักตัวเดียวที่ปฏิสัมพันธ์กับผู้ใช้

404
00:21:55,647 --> 00:21:57,882
แม้มันจะไปขอคำนวณจาก agent

405
00:21:57,882 --> 00:22:00,374
ตัวนี้แล้วกลับมาแชร์ให้ผู้ใช้

406
00:22:00,374 --> 00:22:04,843
มันขอความช่วยเหลือแต่ไม่ได้เสียการควบคุมผู้ใช้ไปครับ

407
00:22:04,843 --> 00:22:08,796
ถ้ากลับมาอ่านตรงนี้อีกครั้ง คุณจะเข้าใจมากขึ้น

408
00:22:08,796 --> 00:22:11,975
คือ agent A เรียก agent B ในฐานะ tool

409
00:22:11,975 --> 00:22:15,842
ผลตอบกลับของ agent B วนกลับไปที่ agent A แล้ว

410
00:22:15,842 --> 00:22:19,623
agent A ยังคงควบคุมอยู่และสานต่อบทสนทนาต่อไป

411
00:22:19,623 --> 00:22:23,233
ดังนั้น use case ในโลกจริงคือการมอบหมายงาน

412
00:22:23,233 --> 00:22:26,756
(delegation) ให้ผู้เชี่ยวชาญเฉพาะทาง เช่น

413
00:22:26,756 --> 00:22:30,193
การคำนวณครับ ในทางกลับกัน sub-agent เป็น

414
00:22:30,193 --> 00:22:33,803
pattern อีกแบบที่เราเคยทำในแบบฝึกหัดก่อน ๆ

415
00:22:33,803 --> 00:22:37,498
agent A โอนการควบคุมทั้งหมดให้ agent B แล้ว

416
00:22:37,498 --> 00:22:40,849
agent B เข้ามารับช่วงต่อและจัดการ input

417
00:22:40,849 --> 00:22:43,513
ของผู้ใช้ทั้งหมดในอนาคต agent A

418
00:22:43,513 --> 00:22:45,920
หลุดออกจากวงจรไปเลย use case

419
00:22:45,920 --> 00:22:48,841
คือการส่งต่อผู้เชี่ยวชาญ (handoff)

420
00:22:48,841 --> 00:22:52,537
เหมือนชั้นของฝ่ายบริการลูกค้าที่มี level 1,

421
00:22:52,537 --> 00:22:55,115
level 2, level 3 อย่างนั้นครับ

422
00:22:55,115 --> 00:22:58,982
ในตัวอย่างของเรา เราต้องการให้ currency agent

423
00:22:58,982 --> 00:23:02,591
ได้ผลการคำนวณมาแล้วยังทำงานต่อกับผลนั้นได้

424
00:23:02,591 --> 00:23:05,771
เราจึงใช้ agent tool ไม่ใช่ sub-agent

425
00:23:05,771 --> 00:23:09,208
หวังว่าจะเข้าใจชัดขึ้นนะครับ ตอนนี้มาถึง

426
00:23:09,208 --> 00:23:11,357
Section 4 ของแบบฝึกหัดนี้

427
00:23:11,357 --> 00:23:15,224
ซึ่งเป็นคู่มือครบวงจรเรื่อง tool ของ ADK ครับ

428
00:23:15,224 --> 00:23:18,145
ในส่วนนี้เราจะเข้าใจประเภทของ tool

429
00:23:18,145 --> 00:23:20,981
ที่ชุดเครื่องมือ ADK จัดเตรียมให้

430
00:23:20,981 --> 00:23:24,247
โดยพื้นฐานแล้วมีสองหมวดใหญ่ คือ custom

431
00:23:24,247 --> 00:23:27,684
(สร้างเอง) กับ built-in (สำเร็จรูป) ครับ

432
00:23:27,684 --> 00:23:31,208
custom tool หมายถึงอะไรตามที่กล่าวไปแล้ว?

433
00:23:31,208 --> 00:23:34,387
ก็คือคุณควบคุมการทำงานของ tool เองได้

434
00:23:34,387 --> 00:23:36,364
คุณจะสร้างสิ่งที่ agent

435
00:23:36,364 --> 00:23:39,801
ต้องทำให้คุณได้ตรงตามต้องการ ตัวอย่างคือ

436
00:23:39,801 --> 00:23:40,918
function tool

437
00:23:40,918 --> 00:23:44,699
อย่างที่เราใช้ในตัวอย่างวันนี้ครับ จากนั้นมี

438
00:23:44,699 --> 00:23:46,934
long-running function tool

439
00:23:46,934 --> 00:23:50,457
ซึ่งช่วยในงานประมวลผลไฟล์และการอนุมัติแบบ

440
00:23:50,457 --> 00:23:51,918
human-in-the-loop

441
00:23:51,918 --> 00:23:55,871
(มีมนุษย์เข้ามามีส่วนร่วมในกระบวนการ) ข้อดีคือ

442
00:23:55,871 --> 00:23:59,480
agent เริ่มงานนั้นไว้แล้วไปทำงานอื่นต่อได้

443
00:23:59,480 --> 00:24:03,519
ระหว่างรอให้การประมวลผลไฟล์หรืองานนั้นเสร็จครับ

444
00:24:03,519 --> 00:24:07,300
ต่อไปมี MCP tool และมี OpenAI tool ด้วย ส่วน

445
00:24:07,300 --> 00:24:11,254
agent tool นั้นเป็นสิ่งที่เราเพิ่งทำเสร็จมาเอง

446
00:24:11,254 --> 00:24:12,628
เป็นเหมือน agent

447
00:24:12,628 --> 00:24:15,894
ผู้เชี่ยวชาญเฉพาะทางที่เรานิยามไว้แล้ว

448
00:24:15,894 --> 00:24:19,589
จึงนำกลับมาใช้ซ้ำได้ในหลายระบบครับ MCP tool

449
00:24:19,589 --> 00:24:21,995
คือ tool ที่มาจาก MCP server

450
00:24:21,995 --> 00:24:25,948
(เซิร์ฟเวอร์ที่ให้บริการเครื่องมือผ่านโปรโตคอล

451
00:24:25,948 --> 00:24:29,644
MCP) ตัวอย่างเช่น Google Maps ฐานข้อมูล ฯลฯ

452
00:24:29,644 --> 00:24:31,792
ข้อดีคือเมื่อคุณเชื่อมต่อ

453
00:24:31,792 --> 00:24:35,659
คุณสามารถเชื่อมกับบริการที่รองรับ MCP ใดก็ได้

454
00:24:35,659 --> 00:24:39,440
โดยไม่ต้องหาวิธี integrate แบบ custom เองเลย

455
00:24:39,440 --> 00:24:41,675
และท้ายสุดคือ OpenAPI tool

456
00:24:41,675 --> 00:24:45,370
ซึ่งทุกคนรู้จักกันดี คือการเปลี่ยน REST API

457
00:24:45,370 --> 00:24:48,807
endpoint ให้กลายเป็น tool ที่เรียกใช้ได้

458
00:24:48,807 --> 00:24:52,760
ข้อดีคือไม่ต้องเขียนโค้ดเองเลย แค่ให้ API spec

459
00:24:52,760 --> 00:24:56,026
มาก็เริ่มใช้ tool ได้เลยครับ ต่อไปเป็น

460
00:24:56,026 --> 00:24:59,635
built-in tool ครับ ตามความหมายของคำ นี่คือ

461
00:24:59,635 --> 00:25:03,416
tool สำเร็จรูปที่ชุดเครื่องมือ ADK เตรียมให้

462
00:25:03,416 --> 00:25:07,026
ข้อดีคือนำไปใช้ได้ทันที ไม่ต้องตั้งค่าอะไร

463
00:25:07,026 --> 00:25:10,635
และไม่ต้องเสียเวลาพัฒนาเองครับ Gemini tool

464
00:25:10,635 --> 00:25:13,986
คือตัวที่เราใช้ในแบบฝึกหัดมาจนถึงตอนนี้

465
00:25:13,986 --> 00:25:17,682
ถัดมาคือ Google tool ซึ่งได้แก่ชุด BigQuery

466
00:25:17,682 --> 00:25:20,517
tool, Places API, hub toolset ฯลฯ

467
00:25:20,517 --> 00:25:24,385
โดยรวมแล้วเป็น tool สำหรับบริการ Google Cloud

468
00:25:24,385 --> 00:25:28,166
และการเชื่อมต่อระดับองค์กร (enterprise) ครับ

469
00:25:28,166 --> 00:25:31,259
และท้ายสุดคือ third-party tool (tool

470
00:25:31,259 --> 00:25:34,611
จากผู้ให้บริการภายนอก) อย่าง GitHub และ

471
00:25:34,611 --> 00:25:37,361
Hugging Face ข้อดีของการใช้ tool

472
00:25:37,361 --> 00:25:41,829
เหล่านี้คือคุณนำการลงทุนที่มีอยู่แล้วกลับมาใช้ซ้ำได้

473
00:25:41,829 --> 00:25:45,181
ไม่ต้องสร้างใหม่ในสิ่งที่มีอยู่แล้วครับ

474
00:25:45,181 --> 00:25:48,962
สิ่งที่ทำคือ tool เหล่านี้เป็นเหมือน wrapper

475
00:25:48,962 --> 00:25:52,056
(ตัวห่อหุ้ม) ของระบบ tool ที่มีอย่าง

476
00:25:52,056 --> 00:25:55,321
นั่นเองครับ เอาล่ะครับ ยินดีด้วยนะครับ

477
00:25:55,321 --> 00:25:59,016
เราสำเร็จสมบูรณ์ Day 2 Part 1 เรียบร้อยแล้ว

478
00:25:59,016 --> 00:26:01,595
ซึ่งเราได้เรียนวิธีสร้าง agent

479
00:26:01,595 --> 00:26:04,087
ที่ก้าวข้างจากการตอบแบบง่าย ๆ

480
00:26:04,087 --> 00:26:07,782
ไปสู่การลงมือทำสิ่งที่ฉลาดแบบมีเป้าหมายด้วย

481
00:26:07,782 --> 00:26:08,880
custom tool

482
00:26:08,880 --> 00:26:12,661
โปรดต่อไปยังวิดีโอถัดไปเพื่อเรียนเรื่อง tool

483
00:26:12,661 --> 00:26:16,270
pattern ซึ่งเป็นแบบฝึกหัด Part B ของ Day 2

484
00:26:16,270 --> 00:26:17,559
ครับ ขอบคุณครับ