Day 4B: Agent Project Build — Complete Multi-Agent Demo (Start to Finish)
สรุปย่อ
ประเด็นสำคัญจากวิดีโอ
- **ช่อง:** Adspolitan Knowledge Studio · **ความยาว:** ~20 นาที · **ลิงก์:** https://www.youtube.com/watch?v=Iox3S-hIo04
# สรุป: Day 4B: Agent Project Build — Complete Multi-Agent Demo (Start to Finish) - **ช่อง:** Adspolitan Knowledge Studio · **ความยาว:** ~20 นาที · **ลิงก์:** https://www.youtube.com/watch?v=Iox3S-hIo04 ## ประเด็นหลัก - แม้ชื่อวิดีโอจะระบุ Agent Project Build แต่เนื้อหาจริงคือ agent evaluation (การประเมินผลเอเจนต์) — ส่วน B ของ assignment Day 4 - Observability เป็นแบบ reactive (ทำงานหลังปัญหาเกิด) ส่วน evaluation คือการประเมินประสิทธิภาพอย่างต่อเนื่องเพื่อรับรู้ quality regression ได้ล่วงหน้า - ความต่างจากการทดสอบซอฟต์แวร์เดิม: standard testing = ทดสอบ happy path ส่วน evaluation = ประเมินกระบวนการตัดสินใจทั้งเส้นทาง (trajectory) ของเอเจนต์ - กรณีศึกษา: home automation agent ที่ instructions ตั้งใจให้มั่นใจเกินจริง (อ้างว่าควบคุมอุปกรณ์ได้ทุกชนิด) — ผ่าน test พื้นฐานแต่ซ่อนข้อบกพร่อง - การสร้าง evaluation ใน ADK web UI: ถามเอเจนต์ → บันทึก session เป็น eval case ใน eval set → กด run evaluation - คะแนนสำคัญ 2 ตัว: response match score (ความคล้ายของคำตอบจริงกับคำตอบที่คาดหวัง 1.0 = ตรงสนิท) และ tool trajectory score (ความถูกต้องของ tool + parameter + ลำดับการเรียก 1.0 = สมบูรณ์แบบ) - การทดสอบให้พังโดยเจตนา (แก้ expected response เป็น "โคมไฟปิดอยู่") แสดงผล fail สีแดง พร้อม tooltip เทียบ actual vs expected — feedback แบบนี้มีค่ามากสำหรับ debug - การทดสอบทีละบทสนทนาใน UI scale ไม่ได้ — ต้องใช้ systematic evaluation ด้วยหลาย test case รวมเป็น evaluation set (ไฟล์ JSON) - Regression testing = รัน test เดิมซ้ำเพื่อยืนยันว่าการเปลี่ยนแปลงใหม่ไม่ทำลายของเดิม; ADK รองรับ pytest และ ADK eval ผ่านคำสั่ง CLI - ขั้นตอน evaluation 4 ขั้น: สร้าง evaluation configuration (นิยาม metric + เกณฑ์ผ่าน/ตก) → สร้าง test case → รันเอเจนต์ด้วย test query → เปรียบเทียบผลลัพธ์ - User simulation (optional): ใช้โมเดล genai อย่าง Gemini สร้าง prompt ของ user แบบไดนามิกระหว่าง evaluate ช่วยค้นพบ edge case ที่ static test case มักพลาด ## ความเห็นสรุป วิดีโอนี้อธิบาย evaluation ได้เป็นขั้นเป็นตอนดี โดยเฉพาะการพาสร้าง test จริงใน web UI แล้วทำให้มัน fail ให้ดู ช่วยให้เข้าใจคะแนนทั้งสองแบบได้รวดเร็วครับ จุดที่ผู้เรียนควรเก็บกินคือแนวคิด systematic evaluation ด้วย JSON และ regression testing เพราะเป็นสะพานสู่งานจริงใน production ครับ ข้อควรระวังอีกครั้ง: ชื่อวิดีโอไม่ตรงกับเนื้อหาจริง (ชื่อบอก Project Build แต่สอน Evaluation) ควรใช้เนื้อหาในคลิปเป็นหลักครับ
คำแปลเต็ม
แปลตามบทสนทนาต้นฉบับ ปรับเป็นภาษาไทยธรรมชาติ
ในวิดีโอนี้เราจะเรียนส่วน B ของ assignment ใน Day 4 ครับ ผมจะคลิกที่ evaluate ในแบบฝึกหัดนี้เราจะเข้าใจว่า agent evaluation ทำงานอย่างไรครับ ผมกด copy and edit เพื่อให้ได้ notebook เวอร์ชันที่แก้ไขได้ของตัวเองครับ
โอเค ตรงนี้ในวิดีโอก่อนหน้าซึ่งเป็นส่วน A ของ Day 4 เราเข้าใจเรื่อง observability แล้ว ในวิดีโอนี้เราจะเรียนเรื่อง agent evaluation (การประเมินผลเอเจนต์) ครับ อย่างที่เห็นตรงนี้บอกว่า observability เป็นแบบ reactive คือมันทำงานหลังจากปัญหาเกิดขึ้นแล้ว โดยให้ข้อมูลที่จำเป็นเพื่อ debug และเข้าใจสาเหตุเบื้องลึกครับ แต่สำหรับ evaluation หมายความว่าเราต้องประเมินประสิทธิภาพของเอเจนต์อย่างต่อเนื่อง เพื่อรับรู้ความเสื่อมถอยของคุณภาพได้เร็วขึ้น หากมีอยู่ในระบบครับ
นิยามของ agent evaluation คือ กระบวนการอย่างเป็นระบบในการทดสอบและวัดว่า AI agent ทำงานได้ดีแค่ไหนในสถานการณ์ต่างๆ และมิติคุณภาพที่แตกต่างกันครับ เรื่องราวที่เราจะ implement ในแบบฝึกหัดนี้คือการสร้าง home automation agent หรือเอเจนต์ควบคุมบ้านอัจฉริยะครับ มันทำงานได้สมบูรณ์แบบในการทดสอบของเรา เราจึงปล่อยใช้งานอย่างมั่นใจ และมันจะต่างจากซอฟต์แวร์แบบเดิม เพราะนี่ไม่ใช่แค่การทดสอบมาตรฐาน แต่เป็น evaluation ซึ่งทั้งสองอย่างต่างกันครับ การทดสอบมาตรฐานคือการทดสอบ happy path คือทางที่ทุกอย่างเป็นไปตามปกติ ขณะที่ evaluation คือการประเมินกระบวนการตัดสินใจทั้งหมดของเอเจนต์ หรือที่เรียกว่า trajectory (เส้นทางการทำงาน) ครับ
ใน notebook วันนี้เราจะเข้าใจว่า agent evaluation คืออะไรและใช้อย่างไร รัน evaluation และวิเคราะห์ผลลัพธ์ตรงใน ADK web UI ตรวจจับ regression (การถดถอยของประสิทธิภาพ) ของเอเจนต์ตลอดช่วงเวลา และเข้าใจรวมถึงสร้างไฟล์ evaluation ที่จำเป็นซึ่งทั้งหมดเป็น JSON ครับ
ส่วนแรกคือ section ของ setup ครับ ผมไปที่ add-ons แล้วเลือก secret ต้องเพิ่ม key ก่อน ผมจะไปที่ AI Studio คัดลอก key ของผม แล้วกลับมาที่หน้านี้ กด add secret key แล้ว save จากนั้นเลือกและรันโค้ด ตอนนี้เสร็จแล้วครับ ต่อไปเราจะตั้งค่า proxy และ tunneling เราใช้ proxy เพื่อเข้าถึง web UI จากใน notebook ของ Kaggle ถ้าคุณรันนอกสภาพแวดล้อมนี้ก็ไม่ต้องทำขั้นตอนนี้ครับ อันนี้เป็น helper function ครับ
ต่อไปเราจะสร้าง home automation agent ครับ มีสองขั้นตอน ขั้นแรกคือสร้างมัน แล้วค่อยทับไฟล์ ตอนนี้เราสร้างสภาพแวดล้อมของเอเจนต์นี้สำเร็จแล้ว เรานิยามทุกอย่างเรียบร้อยครับ home automation agent ตัวนี้ดูสมบูรณ์แบบในการทดสอบพื้นฐาน แต่มีข้อบกพร่องที่ซ่อนอยู่ และเราจะค้นพบมันผ่านการ evaluation แบบครอบคลุมครับ ขั้นต่อไปคือรัน cell นี้ซึ่งจะสร้าง automation agent ครับ
โดย tool ชื่อ set_device ใช้ควบคุมอุปกรณ์ smart home ครับ สถานะของอุปกรณ์มีได้แค่ on กับ off เท่านั้นตามที่เห็นตรงนี้ และ instructions ของเอเจนต์ถูกตั้งใจให้มั่นใจเกินจริงครับ คือเธอเป็นผู้ช่วยระบบบ้านอัจฉริยะ เธอควบคุมอุปกรณ์ smart ทั้งหมดในบ้าน เธอเข้าถึงไฟ ระบบรักษาความปลอดภัย เตาอบ ผู้เผาไหม้ และอุปกรณ์อื่นใดก็ตามที่ user พูดถึง ให้พยายามช่วยเหลือเสมอ และควบคุมอุปกรณ์ใดก็ตามที่ user ขอ เมื่อ user ถามถึงความสามารถของอุปกรณ์ ให้บอกคุณสมบัติเด่นๆ ทั้งหมดที่เธอควบคุมได้ครับ มันจึงอ้างว่าควบคุมอุปกรณ์ smart ทั้งหมดและอุปกรณ์ใดก็ตามที่ user พูดถึง ซึ่ง instructions แบบนี้นำไปสู่ความยากลำบากในการตั้งค่า evaluation ครับ
ต่อไปเราไป section สามซึ่งเป็นการ evaluation แบบ interactive ด้วย ADK web UI ครับ ตรงนี้เราจะได้ URL ของ proxy เหมือนที่เคยทำมาแล้ว เรารันทั้งสองอันนี้ คุณควรจำไว้เสมอว่า cell นี้จะไม่เสร็จสิ้น มันจะรันค้างไว้เรื่อยๆ ถ้าอยากออกต้องกด Ctrl C หรือหยุดด้วยตนเองจากตรงนี้ครับ ตอนนี้เราเปิด ADK web UI จากตรงนี้ได้เลยครับ
ทีนี้เราจะสร้าง evaluation test แบบแรกกันครับ สิ่งแรกที่ต้องถามคือเปิดโคมไฟบนโต๊ะในห้องทำงานหน่อย ผมกลับไปที่ notebook คัดลอกจากตรงนี้แล้วมาวางตรงนี้ กด enter ครับ ถ้าเห็น เอเจนต์ตอบถูกต้อง ควบคุมอุปกรณ์และยืนยันการทำงานครับ ทีนี้เราต้องบันทึก evaluation case นี้ ทำได้จากแท็บ eval ทางด้านขวาครับ ถ้านี่ไม่ใช่ครั้งแรกของคุณ คุณจะมี test ประมาณนี้อยู่ในโฟลเดอร์ แต่ถ้าไม่มี คุณจะเห็นแค่ตัวเลือกที่เขียนว่า create new eval set ครับ คุณสามารถคลิกที่ลิงก์นั้น หรือไม่ก็คลิกที่เครื่องหมายบวกแล้วสร้าง evaluation set ของคุณได้ครับ
เราจะลบอันนี้ทิ้งแล้วใส่ชื่อ ชื่อที่ให้ไว้ตรงนี้คือ home automation test คุณจะใช้ชื่อเดียวกันหรือชื่ออื่นก็ได้ครับ ผมใช้ชื่อเดิมมาตลอด ผมแค่เปลี่ยนเวอร์ชันตรงนี้ เพราะถ้าลองทับโฟลเดอร์เดิมมันจะไม่ยอม ผมกด create ครับ ตอนนี้ evaluation set ถูกสร้างแล้ว เราไปที่เครื่องหมายนี้ แล้วข้างในเราจะเพิ่ม session ปัจจุบันเข้าไปใน test นี้ ผมตั้งชื่อว่า home basic device control เสร็จแล้วครับ ตอนนี้เราบันทึกการโต้ตอบแรกเป็น evaluation case สำเร็จแล้วครับ
ทีนี้มารัน evaluation กัน เราคลิกที่นี่แล้วกด run evaluation มันจะแสดง dialog ของ evaluation metric เราปล่อยเป็นค่า default แล้วกด start ครับ evaluation จะรันขึ้นมา เราเห็นผลลัพธ์ pass สีเขียวใน history นี้ ซึ่งยืนยันว่าพฤติกรรมของเอเจนต์ตรงกับ session ที่บันทึกไว้ครับ
ทีนี้เราต้องเข้าใจว่าเมื่อรัน evaluation เราจะเห็นคะแนนสำคัญสองอย่าง ตอนนี้เราต้องเข้าใจ evaluation metrics กันครับ เมื่อเรารัน evaluation เราจะเห็นคะแนนสำคัญสองตัว ดูได้จาก history ครับ เราดูประวัติของ eval มันบอกว่า passed ครับ สอง metric คือ response match score (คะแนนความตรงของคำตอบ) กับ tool trajectory average score (คะแนนเฉลี่ยเส้นทางการใช้ tool) ครับ
response match score วัดว่าคำตอบจริงของเอเจนต์คล้ายกับคำตอบที่คาดหวังแค่ไหน โดยใช้อัลกอริทึมเปรียบเทียบความคล้ายของข้อความ คะแนนหนึ่งคือตรงกันสมบูรณ์แบบ และ 0.0 คือต่างกันโดยสิ้นเชิงครับ ส่วน tool trajectory score วัดว่าเอเจนต์ใช้ tool ถูกตัวกับ parameter ถูกหรือไม่ ตรวจลำดับการเรียก tool เทียบกับพฤติกรรมที่คาดหวัง คะแนนหนึ่งแปลว่าใช้ tool สมบูรณ์แบบ 0.0 แปลว่า tool ผิดหรือ parameter ผิดครับ ในกรณีนี้สิ่งที่เราเข้าใจได้จากคะแนนคือ response match ใกล้เคียงกับคำตอบที่คาดหวัง ขณะที่ tool trajectory สมบูรณ์แบบ หมายความว่าการใช้ tool สมบูรณ์แบบครับ
เรามาทำให้ test พังโดยเจตนา เพื่อดูว่าความล้มเหลวหน้าตาเป็นอย่างไรครับ ผมกลับไปที่ post test คลิกที่ดินสอตรงนี้ ผมจะแก้ตรงนี้แล้วพิมพ์ว่าโคมไฟบนโต๊ะถูกปิดอยู่ แล้วกด save ทีนี้เราจะรัน eval ใหม่ ครั้งนี้ผลลัพธ์เป็น fail สีแดงครับ เมื่อเอาเมาส์ชี้ตรงนี้มันบอกว่าดูผลลัพธ์การรัน eval เราคลิกเข้าไปได้ แล้วมันแสดงว่าอันนี้ล้มเหลวครับ และเมื่อชี้ที่คำตอบ มันบอกว่าโคมไฟบนโต๊ะในห้องทำงานเปิดอยู่ตอนนี้ ขณะที่คำตอบที่คาดหวังคือโคมไฟถูกปิดอยู่ครับ
ตรงนี้คุณเห็นว่า tooltip นี้แสดงการเปรียบเทียบแบบเคียงข้างกันของ output จริงกับ output ที่คาดหวัง โดยชี้ให้เห็นชัดเจนว่าทำไม test จึงล้มเหลว หมายความว่าคำตอบสุดท้ายไม่ตรงกับคำตอบที่คาดหวังครับ ข้อมูล feedback ทันทีแบบละเอียดนี้มีค่ามากสำหรับการ debug ครับ คุณยังสามารถทำ test อื่นๆ ได้อีก เช่นลองใส่คำสั่งที่คลุมเครือครับ ถ้ากลับไปดูตรงนี้ มันบอกว่าคุณสามารถสร้างสถานการณ์ของคุณในบทสนทนาแยกต่างหากได้ คุณอาจมีคำสั่งคลุมเครือเช่นเปิดไฟในห้องนอนหน่อย บันทึกมันเป็น test ใหม่ แล้วก็ลองพูดว่ากรุณาปิดทีวีในโรงรถหน่อย แล้วดูว่ามันทำงานอย่างไรครับ มาลองหนึ่งตัวกัน ผมเอาอันนี้มาคัดลอก สร้าง session ใหม่จากด้านบน พิมพ์แล้วกด enter ดูสิว่ามันตอบอะไร มันบอกว่าไฟในห้องนอนเปิดแล้วครับ ทีนี้มาบันทึก test นี้กัน กลับเข้าไปข้างใน คลิกแล้วบันทึก test นี้เป็น biggest device reference ครับ
ต่อไปเราจะสร้างอีกหนึ่งตัว โดยพูดว่า แต่ก่อนอื่นลองรันตัวนี้ก่อน มันบอก pass ครับ คุณลองตัวถัดไปได้ซึ่งเป็น invalid locations แล้วก็ complex commands แค่ไปที่ session ใหม่แล้วทำไปเรื่อยๆ ครับ สิ่งที่คุณจะเข้าใจคือทุกครั้งที่เอเจนต์ผ่าน test เอเจนต์กำลังตั้งสมมติฐานเกี่ยวกับอุปกรณ์ที่ไม่มีอยู่จริง มันตอบในแบบที่ฟังดูช่วยเหลือดีแต่ไม่ถูกต้อง และพยายามควบคุมอุปกรณ์ที่มันไม่ควรมีสิทธิ์เข้าถึงครับ
แล้วเราพลาดอะไรไปล่ะครับ นี่เป็นข้อจำกัดของ UI หรือเปล่า จนถึงตอนนี้เราเห็นวิธีสร้างและประเมิน test case ใน ADK UI แล้ว UI เหมาะกับการสร้าง test แบบ interactive มาก แต่การทดสอบทีละบทสนทนามัน scale ไม่ไหวครับ เราต้องมีหลาย test case ในหนึ่ง evaluation set ดังนั้นจะตรวจจับ regression ในประสิทธิภาพของเอเจนต์อย่างล่วงหน้าได้อย่างไร ทำได้ด้วยการ evaluation แบบเป็นระบบครับ
ก่อนไปสู่ evaluation แบบเป็นระบบ เราต้องหยุด web UI ก่อน กลับมาตรงนี้แล้วหยุดมันครับ อันนี้สำคัญเสมอ เพราะถ้าเราไม่หยุด มันจะรันค้างไว้ และ cell ที่รันอยู่นั้นจะบล็อกหรือกัน cell อื่นๆ ไม่ให้รัน ตราบใดที่ ADK web UI ยังทำงานอยู่ครับ ดังนั้นต้องแน่ใจเสมอว่าเมื่อออกจาก UI แล้วให้หยุดมันทันทีครับ
ทีนี้มาคุยกันเรื่อง systematic evaluation ครับ เรามีไดอะแกรมอยู่ตรงนี้ แต่ก่อนอื่นผมอยากเล่าเรื่อง regression testing กันก่อนครับ มันคือแนวปฏิบัติของการรัน test เดิมซ้ำๆ เพื่อให้แน่ใจว่าการเปลี่ยนแปลงใหม่ๆ ไม่ได้ทำลายฟังก์ชันที่เคยทำงานได้ดีอยู่ก่อนครับ ADK ให้วิธีทำ regression อัตโนมัติและ batch testing แก่เราสองแบบ หนึ่งคือ pytest อีกอันคือ ADK eval ครับ ผมจะใส่ลิงก์เอกสารพวกนี้ไว้ คุณไปอ่านทำความเข้าใจคำสั่งต่างๆ ได้ครับ ใน section นี้เราจะใช้คำสั่ง CLI ครับ ถ้าต้องการข้อมูลเพิ่มเติมไปที่เอกสารที่ผมจะแชร์ให้นะครับ
รูปต่อไปนี้แสดงกระบวนการ evaluation โดยรวมครับ ในระดับสูงมีสี่ขั้นตอนในการ evaluate ขั้นแรกคือสร้าง evaluation configuration ซึ่งหมายถึงนิยาม metric ที่คุณต้องการวัด จากนั้นสร้าง test เช่น sample test case ที่จะใช้เปรียบเทียบ แล้วรันเอเจนต์ด้วยคำถาม test และเปรียบเทียบผลลัพธ์ของ test กับผลลัพธ์จริงครับ นี่คือสี่ขั้นตอนโดยสรุปครับ มาสร้าง evaluation configuration กันเลย นี่เป็นไฟล์ optional ซึ่งให้เรานิยามเกณฑ์ผ่านหรือตกสำหรับแต่ละ test ครับ เราสร้าง test config นี้ใน root directory โดย import รายละเอียดของ trajectory และ response match score เข้ามาตรงนี้ครับ ใน test case ของเรา response match score เป็นหนึ่งกับ 0.7 และ trajectory เป็นหนึ่งครับ ซึ่งก็คือต้องใช้ tool แบบสมบูรณ์แบบ และความคล้ายคลึงแปดสิบเปอร์เซ็นต์ ของเราเป็นยี่สิบเปอร์เซ็นต์ครับ
เอาล่ะ ทีนี้เราจะรันส่วนนี้เพื่อสร้าง evaluation configuration ครับ มันให้เกณฑ์ว่า tool trajectory เป็นเท่าไหร่ และ evaluation นี้จะจับอะไรได้บ้าง มันจะจับการใช้ tool ที่ผิด คุณภาพคำตอบที่แย่ และความเบี่ยงเบนจากพฤติกรรมที่คาดหวังครับ
ทีนี้เราต้องสร้าง test case ครับ ตรงนี้มี tip หนึ่งบอกว่าเพื่อบันทึกบทสนทนาจาก web UI ให้คงอยู่ เพียงแค่สร้าง eval set ใน UI แล้วเพิ่ม session ปัจจุบันเข้าไป บทสนทนาทั้งหมดใน session นั้นจะถูกแปลงเป็น eval set โดยอัตโนมัติและดาวน์โหลดลงเครื่อง แล้วคุณสามารถใช้มันเป็น JSON ได้เลยครับ ทีนี้สิ่งที่เราจะสร้างคือ integration eval.json ซึ่งจะมีหลาย test case หรือหลาย session ข้างในครับ ใน tool นี้เรามีค่าเป็น on กับ off ทั้งหมด มีสถานะอุปกรณ์ มี device ID มี location ครับ สำหรับ set_device_status เรามีหลายส่วน เมื่อพูดว่ากรุณาเปิดโคมไฟตั้งพื้นในห้องนั่งเล่น จะมีข้อความนี้ โคมไฟตั้งพื้นคือ device ID และ location คือห้องนั่งเล่นครับ คล้ายกันสำหรับครัว ใน intermediate data มีครัวกับไฟหลักครับ
ทีนี้เรารันส่วนนี้เพื่อสร้าง test case ครับ โอเค test case ถูกสร้างแล้ว ต่อไปเราจะ import JSON นี้เข้าไปในเอเจนต์ของเราครับ เปิดเอเจนต์นี้ ใช้ dump ตรงนี้ ตอนนี้เราได้สร้าง test case แล้ว เรามี test scenario สองอัน หนึ่งสำหรับห้องนั่งเล่นและอีกอันสำหรับครัวครับ ผลลัพธ์ที่คาดหวังคือ basic device control ควรผ่านทั้งสองเกณฑ์ test การใช้ tool ผิดอาจตก tool trajectory หากใช้ parameter ผิด และ test คุณภาพคำตอบที่แย่อาจตก response match หากคำตอบต่างไปมากเกินไปครับ
ทีนี้เราจะ execute คำสั่งนี้โดยชี้ไปที่ directory ของเอเจนต์ eval set และไฟล์ config ของเราครับ นี่คือคำสั่งสำหรับ execute evaluation ครับ อันถัดไปในลำดับคือการวิเคราะห์ผลลัพธ์จาก sample evaluation ครับ ผมจะรันอันนี้ มันจะพิมพ์ผลลัพธ์แบบละเอียด มันจะแจ้งเตือนทุกอย่าง โดยแสดงรายละเอียดทีละ turn ของแต่ละ test พร้อมคะแนนและ diff หรือความแตกต่างของจุดที่ล้มเหลวครับ นี่คือหน้าตาที่ test case ห้องนั่งเล่น response ตรงกันและ tool trajectory ก็ตรงกันเช่นกันครับ นี่คือวิธีที่มันพิมพ์ผลลัพธ์ออกมาครับ นี่คือการเข้าใจว่าผลลัพธ์ของ evaluation จะออกมาหน้าตาแบบไหนครับ
ต่อไปคือ user simulation ซึ่งเป็น optional ครับ อันนี้ต่างจากวิธี evaluation แบบดั้งเดิมที่พึ่ง test case ตายตัว ตรงนี้ user simulation เป็นฟีเจอร์ที่จัดการข้อจำกัดของ static evaluation ครับ แทนที่จะใช้ prompt ของ user แบบ fixed ที่นิยามไว้ล่วงหน้า สิ่งที่มันทำคือใช้โมเดล genai เช่น Gemini สร้าง prompt ของ user แบบไดนามิกระหว่างกระบวนการ evaluation ครับ ถ้าอยากรู้ว่ามันทำงานอย่างไร ดูได้จากเอกสารนี้ครับ ผมจะใส่ไว้ในคำอธิบายของวิดีโอนี้ และคุณลองทำแบบฝึกหัดนี้ได้ เช่นการนิยาม conversation scenario ที่ร่างเป้าหมายการสนทนาโดยรวมของ user และ conversation plan เพื่อนำทางบทสนทนาครับ ลองทำดูถ้าอยากเข้าใจว่า simulation ช่วยให้คุณค้นพบ edge case และปรับปรุงความทนทานของเอเจนต์อย่างไร ในแบบที่ static test case มักพลาดครับ
เมื่อคุณผ่านแบบฝึกหัดนี้แล้ว โปรดไปดูวิดีโอถัดไปซึ่งก็คือ Day 5 ที่เราจะเรียนวิธี deploy เอเจนต์ขึ้น production และต่อยอดด้วย agent-to-agent protocol ครับ ขอบคุณครับ
หมายเหตุการแปล
ความโปร่งใสเกี่ยวกับความไม่แน่นอนในต้นฉบับ
- ไม่มีการใช้สัญลักษณ์ระบุเสียงไม่ชัดเจน (0 จุด) — ทุก segment เข้าใจความหมายได้ครบ
อภิธานศัพท์เทคนิค
คำศัพท์และชื่อผลิตภัณฑ์ที่คงรูปภาษาอังกฤษ
| ศัพท์ | คำแปล / คำอธิบาย |
|---|---|
| agent evaluation | การประเมินผลเอเจนต์อย่างเป็นระบบ |
| observability | การสังเกตการทำงานภายในของระบบ (แบบ reactive — หลังเกิดปัญหา) |
| reactive | ทำงานเมื่อมีเหตุการณ์เกิดขึ้นแล้ว (ตรงข้าม proactive) |
| quality regression | ความถดถอยของคุณภาพ — ประสิทธิภาพแย่ลงจากเดิม |
| home automation agent | เอเจนต์ควบคุมบ้านอัจฉริยะ (ตัวอย่างในแบบฝึกหัด) |
| happy path | เส้นทางที่ทุกอย่างเป็นไปตามปกติ ไม่มีข้อผิดพลาด |
| trajectory | เส้นทางการตัดสินใจ/การทำงานทั้งหมดของเอเจนต์ |
| eval set | ชุดการทดสอบ evaluation ที่บันทึกไว้ |
| evaluation case | เคสการทดสอบหนึ่งๆ ใน eval set |
| response match score | คะแนนความคล้ายระหว่างคำตอบจริงกับคำตอบที่คาดหวัง (1.0 = ตรงสนิท) |
| tool trajectory score | คะแนนความถูกต้องของการเลือก tool พารามิเตอร์ และลำดับการเรียก |
| regression testing | การรัน test เดิมซ้ำเพื่อยืนยันว่าการแก้ใหม่ไม่ทำลายของเดิม |
| batch testing | การทดสอบเป็นชุดหลายเคสพร้อมกัน |
| pytest | เครื่องมือทดสอบของ Python |
| ADK eval | คำสั่ง evaluation ในตัวของ ADK |
| evaluation configuration | ไฟล์ config นิยาม metric และเกณฑ์ผ่าน/ตก |
| threshold | เกณฑ์คะแนนขั้นต่ำที่กำหนดว่าผ่านหรือตก |
| test case | รายการทดสอบหนึ่งๆ |
| integration eval | ไฟล์ทดสอบรวม (JSON) ที่มีหลาย test case/session |
| JSON | รูปแบบไฟล์ข้อมูลแบบข้อความที่นิยมใช้ |
| device ID | รหัสประจำอุปกรณ์ |
| intermediate data | ข้อมูลขั้นกลางที่แยกได้จากคำสั่ง (เช่น location) |
| user simulation | การจำลองพฤติกรรม user ด้วยโมเดล AI สร้าง prompt แบบไดนามิก |
| static evaluation | การประเมินด้วย test case ตายตัวที่เตรียมไว้ล่วงหน้า |
| edge case | กรณีมุม/สถานการณ์ผิดปกติที่มักถูกมองข้าม |
| robustness | ความทนทานของระบบต่อสถานการณ์ต่างๆ |
| conversation scenario | โครงเรื่องบทสนทนาที่กำหนดเป้าหมายของ user |
| conversation plan | แผนนำทางบทสนทนา |
| smart home devices | อุปกรณ์บ้านอัจฉริยะ |
| Ctrl C | ปุ่มลัดหยุดการทำงานของ cell/process |
| proxy / tunneling | ตัวกลางเข้าถึง web UI จาก notebook ของ Kaggle |
| tooltip | กล่องข้อความอธิบายเมื่อชี้เมาส์ |
| diff | การเทียบแสดงความแตกต่างระหว่างสองสิ่ง |
| agent-to-agent protocol | โปรโตคอลสื่อสารระหว่างเอเจนต์ (เนื้อหา Day 5) |
| deploy / deployment | การปล่อยระบบขึ้นใช้งานจริง |
ซับไตเติ้ลภาษาไทย
ดาวน์โหลดหรือดูซับทั้งหมด
1 00:00:00,000 --> 00:00:04,772 ในวิดีโอนี้เราจะเรียนส่วน B ของ assignment ใน 2 00:00:04,772 --> 00:00:08,060 Day 4 ครับ ผมจะคลิกที่ evaluate 3 00:00:08,060 --> 00:00:12,832 ในแบบฝึกหัดนี้เราจะเข้าใจว่า agent evaluation 4 00:00:12,832 --> 00:00:16,544 ทำงานอย่างไรครับ ผมกด copy and edit
เปิดดูซับไตเติ้ลทั้งหมด (310 segments)
1 00:00:00,000 --> 00:00:04,772 ในวิดีโอนี้เราจะเรียนส่วน B ของ assignment ใน 2 00:00:04,772 --> 00:00:08,060 Day 4 ครับ ผมจะคลิกที่ evaluate 3 00:00:08,060 --> 00:00:12,832 ในแบบฝึกหัดนี้เราจะเข้าใจว่า agent evaluation 4 00:00:12,832 --> 00:00:16,544 ทำงานอย่างไรครับ ผมกด copy and edit 5 00:00:16,544 --> 00:00:18,665 เพื่อให้ได้ notebook 6 00:00:18,665 --> 00:00:22,589 เวอร์ชันที่แก้ไขได้ของตัวเองครับ โอเค 7 00:00:22,589 --> 00:00:27,468 ตรงนี้ในวิดีโอก่อนหน้าซึ่งเป็นส่วน A ของ Day 4 8 00:00:27,468 --> 00:00:31,074 เราเข้าใจเรื่อง observability แล้ว 9 00:00:31,074 --> 00:00:35,740 ในวิดีโอนี้เราจะเรียนเรื่อง agent evaluation 10 00:00:35,740 --> 00:00:38,497 (การประเมินผลเอเจนต์) ครับ 11 00:00:38,497 --> 00:00:43,376 อย่างที่เห็นตรงนี้บอกว่า observability เป็นแบบ 12 00:00:43,376 --> 00:00:48,042 reactive คือมันทำงานหลังจากปัญหาเกิดขึ้นแล้ว 13 00:00:48,042 --> 00:00:51,436 โดยให้ข้อมูลที่จำเป็นเพื่อ debug 14 00:00:51,436 --> 00:00:55,466 และเข้าใจสาเหตุเบื้องลึกครับ แต่สำหรับ 15 00:00:55,466 --> 00:00:56,565 evaluation 16 00:00:56,565 --> 00:01:02,928 หมายความว่าเราต้องประเมินประสิทธิภาพของเอเจนต์อย่างต่อเนื่อง 17 00:01:02,928 --> 00:01:07,595 เพื่อรับรู้ความเสื่อมถอยของคุณภาพได้เร็วขึ้น 18 00:01:07,595 --> 00:01:12,367 หากมีอยู่ในระบบครับ นิยามของ agent evaluation 19 00:01:12,367 --> 00:01:17,140 คือ กระบวนการอย่างเป็นระบบในการทดสอบและวัดว่า 20 00:01:17,140 --> 00:01:21,488 AI agent ทำงานได้ดีแค่ไหนในสถานการณ์ต่างๆ 21 00:01:21,488 --> 00:01:24,669 และมิติคุณภาพที่แตกต่างกันครับ 22 00:01:24,669 --> 00:01:27,533 เรื่องราวที่เราจะ implement 23 00:01:27,533 --> 00:01:31,881 ในแบบฝึกหัดนี้คือการสร้าง home automation 24 00:01:31,881 --> 00:01:36,017 agent หรือเอเจนต์ควบคุมบ้านอัจฉริยะครับ 25 00:01:36,017 --> 00:01:39,941 มันทำงานได้สมบูรณ์แบบในการทดสอบของเรา 26 00:01:39,941 --> 00:01:42,911 เราจึงปล่อยใช้งานอย่างมั่นใจ 27 00:01:42,911 --> 00:01:46,198 และมันจะต่างจากซอฟต์แวร์แบบเดิม 28 00:01:46,198 --> 00:01:50,440 เพราะนี่ไม่ใช่แค่การทดสอบมาตรฐาน แต่เป็น 29 00:01:50,440 --> 00:01:54,471 evaluation ซึ่งทั้งสองอย่างต่างกันครับ 30 00:01:54,471 --> 00:01:58,395 การทดสอบมาตรฐานคือการทดสอบ happy path 31 00:01:58,395 --> 00:02:02,318 คือทางที่ทุกอย่างเป็นไปตามปกติ ขณะที่ 32 00:02:02,318 --> 00:02:03,418 evaluation 33 00:02:03,418 --> 00:02:08,402 คือการประเมินกระบวนการตัดสินใจทั้งหมดของเอเจนต์ 34 00:02:08,402 --> 00:02:13,069 หรือที่เรียกว่า trajectory (เส้นทางการทำงาน) 35 00:02:13,069 --> 00:02:17,629 ครับ ใน notebook วันนี้เราจะเข้าใจว่า agent 36 00:02:17,629 --> 00:02:22,507 evaluation คืออะไรและใช้อย่างไร รัน evaluation 37 00:02:22,507 --> 00:02:27,068 และวิเคราะห์ผลลัพธ์ตรงใน ADK web UI ตรวจจับ 38 00:02:27,068 --> 00:02:30,779 regression (การถดถอยของประสิทธิภาพ) 39 00:02:30,779 --> 00:02:33,113 ของเอเจนต์ตลอดช่วงเวลา 40 00:02:33,113 --> 00:02:36,825 และเข้าใจรวมถึงสร้างไฟล์ evaluation 41 00:02:36,825 --> 00:02:41,597 ที่จำเป็นซึ่งทั้งหมดเป็น JSON ครับ ส่วนแรกคือ 42 00:02:41,597 --> 00:02:45,627 section ของ setup ครับ ผมไปที่ add-ons 43 00:02:45,627 --> 00:02:50,399 แล้วเลือก secret ต้องเพิ่ม key ก่อน ผมจะไปที่ 44 00:02:50,399 --> 00:02:53,157 AI Studio คัดลอก key ของผม 45 00:02:53,157 --> 00:02:57,717 แล้วกลับมาที่หน้านี้ กด add secret key แล้ว 46 00:02:57,717 --> 00:03:00,581 save จากนั้นเลือกและรันโค้ด 47 00:03:00,581 --> 00:03:05,141 ตอนนี้เสร็จแล้วครับ ต่อไปเราจะตั้งค่า proxy 48 00:03:05,141 --> 00:03:10,019 และ tunneling เราใช้ proxy เพื่อเข้าถึง web UI 49 00:03:10,019 --> 00:03:12,671 จากใน notebook ของ Kaggle 50 00:03:12,671 --> 00:03:18,079 ถ้าคุณรันนอกสภาพแวดล้อมนี้ก็ไม่ต้องทำขั้นตอนนี้ครับ 51 00:03:18,079 --> 00:03:21,367 อันนี้เป็น helper function ครับ 52 00:03:21,367 --> 00:03:25,821 ต่อไปเราจะสร้าง home automation agent ครับ 53 00:03:25,821 --> 00:03:29,109 มีสองขั้นตอน ขั้นแรกคือสร้างมัน 54 00:03:29,109 --> 00:03:30,700 แล้วค่อยทับไฟล์ 55 00:03:30,700 --> 00:03:35,790 ตอนนี้เราสร้างสภาพแวดล้อมของเอเจนต์นี้สำเร็จแล้ว 56 00:03:35,790 --> 00:03:40,563 เรานิยามทุกอย่างเรียบร้อยครับ home automation 57 00:03:40,563 --> 00:03:44,911 agent ตัวนี้ดูสมบูรณ์แบบในการทดสอบพื้นฐาน 58 00:03:44,911 --> 00:03:47,668 แต่มีข้อบกพร่องที่ซ่อนอยู่ 59 00:03:47,668 --> 00:03:51,274 และเราจะค้นพบมันผ่านการ evaluation 60 00:03:51,274 --> 00:03:55,092 แบบครอบคลุมครับ ขั้นต่อไปคือรัน cell 61 00:03:55,092 --> 00:03:59,865 นี้ซึ่งจะสร้าง automation agent ครับ โดย tool 62 00:03:59,865 --> 00:04:04,425 ชื่อ set_device ใช้ควบคุมอุปกรณ์ smart home 63 00:04:04,425 --> 00:04:08,561 ครับ สถานะของอุปกรณ์มีได้แค่ on กับ off 64 00:04:08,561 --> 00:04:12,909 เท่านั้นตามที่เห็นตรงนี้ และ instructions 65 00:04:12,909 --> 00:04:17,151 ของเอเจนต์ถูกตั้งใจให้มั่นใจเกินจริงครับ 66 00:04:17,151 --> 00:04:20,651 คือเธอเป็นผู้ช่วยระบบบ้านอัจฉริยะ 67 00:04:20,651 --> 00:04:24,469 เธอควบคุมอุปกรณ์ smart ทั้งหมดในบ้าน 68 00:04:24,469 --> 00:04:28,605 เธอเข้าถึงไฟ ระบบรักษาความปลอดภัย เตาอบ 69 00:04:28,605 --> 00:04:32,847 ผู้เผาไหม้ และอุปกรณ์อื่นใดก็ตามที่ user 70 00:04:32,847 --> 00:04:35,923 พูดถึง ให้พยายามช่วยเหลือเสมอ 71 00:04:35,923 --> 00:04:40,695 และควบคุมอุปกรณ์ใดก็ตามที่ user ขอ เมื่อ user 72 00:04:40,695 --> 00:04:43,453 ถามถึงความสามารถของอุปกรณ์ 73 00:04:43,453 --> 00:04:45,574 ให้บอกคุณสมบัติเด่นๆ 74 00:04:45,574 --> 00:04:48,331 ทั้งหมดที่เธอควบคุมได้ครับ 75 00:04:48,331 --> 00:04:51,725 มันจึงอ้างว่าควบคุมอุปกรณ์ smart 76 00:04:51,725 --> 00:04:56,391 ทั้งหมดและอุปกรณ์ใดก็ตามที่ user พูดถึง ซึ่ง 77 00:04:56,391 --> 00:04:57,664 instructions 78 00:04:57,664 --> 00:05:01,588 แบบนี้นำไปสู่ความยากลำบากในการตั้งค่า 79 00:05:01,588 --> 00:05:05,194 evaluation ครับ ต่อไปเราไป section 80 00:05:05,194 --> 00:05:10,072 สามซึ่งเป็นการ evaluation แบบ interactive ด้วย 81 00:05:10,072 --> 00:05:14,738 ADK web UI ครับ ตรงนี้เราจะได้ URL ของ proxy 82 00:05:14,738 --> 00:05:18,981 เหมือนที่เคยทำมาแล้ว เรารันทั้งสองอันนี้ 83 00:05:18,981 --> 00:05:23,329 คุณควรจำไว้เสมอว่า cell นี้จะไม่เสร็จสิ้น 84 00:05:23,329 --> 00:05:28,207 มันจะรันค้างไว้เรื่อยๆ ถ้าอยากออกต้องกด Ctrl C 85 00:05:28,207 --> 00:05:32,874 หรือหยุดด้วยตนเองจากตรงนี้ครับ ตอนนี้เราเปิด 86 00:05:32,874 --> 00:05:37,752 ADK web UI จากตรงนี้ได้เลยครับ ทีนี้เราจะสร้าง 87 00:05:37,752 --> 00:05:40,828 evaluation test แบบแรกกันครับ 88 00:05:40,828 --> 00:05:46,236 สิ่งแรกที่ต้องถามคือเปิดโคมไฟบนโต๊ะในห้องทำงานหน่อย 89 00:05:46,236 --> 00:05:48,357 ผมกลับไปที่ notebook 90 00:05:48,357 --> 00:05:53,024 คัดลอกจากตรงนี้แล้วมาวางตรงนี้ กด enter ครับ 91 00:05:53,024 --> 00:05:55,675 ถ้าเห็น เอเจนต์ตอบถูกต้อง 92 00:05:55,675 --> 00:05:59,281 ควบคุมอุปกรณ์และยืนยันการทำงานครับ 93 00:05:59,281 --> 00:06:03,311 ทีนี้เราต้องบันทึก evaluation case นี้ 94 00:06:03,311 --> 00:06:06,705 ทำได้จากแท็บ eval ทางด้านขวาครับ 95 00:06:06,705 --> 00:06:10,841 ถ้านี่ไม่ใช่ครั้งแรกของคุณ คุณจะมี test 96 00:06:10,841 --> 00:06:14,553 ประมาณนี้อยู่ในโฟลเดอร์ แต่ถ้าไม่มี 97 00:06:14,553 --> 00:06:19,007 คุณจะเห็นแค่ตัวเลือกที่เขียนว่า create new 98 00:06:19,007 --> 00:06:23,143 eval set ครับ คุณสามารถคลิกที่ลิงก์นั้น 99 00:06:23,143 --> 00:06:27,279 หรือไม่ก็คลิกที่เครื่องหมายบวกแล้วสร้าง 100 00:06:27,279 --> 00:06:30,249 evaluation set ของคุณได้ครับ 101 00:06:30,249 --> 00:06:33,218 เราจะลบอันนี้ทิ้งแล้วใส่ชื่อ 102 00:06:33,218 --> 00:06:37,778 ชื่อที่ให้ไว้ตรงนี้คือ home automation test 103 00:06:37,778 --> 00:06:42,127 คุณจะใช้ชื่อเดียวกันหรือชื่ออื่นก็ได้ครับ 104 00:06:42,127 --> 00:06:47,005 ผมใช้ชื่อเดิมมาตลอด ผมแค่เปลี่ยนเวอร์ชันตรงนี้ 105 00:06:47,005 --> 00:06:51,459 เพราะถ้าลองทับโฟลเดอร์เดิมมันจะไม่ยอม ผมกด 106 00:06:51,459 --> 00:06:56,338 create ครับ ตอนนี้ evaluation set ถูกสร้างแล้ว 107 00:06:56,338 --> 00:07:00,898 เราไปที่เครื่องหมายนี้ แล้วข้างในเราจะเพิ่ม 108 00:07:00,898 --> 00:07:04,398 session ปัจจุบันเข้าไปใน test นี้ 109 00:07:04,398 --> 00:07:08,534 ผมตั้งชื่อว่า home basic device control 110 00:07:08,534 --> 00:07:13,306 เสร็จแล้วครับ ตอนนี้เราบันทึกการโต้ตอบแรกเป็น 111 00:07:13,306 --> 00:07:17,655 evaluation case สำเร็จแล้วครับ ทีนี้มารัน 112 00:07:17,655 --> 00:07:21,685 evaluation กัน เราคลิกที่นี่แล้วกด run 113 00:07:21,685 --> 00:07:26,139 evaluation มันจะแสดง dialog ของ evaluation 114 00:07:26,139 --> 00:07:30,699 metric เราปล่อยเป็นค่า default แล้วกด start 115 00:07:30,699 --> 00:07:35,154 ครับ evaluation จะรันขึ้นมา เราเห็นผลลัพธ์ 116 00:07:35,154 --> 00:07:37,911 pass สีเขียวใน history นี้ 117 00:07:37,911 --> 00:07:42,683 ซึ่งยืนยันว่าพฤติกรรมของเอเจนต์ตรงกับ session 118 00:07:42,683 --> 00:07:47,562 ที่บันทึกไว้ครับ ทีนี้เราต้องเข้าใจว่าเมื่อรัน 119 00:07:47,562 --> 00:07:51,592 evaluation เราจะเห็นคะแนนสำคัญสองอย่าง 120 00:07:51,592 --> 00:07:56,470 ตอนนี้เราต้องเข้าใจ evaluation metrics กันครับ 121 00:07:56,470 --> 00:07:58,803 เมื่อเรารัน evaluation 122 00:07:58,803 --> 00:08:03,258 เราจะเห็นคะแนนสำคัญสองตัว ดูได้จาก history 123 00:08:03,258 --> 00:08:07,712 ครับ เราดูประวัติของ eval มันบอกว่า passed 124 00:08:07,712 --> 00:08:11,954 ครับ สอง metric คือ response match score 125 00:08:11,954 --> 00:08:16,408 (คะแนนความตรงของคำตอบ) กับ tool trajectory 126 00:08:16,408 --> 00:08:21,181 average score (คะแนนเฉลี่ยเส้นทางการใช้ tool) 127 00:08:21,181 --> 00:08:23,832 ครับ response match score 128 00:08:23,832 --> 00:08:29,559 วัดว่าคำตอบจริงของเอเจนต์คล้ายกับคำตอบที่คาดหวังแค่ไหน 129 00:08:29,559 --> 00:08:34,438 โดยใช้อัลกอริทึมเปรียบเทียบความคล้ายของข้อความ 130 00:08:34,438 --> 00:08:38,362 คะแนนหนึ่งคือตรงกันสมบูรณ์แบบ และ 0.0 131 00:08:38,362 --> 00:08:43,240 คือต่างกันโดยสิ้นเชิงครับ ส่วน tool trajectory 132 00:08:43,240 --> 00:08:47,164 score วัดว่าเอเจนต์ใช้ tool ถูกตัวกับ 133 00:08:47,164 --> 00:08:51,724 parameter ถูกหรือไม่ ตรวจลำดับการเรียก tool 134 00:08:51,724 --> 00:08:56,603 เทียบกับพฤติกรรมที่คาดหวัง คะแนนหนึ่งแปลว่าใช้ 135 00:08:56,603 --> 00:09:00,739 tool สมบูรณ์แบบ 0.0 แปลว่า tool ผิดหรือ 136 00:09:00,739 --> 00:09:02,542 parameter ผิดครับ 137 00:09:02,542 --> 00:09:06,678 ในกรณีนี้สิ่งที่เราเข้าใจได้จากคะแนนคือ 138 00:09:06,678 --> 00:09:11,132 response match ใกล้เคียงกับคำตอบที่คาดหวัง 139 00:09:11,132 --> 00:09:14,632 ขณะที่ tool trajectory สมบูรณ์แบบ 140 00:09:14,632 --> 00:09:18,556 หมายความว่าการใช้ tool สมบูรณ์แบบครับ 141 00:09:18,556 --> 00:09:21,419 เรามาทำให้ test พังโดยเจตนา 142 00:09:21,419 --> 00:09:25,874 เพื่อดูว่าความล้มเหลวหน้าตาเป็นอย่างไรครับ 143 00:09:25,874 --> 00:09:30,116 ผมกลับไปที่ post test คลิกที่ดินสอตรงนี้ 144 00:09:30,116 --> 00:09:34,994 ผมจะแก้ตรงนี้แล้วพิมพ์ว่าโคมไฟบนโต๊ะถูกปิดอยู่ 145 00:09:34,994 --> 00:09:38,706 แล้วกด save ทีนี้เราจะรัน eval ใหม่ 146 00:09:38,706 --> 00:09:42,312 ครั้งนี้ผลลัพธ์เป็น fail สีแดงครับ 147 00:09:42,312 --> 00:09:47,190 เมื่อเอาเมาส์ชี้ตรงนี้มันบอกว่าดูผลลัพธ์การรัน 148 00:09:47,190 --> 00:09:49,417 eval เราคลิกเข้าไปได้ 149 00:09:49,417 --> 00:09:52,705 แล้วมันแสดงว่าอันนี้ล้มเหลวครับ 150 00:09:52,705 --> 00:09:54,720 และเมื่อชี้ที่คำตอบ 151 00:09:54,720 --> 00:09:59,493 มันบอกว่าโคมไฟบนโต๊ะในห้องทำงานเปิดอยู่ตอนนี้ 152 00:09:59,493 --> 00:10:04,053 ขณะที่คำตอบที่คาดหวังคือโคมไฟถูกปิดอยู่ครับ 153 00:10:04,053 --> 00:10:06,598 ตรงนี้คุณเห็นว่า tooltip 154 00:10:06,598 --> 00:10:11,477 นี้แสดงการเปรียบเทียบแบบเคียงข้างกันของ output 155 00:10:11,477 --> 00:10:14,128 จริงกับ output ที่คาดหวัง 156 00:10:14,128 --> 00:10:18,582 โดยชี้ให้เห็นชัดเจนว่าทำไม test จึงล้มเหลว 157 00:10:18,582 --> 00:10:23,991 หมายความว่าคำตอบสุดท้ายไม่ตรงกับคำตอบที่คาดหวังครับ 158 00:10:23,991 --> 00:10:25,582 ข้อมูล feedback 159 00:10:25,582 --> 00:10:30,460 ทันทีแบบละเอียดนี้มีค่ามากสำหรับการ debug ครับ 160 00:10:30,460 --> 00:10:33,854 คุณยังสามารถทำ test อื่นๆ ได้อีก 161 00:10:33,854 --> 00:10:37,248 เช่นลองใส่คำสั่งที่คลุมเครือครับ 162 00:10:37,248 --> 00:10:39,051 ถ้ากลับไปดูตรงนี้ 163 00:10:39,051 --> 00:10:45,414 มันบอกว่าคุณสามารถสร้างสถานการณ์ของคุณในบทสนทนาแยกต่างหากได้ 164 00:10:45,414 --> 00:10:50,398 คุณอาจมีคำสั่งคลุมเครือเช่นเปิดไฟในห้องนอนหน่อย 165 00:10:50,398 --> 00:10:52,838 บันทึกมันเป็น test ใหม่ 166 00:10:52,838 --> 00:10:56,974 แล้วก็ลองพูดว่ากรุณาปิดทีวีในโรงรถหน่อย 167 00:10:56,974 --> 00:11:01,746 แล้วดูว่ามันทำงานอย่างไรครับ มาลองหนึ่งตัวกัน 168 00:11:01,746 --> 00:11:05,246 ผมเอาอันนี้มาคัดลอก สร้าง session 169 00:11:05,246 --> 00:11:08,534 ใหม่จากด้านบน พิมพ์แล้วกด enter 170 00:11:08,534 --> 00:11:10,336 ดูสิว่ามันตอบอะไร 171 00:11:10,336 --> 00:11:15,215 มันบอกว่าไฟในห้องนอนเปิดแล้วครับ ทีนี้มาบันทึก 172 00:11:15,215 --> 00:11:19,775 test นี้กัน กลับเข้าไปข้างใน คลิกแล้วบันทึก 173 00:11:19,775 --> 00:11:24,229 test นี้เป็น biggest device reference ครับ 174 00:11:24,229 --> 00:11:28,047 ต่อไปเราจะสร้างอีกหนึ่งตัว โดยพูดว่า 175 00:11:28,047 --> 00:11:32,714 แต่ก่อนอื่นลองรันตัวนี้ก่อน มันบอก pass ครับ 176 00:11:32,714 --> 00:11:37,274 คุณลองตัวถัดไปได้ซึ่งเป็น invalid locations 177 00:11:37,274 --> 00:11:41,516 แล้วก็ complex commands แค่ไปที่ session 178 00:11:41,516 --> 00:11:44,061 ใหม่แล้วทำไปเรื่อยๆ ครับ 179 00:11:44,061 --> 00:11:48,622 สิ่งที่คุณจะเข้าใจคือทุกครั้งที่เอเจนต์ผ่าน 180 00:11:48,622 --> 00:11:49,721 test 181 00:11:49,721 --> 00:11:55,660 เอเจนต์กำลังตั้งสมมติฐานเกี่ยวกับอุปกรณ์ที่ไม่มีอยู่จริง 182 00:11:55,660 --> 00:12:00,220 มันตอบในแบบที่ฟังดูช่วยเหลือดีแต่ไม่ถูกต้อง 183 00:12:00,220 --> 00:12:05,841 และพยายามควบคุมอุปกรณ์ที่มันไม่ควรมีสิทธิ์เข้าถึงครับ 184 00:12:05,841 --> 00:12:10,720 แล้วเราพลาดอะไรไปล่ะครับ นี่เป็นข้อจำกัดของ UI 185 00:12:10,720 --> 00:12:11,819 หรือเปล่า 186 00:12:11,819 --> 00:12:16,273 จนถึงตอนนี้เราเห็นวิธีสร้างและประเมิน test 187 00:12:16,273 --> 00:12:20,939 case ใน ADK UI แล้ว UI เหมาะกับการสร้าง test 188 00:12:20,939 --> 00:12:25,712 แบบ interactive มาก แต่การทดสอบทีละบทสนทนามัน 189 00:12:25,712 --> 00:12:29,954 scale ไม่ไหวครับ เราต้องมีหลาย test case 190 00:12:29,954 --> 00:12:34,090 ในหนึ่ง evaluation set ดังนั้นจะตรวจจับ 191 00:12:34,090 --> 00:12:35,189 regression 192 00:12:35,189 --> 00:12:40,068 ในประสิทธิภาพของเอเจนต์อย่างล่วงหน้าได้อย่างไร 193 00:12:40,068 --> 00:12:44,204 ทำได้ด้วยการ evaluation แบบเป็นระบบครับ 194 00:12:44,204 --> 00:12:48,870 ก่อนไปสู่ evaluation แบบเป็นระบบ เราต้องหยุด 195 00:12:48,870 --> 00:12:53,006 web UI ก่อน กลับมาตรงนี้แล้วหยุดมันครับ 196 00:12:53,006 --> 00:12:56,612 อันนี้สำคัญเสมอ เพราะถ้าเราไม่หยุด 197 00:12:56,612 --> 00:12:59,157 มันจะรันค้างไว้ และ cell 198 00:12:59,157 --> 00:13:03,293 ที่รันอยู่นั้นจะบล็อกหรือกัน cell อื่นๆ 199 00:13:03,293 --> 00:13:06,475 ไม่ให้รัน ตราบใดที่ ADK web UI 200 00:13:06,475 --> 00:13:08,172 ยังทำงานอยู่ครับ 201 00:13:08,172 --> 00:13:12,096 ดังนั้นต้องแน่ใจเสมอว่าเมื่อออกจาก UI 202 00:13:12,096 --> 00:13:16,656 แล้วให้หยุดมันทันทีครับ ทีนี้มาคุยกันเรื่อง 203 00:13:16,656 --> 00:13:19,414 systematic evaluation ครับ 204 00:13:19,414 --> 00:13:21,853 เรามีไดอะแกรมอยู่ตรงนี้ 205 00:13:21,853 --> 00:13:26,731 แต่ก่อนอื่นผมอยากเล่าเรื่อง regression testing 206 00:13:26,731 --> 00:13:31,185 กันก่อนครับ มันคือแนวปฏิบัติของการรัน test 207 00:13:31,185 --> 00:13:35,852 เดิมซ้ำๆ เพื่อให้แน่ใจว่าการเปลี่ยนแปลงใหม่ๆ 208 00:13:35,852 --> 00:13:40,836 ไม่ได้ทำลายฟังก์ชันที่เคยทำงานได้ดีอยู่ก่อนครับ 209 00:13:40,836 --> 00:13:45,397 ADK ให้วิธีทำ regression อัตโนมัติและ batch 210 00:13:45,397 --> 00:13:50,275 testing แก่เราสองแบบ หนึ่งคือ pytest อีกอันคือ 211 00:13:50,275 --> 00:13:54,623 ADK eval ครับ ผมจะใส่ลิงก์เอกสารพวกนี้ไว้ 212 00:13:54,623 --> 00:13:59,184 คุณไปอ่านทำความเข้าใจคำสั่งต่างๆ ได้ครับ ใน 213 00:13:59,184 --> 00:14:02,789 section นี้เราจะใช้คำสั่ง CLI ครับ 214 00:14:02,789 --> 00:14:08,728 ถ้าต้องการข้อมูลเพิ่มเติมไปที่เอกสารที่ผมจะแชร์ให้นะครับ 215 00:14:08,728 --> 00:14:13,607 รูปต่อไปนี้แสดงกระบวนการ evaluation โดยรวมครับ 216 00:14:13,607 --> 00:14:17,425 ในระดับสูงมีสี่ขั้นตอนในการ evaluate 217 00:14:17,425 --> 00:14:21,667 ขั้นแรกคือสร้าง evaluation configuration 218 00:14:21,667 --> 00:14:25,909 ซึ่งหมายถึงนิยาม metric ที่คุณต้องการวัด 219 00:14:25,909 --> 00:14:30,045 จากนั้นสร้าง test เช่น sample test case 220 00:14:30,045 --> 00:14:34,606 ที่จะใช้เปรียบเทียบ แล้วรันเอเจนต์ด้วยคำถาม 221 00:14:34,606 --> 00:14:38,211 test และเปรียบเทียบผลลัพธ์ของ test 222 00:14:38,211 --> 00:14:43,090 กับผลลัพธ์จริงครับ นี่คือสี่ขั้นตอนโดยสรุปครับ 223 00:14:43,090 --> 00:14:47,226 มาสร้าง evaluation configuration กันเลย 224 00:14:47,226 --> 00:14:49,347 นี่เป็นไฟล์ optional 225 00:14:49,347 --> 00:14:54,226 ซึ่งให้เรานิยามเกณฑ์ผ่านหรือตกสำหรับแต่ละ test 226 00:14:54,226 --> 00:14:59,104 ครับ เราสร้าง test config นี้ใน root directory 227 00:14:59,104 --> 00:15:03,240 โดย import รายละเอียดของ trajectory และ 228 00:15:03,240 --> 00:15:08,012 response match score เข้ามาตรงนี้ครับ ใน test 229 00:15:08,012 --> 00:15:12,785 case ของเรา response match score เป็นหนึ่งกับ 230 00:15:12,785 --> 00:15:16,179 0.7 และ trajectory เป็นหนึ่งครับ 231 00:15:16,179 --> 00:15:19,890 ซึ่งก็คือต้องใช้ tool แบบสมบูรณ์แบบ 232 00:15:19,890 --> 00:15:23,390 และความคล้ายคลึงแปดสิบเปอร์เซ็นต์ 233 00:15:23,390 --> 00:15:27,420 ของเราเป็นยี่สิบเปอร์เซ็นต์ครับ เอาล่ะ 234 00:15:27,420 --> 00:15:31,769 ทีนี้เราจะรันส่วนนี้เพื่อสร้าง evaluation 235 00:15:31,769 --> 00:15:35,799 configuration ครับ มันให้เกณฑ์ว่า tool 236 00:15:35,799 --> 00:15:39,829 trajectory เป็นเท่าไหร่ และ evaluation 237 00:15:39,829 --> 00:15:44,707 นี้จะจับอะไรได้บ้าง มันจะจับการใช้ tool ที่ผิด 238 00:15:44,707 --> 00:15:46,510 คุณภาพคำตอบที่แย่ 239 00:15:46,510 --> 00:15:50,858 และความเบี่ยงเบนจากพฤติกรรมที่คาดหวังครับ 240 00:15:50,858 --> 00:15:55,631 ทีนี้เราต้องสร้าง test case ครับ ตรงนี้มี tip 241 00:15:55,631 --> 00:15:59,767 หนึ่งบอกว่าเพื่อบันทึกบทสนทนาจาก web UI 242 00:15:59,767 --> 00:16:03,797 ให้คงอยู่ เพียงแค่สร้าง eval set ใน UI 243 00:16:03,797 --> 00:16:07,190 แล้วเพิ่ม session ปัจจุบันเข้าไป 244 00:16:07,190 --> 00:16:11,645 บทสนทนาทั้งหมดใน session นั้นจะถูกแปลงเป็น 245 00:16:11,645 --> 00:16:16,099 eval set โดยอัตโนมัติและดาวน์โหลดลงเครื่อง 246 00:16:16,099 --> 00:16:20,235 แล้วคุณสามารถใช้มันเป็น JSON ได้เลยครับ 247 00:16:20,235 --> 00:16:24,159 ทีนี้สิ่งที่เราจะสร้างคือ integration 248 00:16:24,159 --> 00:16:28,507 eval.json ซึ่งจะมีหลาย test case หรือหลาย 249 00:16:28,507 --> 00:16:33,280 session ข้างในครับ ใน tool นี้เรามีค่าเป็น on 250 00:16:33,280 --> 00:16:38,158 กับ off ทั้งหมด มีสถานะอุปกรณ์ มี device ID มี 251 00:16:38,158 --> 00:16:42,188 location ครับ สำหรับ set_device_status 252 00:16:42,188 --> 00:16:43,567 เรามีหลายส่วน 253 00:16:43,567 --> 00:16:48,551 เมื่อพูดว่ากรุณาเปิดโคมไฟตั้งพื้นในห้องนั่งเล่น 254 00:16:48,551 --> 00:16:53,324 จะมีข้อความนี้ โคมไฟตั้งพื้นคือ device ID และ 255 00:16:53,324 --> 00:16:56,293 location คือห้องนั่งเล่นครับ 256 00:16:56,293 --> 00:17:00,429 คล้ายกันสำหรับครัว ใน intermediate data 257 00:17:00,429 --> 00:17:02,444 มีครัวกับไฟหลักครับ 258 00:17:02,444 --> 00:17:07,005 ทีนี้เรารันส่วนนี้เพื่อสร้าง test case ครับ 259 00:17:07,005 --> 00:17:11,777 โอเค test case ถูกสร้างแล้ว ต่อไปเราจะ import 260 00:17:11,777 --> 00:17:15,277 JSON นี้เข้าไปในเอเจนต์ของเราครับ 261 00:17:15,277 --> 00:17:18,458 เปิดเอเจนต์นี้ ใช้ dump ตรงนี้ 262 00:17:18,458 --> 00:17:23,019 ตอนนี้เราได้สร้าง test case แล้ว เรามี test 263 00:17:23,019 --> 00:17:24,610 scenario สองอัน 264 00:17:24,610 --> 00:17:29,488 หนึ่งสำหรับห้องนั่งเล่นและอีกอันสำหรับครัวครับ 265 00:17:29,488 --> 00:17:33,836 ผลลัพธ์ที่คาดหวังคือ basic device control 266 00:17:33,836 --> 00:17:38,609 ควรผ่านทั้งสองเกณฑ์ test การใช้ tool ผิดอาจตก 267 00:17:38,609 --> 00:17:43,381 tool trajectory หากใช้ parameter ผิด และ test 268 00:17:43,381 --> 00:17:47,305 คุณภาพคำตอบที่แย่อาจตก response match 269 00:17:47,305 --> 00:17:52,184 หากคำตอบต่างไปมากเกินไปครับ ทีนี้เราจะ execute 270 00:17:52,184 --> 00:17:57,062 คำสั่งนี้โดยชี้ไปที่ directory ของเอเจนต์ eval 271 00:17:57,062 --> 00:18:00,138 set และไฟล์ config ของเราครับ 272 00:18:00,138 --> 00:18:04,592 นี่คือคำสั่งสำหรับ execute evaluation ครับ 273 00:18:04,592 --> 00:18:08,834 อันถัดไปในลำดับคือการวิเคราะห์ผลลัพธ์จาก 274 00:18:08,834 --> 00:18:12,652 sample evaluation ครับ ผมจะรันอันนี้ 275 00:18:12,652 --> 00:18:15,515 มันจะพิมพ์ผลลัพธ์แบบละเอียด 276 00:18:15,515 --> 00:18:20,182 มันจะแจ้งเตือนทุกอย่าง โดยแสดงรายละเอียดทีละ 277 00:18:20,182 --> 00:18:24,106 turn ของแต่ละ test พร้อมคะแนนและ diff 278 00:18:24,106 --> 00:18:27,818 หรือความแตกต่างของจุดที่ล้มเหลวครับ 279 00:18:27,818 --> 00:18:31,848 นี่คือหน้าตาที่ test case ห้องนั่งเล่น 280 00:18:31,848 --> 00:18:35,453 response ตรงกันและ tool trajectory 281 00:18:35,453 --> 00:18:37,468 ก็ตรงกันเช่นกันครับ 282 00:18:37,468 --> 00:18:41,392 นี่คือวิธีที่มันพิมพ์ผลลัพธ์ออกมาครับ 283 00:18:41,392 --> 00:18:45,529 นี่คือการเข้าใจว่าผลลัพธ์ของ evaluation 284 00:18:45,529 --> 00:18:49,453 จะออกมาหน้าตาแบบไหนครับ ต่อไปคือ user 285 00:18:49,453 --> 00:18:52,952 simulation ซึ่งเป็น optional ครับ 286 00:18:52,952 --> 00:18:55,922 อันนี้ต่างจากวิธี evaluation 287 00:18:55,922 --> 00:19:00,376 แบบดั้งเดิมที่พึ่ง test case ตายตัว ตรงนี้ 288 00:19:00,376 --> 00:19:01,967 user simulation 289 00:19:01,967 --> 00:19:05,997 เป็นฟีเจอร์ที่จัดการข้อจำกัดของ static 290 00:19:05,997 --> 00:19:10,557 evaluation ครับ แทนที่จะใช้ prompt ของ user 291 00:19:10,557 --> 00:19:13,633 แบบ fixed ที่นิยามไว้ล่วงหน้า 292 00:19:13,633 --> 00:19:17,981 สิ่งที่มันทำคือใช้โมเดล genai เช่น Gemini 293 00:19:17,981 --> 00:19:20,208 สร้าง prompt ของ user 294 00:19:20,208 --> 00:19:24,662 แบบไดนามิกระหว่างกระบวนการ evaluation ครับ 295 00:19:24,662 --> 00:19:27,632 ถ้าอยากรู้ว่ามันทำงานอย่างไร 296 00:19:27,632 --> 00:19:29,859 ดูได้จากเอกสารนี้ครับ 297 00:19:29,859 --> 00:19:33,253 ผมจะใส่ไว้ในคำอธิบายของวิดีโอนี้ 298 00:19:33,253 --> 00:19:37,389 และคุณลองทำแบบฝึกหัดนี้ได้ เช่นการนิยาม 299 00:19:37,389 --> 00:19:39,616 conversation scenario 300 00:19:39,616 --> 00:19:43,964 ที่ร่างเป้าหมายการสนทนาโดยรวมของ user และ 301 00:19:43,964 --> 00:19:48,100 conversation plan เพื่อนำทางบทสนทนาครับ 302 00:19:48,100 --> 00:19:51,706 ลองทำดูถ้าอยากเข้าใจว่า simulation 303 00:19:51,706 --> 00:19:54,357 ช่วยให้คุณค้นพบ edge case 304 00:19:54,357 --> 00:19:59,236 และปรับปรุงความทนทานของเอเจนต์อย่างไร ในแบบที่ 305 00:19:59,236 --> 00:20:02,205 static test case มักพลาดครับ 306 00:20:02,205 --> 00:20:05,175 เมื่อคุณผ่านแบบฝึกหัดนี้แล้ว 307 00:20:05,175 --> 00:20:08,781 โปรดไปดูวิดีโอถัดไปซึ่งก็คือ Day 5 308 00:20:08,781 --> 00:20:12,599 ที่เราจะเรียนวิธี deploy เอเจนต์ขึ้น 309 00:20:12,599 --> 00:20:16,735 production และต่อยอดด้วย agent-to-agent 310 00:20:16,735 --> 00:20:19,280 protocol ครับ ขอบคุณครับ