Day 2A: Agent Tools — How AI Agents Use Tools (Hands-On Demo)
สรุปย่อ
ประเด็นสำคัญจากวิดีโอ
- **ช่อง:** 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 ช่วยให้เข้าใจความต่างของการควบคุมบทสนทนาได้ดีมากครับ
คำแปลเต็ม
แปลตามบทสนทนาต้นฉบับ ปรับเป็นภาษาไทยธรรมชาติ
สวัสดีทุกคนครับ ยินดีต้อนรับเข้าสู่บทเรียน 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 ครับ ขอบคุณครับ
หมายเหตุการแปล
ความโปร่งใสเกี่ยวกับความไม่แน่นอนในต้นฉบับ
- ## จุดที่ใช้สัญลักษณ์ฟังไม่ชัด
อภิธานศัพท์เทคนิค
คำศัพท์และชื่อผลิตภัณฑ์ที่คงรูปภาษาอังกฤษ
| ศัพท์ | คำแปล / คำอธิบาย |
|---|---|
| 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 tool | custom tool ที่เกิดจากการเปลี่ยน Python function ให้เป็น tool ของ agent |
| agent tool | การใช้ agent หนึ่งเป็น tool ของ agent อีกตัว โดยตัวเรียกยังคุมบทสนทนาต่อ (delegation) |
| sub-agent | agent ลูกที่รับการโอนการควบคุมทั้งหมดจาก agent หลัก แล้วดูแลผู้ใช้ต่อเอง (handoff) |
| MCP (Model Context Protocol) | โปรโตคอลกลางสำหรับเชื่อม tool/บริการภายนอกเข้ากับ agent |
| MCP server | เซิร์ฟเวอร์ที่ให้บริการเครื่องมือผ่านโปรโตคอล MCP เช่น Google Maps |
| OpenAPI tool | tool ที่สร้างจาก REST API endpoint โดยให้ API spec โดยไม่ต้องเขียนโค้ดเอง |
| long-running function tool | tool สำหรับงานที่ใช้เวลานาน เช่น ประมวลผลไฟล์ หรืออนุมัติแบบ 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 flow | pattern การทำงานเรียงลำดับ ผลลัพธ์ของ 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 | เอกสารสรุปแนวคิดหลักของหัวข้อที่เรียน |
ซับไตเติ้ลภาษาไทย
ดาวน์โหลดหรือดูซับทั้งหมด
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 ในหน่วยที่สองนี้เรามีแบบฝึกหัดสองส่วนเหมือนเดิม
เปิดดูซับไตเติ้ลทั้งหมด (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 ครับ ขอบคุณครับ