ภาพรวม
โมเดลภาษาขนาดใหญ่มีความรู้ทั่วไปในวงกว้าง แต่ไม่ทราบเมตริกเฉพาะของโดเมน สคีมาฐานข้อมูล หรือสูตรการคำนวณ หากไม่มีบริบทนี้ โมเดลจะคาดเดา ซึ่งจะทำให้ SQL ไม่ถูกต้องและการวิเคราะห์มีข้อบกพร่อง
RMI ADK Agent แก้ไขข้อจำกัดนี้ผ่านทักษะ พิจารณาผู้ใช้ที่ถามว่า "เมื่อวานถนน Storrow Drive ติดขัดมากไหม" หากต้องการตอบ เจ้าหน้าที่ต้องทราบว่า RMI แสดงความหนาแน่นเป็นการดัชนีเวลาเดินทาง (TTI) ซึ่งเป็นอัตราส่วนของduration_in_seconds แบบเรียลไทม์ต่อstatic_duration_in_seconds แบบไม่มีการจราจรในตารางhistorical_travel_time เอเจนต์ที่ไม่มีทักษะอาจสร้างaverage_speedคอลัมน์ (รายงาน RMI จะแสดงความเร็วเชิงหมวดหมู่เท่านั้น ไม่ใช่กม./ชม.) หรือใช้
สูตรที่ไม่ถูกต้องแทน ซึ่งจะทำให้ได้คำตอบที่มั่นใจแต่ไม่ถูกต้อง
แม้ว่าเอเจนต์จะต้องการความรู้เกี่ยวกับโดเมนนี้ แต่การใส่คำจำกัดความของเมตริก สคีมาของตาราง และข้อควรระวังของ SQL ทั้งหมดลงในพรอมต์ของระบบเดียวก็ไม่มีประสิทธิภาพ
ข้อจำกัดของพรอมต์ระบบขนาดใหญ่
การใส่กฎและสคีมาของโดเมนทั้งหมดลงในพรอมต์ของระบบเดียวจะทำให้เกิดปัญหาหลายประการ ดังนี้
- ต้นทุนสูงขึ้นและตอบกลับช้าลง: การส่งพรอมต์ขนาดใหญ่ในทุกๆ รอบจะทำให้โทเค็นสูญเปล่าและเพิ่มเวลาในการตอบสนอง แม้แต่สำหรับคำถามที่ไม่จำเป็นต้องใช้กฎเหล่านั้น
- การทำตามคำสั่งแย่ลง: เมื่อพรอมต์ยาวขึ้นพร้อมกับกรณีที่ซับซ้อน โมเดลก็มีแนวโน้มที่จะละเลยหรือลืมกฎที่เฉพาะเจาะจงมากขึ้น
- การบำรุงรักษาที่ยากขึ้น: การรวมทุกอย่างไว้ในพรอมต์เดียวทำให้การอัปเดตหรือทดสอบกฎแต่ละข้อเป็นเรื่องยากโดยไม่ทำให้กฎอื่นๆ เสียหาย
ทักษะ
ทักษะของเอเจนต์จะจัดระเบียบความรู้เฉพาะด้านเป็นโฟลเดอร์แบบโมดูลาร์ที่เอเจนต์
จะโหลดเมื่อจำเป็นเท่านั้น ทักษะแต่ละอย่างคือไดเรกทอรีที่มีไฟล์ SKILL.md
พร้อมคำสั่งมาร์กดาวน์และส่วนหัว YAML
Agent จะเก็บเฉพาะdescriptionสั้นๆ ของแต่ละทักษะไว้ในพรอมต์พื้นฐานแทนที่จะโหลดทุกอย่างล่วงหน้า เมื่อผู้ใช้ถามคำถามที่เกี่ยวข้องกับ
ทักษะ 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
เพื่อให้มั่นใจว่าโมเดลจะได้รับทั้งสคีมาเครื่องมือและวิธีการใช้งาน พร้อมกันในเวลาที่เหมาะสม ซึ่งจะช่วยให้ชุดเครื่องมือพื้นฐานมีขนาดเล็ก
ตัวอย่าง: การอ้างอิงคำค้นหาเกี่ยวกับความหนาแน่น
- ผู้ใช้ถามว่า "ถนนสโตรว์ไดรฟ์ติดขัดแค่ไหนในช่วงเวลาเร่งด่วนตอนเย็น"
- พรอมต์ของระบบฐานจะโฆษณาเฉพาะชื่อและคำอธิบายของแต่ละทักษะ ดังนั้น Agent จึงเห็นว่า
rmi-traffic-metrics-groundingครอบคลุม "การคั่ง" และเรียกใช้load_skillเพื่อดึงคำสั่งแบบเต็มสำหรับคำค้นหานี้ - เมื่อโหลดทักษะแล้ว Agent จะใช้คำจำกัดความ TTI และเทมเพลต SQL ที่ได้รับการยืนยันซึ่งมีให้ โดยจะคำนวณอัตราส่วนเทียบกับ
historical_travel_timeแทนที่จะคาดเดาสูตร
เนื่องจากระบบจะดึงข้อมูลเนื้อหาของทักษะเมื่อคำค้นหาต้องการเท่านั้น ทักษะที่เอเจนต์ไม่เคยใช้จึงไม่เคยเข้าสู่บริบท ทำให้พรอมต์ของระบบฐานมีขนาดเล็ก
สรุปประเด็นสำคัญ
- อิงตามคำแนะนำเกี่ยวกับโดเมน: ระบุวิธีการ ข้อจำกัด และตรรกะทางธุรกิจอย่างชัดเจนแทนที่จะอาศัยสมมติฐานทั่วไปของโมเดล
- ใช้ทักษะแบบแยกส่วน: แบ่งความรู้เป็นทักษะที่มุ่งเน้นแทนที่จะใช้พรอมต์ของระบบขนาดใหญ่เพียงรายการเดียวเพื่อประหยัดโทเค็น ลดเวลาในการตอบสนอง และปรับปรุงความแม่นยำ
- เขียนคำอธิบายที่ชัดเจน: ใส่วลีทริกเกอร์และคีย์เวิร์ดที่เฉพาะเจาะจง ในคำอธิบายของแต่ละทักษะเพื่อให้เอเจนต์โหลดทักษะได้อย่างน่าเชื่อถือ
- ใส่ตัวอย่างที่เป็นรูปธรรม: เพิ่มตัวอย่างที่ได้รับการยืนยันและเวิร์กโฟลว์อ้างอิงลงในเนื้อหาของทักษะเพื่อให้เอาต์พุตมีความสอดคล้องและถูกต้อง
- รวมเครื่องมือเพื่อความแน่นอน: แนบเครื่องมือที่เรียกใช้งานได้กับทักษะเพื่อ จัดการการตรวจสอบและการดำเนินการอย่างเข้มงวดในขณะที่ยังคงชุดเครื่องมือพื้นฐานให้มีขนาดเล็ก
ขั้นตอนถัดไป
- สำรวจรูปแบบทักษะขั้นสูง: อ่าน คู่มือนักพัฒนาซอฟต์แวร์ในการสร้างเอเจนต์ ADK ด้วยทักษะ เพื่อดูข้อมูลเกี่ยวกับทักษะ ADK
ผู้ร่วมให้ข้อมูล
Nathaniel Thomas | นักศึกษาฝึกงานด้านวิศวกรรมซอฟต์แวร์, Google Maps Platform