หนึ่งในส่วนที่ยากที่สุดของการสร้าง agent harness คือการสร้าง action space ของมัน
Claude ทำงานผ่าน Tool Calling แต่มีหลายวิธีที่เครื่องมือสามารถสร้างขึ้นใน Claude API ด้วย primitives อย่าง bash, skills และ code execution เมื่อไม่นานมานี้ (อ่านเพิ่มเติมเกี่ยวกับการเรียกใช้เครื่องมือแบบโปรแกรมบน Claude API ได้ใน บทความใหม่ของ @RLanceMartin
เมื่อมีตัวเลือกมากมายขนาดนี้ คุณจะออกแบบเครื่องมือของ agent ของคุณอย่างไร? คุณต้องการแค่เครื่องมือเดียวอย่าง code execution หรือ bash หรือไม่? แล้วถ้าคุณมี 50 เครื่องมือ หนึ่งเครื่องมือต่อหนึ่งกรณีการใช้งานที่ agent ของคุณอาจเจอล่ะ?
เพื่อให้ตัวเองอยู่ในมุมมองของโมเดล ผมชอบจินตนาการว่าได้รับโจทย์คณิตศาสตร์ที่ยาก คุณอยากได้เครื่องมืออะไรเพื่อแก้มัน? มันขึ้นอยู่กับทักษะของคุณเอง!
กระดาษเป็นขั้นต่ำสุด แต่คุณจะถูกจำกัดด้วยการคำนวณด้วยมือ เครื่องคิดเลขดีกว่า แต่คุณต้องรู้วิธีใช้ตัวเลือกขั้นสูง ตัวเลือกที่เร็วและทรงพลังที่สุดคือคอมพิวเตอร์ แต่คุณต้องรู้วิธีใช้มันเพื่อเขียนและรันโค้ด
นี่คือกรอบความคิดที่มีประโยชน์สำหรับการออกแบบ agent ของคุณ คุณต้องการให้เครื่องมือที่เหมาะสมกับความสามารถของมัน แต่คุณจะรู้ได้อย่างไรว่าความสามารถเหล่านั้นคืออะไร? คุณต้องใส่ใจ อ่านผลลัพธ์ของมัน ทดลอง คุณเรียนรู้ที่จะมองเห็นเหมือน agent
นี่คือบทเรียนบางส่วนที่เราได้เรียนรู้จากการใส่ใจ Claude ขณะสร้าง Claude Code
การปรับปรุง Elicitation และเครื่องมือ AskUserQuestion

เมื่อสร้างเครื่องมือ AskUserQuestion เป้าหมายของเราคือการปรับปรุงความสามารถของ Claude ในการถามคำถาม (มักเรียกว่า elicitation)
แม้ว่า Claude จะถามคำถามในรูปแบบข้อความธรรมดาได้ แต่เราพบว่าการตอบคำถามเหล่านั้นใช้เวลามากเกินความจำเป็น เราจะลดแรงเสียดทานนี้และเพิ่มแบนด์วิดท์ของการสื่อสารระหว่างผู้ใช้กับ Claude ได้อย่างไร?
ความพยายามที่ 1 - การแก้ไข ExitPlanTool
สิ่งแรกที่เราลองคือการเพิ่มพารามิเตอร์ให้กับ ExitPlanTool เพื่อให้มีอาร์เรย์ของคำถามควบคู่ไปกับแผน นี่เป็นสิ่งที่ง่ายที่สุดในการนำไปใช้ แต่ทำให้ Claude สับสนเพราะเราขอทั้งแผนและชุดคำถามเกี่ยวกับแผนพร้อมกัน จะเกิดอะไรขึ้นถ้าคำตอบของผู้ใช้ขัดแย้งกับสิ่งที่แผนบอก? Claude จะต้องเรียก ExitPlanTool สองครั้งหรือไม่? เราต้องการแนวทางอื่น
(คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเหตุผลที่เราสร้าง ExitPlanTool ได้ใน โพสต์ของเราเกี่ยวกับ prompt caching
ความพยายามที่ 2 - การเปลี่ยนรูปแบบผลลัพธ์
ต่อไปเราลองปรับเปลี่ยนคำแนะนำผลลัพธ์ของ Claude เพื่อให้ใช้รูปแบบ markdown ที่ปรับเปลี่ยนเล็กน้อยซึ่งมันสามารถใช้ถามคำถามได้ ตัวอย่างเช่น เราสามารถขอให้มันแสดงรายการคำถามแบบหัวข้อย่อยพร้อมตัวเลือกในวงเล็บ จากนั้นเราสามารถแยกวิเคราะห์และจัดรูปแบบคำถามนั้นเป็น UI สำหรับผู้ใช้
แม้ว่านี่จะเป็นการเปลี่ยนแปลงที่ครอบคลุมที่สุดที่เราทำได้ และ Claude ดูเหมือนจะโอเคกับการแสดงผลนี้ แต่มันไม่รับประกัน Claude จะเพิ่มประโยคพิเศษ ละเว้นตัวเลือก หรือใช้รูปแบบอื่นโดยสิ้นเชิง
ความพยายามที่ 3 - เครื่องมือ AskUserQuestion

ในที่สุด เราก็ลงเอยด้วยการสร้างเครื่องมือที่ Claude สามารถเรียกใช้ได้ตลอดเวลา แต่ถูกกระตุ้นเป็นพิเศษให้ทำเช่นนั้นในระหว่างโหมดแผน เมื่อเครื่องมือถูกเรียกใช้ เราจะแสดง modal เพื่อแสดงคำถามและบล็อกลูปของ agent จนกว่าผู้ใช้จะตอบ
เครื่องมือนี้ช่วยให้เราสามารถกระตุ้น Claude ให้สร้างผลลัพธ์ที่มีโครงสร้าง และช่วยให้เรามั่นใจว่า Claude ให้ตัวเลือกหลายอย่างแก่ผู้ใช้ นอกจากนี้ยังให้ผู้ใช้มีวิธีในการประกอบฟังก์ชันนี้ เช่น การเรียกใช้ใน Agent SDK หรือการอ้างถึงใน skills
ที่สำคัญที่สุด Claude ดูเหมือนชอบเรียกใช้เครื่องมือนี้ และเราพบว่าผลลัพธ์ของมันทำงานได้ดี แม้แต่เครื่องมือที่ออกแบบดีที่สุดก็ใช้ไม่ได้ถ้า Claude ไม่เข้าใจวิธีเรียกใช้
นี่คือรูปแบบสุดท้ายของ elicitation ใน Claude Code หรือไม่? เราไม่แน่ใจ อย่างที่คุณจะเห็นในตัวอย่างถัดไป สิ่งที่ใช้ได้กับโมเดลหนึ่งอาจไม่ดีที่สุดสำหรับอีกโมเดลหนึ่ง
การอัปเดตด้วยความสามารถ - Tasks และ Todos

เมื่อเราเปิดตัว Claude Code ครั้งแรก เราตระหนักว่าโมเดลต้องการรายการ Todo เพื่อให้มันทำงานตามแผน Todos สามารถเขียนไว้ตอนเริ่มต้นและเช็คออกเมื่อโมเดลทำงานเสร็จ เพื่อทำสิ่งนี้เราให้เครื่องมือ TodoWrite แก่ Claude ซึ่งจะเขียนหรืออัปเดต Todos และแสดงให้ผู้ใช้เห็น
แต่ถึงอย่างนั้นเรามักเห็น Claude ลืมสิ่งที่ต้องทำ เพื่อปรับตัว เราแทรกการแจ้งเตือนระบบทุก 5 รอบที่เตือน Claude ถึงเป้าหมายของมัน
แต่เมื่อโมเดลพัฒนาขึ้น พวกมันไม่เพียงไม่ต้องการการเตือนเกี่ยวกับ Todo List แต่ยังพบว่ามันจำกัดอีกด้วย การถูกส่งการแจ้งเตือนของ todo list ทำให้ Claude คิดว่ามันต้องยึดติดกับรายการแทนที่จะปรับเปลี่ยนมัน เรายังเห็น Opus 4.5 ใช้ subagents ได้ดีขึ้นมาก แต่ subagents จะประสานงานกันบน Todo List ที่ใช้ร่วมกันได้อย่างไร?
เมื่อเห็นเช่นนี้ เราจึงแทนที่ TodoWrite ด้วย Task Tool (อ่านเพิ่มเติมเกี่ยวกับ Tasks ได้ที่นี่) ในขณะที่ Todos เกี่ยวกับการทำให้โมเดลอยู่ในเส้นทาง Tasks เกี่ยวกับการช่วยให้ agents สื่อสารกันมากขึ้น Tasks สามารถรวม dependencies แชร์อัปเดตระหว่าง subagents และโมเดลสามารถแก้ไขและลบได้
เมื่อความสามารถของโมเดลเพิ่มขึ้น เครื่องมือที่โมเดลของคุณเคยต้องการอาจกลายเป็นข้อจำกัด สิ่งสำคัญคือต้องทบทวนสมมติฐานก่อนหน้านี้เกี่ยวกับเครื่องมือที่จำเป็นอยู่เสมอ นี่คือเหตุผลที่การยึดติดกับโมเดลชุดเล็กๆ ที่มีโปรไฟล์ความสามารถใกล้เคียงกันนั้นมีประโยชน์
การออกแบบอินเทอร์เฟซการค้นหา
ชุดเครื่องมือที่สำคัญโดยเฉพาะสำหรับ Claude คือเครื่องมือค้นหาที่สามารถใช้สร้างบริบทของตัวเอง
เมื่อ Claude Code เปิดตัวครั้งแรก เราใช้ฐานข้อมูลเวกเตอร์ RAG เพื่อค้นหาบริบทสำหรับ Claude ในขณะที่ RAG ทรงพลังและรวดเร็ว แต่มันต้องการการจัดทำดัชนีและการตั้งค่า และอาจเปราะบางในสภาพแวดล้อมที่แตกต่างกันมากมาย ที่สำคัญกว่านั้น Claude ได้รับ บริบทนี้แทนที่จะค้นหาบริบทด้วยตัวเอง
แต่ถ้า Claude สามารถค้นหาบนเว็บได้ ทำไมไม่ค้นหาใน codebase ของคุณล่ะ? ด้วยการให้เครื่องมือ Grep แก่ Claude เราสามารถให้มันค้นหาไฟล์และสร้างบริบทด้วยตัวเอง
นี่คือรูปแบบที่เราเห็นเมื่อ Claude ฉลาดขึ้น มันจะเก่งขึ้นเรื่อยๆ ในการสร้างบริบทของตัวเองหากได้รับเครื่องมือที่เหมาะสม
เมื่อเราแนะนำ Agent Skills เราได้ทำให้แนวคิดของการเปิดเผยแบบค่อยเป็นค่อยไป (progressive disclosure) เป็นทางการ ซึ่งช่วยให้ agents ค้นพบบริบทที่เกี่ยวข้องทีละน้อยผ่านการสำรวจ
Claude สามารถอ่านไฟล์ skill และไฟล์เหล่านั้นสามารถอ้างอิงไฟล์อื่นๆ ที่โมเดลสามารถอ่านแบบเรียกซ้ำได้ อันที่จริง การใช้งาน skills ทั่วไปคือการเพิ่มความสามารถในการค้นหาให้กับ Claude เช่น การให้คำแนะนำเกี่ยวกับวิธีใช้ API หรือสอบถามฐานข้อมูล
ตลอดระยะเวลาหนึ่งปี Claude เปลี่ยนจากการไม่สามารถสร้างบริบทของตัวเองได้จริงๆ ไปสู่การสามารถค้นหาแบบซ้อนกันในหลายชั้นของไฟล์เพื่อค้นหาบริบทที่ต้องการได้อย่างแม่นยำ
การเปิดเผยแบบค่อยเป็นค่อยไปเป็นเทคนิคทั่วไปที่เราใช้ในการเพิ่มฟังก์ชันใหม่โดยไม่ต้องเพิ่มเครื่องมือ
การเปิดเผยแบบค่อยเป็นค่อยไป - Claude Code Guide Agent
ปัจจุบัน Claude Code มีเครื่องมือประมาณ 20 ตัว และเราถามตัวเองอยู่เสมอว่าเราต้องการทั้งหมดหรือไม่ เกณฑ์ในการเพิ่มเครื่องมือใหม่นั้นสูง เพราะนี่ทำให้โมเดลมีตัวเลือกเพิ่มขึ้นอีกหนึ่งอย่างให้คิด
ตัวอย่างเช่น เราสังเกตว่า Claude ไม่รู้เพียงพอเกี่ยวกับวิธีใช้ Claude Code ถ้าคุณถามมันว่าจะเพิ่ม MCP หรือคำสั่ง slash ทำอะไร มันจะไม่สามารถตอบได้
เราสามารถใส่ข้อมูลทั้งหมดนี้ใน system prompt แต่เนื่องจากผู้ใช้ไม่ค่อยถามเกี่ยวกับเรื่องนี้ มันจะเพิ่ม context rot และรบกวนงานหลักของ Claude Code: การเขียนโค้ด
แทนที่จะทำอย่างนั้น เราลองใช้รูปแบบของการเปิดเผยแบบค่อยเป็นค่อยไป เราให้ลิงก์ไปยังเอกสารของ Claude ซึ่งมันสามารถโหลดเพื่อค้นหาข้อมูลเพิ่มเติม วิธีนี้ใช้ได้ผล แต่เราพบว่า Claude จะโหลดผลลัพธ์จำนวนมากเข้าสู่บริบทเพื่อหาคำตอบที่ถูกต้อง ในขณะที่สิ่งที่คุณต้องการจริงๆ คือคำตอบ
ดังนั้นเราจึงสร้าง subagent Claude Code Guide ซึ่ง Claude ถูกกระตุ้นให้เรียกเมื่อคุณถามเกี่ยวกับตัวมันเอง subagent มีคำแนะนำมากมายเกี่ยวกับวิธีค้นหาเอกสารอย่างดีและสิ่งที่จะส่งคืน
แม้ว่านี่จะไม่สมบูรณ์แบบ Claude ยังคงสับสนได้เมื่อคุณถามเกี่ยวกับวิธีตั้งค่าตัวมันเอง แต่มันดีกว่าเมื่อก่อนมาก! เราสามารถเพิ่มสิ่งต่างๆ ลงใน action space ของ Claude โดยไม่ต้องเพิ่มเครื่องมือ
ศิลปะ ไม่ใช่วิทยาศาสตร์
ถ้าคุณหวังว่าจะมีชุดกฎตายตัวเกี่ยวกับวิธีสร้างเครื่องมือของคุณ น่าเสียดายที่นี่ไม่ใช่คู่มือนั้น การออกแบบเครื่องมือสำหรับโมเดลของคุณเป็นทั้งศิลปะและวิทยาศาสตร์ ขึ้นอยู่กับโมเดลที่คุณใช้ เป้าหมายของ agent และสภาพแวดล้อมที่มันทำงาน
ทดลองบ่อยๆ อ่านผลลัพธ์ของคุณ ลองสิ่งใหม่ๆ มองเห็นเหมือน agent





