แตก tool กว้างเป็น tool เฉพาะทาง กับการยุบให้น้อยลง
แนวคิด
มีสองทิศทางในการจัดรูป tool ที่ดูขัดกันแต่จริง ๆ แล้วเสริมกัน คือการแตก tool กว้างเป็นหลายตัวเฉพาะทาง กับการยุบหลายตัวให้เป็นน้อยลง ทั้งคู่มีเป้าหมายเดียวคือลดความกำกวมในการเลือก tool
ทิศทางแรกคือแตก tool ที่ทำหลายอย่างในตัวเดียว เช่น analyze_document แบบกว้าง ๆ ออกเป็น tool เฉพาะทางที่มี input/output contract ชัด ได้แก่ extract_data_points, summarize_content, และ verify_claim_against_source เมื่อแต่ละ tool มีหน้าที่เดียวและสัญญาชัดเจน โมเดลจับคู่คำถามกับ tool ได้ตรงกว่า และแอปก็ตรวจ input/output ได้ง่ายกว่า
ทิศทางที่สองคือยุบ operation ที่เกี่ยวข้องกันให้อยู่ใน tool เดียวที่มีพารามิเตอร์ action แทนที่จะมี create_pr, review_pr, merge_pr แยกกันสามตัว เอกสารแนะนำให้รวมเป็น tool เดียว เพราะ tool ที่น้อยแต่ทรงพลังกว่าลดความกำกวมในการเลือกและทำให้ผิว tool ทั้งชุดง่ายต่อการนำทาง
ทำไมสำคัญ
เกณฑ์ตัดสินว่าจะแตกหรือยุบคือ "ความกำกวมในการเลือกลดลงไหม" ถ้า tool กว้างตัวหนึ่งทำหลายงานที่มี contract ต่างกันมากจนโมเดลไม่รู้ว่ากำลังทำโหมดไหน การแตกช่วยได้ แต่ถ้าเรามี tool เล็ก ๆ หลายตัวที่ต่างกันแค่ verb บนทรัพยากรเดียวกัน การยุบเป็น action เดียวช่วยได้มากกว่า
อีกจุดที่ต้องระวังคือความไวของ system prompt ต่อคำสั่งเชิง keyword exam guide เตือนว่าคำสั่งใน system prompt ที่ไวต่อคำบางคำอาจสร้างความเชื่อมโยงกับ tool โดยไม่ตั้งใจ เช่น ถ้า system prompt เขียนว่า "เมื่อผู้ใช้พูดถึง document ให้..." คำว่า document อาจไปดึงให้เรียก tool ที่มีคำนั้นในชื่อ แม้จะไม่ใช่ตัวที่เหมาะ เมื่อเราแตกหรือเปลี่ยนชื่อ tool ควรทบทวน system prompt ควบคู่ไปด้วย เพื่อไม่ให้คำสั่งที่ไวต่อ keyword ไปทับคำอธิบาย tool ที่เขียนมาดีแล้ว
หลักที่ยึดได้คือ ให้ description เป็นตัวนำการเลือก tool และให้ system prompt เป็นตัวเสริมทิศทางโดยรวม ไม่ใช่ไปผูกกับชื่อ tool แบบเจาะจงจนกลายเป็นตัวสั่งเลือกที่ขัดกับคำอธิบาย
ตัวอย่าง
// แตก tool กว้างเป็นเฉพาะทาง
"analyze_document" -> "extract_data_points" | "summarize_content" | "verify_claim_against_source"
// ยุบ operation ที่เกี่ยวข้องเป็น action เดียว
{
"name": "manage_pr",
"description": "Create, review, or merge a pull request.",
"input_schema": {
"type": "object",
"properties": {
"action": { "type": "string", "enum": ["create", "review", "merge"] },
"pr_number": { "type": "integer" }
},
"required": ["action"]
}
}
เช็คความเข้าใจ
เมื่อไรควรแตก tool กว้างเป็นหลายตัวเฉพาะทาง และเมื่อไรควรยุบให้น้อยลง
ทำไมต้องทบทวน system prompt เมื่อปรับชุด tool