ภาพรวม
โมเดลภาษาขนาดใหญ่มีความรู้ทั่วไปที่กว้างขวาง แต่ไม่ทราบเมตริกเฉพาะของโดเมน สคีมาฐานข้อมูล หรือสูตรการคำนวณ หากไม่มีบริบทนี้ โมเดลจะคาดเดา ซึ่งนำไปสู่ SQL ที่ไม่ถูกต้องและการวิเคราะห์ที่ผิดพลาด
RMI ADK Agent แก้ไขข้อจำกัดนี้ผ่านทักษะ ลองพิจารณาผู้ใช้ที่
ถามว่า "เมื่อวาน Storrow Drive ติดขัดมากแค่ไหน" Agent ต้องทราบว่า RMI แสดงความติดขัดเป็นดัชนีเวลาเดินทาง (TTI) ซึ่งเป็นอัตราส่วน
ของ duration_in_seconds แบบสดต่อ static_duration_in_seconds แบบไหลอิสระในตาราง
historical_travel_time Agent ที่ไม่มีทักษะอาจสร้างคอลัมน์ average_speed ขึ้นมาแทน (RMI จะรายงานความเร็วเป็นหมวดหมู่เท่านั้น ไม่ใช่กม./ชม.) หรือใช้สูตรที่ไม่ถูกต้อง ซึ่งจะให้คำตอบที่มั่นใจแต่ผิด
แม้ว่า Agent จะต้องมีความรู้ในโดเมนนี้ แต่การใส่คำจำกัดความของเมตริก สคีมาตาราง และข้อควรระวังเกี่ยวกับ SQL ทั้งหมดลงในพรอมต์ระบบเดียวก็ไม่มีประสิทธิภาพ
ข้อจำกัดของพรอมต์ระบบขนาดใหญ่
การใส่กฎและสคีมาทั้งหมดของโดเมนลงในพรอมต์ระบบเดียวจะทำให้เกิดปัญหาหลายประการ ดังนี้
- ค่าใช้จ่ายสูงขึ้นและคำตอบช้าลง: การส่งพรอมต์ขนาดใหญ่ในแต่ละรอบ จะทำให้เสียโทเค็นและเพิ่มเวลาในการตอบสนอง แม้แต่คำถามที่ไม่จำเป็นต้องใช้กฎเหล่านั้น
- การปฏิบัติตามคำแนะนำแย่ลง: เมื่อพรอมต์ยาวขึ้นพร้อมกรณีขอบ โมเดลมีแนวโน้มที่จะละเลยหรือลืมกฎเฉพาะ
- การบำรุงรักษาทำได้ยากขึ้น: การรวมทุกอย่างไว้ในพรอมต์เดียวทำให้การอัปเดตหรือทดสอบกฎแต่ละข้อทำได้ยาก โดยไม่ทำให้กฎอื่นๆ เสีย
ทักษะ
ทักษะ ของ Agent จะจัดระเบียบความรู้ในโดเมนเป็นโฟลเดอร์แบบโมดูลาร์ที่ Agent จะโหลดเมื่อจำเป็นเท่านั้น ทักษะแต่ละอย่างคือไดเรกทอรีที่มีไฟล์ SKILL.md พร้อมคำแนะนำมาร์กดาวน์และส่วนหัว YAML
Agent จะเก็บเฉพาะ description สั้นๆ ของแต่ละทักษะไว้ในพรอมต์พื้นฐานแทนที่จะโหลดทุกอย่างล่วงหน้า เมื่อผู้ใช้ถามคำถามที่เกี่ยวข้องกับทักษะ Agent จะโหลดคำแนะนำทั้งหมดสำหรับรอบนั้น วิธีนี้จะช่วยให้พรอมต์มีขนาดเล็กและประหยัดพื้นที่บริบทสำหรับประวัติการสนทนาจริง
ทักษะยังช่วยแยกความกังวลได้อย่างชัดเจนด้วย คุณสามารถเขียน ทดสอบ และอัปเดตความสามารถแต่ละอย่างแยกกันได้โดยไม่ต้องเสี่ยงกับผลข้างเคียงที่ไม่พึงประสงค์ในโดเมนที่ไม่เกี่ยวข้อง โดยปกติแล้ว Agent ที่ใช้งานจริงจะใช้ทักษะที่มุ่งเน้นหลายอย่างแทนที่จะใช้พรอมต์ขนาดใหญ่เพียงอย่างเดียว
โครงสร้างของทักษะ
ไฟล์ SKILL.md มี 2 ส่วน ได้แก่ ส่วนหัว YAML สำหรับการกำหนดเส้นทางและส่วนเนื้อหามาร์กดาวน์สำหรับคำแนะนำ
1. ส่วนหัว YAML
---
name: rmi-traffic-metrics-grounding
description: >
Standard traffic performance metrics computable from RMI BigQuery
tables. Covers congestion severity (TTI), delay, travel time
reliability (LOTTR, BTI, PTI, CoV), congestion frequency, speed
breakdowns, and network-wide congestion rates. Use when the user asks
about traffic conditions, congestion, reliability, delay, or network
health.
---
โมเดลจะใช้ description เพื่อตัดสินใจว่าจะโหลดทักษะหรือไม่ เนื่องจากโมเดลจะเห็นเฉพาะคำอธิบายนี้ก่อนที่จะตัดสินใจโหลดทักษะ โปรดตรวจสอบว่าคำอธิบายระบุหัวข้อที่ครอบคลุม การใช้คำพูดของผู้ใช้โดยทั่วไป และเวลาที่จะทริกเกอร์อย่างชัดเจน
2. ส่วนเนื้อหามาร์กดาวน์
ส่วนเนื้อหาจะให้คำแนะนำเฉพาะโดเมนที่โมเดลจะปฏิบัติตามเมื่อโหลดแล้ว
ส่วนเนื้อหาของทักษะเมตริก RMI มีสูตร TTI ที่แน่นอน (duration_in_seconds / static_duration_in_seconds) เทมเพลต SQL ของ BigQuery ที่ได้รับการยืนยันสำหรับเมตริกแต่ละรายการ และวลีทริกเกอร์ที่แมปความตั้งใจของผู้ใช้กับเมตริกที่ถูกต้อง การให้คำแนะนำที่มีโครงสร้างและได้รับการยืนยันจะช่วยให้โมเดลมีความแม่นยำและป้องกันไม่ให้โมเดลคาดเดารายละเอียดสคีมาหรือสูตร
ลงทะเบียนทักษะกับ ADK
จัดกลุ่มทักษะเป็น SkillToolset แล้วเพิ่มลงในรายการเครื่องมือของ Agent
from google.adk import skills
from google.adk.tools import skill_toolset
rmi_skill_toolset = skill_toolset.SkillToolset(
skills=[
# TRAFFIC_METRICS_SKILL_DIR points to the skill's SKILL.md folder.
skills.load_skill_from_dir(TRAFFIC_METRICS_SKILL_DIR),
],
)
# root_agent = llm_agent.Agent(..., tools=[*bq_tools, rmi_skill_toolset])
โดย TRAFFIC_METRICS_SKILL_DIR จะชี้ไปยังไดเรกทอรีที่มีทักษะการอ้างอิงเมตริกการจราจร
รวมเครื่องมือกับทักษะ
เนื่องจากทักษะเป็นคำแนะนำแบบข้อความ การอาศัยโมเดลเพียงอย่างเดียวในการตีความและดำเนินการตรรกะที่ซับซ้อนอาจทำให้เกิดความไม่สอดคล้องกัน การแนบเครื่องมือที่ดำเนินการได้กับทักษะจะช่วยให้เกิดความแน่นอน โดยโค้ดจะจัดการการคำนวณ การตรวจสอบ และการโต้ตอบกับ API ที่เข้มงวด ในขณะที่ทักษะจะแนะนำโมเดลเกี่ยวกับเวลาและวิธีใช้เครื่องมือเหล่านั้น
การรวมเครื่องมือยังช่วยหลีกเลี่ยงการขยายบริบทส่วนกลางด้วย เครื่องมือจะได้รับการกำหนดขอบเขตให้โหลดเฉพาะเมื่อทักษะโดเมนที่เกี่ยวข้องทำงานอยู่ แทนที่จะแสดงเครื่องมือเฉพาะทางทุกอย่างล่วงหน้า
คุณสามารถแนบเครื่องมือเฉพาะกับทักษะได้โดยตรงในส่วนหัว YAML ของทักษะ
metadata:
adk_additional_tools:
- calculate_custom_metric
วิธีนี้จะช่วยให้โมเดลได้รับทั้งสคีมาเครื่องมือและคำแนะนำการใช้งานพร้อมกันในเวลาที่เหมาะสม ซึ่งจะช่วยให้ชุดเครื่องมือพื้นฐานมีขนาดเล็ก
ตัวอย่าง: การอ้างอิงคำค้นหาความติดขัด
- ผู้ใช้ถามว่า "Storrow Drive ติดขัดมากแค่ไหนในช่วงเวลาเร่งด่วนตอนเย็น"
- พรอมต์ระบบพื้นฐานจะโฆษณาเฉพาะชื่อและคำอธิบายของแต่ละทักษะ ดังนั้น Agent จะเห็นว่า
rmi-traffic-metrics-groundingครอบคลุม "การคั่ง" และเรียกload_skillเพื่อดึงคำแนะนำทั้งหมดสำหรับคำค้นหานี้ - เมื่อโหลดทักษะแล้ว Agent จะใช้คำจำกัดความ TTI และเทมเพลต SQL ที่ได้รับการยืนยันที่ทักษะให้มา โดยจะคำนวณอัตราส่วนเทียบกับ
historical_travel_timeแทนที่จะคาดเดาสูตร
เนื่องจากระบบจะดึงข้อมูลส่วนเนื้อหาของทักษะก็ต่อเมื่อคำค้นหาต้องการเท่านั้น ทักษะที่ Agent ไม่เคยใช้จึงจะไม่เข้าสู่บริบท ซึ่งจะช่วยให้พรอมต์ระบบพื้นฐานมีขนาดเล็ก
สรุปประเด็นสำคัญ
- อ้างอิงตามคำแนะนำของโดเมน: ให้คำแนะนำ ข้อจำกัด และตรรกะทางธุรกิจที่ชัดเจนแทนที่จะอาศัยสมมติฐานทั่วไปของโมเดล
- ใช้ทักษะแบบโมดูลาร์: แยกความรู้เป็นทักษะที่มุ่งเน้นแทนที่จะใช้ พรอมต์ระบบขนาดใหญ่เพียงอย่างเดียวเพื่อประหยัดโทเค็น ลดเวลาในการตอบสนอง และปรับปรุงความแม่นยำ
- เขียนคำอธิบายที่ชัดเจน: ใส่วลีทริกเกอร์และคีย์เวิร์ดเฉพาะ ในคำอธิบายของแต่ละทักษะเพื่อให้ Agent โหลดทักษะได้อย่างน่าเชื่อถือ
- ใส่ตัวอย่างที่เป็นรูปธรรม: เพิ่มตัวอย่างที่ได้รับการยืนยันและเวิร์กโฟลว์อ้างอิง ลงในส่วนเนื้อหาของทักษะเพื่อให้เอาต์พุตมีความสอดคล้องกันและแม่นยำ
- รวมเครื่องมือเพื่อความแน่นอน: แนบเครื่องมือที่ดำเนินการได้กับทักษะเพื่อ จัดการการตรวจสอบและการดำเนินการที่เข้มงวด ในขณะที่ทำให้ชุดเครื่องมือพื้นฐานมีขนาดเล็ก
ขั้นตอนถัดไป
- สำรวจรูปแบบทักษะขั้นสูง: อ่าน คู่มือสำหรับนักพัฒนาแอปในการสร้าง ADK Agent ด้วยทักษะ เพื่อเรียนรู้เกี่ยวกับทักษะ ADK
ผู้ร่วมให้ข้อมูล
Nathaniel Thomas | นักศึกษาฝึกงานด้านวิศวกรรมซอฟต์แวร์, Google Maps Platform