คู่มือการใช้งาน Effective Token · V1.0
คำนำ
เมื่อการเขียนโค้ดโดยใช้ AI กลายเป็นเรื่องปกติ Token ก็กลายเป็นต้นทุนคอมพิวต์ที่ชัดเจน ไม่ใช่เสียงรบกวนพื้นหลังที่มองข้ามไปได้
ปัญหาที่แท้จริงของหลายทีมไม่ใช่การไม่รู้ว่าควรลดการใช้งาน แต่เป็นดังนี้:
- บิลยังคงเพิ่มขึ้นเรื่อยๆ แต่ไม่มีใครระบุได้ว่าค่าใช้จ่ายมาจากประเภทงาน Skill บุคคล หรือ workflow ใด
- ปรับแต่ง Prompt ไปมากมาย แต่สุดท้ายบิลแทบไม่เปลี่ยนแปลง
- นำเครื่องมือใหม่ที่ "ควรจะช่วยประหยัดได้มาก" มาใช้ แต่ต้นทุนรวมกลับเพิ่มขึ้น
มีสาเหตุรากฐานเดียวเท่านั้น: หากไม่มีการวัดผล ก็ไม่มีการปรับปรุงให้ดีขึ้น
ในทางวิศวกรรมศาสตร์ สิ่งนี้ไม่ต่างจากการกำหนด monitoring, alerting และ SLI/SLO ตั้งแต่วันแรก
นั่นคือเหตุผลที่การวัดผลเป็นบทที่ 1 — การปรับปรุงทั้งหมดในบทต่อๆ ไปต้องสร้างขึ้นบน baseline การวัดผลที่กำหนดไว้ในบทนี้
อภิธานศัพท์
คู่มือนี้ตั้งสมมติฐานว่าผู้อ่านคุ้นเคยกับเครื่องมือเขียนโค้ดด้วย AI ทั่วไป เช่น Claude Code, CodeBuddy, Cursor และ Copilot คำศัพท์ต่อไปนี้ปรากฏซ้ำตลอดทั้งคู่มือ และถูกนิยามไว้ที่นี่เพื่อป้องกันความคลุมเครือ
| คำศัพท์ | ชื่อเรียกอื่น / ความหมาย | คำอธิบายโดยย่อ |
|---|---|---|
| Token | Token | หน่วยที่คิดเงินได้เล็กที่สุดของข้อความที่ LLM ประมวลผล ประมาณการคร่าวๆ: อักษรจีน 1 ตัว ≈ 1–2 tokens; คำภาษาอังกฤษ 1 คำ ≈ 1.3 tokens |
| Input / Output | ข้อมูลนำเข้า / ผลลัพธ์ | เนื้อหาทั้งหมดที่ส่งไปยังโมเดลในหนึ่งคำขอ / เนื้อหาทั้งหมดที่โมเดลส่งกลับมา ซึ่งคิดเงินแยกกันในอัตราที่ต่างกัน |
| Context | Context window (หน้าต่าง Context) | ทุกสิ่งที่ส่งไปยังโมเดลจริงๆ ในหนึ่งคำขอ: System Prompt + ประวัติ + คำขอของผู้ใช้ + นิยามของเครื่องมือ + ผลการค้นคืน และอื่นๆ |
| System Prompt | System instructions (คำสั่งระดับระบบ) | คำสั่งคงที่ที่วางไว้ต้นสุดของ Context ในทุกๆ รอบ มักประกอบด้วยบทบาท กฎ และคำอธิบายเครื่องมือ |
| Session | Continuous conversation (บทสนทนาต่อเนื่อง) | ทุกรอบนับจากเริ่มบทสนทนาจนกระทั่ง /clear หรือปิด session จะใช้ Context ประวัติร่วมกัน |
| Prompt Cache | Prefix cache (แคชส่วนนำ) | แคชการคำนวณของส่วนนำ (prefix) ของคำขอเพื่อนำกลับมาใช้ซ้ำ หาก cache hit จะคิดเงินเป็น Cache read (ประมาณหนึ่งในสิบของ Input ในกรณีของ Anthropic); หาก cache miss หรือเป็นการเขียนครั้งแรกจะคิดเงินเป็น Cache write |
| TTL | Time to live (อายุที่ยังใช้ได้) | ระยะเวลาที่รายการแคชยังคงใช้ได้ เช่น ค่าเริ่มต้นของ Anthropic คือ 5 นาที และ optionally รองรับ 1 ชั่วโมง; ผู้ให้บริการรายอื่นใช้กลไกที่แตกต่างกัน |
| Thinking / Reasoning | Reasoning tokens (Token สำหรับการคิด) | การให้เหตุผลขั้นกลางของโมเดลก่อนให้คำตอบสุดท้าย ซึ่งก็ใช้ Token เช่นกันและถูกนับเป็น output โดย Anthropic |
| Skill | Skill | คำสั่ง workflow ที่นำกลับมาใช้ซ้ำได้ ประกอบด้วย Description + Instructions + Examples เช่น code-review หรือ commit-message |
| Rules | Rules (กฎ) | ข้อจำกัดด้านพฤติกรรมระดับ global หรือระดับโปรเจกต์ เช่น จรรยาบรรณการเขียนโค้ดและประสิทธิภาพการใช้ Token ซึ่งมักถูกส่งไปพร้อมกับ System Prompt ในทุกๆ รอบ |
| Agent | Agent | หน่วยปฏิบัติงานที่สามารถเรียกใช้เครื่องมือได้ด้วยตนเอง สามารถมีโมเดล Skill และชุดเครื่องมือของตนเองได้ |
| Subagent | Subagent (Agent ย่อย) | Agent อิสระที่ได้รับมอบหมายงานจาก Agent หลัก มี Context แบบแยกส่วนและใช้ครั้งเดียว และส่งกลับเฉพาะบทสรุปให้ Agent หลัก |
| Command | Command (คำสั่ง) | งานที่ใช้เทมเพลตคงที่ เรียกใช้ด้วย /xxx เช่น /commit, /clear, /compact หรือ /cost |
| MCP | Model Context Protocol | โปรโตคอลมาตรฐานที่เชื่อมต่อเครื่องมือ AI เข้ากับระบบภายนอก เช่น ฐานข้อมูล API และระบบไฟล์ |
| Tool Definition | Tool schema (สคีมาของเครื่องมือ) | สคีมาที่อธิบายความสามารถ พารามิเตอร์ และค่าที่ส่งกลับของเครื่องมือ ซึ่งถูกส่งไปพร้อมกับ Context ในทุกๆ รอบ |
| RAG | Retrieval-Augmented Generation (การสร้างข้อความโดยเสริมการค้นคืน) | ค้นคืนความรู้ภายนอกก่อน แล้วจึงแทรกเนื้อหาที่ค้นคืนได้เข้าไปใน Context |
| Learnings | Captured knowledge (ความรู้ที่บันทึกไว้) | บทเรียนและแนวปฏิบัติที่ดีที่สุดที่ทีมสั่งสมมา ซึ่งมักถูกแทรกเข้าไปใน Context ก็ต่อเมื่อมีการเรียกคืน (recall) เท่านั้น |
| SLI / SLO | Service Level Indicator / Service Level Objective | เมตริกที่สังเกตได้ซึ่งใช้สำหรับการวัดผลและการกำกับดูแล (SLIs) และค่าเป้าหมายของเมตริกเหล่านั้น (SLOs) |
ข้อมูลอ้างอิงคำสั่งแบบย่อ:
/cost(ดูการใช้งานของรอบปัจจุบัน),/compact(บีบอัดประวัติ),/clear(ล้าง session ปัจจุบัน)
บทที่ 1: วัดผลก่อน — หากไม่มีการวัดผล ก็ไม่มีการปรับปรุงให้ดีขึ้น
ทำให้เป็นตัวเลขก่อน หากวัดผลไม่ได้ ก็อย่าเพิ่งทำ
1.1 หากคุณไม่รู้ว่าอะไรแพง คุณก็ไม่รู้ว่าจะประหยัดอะไร
ปัญหาในโลกความเป็นจริง
เครื่องมือเขียนโค้ดด้วย AI มักให้เพียงตัวเลขบิลแบบรวม:
- Token รวมของเดือน
- ต้นทุนรวมของเดือน
- ยอดรวมแยกตามโมเดล
แต่ไม่ได้บอกคุณว่า:
- Token ใดถูกใช้ไปกับ Input
- Token ใดถูกใช้ไปกับ Output
- ส่วนใดมาจาก Prompt Cache hits
- ส่วนใดมาจาก Cache writes
- ส่วนใดมาจาก Thinking / Reasoning
- ส่วนใดมาจาก การไป-กลับของเครื่องมือ (tool round-trips)
- ส่วนใดมาจาก การลองใหม่ (retries)
ผลลัพธ์คือ สัญชาตญาณมักผิดพลาด
1.2 โปรไฟล์ Token ของหนึ่งคำขอ
หากต้องการเข้าใจว่าเงินถูกใช้ไปที่ใด คุณต้องเข้าใจองค์ประกอบ Token ของหนึ่งคำขอเสียก่อน
| ฟิลด์ | ความหมาย | ลักษณะของต้นทุน |
|---|---|---|
| Input | Input tokens: System Prompt + ประวัติ + Context + คำขอของผู้ใช้ รวมถึงส่วนที่ได้จากแคช | ต้นทุนพื้นฐาน ได้รับผลกระทบอย่างมากจากความเสถียรของ prefix |
| Output | Token ทั้งหมดที่โมเดลสร้างขึ้น | โดยปกติแพงกว่า Input และปล่อยให้บานปลายได้ง่าย |
| Cache read | Input tokens ที่ได้จาก Prompt Cache | ประมาณหนึ่งในสิบของราคา Input; ไม่สามารถใช้ได้หลังจากแคชหมดอายุ |
| Cache write | Token ที่ถูกเขียนลงแคชเป็นครั้งแรก | ต้นทุนเริ่มต้นที่ถูกเฉลี่ยกันในการนำกลับมาใช้ซ้ำครั้งหลังๆ; การหมดอายุของแคชยังคงมีความสำคัญ |
| Thinking | Token ที่ใช้ไประหว่างการให้เหตุผล เช่น thinking budget ของ Claude | มีมูลค่าสูง แต่ก็มีต้นทุนสูงเช่นกัน |
วิธีรับข้อมูลนี้
- CodeBuddy / WorkBuddy / Codex / Claude Code
- ใช้คำสั่ง
/cost - เปิดใช้งาน telemetry เพื่อให้ได้รายละเอียดแยกต่อคำขอ
- ใช้คำสั่ง
ตัวอย่างที่ไม่ถูกต้อง
The developer looks only at total cost, not its composition:
- Output has a high share, so they assume the model is too verbose;
- In reality, the Prompt does not constrain the output format, so the model responds freely;
- The optimization effort targets the wrong problem.
ตัวอย่างที่ถูกต้อง
After every critical task, the developer routinely checks `/cost`:
- They notice that the proportion of cache-read tokens remains below 20% for a certain task type;
- They check whether the prefix changes frequently or a Skill is reloaded every time;
- After adjustment, the Cache hit rate remains above 70%;
- Input cost for the same task falls to one-third of its previous level.
1.3 เมตริกสำคัญและค่าเป้าหมาย
จากทั้งห้าฟิลด์ข้างต้น เรากำหนดชุดของ SLI ที่ทีมต้องติดตามอย่างต่อเนื่อง
1. Cache Hit Rate
นิยาม: Cache read tokens / Input tokens (Input หมายถึง input ทั้งหมด รวมถึงส่วนที่ cache hit; ดูตารางห้าฟิลด์ในหัวข้อ 1.2)
| ช่วง | การประเมิน | การดำเนินการที่แนะนำ |
|---|---|---|
| > 70% | สุขภาพดี | รักษาสถานะปัจจุบันไว้และทบทวนเป็นระยะ |
| 40%–70% | เตือน | ตรวจสอบความเสถียรของ prefix และความถี่ในการเปลี่ยนแปลง Skill/Rules |
| < 40% | วิกฤต | หยุดเพิ่ม Skill ใหม่ชั่วคราว และให้ความสำคัญกับการปรับโครงสร้าง Context ก่อน |
หมายเหตุ: นี่เป็นช่วงอ้างอิง แต่ละทีมควรปรับเทียบให้เข้ากับ baseline การดำเนินงานจริงของตน
เหตุใดจึงเข้มงวดเช่นนี้?
Prompt Cache คือ "อาหารกลางวันฟรี" ที่คุ้มค่าที่สุดในปัจจุบัน อัตรา cache hit ต่ำกว่า 40% มักหมายความว่า:
- prefix เปลี่ยนแปลงบ่อย
- การจัดการ session ไร้ระเบียบ
- Skills / Rules ได้รับการออกแบบมาไม่ดี
2. Output / Input Ratio
นิยาม: Output tokens / Input tokens
- สูงเกินไป (> 3)
- โมเดลกำลัง "คุยเล่น" มากกว่าการสร้างผลงานที่ถูกขอ
- สาเหตุที่พบบ่อย: ไม่มีการจำกัดรูปแบบ output, ไม่มี prefill, และการตอบกลับที่ไม่ถูกควบคุม
- ต่ำเกินไป (< 0.3)
- โมเดลอาจระมัดระวังมากเกินไป หรือมีการลองใหม่และความล้มเหลวด้านรูปแบบบ่อยครั้ง
- ช่วงที่สมเหตุสมผล
- งานเขียนโค้ดมักอยู่ในช่วง 0.5–1.5
- งานที่เป็นการให้เหตุผลหรือการวางแผนล้วนๆ อาจใช้ช่วงที่กว้างกว่า
3. Average Tokens per Task
- นิยาม: Token รวมที่งานหนึ่งๆ ใช้ไป เช่น การแก้บั๊กหนึ่งครั้ง หรือการ implement ฟีเจอร์หนึ่งอย่าง
- การใช้งาน:
- ระบุค่าผิดปกติ (outliers) ที่เบี่ยงเบนไปจากค่าเฉลี่ยอย่างมีนัยสำคัญ
- จัดเตรียมเมตริก baseline สำหรับ SLOs
ตัวอย่างที่ไม่ถูกต้อง
The team looks only at total monthly cost and does not track the metrics above:
- Cache hit rate remains around 30%;
- The Output/Input ratio reaches 5;
- Nobody notices because total cost is still within budget;
- By the time the budget becomes tight, substantial structural waste has accumulated.
ตัวอย่างที่ถูกต้อง
The team reviews three metrics in every weekly meeting:
- Cache hit rate: 78%
- Output/Input ratio: 1.2
- Average tokens per task: p50 = 45K, p95 = 180K
Outliers, such as a Skill that suddenly raises p95, receive focused remediation.
Within six months, token cost falls by 55% for the same workload.
1.4 การระบุแหล่งที่มาของค่าใช้จ่ายระดับทีม
ยอดรวมแบบเหมารวมนั้นไม่เพียงพออย่างยิ่ง ต้นทุนต้องถูกระบุแหล่งที่มาหลายมิติ
โมเดลการระบุแหล่งที่มาแบบสี่มิติที่แนะนำ
- แยกตามบุคคล
- ใครเป็นผู้ใช้ Token?
- มีสมาชิกทีมคนใดที่มีรูปแบบการใช้งานผิดปกติหรือไม่?
- แยกตามโปรเจกต์
- โปรเจกต์ใดเป็นศูนย์กลางของต้นทุน?
- ต้นทุนสอดคล้องกับระยะของโปรเจกต์หรือไม่ เช่น ระยะสำรวจในช่วงต้นเทียบกับระยะบำรุงรักษาที่เสถียร
- แยกตาม Skill / Agent
- Skill / Agent ใดแพงที่สุด?
- มี Skill / Agent ที่ต้นทุนสูงแต่มูลค่าต่ำอยู่หรือไม่?
- แยกตามโมเดล
- สัดส่วนต้นทุนของแต่ละโมเดลสมเหตุสมผลหรือไม่?
- มีความไม่สอดคล้องที่ชัดเจนหรือไม่ เช่น การใช้ Opus เพื่อเขียน unit test
ข้อแนะนำในการนำไปปฏิบัติ
- สร้าง team token dashboard ทุกสัปดาห์
- ต้องครอบคลุมอย่างน้อยทั้งสี่มิติข้างต้น
- ทำเครื่องหมายการเปลี่ยนแปลงเทียบกับงวดก่อนและความผันผวนที่ผิดปกติ
- ใช้ dashboard เป็น:
- วาระประจำในการประชุมรายสัปดาห์
- ข้อมูลนำเข้าที่สำคัญสำหรับการทบทวน Skill / Prompt
บทที่ 2: เงินในบิลไปอยู่ที่ใด
Token ไม่ได้หายไปไหน มันไหลผ่านห่วงโซ่ต้นทุนที่ตายตัว — จากคำขอของคุณ ไปยัง System Prompt ไปยังประวัติการสนทนา ไปยังการไป-กลับของเครื่องมือ และสุดท้ายไปยัง output ของโมเดล
2.1 คำขอของคุณมักเป็นส่วนที่ถูกที่สุด
การกระจายตัวของ Token ทั่วไป
| ส่วนประกอบ | ปริมาณ Token โดยทั่วไป | บทบาทด้านต้นทุน |
|---|---|---|
| System Prompt | 3K–10K | ต้นทุนคงที่ที่จ่ายในทุกๆ รอบ |
| Skill / Instructions | 5K–30K | เพิ่มขึ้นเมื่อมีการโหลด Skill |
| Tool Definitions | 5K–20K | เพิ่มขึ้นตามจำนวน MCP server และเครื่องมือ |
| Session history | 10K–200K+ | เติบโตเชิงเส้นตามจำนวนรอบ |
| เนื้อหาที่ค้นคืนได้ (RAG / search) | 5K–50K | ขึ้นอยู่กับกลยุทธ์การค้นคืน |
| ไฟล์โค้ด / Patch | 5K–100K | ขึ้นอยู่กับระดับความละเอียดของการอ่าน |
| คำค้นของผู้ใช้ | 50–500 | สัดส่วนที่เล็กมาก |
สูตรหลัก:
ต้นทุนรวม ≈ prefix คงที่ + ประวัติ session + การค้นคืนขณะรัน + การไป-กลับของเครื่องมือ + output ของโมเดล
ตัวอย่างที่ไม่ถูกต้อง
A one-line request: "Build a login feature." "Fix bug."
Result:
- The model misunderstands and enters multiple rounds of clarification;
- The number of tool calls doubles;
- Output grows and retries increase;
- Total cost rises instead.
**Root cause**: saving money in the wrong place.
ตัวอย่างที่ถูกต้อง
"Please fix this bug. The reproduction steps are..."
- Compress 20K of Skill instructions to 8K by removing filler and merging duplicate rules;
- Limit the number of lines returned by tools (`head -n 100`);
- Reference the exact file with `@path/to/file` instead of making the model search blindly.
✅ กฎง่ายๆ: แทนที่จะย่นคำขอของผู้ใช้ให้สั้นลง ให้ลด System / Skill / Tool / History แทน
2.2 "มันจำได้" เป็นภาพลวงตา
LLM ไม่มีความจำ
เมื่อดูเหมือนว่าโมเดลจำได้ สิ่งที่เกิดขึ้นจริงคือ เนื้อหาก่อนหน้าทั้งหมดถูกส่งไปอีกครั้ง
ผลกระทบสำคัญสามประการ
- Context ยาวเท่าใด ต้นทุนก็สูงเท่านั้น
- ต้นทุนของรอบที่ 10 ไม่ใช่สิบเท่าของต้นทุนรอบที่ 1 อย่างง่ายๆ
- ทุกๆ รอบต้องจ่ายค่าเนื้อหาของทุกรอบก่อนหน้าอีกครั้ง
- เครื่องมือมากเท่าใด ภาระก็หนักเท่านั้น
- ทุกเครื่องมือมาพร้อม "คู่มือ": สคีมาและคำอธิบายของมัน
- คู่มือเหล่านี้ถูก โหลดกลับเข้าไปใน Context ใหม่ในทุกๆ รอบ
- การเรียกเครื่องมือสร้างวงจรต้นทุน
User request
↓
Model decision
↓
Tool call
↓
Tool result (large!)
↓
Model processing
↓
Next tool call...
2.3 ต้นทุนห้าประเภท
นอกจาก Input และ Output แล้ว ยังมีต้นทุนอีกสามประเภทที่มักถูกประเมินต่ำเกินไป
| ประเภทต้นทุน | เกิดขึ้นเมื่อใด | ระดับความง่ายในการมองข้าม | ผลกระทบ |
|---|---|---|---|
| ต้นทุน Input | System Prompt, ประวัติ, ไฟล์ | ต่ำ | ⭐⭐ |
| ต้นทุน Output | เนื้อหาที่โมเดลสร้างขึ้น | ต่ำ | ⭐⭐⭐ |
| ต้นทุน Thinking | การให้เหตุผล / thinking budget | สูง | ⭐⭐⭐⭐ |
| ต้นทุนการไป-กลับของเครื่องมือ | การเรียกเครื่องมือ + ผลลัพธ์ที่ส่งกลับมา | สูงมาก | ⭐⭐⭐⭐⭐ |
| ต้นทุนการลองใหม่ (Retry) | ข้อผิดพลาดด้านรูปแบบ, คำสั่งที่ไม่ชัดเจน, ความล้มเหลวของเครื่องมือ | สูงมาก | ⭐⭐⭐⭐⭐ |
การไป-กลับของเครื่องมือ: จุดรั่วไหลของต้นทุนที่ถูกประเมินต่ำที่สุด
ต้นทุนการไป-กลับของเครื่องมือ = นิยามของเครื่องมือ + เนื้อหาที่ส่งกลับ + การประกอบ Context ใหม่ + การให้เหตุผลเพิ่มเติมของโมเดล
การเรียก grep ทั่วไปหนึ่งครั้ง:
- นิยามของเครื่องมือ: ~300 tokens
- ผลลัพธ์ที่ส่งกลับ: ~2,000 tokens
- การประกอบ Context ใหม่: ~500 tokens
- การประมวลผลของโมเดล: ~1,000 tokens
การเรียกเครื่องมือเพียงครั้งเดียวสามารถเกิน 3,500 tokens ได้อย่างง่ายดาย
หากโมเดลลังเลและเรียกเครื่องมือติดต่อกันห้าครั้ง ต้นทุนก็อาจบานปลายออกไปอย่างรวดเร็ว
2.4 Prompt Cache: รากฐานของการปรับปรุง
Prompt Cache แคชการคำนวณของ prefix ไม่ใช่คำตอบ
ข้อเท็จจริงสำคัญสามประการ
- สิ่งที่ถูกแคชคือ prefix
- มีเพียง prefix ที่เหมือนกันทุกประการเท่านั้นจึงจะเกิด cache hit
- การเปลี่ยนแปลงแม้เพียงหนึ่งตัวอักษรอาจทำให้แคชใช้ไม่ได้
- TTL มักอยู่ที่ 5 นาที
- การนำกลับมาใช้ซ้ำภายใน 5 นาที: Cache read ประมาณหนึ่งในสิบของราคา ขึ้นอยู่กับโมเดล
- หลังจาก 5 นาที: เป็น Cache write ราคาเต็มอีกครั้ง
Note: Cache expiration differs by model. Anthropic supports 5m and 1h options; OpenAI, DeepSeek, and GLM use different cache mechanisms.
- แคชไม่ได้ถูกแชร์ข้ามโมเดล
- แคชของ DeepSeek / GLM / GPT / Opus / Sonnet ใช้ร่วมกันไม่ได้
- การผสมโมเดลภายใน workflow เดียวหมายถึงการสละการนำแคชกลับมาใช้ซ้ำ
ผลกระทบสามประการต่อการปรับปรุงแคช
- การนำกลับมาใช้ซ้ำคือสิ่งที่ประหยัดเงิน: prefix เดียวกันจะถูกกว่าก็ต่อเมื่อมีการใช้ตั้งแต่ครั้งที่สองเป็นต้นไป
- รักษา prefix ให้เสถียร: ไฟล์ Rules / CLAUDE.md ที่เปลี่ยนแปลงบ่อยคือตัวทำลายแคช
- การปรับปรุงแคช = การกำกับดูแล Context: ทำให้ prefix เสถียร ลดสัญญาณรบกวน และแยก session
2.5 การเสื่อมถอยของคุณภาพใน Context ยาว — ไม่เพียงแพงขึ้น แต่ยังมีประสิทธิภาพน้อยลง
Context ที่ยาวเกินไปทำให้เกิดบทลงโทษสามประการ:
1. ปรากฏการณ์ Needle-in-a-Haystack
โมเดลประสบความยากลำบากในการค้นหาข้อมูลสำคัญท่ามกลางเนื้อหาที่ไม่เกี่ยวข้องจำนวนมาก
2. การปนเปื้อนของ Context (Context Poisoning)
เมื่อข้อมูลที่ไม่ถูกต้องเข้าไปอยู่ใน Context แล้ว โมเดลอาจอ้างอิงมันซ้ำๆ ซึ่งปนเปื้อน output ในลำดับต่อไป
3. Lost in the Middle
โมเดลให้ความสนใจกับส่วนกลางของ Context น้อยกว่าอย่างมีนัยสำคัญ และมีแนวโน้มที่จะจดจ่อกับส่วนต้นและส่วนท้าย
แผนภาพการตัดสินใจ: ดำเนินการต่อ vs. /compact vs. เริ่มใหม่
Has the current session exceeded 20 turns?
├─ No → Is Context usage above 50%?
│ ├─ No → Continue
│ └─ Yes → Run /compact
└─ Yes → Can you still locate the critical information clearly?
├─ Yes → Run /compact
└─ No → Start a new session
2.6 โมเดลการกำกับดูแลต้นทุนห้าชั้น
| ชั้น | หัวข้อ | วัตถุประสงค์หลัก | บทที่เกี่ยวข้อง |
|---|---|---|---|
| ชั้นที่ 1 | นิสัยการใช้งาน | ลด Context ที่ไร้ความหมาย | บทที่ 3 |
| ชั้นที่ 2 | การจัดเส้นทางโมเดล (Model routing) | สงวนโมเดลราคาแพงไว้สำหรับการให้เหตุผลที่มีมูลค่าสูง | บทที่ 4 |
| ชั้นที่ 3 | การออกแบบ Context (Context engineering) | ทำให้ prefix เสถียรและลดการส่งซ้ำ | บทที่ 5 |
| ชั้นที่ 4 | สถาปัตยกรรม Agent | การแยก Context + การทำงานแบบขนาน | บทที่ 6 |
| ชั้นที่ 5 | การนำกลับมาใช้ซ้ำระดับองค์กร | บันทึกครั้งเดียว ใช้ซ้ำได้หลายครั้ง | บทที่ 7 |
บทที่ 3: นิสัยการใช้งาน — การปรับปรุงที่ถูกที่สุดและถูกประเมินต่ำที่สุด
3.1 การแยก Session
[บังคับ] แต่ละ session ต้องรับใช้วัตถุประสงค์ที่ชัดเจนหนึ่งอย่าง อย่าผสมงานที่แตกต่างกันโดยพื้นฐานไว้ใน session เดียวกัน
ความยาวของ session เติบโตไปตามประวัติการสนทนา ดังนั้นทุกคำขอในลำดับถัดไปจึงแพงขึ้น ให้สร้าง session แยกต่างหากสำหรับงานแต่ละประเภท
ตัวอย่างที่ถูกต้อง 1 — เปิดหลาย CodeBuddy session
# Session 1: Fix a nil-pointer dereference in the order module
# Session 2: Refactor the authentication logic in the user service
# Session 3: Add unit tests for the auth module
ตัวอย่างที่ถูกต้อง 2 — รัน /clear หลังจากทำงานเสร็จ
User: Fix bug: http://github.com/project/issues/xxx
AI: [Bug fix completed]
User: /clear
User: Create an implementation plan for the new requirement at http://github.com/project/issues/xxx
ตัวอย่างที่ไม่ถูกต้อง
# In the same session:
# Fix a nil-pointer dereference in the order module → review an auth-module PR → write a technical
# plan for a new requirement → add unit tests
# Task types are mixed and the history context keeps growing
3.2 บีบอัดประวัติที่ยาว
[บังคับ] เมื่อ session เกิน 20 รอบ หรือเมื่อ Context ประวัติเติบโตขึ้นอย่างมีนัยสำคัญและการใช้งาน Context เกิน 50% ให้รัน /compact หรือสร้าง session ใหม่
โมเดลไม่ต้องการกระบวนการลองผิดลองถูกที่สมบูรณ์ สิ่งที่มันต้องการจริงๆ มีเพียงวัตถุประสงค์ปัจจุบัน งานที่ทำเสร็จแล้ว เส้นทางที่ตัดออกไปแล้ว อุปสรรคในปัจจุบัน และขั้นตอนถัดไป
ตัวอย่างที่ถูกต้อง
AI: [Completes one phase]
User: /compact
User: Continue with the second phase
ตัวอย่างที่ไม่ถูกต้อง
# Dozens of failed attempts remain in the history during debugging
# After the bug is fixed, unrelated work continues in the same session
# Every subsequent request carries the irrelevant debugging history
3.3 นำข้อมูลออกไปเก็บภายนอก
[แนะนำ] เก็บข้อมูลที่มีอายุยาวนานไว้ในระบบไฟล์ แทนที่จะพึ่งพาความจำของ session
จัดเก็บข้อมูลที่มีอายุยาวนานในตำแหน่งที่เหมาะสม:
- เอกสารของโปรเจกต์ เช่น README และ CONTRIBUTING
- ไฟล์ Memory เช่น CODEBUDDY.md / CLAUDE.md
- ไฟล์สรุป / บันทึกการตัดสินใจ
- รายการงาน / Issues
session ควรพกพาเฉพาะสถานะการทำงานปัจจุบัน ไม่ใช่ประวัติทั้งหมดของโปรเจกต์
ตัวอย่างที่ถูกต้อง
# Record the database selection decision in docs/decisions/001-database-selection.md
# Record the team's API naming conventions in CODEBUDDY.md / CLAUDE.md
# Discuss only the interface currently being changed in the session
ตัวอย่างที่ไม่ถูกต้อง
# Discuss database selection, API conventions, and exception-handling strategy
# in detail within the session
# Depend on the Agent to reference these discussions automatically later
# The session keeps growing, and other team members cannot easily find the decisions
3.4 การจัดการ Skill
[บังคับ] ยึดหลักการ "จำกัด Skill ที่โหลดตลอดเวลาให้น้อยที่สุด; โหลด Skill ที่ใช้ไม่บ่อยในระดับโปรเจกต์" อย่าติดตั้ง Skill จำนวนมากไว้ที่ระดับผู้ใช้โดยไม่เลือก
ทุก Skill ประกอบด้วย Description, Instructions, Examples และตรรกะการ trigger หากข้อมูลนี้ยังคงประจำอยู่ใน Context มันจะส่งผลต่อการใช้ Token ในทุกคำขอ
ตัวอย่างที่ถูกต้อง
# User-level resident Skills: frequently used general-purpose Skills such as
# commit, code-review, and unit-test
# Project-level Skills: framework-specific workflows such as gRPC code generation,
# or tool-specific workflows such as database migration scripts
# Periodic cleanup: remove Skills that have not been used for more than two weeks
ตัวอย่างที่ไม่ถูกต้อง
# Install 30+ user-level Skills at once, covering Python, Go, Rust, frontend,
# operations, and other technology stacks
# Only commit, code-review, and unit-test are used in day-to-day work
# Definitions for all other Skills remain in the context and continuously consume tokens
3.5 การจัดการ MCP
[บังคับ] จำกัดชุดเครื่องมือ MCP ให้เหลือเท่าที่จำเป็นที่สุด การเพิ่ม MCP server ทุกตัวหมายถึงการเพิ่ม Tool Definition อีกชุดและเพิ่มภาระในการเลือกเครื่องมือ
เครื่องมือที่มากเกินไปไม่ได้เพิ่มเพียงปริมาณข้อความนิยามเท่านั้น แต่ยัง:
- ขยายพื้นที่การเลือกและเพิ่ม latency ในการตัดสินใจ
- เพิ่มความน่าจะเป็นของการเรียกเครื่องมือผิด
- เพิ่ม payload นิยามที่ทุกคำขอต้องแบกรับ
ตัวอย่างที่ถูกต้อง
# User-level resident tool: Headroom context compression
# Project level: no more than five MCP servers for the current project's core business
# Disable or remove: infrequently used MCP servers unrelated to the current project
ตัวอย่างที่ไม่ถูกต้อง
# Install GitHub, Notion, TAPD, Gongfeng, Browser, Kubernetes, Docker, and multiple
# internal-system MCP servers at the user level
# The nominal feature set is comprehensive, but only Filesystem and Git are used frequently
3.6 การเลือกใช้ระหว่าง CLI กับ MCP
[บังคับ] ใช้ MCP เป็นค่าเริ่มต้น ให้กลับไปใช้ CLI ก็ต่อเมื่อ CLI นั้นปรากฏอย่างแพร่หลายในข้อมูลฝึกอบรมของ AI ดังเช่นกรณีของเครื่องมือหลักๆ เช่น git, gh, kubectl, docker, npm และ pip
การแลกเปลี่ยนที่เป็นศูนย์กลางคือ: CLI หลีกเลี่ยงต้นทุนในการโหลด Tool Definition ซึ่งลด Token ต่อรอบ อย่างไรก็ตาม เมื่อ AI ขาดความรู้พื้นฐานที่เชื่อถือได้เกี่ยวกับ CLI นั้น มันอาจสะกด flag ผิด ใช้ subcommand ผิด หรือคิดค้นอาร์กิวเมนต์ขึ้นมาเองได้ง่าย ซึ่งจะกระตุ้นให้เกิดการลองใหม่ ดังที่อธิบายไว้ในบทที่ 2 การลองใหม่หนึ่งครั้งมีต้นทุนประมาณหนึ่งคำขอที่สมบูรณ์ (⭐⭐⭐⭐⭐) ซึ่งมักมากกว่า Tool Definition ที่ประหยัดไปมาก MCP ใช้ Token นิยามจำนวนเล็กน้อยในแต่ละรอบเพื่อแลกกับสคีมาพารามิเตอร์ที่เป็นมาตรฐาน คำอธิบายที่ชัดเจนกว่า และการเรียกผิดและการลองใหม่ที่น้อยลง
แนวทางการเลือก
| สถานการณ์ | เลือกใช้ | เหตุผล |
|---|---|---|
| CLI หลักที่ปรากฏอย่างแพร่หลายในข้อมูลฝึกอบรมของ AI เช่น git / gh / kubectl / docker / npm / pip | CLI | ภาระในการโหลดต่ำและความน่าจะเป็นในการเรียกถูกต้องสูง |
| CLI เฉพาะทาง / เป็นกรรมสิทธิ์ / ภายใน เช่น สคริปต์ปฏิบัติการของทีมหรือคำสั่งธุรกิจส่วนตัว | MCP | สคีมาที่เป็นมาตรฐานช่วยลดภาพหลอนและหลีกเลี่ยงการลองใหม่ที่เกิดจากการเรียกผิด |
| ต้องการผลลัพธ์ที่มีโครงสร้างและอ่านได้ด้วยเครื่องสำหรับห่วงโซ่การตัดสินใจในลำดับถัดไป | MCP | หลีกเลี่ยงต้นทุนแบบทบต้นจากการแยกวิเคราะห์ output การทำความสะอาด และการลองใหม่ |
| ต้องการขอบเขตสิทธิ์และการยืนยันตัวตนแบบรวมศูนย์ | MCP | ตอบสนองข้อกำหนดด้านความปลอดภัยและการตรวจสอบ |
วิธีประเมินว่า AI รู้จัก CLI หรือไม่
"เป็นเครื่องมือหลักและ AI คุ้นเคย" ไม่ใช่มาตรฐานที่แน่นอน แต่เกณฑ์ด้านล่างสามารถช่วยได้ หากไม่แน่ใจ ให้ใช้ MCP เป็นค่าเริ่มต้น ต้นทุนของความผิดพลาดไม่สมมาตร: การปฏิบัติต่อ CLI ที่ไม่เป็นที่รู้จักเสมือนเป็นเครื่องมือหลักอาจกระตุ้นการลองใหม่ที่มีต้นทุน ⭐⭐⭐⭐⭐ ในขณะที่การปฏิบัติต่อ CLI หลักเสมือนว่าไม่เป็นที่รู้จักแล้วใช้ MCP จะเพิ่มเพียง Tool Definition ไม่กี่กิโลไบต์
| เกณฑ์ | ช่วงที่ปลอดภัยสำหรับ CLI | ช่วงที่ปลอดภัยสำหรับ MCP |
|---|---|---|
| การทดสอบโดยตรง: ให้ AI ทำงานทั่วไปด้วย CLI นั้น เขียนคำสั่ง และอธิบายแต่ละอาร์กิวเมนต์ | คำสั่งถูกต้อง และคำอธิบายอาร์กิวเมนต์มีความมั่นใจและสอดคล้องกัน | AI สะกด flag ผิด คิดค้น subcommand ขึ้นมาเอง หรือดูไม่แน่ใจ |
| GitHub Stars | > 10K | < 1K |
| สิ่งพิมพ์เฉพาะทาง เช่น หนังสือจาก O'Reilly หรือ Manning | มี | ไม่มี |
| จำนวนคำถามบน Stack Overflow | > 5,000 | < 100 |
| การเปิดตัวครั้งแรกของเครื่องมือเกิดขึ้นก่อน training cutoff ของโมเดลมากกว่าหนึ่งปีหรือไม่ | ใช่ | ไม่ใช่ หรือใกล้เคียงกับ cutoff |
| ยอดดาวน์โหลดต่อสัปดาห์จาก package manager | > 1 ล้าน | < 10,000 |
ตัวชี้วัดสนับสนุน เช่น Stars และยอดดาวน์โหลดเป็นเพียงข้อมูลอ้างอิง และไม่ควรนำมากำหนดการเลือกเพียงลำพัง การทดสอบโดยตรงมีลำดับความสำคัญสูงสุด และใช้เพียงข้อความเดียว
ตัวอย่างที่ถูกต้อง — CLI ชนะ
# Inspect Git changes; the AI is highly familiar with git
git diff --stat
git log --oneline -10
# Create a PR; gh is extensively represented in training data
gh pr create --title "feat: add batch query for UserService" --body "..."ตัวอย่างที่ถูกต้อง — MCP ชนะ
# The AI has no prior knowledge of a proprietary internal release-system CLI
# and can easily misspell a flag and trigger a retry
# Wrap it as an MCP Tool with a standardized schema describing its parameters and behavior
# The AI must make a structured decision based on the previous result
# Example: query inventory → decide whether to scale based on the structured result
# → call the scaling API
# MCP's structured return value avoids cascading retries caused by CLI-output parsing failures
ตัวอย่างที่ไม่ถูกต้อง
# Mature CLIs such as gh and kubectl are already highly familiar to the AI,
# yet GitHub and Kubernetes MCP servers are installed as well
# The context gains several kilobytes of Tool Definitions without improving call accuracy
# A proprietary internal CLI is called directly without an MCP wrapper
# Every call becomes a gambling loop: guess arguments → receive an error
# → interpret the error → guess again; retry cost becomes uncontrolled
3.7 อ้างอิงไฟล์ด้วยพาธแบบเต็ม (@path)
[บังคับ] เมื่ออ้างอิงไฟล์ ให้ใช้ @ ตามด้วยพาธแบบเต็มหรือแบบสัมพัทธ์ อย่าให้เพียงชื่อไฟล์แล้วปล่อยให้ Agent ไปค้นหาเอง
การให้เพียงชื่อไฟล์จะกระตุ้น workflow แบบ "ค้นหา → อาจต้องยืนยันหลายครั้ง → อ่าน" ในขณะที่พาธแบบเต็มทำให้สามารถระบุตำแหน่งและอ่านไฟล์ได้โดยตรง โปรเจกต์ยิ่งใหญ่ การค้นหาก็ยิ่งแพง
ตัวอย่างที่ถูกต้อง
Review the transaction-handling logic in CreateOrder at @src/order/service.go
Modify the token-validation logic in @internal/auth/middleware.go
ตัวอย่างที่ไม่ถูกต้อง
Review the transaction-handling logic in service.go
Modify the token-validation logic in middleware.go
# The Agent must traverse the project tree, find files with the same name,
# confirm the intended target, and then read it
3.8 ระบุความต้องการทั้งหมดให้ครบถ้วน
[บังคับ] ระบุวัตถุประสงค์ของงาน บริบท และเกณฑ์การยอมรับให้ครบถ้วนในข้อความเดียว หลีกเลี่ยงการขอทีละเล็กทีละน้อยแบบไป-กลับ
ทุกการโต้ตอบใช้ Token ไปกับการประกอบ Context ใหม่ การโหลดประวัติซ้ำ และการยืนยันสถานะใหม่ การขอที่ครบถ้วนในข้อความเดียวมีประสิทธิภาพสูงกว่าการยืนยันแบบเพิ่มทีละส่วนหลายรอบอย่างมีนัยสำคัญ
ตัวอย่างที่ถูกต้อง
Review the CreateOrder function in @src/order/service.go, identify potential defects,
fix them, and write unit tests for the corrected function.
ตัวอย่างที่ไม่ถูกต้อง
User: Take a look at the CreateOrder function
AI: What aspects should I check?
User: See whether it has any bugs
AI: Inventory deduction is not protected by a transaction. Should I fix it?
User: Fix it
AI: The fix is complete. Should I add tests?
User: Yes, add them
3.9 เลือกใช้เครื่องมือมากกว่าการให้เหตุผลของ LLM
[บังคับ] เลือกวิธีการดำเนินการตามลำดับนี้: ใช้เครื่องมือเฉพาะทางที่มีอยู่แล้ว > เขียนสคริปต์ > พึ่งพาการให้เหตุผลของ LLM
คุณค่าหลักของ LLM คือการจัดการกับความไม่แน่นอน — งานที่ต้องการความเข้าใจบริบท การให้เหตุผล การตัดสินใจ และการแลกเปลี่ยน สำหรับการดำเนินการเชิงกลที่มี workflow แบบกำหนดได้และมีกฎที่ชัดเจน ให้เลือกเครื่องมือเฉพาะทางหรือสคริปต์
ตัวอย่างที่ถูกต้อง
# Existing specialized tool: code linting
golangci-lint run ./...
# Existing specialized tool: code formatting
gofmt -w ./src
# Existing specialized tool: database migration
alembic upgrade headตัวอย่างที่ไม่ถูกต้อง
User: Check whether this Go code has formatting problems
AI: Reads every file → analyzes indentation, naming, and import order line by line
→ outputs modification suggestions
# golangci-lint can do this with one command; Agent reasoning is both inefficient
# and vulnerable to misjudgment
User: I need the number of paid machines over the past 30 days, every day
AI: Re-reads the table schema and sample data every day → estimates the count
# Instead, have the AI generate a fixed script and execute it to obtain the result
3.10 โหลดเครื่องมือแบบ Lazy-Load
[แนะนำ] กำหนดค่าเครื่องมือที่ไม่ได้ใช้บ่อยให้โหลดแบบรอได้ (deferred) ด้วย Defer เพื่อไม่ให้นิยามของมันประจำอยู่ใน Context
ตามค่าเริ่มต้น นิยามของเครื่องมือที่ลงทะเบียนไว้ทั้งหมดจะถูกแทรกเข้าไปใน Context ของทุกคำขอ เครื่องมือยิ่งมาก ต้นทุน Token ที่ประจำอยู่ก็ยิ่งมาก CodeBuddy รองรับตัวปรับแต่ง (modifier) Defer(...) สำหรับทำเครื่องหมายเครื่องมือที่ไม่จำเป็นให้โหลดแบบ lazy นิยามของมันจะไม่ปรากฏในรายการเครื่องมือของโมเดล และจะถูกโหลดและเรียกใช้ก็ต่อเมื่อโมเดลค้นพบมันด้วยตนเองผ่าน ToolSearch
ตัวอย่างที่ถูกต้อง — Agent
# .codebuddy/agents/code-reviewer.md
---
name: code-reviewer
description: Code review agent
tools:
- Read
- Grep
- Bash
- Defer(Glob) # Lazy-loaded: discovered through ToolSearch only when file search is needed
- Defer(WebFetch) # Lazy-loaded: triggered only when online documentation is needed
---ตัวอย่างที่ถูกต้อง — CodeBuddy
# Specify lazy-loaded tools when starting the CLI
codebuddy --tools "Read,Edit,Bash,Defer(Glob),Defer(Grep),Defer(WebFetch)"ตัวอย่างที่ถูกต้อง — MCP
{
"mcpServers": {
"mcp-server-tapd": {
"command": "uvx",
"args": ["mcp-server-tapd"],
"defer_loading": true
}
}
}ตัวอย่างที่ไม่ถูกต้อง
---
name: research-agent
description: Conduct research through multiple web search engines
# Omitting a tools declaration enables many built-in CodeBuddy tools by default
---
XXX contentบทที่ 4: Model Routing — อย่าใช้โมเดลราคาแพงกับงานราคาถูก
4.1 จับคู่กับงานก่อน อย่าเพียงเลือกโมเดลที่ถูกที่สุด
Model routing ไม่ได้หมายถึง "ใช้โมเดลที่ถูกที่สุดเสมอ" แต่หมายถึงการจัดประเภทงานให้ถูกต้องเสียก่อน:
- งานที่ซับซ้อน → โมเดลที่ทรงพลัง
- งานที่เรียบง่าย → โมเดลราคาประหยัด
- งานที่ทำซ้ำ → โมเดลที่มีความเสถียร
การออกแบบสถาปัตยกรรมต้องอาศัยการให้เหตุผลหลายขั้นตอน ดังนั้นจงใช้โมเดลราคาแพงเมื่อจำเป็น โมเดลราคาประหยัดก็เพียงพอโดยสมบูรณ์สำหรับการเขียน unit test การเพิ่มคอมเมนต์ หรือการสร้าง commit message ส่วนการจัดหมวดหมู่และการสรุปขนาดใหญ่เหมาะกับโมเดลต้นทุนต่ำหรือการประมวลผลแบบ batch แบบออฟไลน์มากกว่า
4.2 การจับคู่งานกับโมเดล
[บังคับ] เลือกระดับโมเดลที่เหมาะสมตามความซับซ้อนของงาน อย่าใช้โมเดลที่ทรงพลังที่สุดเป็นค่าเริ่มต้นสำหรับทุกงาน
| ประเภทงาน | ระดับโมเดลที่แนะนำ | เหตุผล |
|---|---|---|
| การจัดหมวดหมู่ / การสรุปจำนวนมาก | โมเดลต้นทุนต่ำหรือการประมวลผลแบบ batch | ปริมาณสูงและมีความอ่อนไหวต่อต้นทุนสูง |
| การเขียน unit test | โมเดลน้ำหนักเบา | รูปแบบเสถียร เป็นเทมเพลตสูง และตรวจสอบได้ทันที |
| การสร้าง commit message | โมเดลน้ำหนักเบา | สรุป diff ให้ output สั้น และมีความเสี่ยงต่ำ |
| การจัดรูปแบบโค้ด / การเพิ่มคอมเมนต์ | โมเดลน้ำหนักเบา | มีกฎที่ชัดเจนและเป็นการแปลงรูปแบบเชิงกล |
| การเปลี่ยนชื่อตัวแปร / การ refactor อย่างง่าย | โมเดลน้ำหนักเบา | เป็นการจับคู่รูปแบบเป็นหลักและมีความกำหนดได้สูง |
| การสร้างเอกสาร API | โมเดลน้ำหนักเบา | ดึงนิยามของอินเทอร์เฟซจากโค้ดมาเป็น output แบบเทมเพลต |
| การทบทวนโค้ด (Code Review) | โมเดลระดับกลางถึงสูง | ต้องเข้าใจความตั้งใจของโค้ดและระบุปัญหาที่ลึกขึ้น เช่น ความปลอดภัยของ concurrency และขอบเขตของ transaction |
| การออกแบบสถาปัตยกรรม | โมเดลประสิทธิภาพสูง | ต้องเปรียบเทียบทางเลือก พิจารณาความสามารถในการขยายและกรณีขอบ และทำการให้เหตุผลหลายขั้นตอน |
| การวิเคราะห์ข้อบกพร่องที่ซับซ้อน | โมเดลประสิทธิภาพสูง | ต้องการหลายสมมติฐาน: สรุปสาเหตุรากฐาน → ตรวจสอบเส้นทาง → กำจัดสิ่งรบกวน → ออกแบบวิธีแก้ |
| การทบทวนการออกแบบเชิงเทคนิค | โมเดลประสิทธิภาพสูง | ต้องประเมินความเป็นไปได้ ระบุความเสี่ยงที่อาจเกิดขึ้น และเสนอทางเลือก |
| การ refactor ข้ามโมดูล | โมเดลประสิทธิภาพสูง | ต้องการมุมมองระดับโลกของการพึ่งพากันข้าม service และโมดูล |
| การวิเคราะห์การปรับปรุงประสิทธิภาพ | โมเดลประสิทธิภาพสูง | ต้องระบุคอขวด สรุปสาเหตุ และประเมินประโยชน์ของกลยุทธ์การปรับปรุงที่ต่างกัน |
กฎการตัดสินใจ: หากความถูกต้องสามารถตรวจสอบได้ทันทีหลังจากงานถูกสร้างขึ้น ให้ใช้โมเดลน้ำหนักเบา หากผลลัพธ์ต้องการการวิเคราะห์และการแลกเปลี่ยนซ้ำๆ ให้ใช้โมเดลประสิทธิภาพสูง
4.3 ผูกโมเดลเข้ากับ Skills / Agents / Commands
Model routing ไม่ควรมีอยู่เพียงเป็นกฎในหัวของการสนทนาหลัก แต่ควรถูกนำไปใช้ในหน่วยปฏิบัติการ
ผูกโมเดลเข้ากับ Skills: ผูกโมเดลราคาประหยัดเข้ากับ Skill อย่างชัดเจน สำหรับการเขียน unit test การสร้าง commit การแก้รูปแบบ และการสร้างโค้ดแบบ boilerplate
ใน CodeBuddy เป็นต้น frontmatter ของไฟล์ SKILL.md สามารถประกาศโมเดลและกลยุทธ์ Context ได้โดยตรง:
---
name: XXX
description: XXXX
context: fork
model: deepseek-v4-pro
---ฟิลด์ model ระบุโมเดลที่ Skill ใช้ context: fork รัน workflow ที่ตายตัวนี้ใน Context การปฏิบัติงานแบบแยกส่วน ซึ่งเหมาะสมกับ Skill ที่มีขอบเขตชัดเจนและสามารถทำงานให้สำเร็จได้ด้วยตนเอง สิ่งนี้ทำให้ Skill ที่มีความซับซ้อนต่ำใช้โมเดลราคาประหยัดโดยอัตโนมัติโดยไม่ต้องแบกประวัติทั้งหมดของ session หลัก
ผูกโมเดลเข้ากับ Agents: Agent ก็รองรับการผูกโมเดลผ่านพารามิเตอร์ model เช่นกัน ให้กำหนดโมเดลในนิยามของ Agent เพื่อให้ทุกคนในทีมใช้ระดับที่กำหนดไว้เป็นค่าเริ่มต้น แทนที่จะต้องจำว่าต้องสลับเอง
Planner → Mid-to-high tier
Coder → Mid tier
UnitTest → Inexpensive
Reviewer → Powerful
หมายเหตุ: ใน CodeBuddy คีย์เวิร์ด lite หมายถึงโมเดลราคาประหยัดหรือน้ำหนักเบา โดยจะเลือกโมเดลคู่ที่ต้นทุนต่ำกว่าของโมเดลที่ผู้ใช้เลือกโดยอัตโนมัติ เช่น หากผู้ใช้เลือก deepseek-v4-pro โมเดล lite จะเป็น deepseek-v4-flash ผู้ใช้ยังสามารถตั้งค่าตัวแปรสภาพแวดล้อม CODEBUDDY_SMALL_FAST_MODEL="hy3-ioa" เพื่อระบุโมเดลที่เจาะจงซึ่ง lite แทนได้
frontmatter ต่อไปนี้นิยาม Agent ที่ใช้โมเดลน้ำหนักเบา:
---
name: AgentName
description: XXXX
model: lite
tools: Read, Grep, Glob, Bash
---ผูกโมเดลเข้ากับ Commands: Command หลายตัว เช่น /commit และ /check-ci-status เป็นไปตามเทมเพลตที่ตายตัว และเหมาะสมอย่างยิ่งกับการใช้โมเดลราคาประหยัดที่ตั้งไว้ล่วงหน้า
เมื่อการออกแบบนี้ถูกเข้ารหัสไว้ การกำกับดูแลต้นทุนจะเปลี่ยนจาก "ต้องจำว่าต้องสลับโมเดล" ไปเป็น "ระบบมีความคุ้มทุนเป็นค่าเริ่มต้น" ต่อไปนี้คือตัวอย่างของ Command frontmatter:
---
description: "XXX"
argument-hint: "[message]"
allowed-tools: Bash(git:*)
model: lite
---บทที่ 5: การกำกับดูแล Context และ Output — ทำให้ทุกชั้นมีประสิทธิภาพมากขึ้น
5.1 CLAUDE.md ของ Karpathy: การตัดแต่งอัตโนมัติและจุดยึดเหนี่ยวต้านภาพหลอน
[แนะนำ] หากทีมยังไม่มีข้อตกลงทางเลือกอื่น พิจารณานำ Andrej Karpathy's CLAUDE.md มาใช้ตามความเหมาะสมกับโปรเจกต์
ตำแหน่ง: เทมเพลต CLAUDE.md คุณภาพสูงที่พัฒนาโดยชุมชน ผ่านชุดกฎที่กำหนดไว้ล่วงหน้า มันกำหนดให้โมเดลตัดแต่ง Context ลดคำฟุ่มเฟือย ระงับภาพหลอน และบังคับใช้ข้อตกลงทางวิศวกรรม
CLAUDE.md ของ Andrej Karpathy มุ่งแก้ปัญหาว่าโมเดลควรคิดอย่างไร มันฝังโปรโตคอลการให้เหตุผลที่มีประสิทธิภาพไว้ที่ชั้น System Prompt เพื่อลดการสร้าง Token ที่ไม่จำเป็นตั้งแต่ต้นทาง
5.1.1 คุณค่าหลัก: เหตุใดจึงควรใช้ CLAUDE.md ของ Karpathy?
CLAUDE.md ทั่วไปมักมีเพียงการแนะนำโปรเจกต์ แต่เวอร์ชันของ Karpathy คือ "รัฐธรรมนูญแห่งเศรษฐศาสตร์ Token":
- บังคับให้ output กระชับ (Anti-Bloat)
- ห้ามการทักทายที่ไร้ความหมาย การชื่นชมตนเอง และการยืนยันซ้ำซาก
- กำหนดให้ใช้รายการและตารางแทนข้อความร้อยแก้วยาวๆ
- กำหนดให้โมเดลถามตนเองก่อนตอบว่า: "ข้อมูลนี้จำเป็นต่อการทำงานให้สำเร็จหรือไม่?"
- คำสั่งสำหรับการตัดแต่ง Context
- บอกโมเดลอย่างชัดเจนให้ละเว้นชิ้นส่วนไฟล์ที่ไม่เกี่ยวข้อง เช่น
node_modulesและสิ่งที่ได้จากการ build - สำหรับไฟล์ยาว ให้ใช้
grep/rgเพื่อระบุตำแหน่งเนื้อหาที่เกี่ยวข้องก่อน อย่าเพียงแต่Readทั้งไฟล์
- บอกโมเดลอย่างชัดเจนให้ละเว้นชิ้นส่วนไฟล์ที่ไม่เกี่ยวข้อง เช่น
- การยึดเหนี่ยวเพื่อต้านภาพหลอน (Anti-hallucination grounding)
- กำหนดให้เรียกใช้เครื่องมือ เช่น Read / Search ทุกครั้งที่โมเดลไม่แน่ใจ ห้ามคิดค้นลายเซ็นฟังก์ชันหรือวิธีใช้ API จากความจำ
- ภาพหลอนเป็นหนึ่งในสาเหตุที่ใหญ่ที่สุดของการลองใหม่ กฎของ Karpathy สามารถลดต้นทุนการลองใหม่ที่เกิดจากข้อมูลที่ถูกสร้างขึ้นอย่างมั่นใจได้อย่างมีนัยสำคัญ
- ทำให้ข้อตกลงทางวิศวกรรมเป็นรหัส
- นำรูปแบบโค้ด ข้อตกลงการทำ commit และข้อกำหนดการทดสอบไว้ใน prefix เพื่อไม่ต้องอธิบายซ้ำๆ ซึ่งช่วยเพิ่ม Cache Hit Rate
5.1.2 การรับมาและการติดตั้ง
CLAUDE.md ของ Andrej Karpathy เป็นทรัพยากรแบบโอเพนซอร์สที่ยังคงพัฒนาต่อไปผ่านการสนับสนุนของชุมชน
แหล่งที่มา: https://github.com/multica-ai/andrej-karpathy-skills/blob/main/CLAUDE.md
การติดตั้ง:
- ระดับโปรเจกต์ (แนะนำ): คัดลอกเนื้อหาไปไว้ใน
CLAUDE.mdหรือCODEBUDDY.mdที่รากของโปรเจกต์ หรือไว้ในไดเรกทอรีrules; - ระดับ Global: รวมเนื้อหาเข้ากับไฟล์คอนฟิกส่วนกลาง เช่น
~/.claude/CLAUDE.mdเพื่อให้มีผลกับทุกโปรเจกต์
หมายเหตุ: เนื่องจากไฟล์นี้เปลี่ยนพฤติกรรมเริ่มต้นของโมเดล ให้ตรวจสอบการอัปเดต เดือนละครั้ง
5.1.3 ตัวอย่างกฎทั่วไป — บางส่วน
ตัวอย่างต่อไปนี้แสดงให้เห็นว่ากฎสไตล์ Karpathy ใช้ข้อจำกัดเพื่อประหยัด Token อย่างไร:
---
# Global response strategy
- Minimalism: Unless an explanation is requested, output only code blocks. Do not
include pleasantries such as "Okay" or "Let me help you."
- Determinism: If the Read tool returns empty or no results, stop and report an
error immediately. Do not guess the file contents.
- Tools first: When a task concerns file content, code definitions, or Git status,
call a tool. Never guess based on memory.
# Context management
- Search before reading: In an unfamiliar codebase, use Grep/Glob before deciding
what to Read.
- Line limits: When reading a file, specify `offset` and `limit`; read no more than
200 lines by default.
- Focus changes: After modifying code, show only the relevant diff. Do not repeat
the entire file.
# Output format
- Present information with Markdown lists and tables.
- Include necessary comments in code snippets, but remove redundant sample output.
---
# Project-specific rules: insert the project's architecture, technology stack,
# and special conventions here5.2 RTK — Rust Token Killer
[แนะนำ] ลดปริมาณ output ของเครื่องมือและการใช้ Token อย่างรวดเร็ว
ตำแหน่ง: สกัดกั้น output ของคำสั่ง shell และบีบอัดก่อนที่ Agent จะเห็น มันบีบอัดเฉพาะ output ของ CLI ไม่ใช่ Prompt หรือโค้ด
5.2.1 การติดตั้ง RTK
# 1. Install the internal fork; Rust must already be installed
git clone https://git.woa.com/godwinchen/rtk.git
cd rtk && cargo install --path .
rtk init --global --agent codebuddy # Install the hook to intercept all commands transparently
rtk gain # Confirm that savings data is available5.2.2 การใช้งาน RTK
ตัวอย่างคำขอ: Push การเปลี่ยนแปลงของโค้ด
Output ปกติ (~80 tokens):
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 10 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 2.34 KiB | 2.34 MiB/s, done.
Total 8 (delta 5), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (5/5), completed with 3 local objects.
To github.com:org/repo.git
abc1234..def5678 main -> main
Output ของ RTK (3 tokens):
ok main
ตัวอย่างคำขอ: ตรวจสอบว่าการทดสอบผ่านหรือไม่
Output ปกติ (~2,500 tokens):
PASS src/utils.test.ts
PASS src/config.test.ts
...
PASS src/chain.test.ts
FAIL src/order.test.ts > should handle empty cart
AssertionError: expected 400 got 500
at Object.<anonymous> (src/order.test.ts:42:17)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Promise (src/order.test.ts:38:3)
at async Context.<anonymous> (src/order.test.ts:35:5)
FAIL src/auth.test.ts > expired token
Error: timeout of 2000ms exceeded
at Object.<anonymous> (src/auth.test.ts:18:12)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Promise (src/auth.test.ts:14:3)
Test Suites: 2 failed, 43 passed, 45 total
Tests: 2 failed, 178 passed, 180 total
Snapshots: 0 total, 0 failed
Time: 12.345 s
Ran all test suites.
Output ของ RTK (~30 tokens):
FAIL 2/45 tests
src/order.test.ts > should handle empty cart → expected 400 got 500
src/auth.test.ts > expired token → timeout
5.3 Caveman
Caveman เป็นปลั๊กอินบีบอัด output สำหรับ AI coding Agent กฎใน Prompt ทำให้โมเดลตอบกลับแบบ "มนุษย์ถ้ำอัจฉริยะ": ตัดคำฟุ่มเฟือยและมารยาททางสังคมออกไป ในขณะที่ยังคงรักษาข้อเท็จจริงทางเทคนิคไว้
5.3.1 การติดตั้ง Caveman
หากคุณใช้เครื่องมือเขียนโค้ดด้วย AI อื่นที่ไม่ใช่ Claude Code หรือ Codex ให้ติดตั้ง Caveman ด้วยคำสั่งต่อไปนี้:
# macOS · Linux · WSL · Git Bash
curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash
# Windows · PowerShell 5.1+
irm https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.ps1 | iexCodeBuddy ยังไม่มีการสนับสนุนอย่างเป็นทางการ ดังนั้นให้ใช้ fork รันคำสั่งต่อไปนี้ใน CodeBuddy:
/plugin marketplace add https://github.com/studyzy/caveman
# Select the caveman plugin after running the command. The system returns:
# ⎿ ✓ Added marketplace: caveman
# ⎿ ✓ Installed caveman. Restart CodeBuddy Code to load new plugins.
5.3.2 การใช้งาน Caveman
หลังจากติดตั้ง Caveman ถูกต้องแล้ว CodeBuddy จะแสดงข้อความต่อไปนี้เมื่อเริ่มทำงาน:
Hook SessionStart
CAVEMAN MODE ACTIVE — level: full
Respond terse like smart caveman. All technical substance stay. Only fluff die.
……
Caveman มีสี่โหมดโดยมีการบีบอัดที่แรงขึ้นตามลำดับ:
/caveman lite: ตัดคำฟุ่มเฟือยออกไปในขณะที่ยังคงรักษา article และสไตล์ที่เป็นทางการ เหมาะกับ output ที่เป็นทางการ/caveman(full, ค่าเริ่มต้น): ตัด article ออกและใช้ประโยคแบบ fragment เพื่อสมดุลระหว่างการบีบอัดกับความอ่านง่าย/caveman ultra: การบีบอัดขั้นสุดด้วยห่วงโซ่เชิงเหตุปัจจัยแบบA → B → C/caveman wenyan: โหมดภาษาจีนโบราณ ซึ่งในทางทฤษฎีเป็นรูปแบบการเขียนที่ประหยัด Token ที่สุด
ตัวอย่างผลลัพธ์ในโหมด full:
คำถาม: เหตุใด React component จึง re-render ตลอดเวลา?
Output ปกติ (69 tokens):
The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle...
Output ของ Caveman (19 tokens):
New object ref each render. Inline object prop = new ref = re-render. Wrap in useMemo.
5.4 Ponytail
แก่นของ Ponytail ไม่ใช่ "วิธีเขียนโค้ด" แต่เป็นสิ่งที่ต้องพิจารณาก่อนเขียนโค้ด มันนิยามลำดับการตัดสินใจที่เข้มงวด:
Level 1: Does this really need to be built? (YAGNI)
Level 2: Does the codebase already contain it? Reuse it
Level 3: Can the standard library do it? Use it
Level 4: Does the browser / operating system provide it natively? Use it
Level 5: Is it available in an already-installed dependency? Use it
Level 6: Can it be done in one line? Write one line
Level 7: Only if none of the above works, write the minimum amount of new code
แต่ละระดับคือด่านตรวจ การไปถึงระดับ 7 หมายถึงการเริ่มเขียนโค้ดจริงๆ แต่ความต้องการส่วนมากจะถูกหยุดไว้ที่ระดับก่อนหน้า วิศวกรที่มีประสบการณ์จะไม่สร้างไฟล์ใหม่ทันที — พวกเขาจะ grep หาวิธีแก้ที่มีอยู่แล้วใน codebase ก่อน
5.4.1 การติดตั้ง Ponytail
รันคำสั่งต่อไปนี้ในบรรทัดคำสั่งของ CodeBuddy หรือ Claude Code:
/plugin marketplace add https://github.com/studyzy/ponytail
# After adding the marketplace, select the ponytail plugin.
# If you did not select it, run:
/plugin install ponytail@ponytail
5.4.2 การใช้งาน Ponytail
Ponytail เป็นเครื่องมือ prompt engineering โดยพื้นฐาน มันแทรก Prompt เข้าไปใน Context ปัจจุบันเพื่อเตือน LLM ไม่ให้เสีย Token ไปกับการสร้างโค้ดที่ซ้ำซ้อน
Ponytail ทำมากกว่าการสนับสนุนให้เขียนโค้ดให้น้อยลง มันยังมีชุดคำสั่งย่อยที่ใช้งานได้จริง:
| คำสั่ง | วัตถุประสงค์ |
|---|---|
/ponytail-review |
ทบทวนการเปลี่ยนแปลงปัจจุบันว่ามีการออกแบบที่ซับซ้อนเกินไปหรือไม่ และสร้างรายการโค้ดที่สามารถลบออกได้ |
/ponytail-audit |
สแกนทั้ง repository หาการออกแบบที่ซับซ้อนเกินไป — เสมือนเป็นการตรวจสุขภาพของ codebase |
/ponytail-debt |
แสดงรายการหนี้ทางเทคนิคทั้งหมดที่ทำเครื่องหมายด้วยคอมเมนต์ ponytail: พร้อมแนวทางการแก้ไข |
/ponytail-gain |
แสดงผลการประหยัดที่เป็นตัวเลขจาก Ponytail ทั้งด้านโค้ด ต้นทุน และเวลา |
/ponytail-help |
แสดงข้อมูลอ้างอิงแบบย่อของคำสั่งทั้งหมดที่มี |
คำสั่งย่อยเหล่านี้ขยาย Ponytail จาก "ป้องกันการออกแบบที่ซับซ้อนเกินไปขณะเขียนโค้ด" ไปเป็น "ทบทวนโค้ด + จัดการหนี้ทางเทคนิค + วัดผลประโยชน์" มันไม่ใช่เพียง Prompt อีกต่อไป แต่เป็น ชุดเครื่องมือสำหรับการปรับปรุงคุณภาพโค้ดอย่างต่อเนื่อง
5.5 การเปรียบเทียบเครื่องมือทั้งสี่
| เครื่องมือ | ตำแหน่ง | สิ่งที่มันบีบอัด | ชั้น | ผลกระทบต่อต้นทุน |
|---|---|---|---|---|
| Karpathy's CLAUDE.md | กฎด้านพฤติกรรมและจุดยึดเหนี่ยวต้านภาพหลอน | แนวทางการให้เหตุผลของโมเดล แนวโน้มของ output และกลยุทธ์การค้นคืน | System Prompt ซึ่งเป็นชั้นต้นน้ำ | ลด Output และการลองใหม่; เพิ่ม Cache Hit Rate |
| RTK | ตัวกรอง output ของ shell | output ของ CLI เช่น git status, test, ls และ docker |
ชั้น Tool Output | ลดต้นทุนการไป-กลับของเครื่องมือได้อย่างมาก |
| Caveman | ตัวบีบอัดสไตล์การตอบกลับของ AI | คำฟุ่มเฟือย คำสุภาพ และการอธิบายซ้ำใน output ของโมเดล | ชั้น Output | ลด Output และภาระของประวัติ |
| Ponytail | เอนจินลดปริมาณโค้ด | โค้ดที่ไม่ควรถูกสร้างขึ้น ทำหน้าที่เป็นผู้บังคับใช้ YAGNI | ชั้น Logic / Generation | ลด Output และต้นทุนการบำรุงรักษา |
สรุปเครื่องมือละหนึ่งประโยค:
- Karpathy's CLAUDE.md ทำให้ Agent คิดให้ชัดก่อนลงมือทำ
- RTK บีบอัดสิ่งที่ Agent เห็น
- Caveman บีบอัดสิ่งที่ Agent พูด
- Ponytail บีบอัดโค้ดที่ Agent เขียน
เครื่องมือทั้งสี่ครอบคลุมมิติของการบีบอัดที่ต่างกัน และสามารถนำมารวมกันเป็น pipeline ที่สมบูรณ์ได้:
Agent calls a command
↓
RTK (first stage: compress CLI command output)
↓
LLM receives clean input
↓
Ponytail (controls what to write: do not write unnecessary code)
+
Caveman (controls how to say it: remove unnecessary prose)
↓
Compressed output is returned to the user
บทที่ 6: การทำงานร่วมกันของ Multi-Agent — ขอบเขตที่ชัดเจนช่วยประหยัด Token
6.1 เหตุใด Agent เดี่ยวจึงแพงขึ้นเมื่อเวลาผ่านไป
สาเหตุหลัก: Transformer ไม่มีความจำ
สถาปัตยกรรม Transformer ที่ LLM ใช้งานไม่มีความจำข้ามรอบ ในทุกๆ รอบ จะต้องส่ง "System Prompt + ประวัติการสนทนา + input ปัจจุบัน" ที่สมบูรณ์ไปยังโมเดลอีกครั้ง ซึ่งหมายความว่า:
Turn 1: Context = System Prompt
Turn 2: Context = System Prompt + turn 1
Turn 3: Context = System Prompt + turn 1 + turn 2
...
Turn N: Context = System Prompt + all previous N-1 turns
การเพิ่มข้อมูลที่ไม่เกี่ยวข้องมากเกินไปยังลดคุณภาพของการตอบกลับด้วย งานวิจัยได้แสดงให้เห็นซ้ำๆ ผ่านปรากฏการณ์ "Lost in the Middle": โมเดลให้ความสนใจกับข้อมูลที่อยู่ตรงกลางของ Context น้อยที่สุด Context Engineering ที่ดีไม่ใช่การแทรกข้อมูลให้มากที่สุดเท่าที่จะทำได้ แต่คือการเลือกข้อมูลที่จำเป็นในขณะนี้อย่างระมัดระวัง
6.2 Subagents: รูปแบบการแยกงานที่มีต้นทุนต่ำที่สุด
เหตุใด Subagents จึงประหยัด Token?
กลไกหลัก: Subagent มี Context แบบแยกส่วนและใช้ครั้งเดียว การเติบโตแบบกำลังสองถูกจำกัดไว้ภายใน Subagent ในขณะที่ประวัติของ Agent หลักเติบโตเชิงเส้น
API ของ LLM เป็นแบบ stateless และทุกการเรียกเครื่องมือจะส่งประวัติที่สมบูรณ์กลับไปใหม่ ดังนั้นวิธีที่ประวัติสะสมจึงเป็นตัวกำหนดว่าการใช้ Token จะเติบโตแบบเชิงเส้นหรือแบบกำลังสอง
ตัวอย่างที่ไม่ถูกต้อง
อย่ามอบหมายงาน; ทำทุกอย่างในบทสนทนาของ Agent หลัก:
Main Agent: Poll N×K times → read entire large files → process intermediate artifacts
Every message resends all preceding history
⇒ Main history is O(N×K), and every turn resends it in full
⇒ Total tokens ≈ O((N×K)²), quadratic growth
ตัวอย่างที่ถูกต้อง
มอบหมายงานหนักให้ Subagent:
Subagent: Poll N×K times → read entire large files → process intermediate artifacts
This remains in the Subagent's one-time context and does not enter main history
Main Agent: Receive only a concise result for each task, with no intermediate artifacts
⇒ Main history is O(N), adding only one result per task
⇒ Total tokens ≈ O(N), linear growth
ความเสี่ยงที่ Subagents นำมา
การประหยัด Token หมายถึงการมอบงานหนักให้ Agent แบบ "กล่องดำ" Agent หลักมองไม่เห็นกระบวนการขั้นกลางของมัน ซึ่งขยายผลกระทบของความล้มเหลวหรือการรายงานที่เป็นเท็จ มีความเสี่ยงสี่ประเภทและการควบคุมที่สอดคล้องกัน:
- ความล้มเหลวแบบเงียบ (Silent failure): Subagent พบปัญหาด้านสภาพแวดล้อม เช่น โปรเซสไม่ยอมเริ่มทำงานหรือได้ artifact ที่ว่างเปล่า แต่ส่งกลับข้อความที่ดูเหมือนทำงานเสร็จปกติ Agent หลักยอมรับผลลัพธ์ที่ใช้ไม่ได้ซึ่งดูเหมือนสำเร็จอย่างผิดๆ
- → รัน health gate สำหรับทุกงาน: Agent หลักตรวจสอบด้วยตนเองว่า artifact มีอยู่จริง ไม่ว่างเปล่า และมีเครื่องหมายการเสร็จสิ้นตามที่คาดหวัง อย่าเชื่อเพียงข้อความของ Subagent
- การกล่าวอ้างที่ไม่มีหลักฐานสนับสนุน: Subagent บอกว่า "เสร็จแล้ว" โดยไม่มีหลักฐานที่เป็นปรนัย ทำให้ไม่สามารถตรวจสอบผลลัพธ์ได้
- → ทุกผลลัพธ์ต้องมีหลักฐานที่ตรวจสอบได้ เช่น ไฟล์ที่มีอยู่จริง, exit code, หรือบรรทัดสถานะ อย่าอ้างว่างานเสร็จจนกว่าหลักฐานจะปรากฏ
- การส่งงานแบบขนานโดยไม่มีการจัดการการเสร็จสิ้นแบบรวมศูนย์: การเปิดงานย่อยแบบ synchronous หลายงานพร้อมกันเป็นสิ่งที่ทำได้ แต่ผลลัพธ์อาจผิดเพี้ยนหรือสูญหายหากไม่ได้ตรวจสอบทีละงานและปิดงานร่วมกัน
- → อนุญาตให้มอบหมายงานแบบขนานได้ สิ่งสำคัญคือ การจัดการการเสร็จสิ้นแบบรวมศูนย์ ให้ตรวจสอบแต่ละผลลัพธ์หลังส่งงาน แล้วจึงสร้างบทสรุปโดยรวม อย่ายอมรับการรายงานตนเองของ Subagent โดยไม่ตรวจสอบ
- การถอยกลับแบบสุ่มสี่สุ่มห้า (Blind fallback): การมอบหมายงานใหม่หรือการลองใหม่โดยอัตโนมัติหลังเกิดความล้มเหลว ทำให้สาเหตุรากฐานเดียวกันล้มเหลวซ้ำๆ และใช้ Token ต่อไปเรื่อยๆ
- → เมื่อล้มเหลว ให้ตัดสินใจก่อน แทนที่จะถอยกลับโดยอัตโนมัติ หากความล้มเหลวเป็นแบบเป็นระบบ ให้หยุด workflow และป้องกันการลองใหม่เพิ่มเติม ใช้ fallback เฉพาะกับความล้มเหลวที่เกิดเป็นครั้งคราวและกู้คืนได้ และกำหนดขีดจำกัดแบบ hard limit ไว้ล่วงหน้า: ลองใหม่ได้ไม่เกินสองครั้ง, ระยะเวลา polling สูงสุด, และกฎให้ข้ามงานเมื่อถึงขีดจำกัด รักษาความพยายามที่ใช้ในการได้ผลลัพธ์ให้อยู่ในขอบเขต แทนที่จะพยายามชุบชีวิตงานขึ้นมาอย่างไม่สิ้นสุด
หลักการกำกับดูแล: ตัดสินใจก่อน แล้วจึงใช้ fallback และบังคับใช้ขีดจำกัดแบบ hard limit ไม่ว่าจะเลือกเส้นทางใด การสูญเสีย Token ก็ยังคงเป็นเชิงเส้นและอยู่ในขอบเขต
บทที่ 7: การทำงานร่วมกันของทีม — จากการประหยัดระดับบุคคลสู่การประหยัดระดับองค์กร
7.1 ขีดจำกัดสูงสุดของการปรับปรุงระดับบุคคล
เทคนิคการปรับปรุงการใช้ Token ที่บุคคลหนึ่งทำได้นั้นค่อนข้างสมบูรณ์แล้ว:
| เทคนิค | หลักการ | การประหยัดต่อการใช้หนึ่งครั้ง |
|---|---|---|
| การอ่านไฟล์แบบแม่นยำโดยระบุช่วงบรรทัด | หลีกเลี่ยงการเททั้งไฟล์ลงใน Context | 500–2,000 tokens |
| มอบหมายการค้นหาขนาดใหญ่ให้ Subagent | เก็บการประมวลผลไว้ใน Subagent และส่งกลับเฉพาะบทสรุป | 3,000–10,000 tokens |
| ทำงานต่อเนื่องภายใน 5 นาที | Prompt Cache hit ลดต้นทุน Input ลงเหลือหนึ่งในสิบ | 80%–90% ของต้นทุน Input |
กรอง output ของคำสั่งด้วย head / grep / jq |
จำกัดเนื้อหาที่ส่งกลับมาให้แคบลง | 500–5,000 tokens |
เทคนิคเหล่านี้ให้ผลตอบแทนเชิงเส้น แต่ละคนสำรวจ Prompt ที่ดีที่สุดด้วยตนเอง พบกับหลุมพรางเดียวกัน และสั่งสมความรู้เดียวกัน ในทีมสิบคน หลุมพรางเดียวกันอาจถูกพบถึงสิบครั้ง และแนวปฏิบัติที่ดีที่สุดเดียวกันอาจถูกค้นพบใหม่โดยอิสระถึงสิบครั้ง
สูตรการทวีคูณสำหรับการทำงานร่วมกันของทีม:
Team savings = one-time optimization investment × number of users × average daily usage frequency
หากการขัดเกลา Skill หนึ่งตัวใช้เวลาสองชั่วโมง และมีสิบคนใช้งานคนละสามครั้งต่อวัน การลงทุนสองชั่วโมงนั้นจะส่งมอบคุณค่าผ่านการใช้งาน 30 ครั้งในทุกๆ วัน
7.2 สร้างและแบ่งปันทรัพยากรของทีม
7.2.1 ทรัพยากรที่ใช้ร่วมกันหกประเภท
| ประเภททรัพยากร | นิยาม | วงจรชีวิต | ผลกระทบต่อ Token |
|---|---|---|---|
| Skills | คำสั่ง workflow ที่นำกลับมาใช้ซ้ำได้ เช่น TDD, Code Review และ Deep Research | ได้รับการบำรุงรักษาในระยะยาว | โหลดประมาณ 500–3,000 tokens ทุกครั้งที่ถูก trigger |
| Rules | ข้อจำกัดด้านพฤติกรรม เช่น จรรยาบรรณการเขียนโค้ดและประสิทธิภาพการใช้ Token | เสถียรและเปลี่ยนแปลงไม่บ่อย | ถูกส่งไปพร้อมกับ System Prompt ในทุกๆ รอบ |
| MCP | โปรโตคอลสำหรับบริการเครื่องมือภายนอก เช่น การสอบถามฐานข้อมูล การเรียก API และการเข้าถึงระบบไฟล์ | ถูกคอนฟิกตามโปรเจกต์ / workspace และค่อนข้างเสถียร | สคีมาของเครื่องมือยังคงอยู่ใน System Prompt; ผลการเรียกถูกแทรกเข้าไปใน Context |
| Plugins | ส่วนขยายความสามารถของ IDE / Agent runtime หรือโมดูลประมวลผลผลลัพธ์ | ติดตั้ง / เปิดใช้งานตามต้องการและอัปเดตเป็นระยะ | การประกาศปลั๊กอินมักประจำอยู่; ผลการปฏิบัติงานถูกแทรกตามต้องการ |
| Docs | เอกสารอ้างอิง เช่น แผนภาพสถาปัตยกรรมและข้อกำหนด API | อัปเดตตามความจำเป็น | โหลดก็ต่อเมื่อมีการอ้างอิงถึง |
| Learnings | บทเรียนและแนวปฏิบัติที่ดีที่สุดที่ถูกบันทึกไว้ | สั่งสมอย่างต่อเนื่อง | ถูกแทรกก็ต่อเมื่อการ recall พบสิ่งที่ตรงกัน |
7.2.2 กลไกที่ทำให้ทรัพยากรที่ใช้ร่วมกันทำงานได้
เพื่อสร้างคุณค่าในระดับองค์กร ทรัพยากรที่ใช้ร่วมกันต้องทำมากกว่าแก้ปัญหา "จัดเก็บ แจกจ่าย และทำให้ค้นหาได้" ระบบยังต้องมั่นใจว่าประสบการณ์ใหม่ๆ ยังคงเข้าสู่ชั้นที่ใช้ร่วมกันต่อไป ดังนั้นจึงต้องครอบคลุมความสามารถห้าประการ:
- การจัดเก็บแบบรวมศูนย์: จัดการทรัพยากรที่ใช้ร่วมกันใน repository เดียว
- การควบคุมเวอร์ชัน: ทำให้ทุกการเปลี่ยนแปลงสามารถติดตามและทบทวนได้
- การแจกจ่ายด้วยต้นทุนต่ำ: ให้สมาชิกทีมได้รับทรัพยากรล่าสุดโดยอัตโนมัติ
- การเรียกคืนตามต้องการ: นำประสบการณ์ในอดีตขึ้นมาแสดงภายในงานที่เจาะจง
- การบันทึกแบบเพิ่มทีละส่วน: ค้นพบและขัดเกลาบทเรียนจากงานประจำวัน แล้วเพิ่มเข้าไปในกลุ่มทรัพยากรที่ใช้ร่วมกันของทีม
7.2.3 แนะนำ TeamAI CLI สำหรับการจัดการและแจกจ่ายทรัพยากรของทีม
TeamAI CLI แสดงให้เห็นว่ากลไกทั้งห้านี้สามารถถูกนำไปปฏิบัติได้อย่างไร มันไม่เพียงซิงโครไนซ์และนำทรัพยากรของทีมกลับมาใช้ซ้ำ แต่ยังบันทึกความรู้ใหม่ที่เกิดจากงานวิศวกรรมประจำวันอย่างต่อเนื่อง
GitHub: https://github.com/Tencent/teamai-cli
การเปรียบเทียบแนวทางการจัดการและแจกจ่ายทรัพยากรของทีม:
| การดำเนินการ | TeamAI CLI | ทางเลือกอื่น |
|---|---|---|
| ดึงทรัพยากรของทีม | teamai pull |
Git submodule + การคัดลอกด้วยมือ |
| ส่งมอบ Skill ใหม่ | teamai push |
เปิด PR กับ repository ของทีมโดยตรง |
| แบ่งปันบทเรียน | teamai contribute --title "..." --file ./learning.md |
เขียนหน้า Wiki + แจ้งเตือนในกลุ่มแชท |
| ค้นหาความรู้ของทีม | teamai recall "keyword" |
ค้นหาใน Confluence |
| สมัครรับข้อมูลข้ามทีม | teamai source add <name> <repo-url> |
ทำ Fork + cherry-pick |
7.2.3.1 กลไกการแจกจ่ายและการจัดเก็บ
Team member A contributes a Skill
↓ push (creates a PR, merged after review)
Team Repo (Git repository)
↓ pull (triggered automatically at CodeBuddy SessionStart)
AI tools used by team members B/C/D... automatically receive the Skill
การออกแบบหลัก: Git คือฐานข้อมูล ทรัพยากรที่ใช้ร่วมกันทั้งหมดถูกจัดเก็บพร้อมประวัติเวอร์ชันใน Git repository เดียว push / pull ให้การไหลแบบสองทิศทาง และการทบทวน PR ให้การควบคุมคุณภาพ
7.2.3.2 โมเดลผลประโยชน์ด้าน Token
- การนำ Skill กลับมาใช้ซ้ำ: หลีกเลี่ยงการลองผิดลองถูกกับ Prompt ซ้ำๆ โดยทุกคน Skill ที่พัฒนาจนสมบูรณ์แล้วช่วยประหยัดประมาณ 2,000 tokens ต่อการใช้หนึ่งครั้ง โดยตัดรอบของการทดลอง การปรับแต่ง และการรันใหม่ออกไป ในทีมสิบคนที่ใช้งานคนละสามครั้งต่อวัน นั่นคือ 60,000 tokens ต่อวัน
- การแทรก Rules: ข้อจำกัดด้านพฤติกรรมที่เป็นหนึ่งเดียวลดรอบการทำงานซ้ำลงประมาณ 40% ทุกรอบการทำงานซ้ำจะส่ง Context ที่สมบูรณ์กลับไปใหม่ ประมาณ 8,000–20,000 tokens
- การเรียกคืน Learnings: เรียกคืนประสบการณ์ก่อนหน้าโดยอัตโนมัติและหลีกเลี่ยงการดีบักซ้ำซ้อน การดีบักหนึ่งครั้งโดยทั่วไปใช้ 5–10 รอบ × 15,000 tokens ต่อรอบ = 75,000–150,000 tokens หากการ recall ทำให้ทีมสามารถข้ามมันไปได้ จำนวนทั้งหมดนี้คือสิ่งที่ประหยัดได้
7.2.3.3 การบันทึกประสบการณ์แบบเพิ่มทีละส่วน
การสรุปประสบการณ์ด้วยมือและการเขียนเอกสาร Wiki ต้องใช้แรงงานคนจำนวนมาก การควบคุมเวอร์ชันและรูปแบบก็ทำได้ยากเช่นกัน ดังนั้นบทเรียนจำนวนมากจึงไม่ได้เข้าไปอยู่ในเอกสารหรือ Wiki ตามธรรมชาติ และหายไปเฉยๆ หลังจากการแก้ปัญหา การซ่อม หรือการดีบัก
TeamAI มี hook contribute-check ที่ถูก trigger โดยอัตโนมัติ ซึ่งตรวจจับบทเรียนที่ควรค่าแก่การเก็บรักษาและแจ้งให้ผู้ใช้ส่งมอบมัน นอกจากนี้ยังสามารถสร้างบทเรียนจากประวัติ session ซึ่งลดความพยายามที่ต้องใช้ในการบันทึกความรู้ใหม่ สิ่งนี้ทำให้ฐานความรู้ของทีมไม่เพียงแจกจ่ายทรัพยากรที่มีอยู่ แต่ยังดูดซับความรู้ใหม่อย่างต่อเนื่อง
บทที่ 8: บทสรุป
8.1 หลักการ 5 ข้อ
- วัดผลก่อน แล้วจึงปรับปรุง
- อย่าแก้ปัญหาซ้ำในสิ่งที่สามารถบันทึกเป็นทรัพยากรได้
- prefix ที่เสถียรเป็นสิ่งจำเป็นต่อการแคชที่มีประสิทธิภาพ
- คุณภาพของ Context สำคัญกว่าปริมาณของ Context
- ความสอดคล้องของทีมสำคัญกว่าความสมบูรณ์แบบของบุคคล
8.2 สูตรหลักที่ปรับปรุงใหม่
Lower cost =
less repeated context
+ more appropriate model routing
+ more precise code retrieval
+ clearer Agent responsibilities
+ measurable, continuous optimization
+ organization-wide asset reuse
8.3 ข้อแนะนำระยะยาวสามประการ
- ทำให้การวัดผลเป็นส่วนหนึ่งของความเคยชินของทีม
- ทำให้การบันทึกทรัพยากรเป็นการกระทำเริ่มต้น
- ตั้งการตัดสินใจด้านการปรับปรุงบนข้อมูล ไม่ใช่สัญชาตญาณ
สัญญาอนุญาต
เอกสารนี้เผยแพร่ภายใต้ MIT License
💬 มีคำถาม? ช่วยสร้างสิ่งนี้ไปด้วยกัน
มุมสำหรับการมีส่วนร่วม: เปิด Issue เพื่อแจ้งข้อผิดพลาดหรือข้อเสนอแนะใดๆ หรือเปิด MR เพื่อแบ่งปันแนวปฏิบัติการปรับปรุงการใช้ Token ของคุณเอง