# ทำไม Tools ถึงแสดงก่อน?

ในแผง Context ของ cc-viewer **Tools จะปรากฏก่อน System Prompt และ Messages** ลำดับนี้สะท้อนให้เห็นถึง **ลำดับ prefix ของ KV-Cache ใน Anthropic API** อย่างแม่นยำ

## ลำดับ prefix ของ KV-Cache

เมื่อ Anthropic API สร้าง KV-Cache จะเชื่อมต่อบริบทเป็น prefix ตาม **ลำดับที่ตายตัว** นี้:

```
┌─────────────────────────────────────────────────┐
│ 1. Tools (JSON Schema definitions)               │  ← Start of cache prefix
│ 2. System Prompt                                 │
│ 3. Messages (conversation history + current turn)│  ← End of cache prefix
└─────────────────────────────────────────────────┘
```

หมายความว่า **Tools อยู่ก่อน System Prompt ที่จุดเริ่มต้นของ cache prefix**

## ทำไม Tools จึงมีน้ำหนักใน cache มากกว่า System?

ในการจับคู่ prefix ของ KV-Cache **เนื้อหาที่อยู่ก่อนหน้ามีความสำคัญมากกว่า** — การเปลี่ยนแปลงใดๆ จะทำให้ทุกอย่างที่ตามมาเป็นโมฆะ:

1. **การจับคู่ prefix เริ่มต้นจากจุดเริ่มต้น**: KV-Cache เปรียบเทียบคำขอปัจจุบันกับ prefix ที่แคชไว้ทีละ token จากจุดเริ่มต้น เมื่อพบความไม่ตรงกัน เนื้อหาทั้งหมดที่ตามมาจะถูกทำให้เป็นโมฆะ

2. **Tools เปลี่ยน = cache ทั้งหมดเป็นโมฆะ**: เนื่องจาก Tools อยู่ก่อน การเปลี่ยนแปลงใดๆ ในนิยามของเครื่องมือ (แม้แต่การเพิ่มหรือลบ MCP tool เพียงอันเดียว) จะ **ทำลาย prefix จากจุดเริ่มต้น** ทำให้ System Prompt และ Messages ที่แคชไว้ทั้งหมดเป็นโมฆะ

3. **System เปลี่ยน = cache ของ Messages เป็นโมฆะ**: System Prompt อยู่ตรงกลาง ดังนั้นการเปลี่ยนแปลงจึงทำให้เฉพาะส่วน Messages ที่ตามมาเป็นโมฆะ

4. **Messages เปลี่ยน = ส่งผลเฉพาะส่วนท้าย**: Messages อยู่ท้ายสุด ดังนั้นการเพิ่มข้อความใหม่จะทำให้เฉพาะส่วนท้ายเล็กๆ เป็นโมฆะ — cache ของ Tools และ System ยังคงสมบูรณ์

## ผลกระทบในทางปฏิบัติ

| ประเภทการเปลี่ยนแปลง | ผลกระทบต่อ cache | สถานการณ์ทั่วไป |
|----------------------|-----------------|-----------------|
| เพิ่ม/ลบ Tool | **เป็นโมฆะทั้งหมด** | เชื่อมต่อ/ตัดการเชื่อมต่อ MCP server, เปิด/ปิด IDE plugin |
| เปลี่ยน System Prompt | สูญเสีย cache ของ Messages | แก้ไข CLAUDE.md, การฉีด system reminder |
| เพิ่มข้อความใหม่ | เพิ่มเฉพาะส่วนท้ายเท่านั้น | การสนทนาปกติ (พบบ่อยที่สุด, ถูกที่สุด) |

นี่คือเหตุผลที่ `tools_change` ใน [CacheRebuild](CacheRebuild.md) มักเป็นเหตุผลของการสร้างใหม่ที่แพงที่สุด — มันทำลายห่วงโซ่ prefix ตั้งแต่ด้านหน้าสุด

## ทำไมคำจำกัดความเครื่องมือถึงอยู่ก่อน "สมอง"?

จากมุมมองของแคช การที่ Tools อยู่ก่อนเป็นข้อเท็จจริงทางเทคนิค แต่จากมุมมองของการออกแบบเชิงปัญญา ลำดับนี้ก็มีเหตุผลเท่าเทียมกัน — **Tools คือมือและเท้า, System Prompt คือสมอง**

ก่อนลงมือทำ คนเราต้องรับรู้ก่อนว่ามีแขนขาและเครื่องมืออะไรใช้ได้บ้าง ทารกไม่ได้เข้าใจกฎของโลก (System) ก่อนแล้วค่อยเรียนรู้การหยิบจับ — พวกเขารับรู้ก่อนว่ามีมือและเท้า จากนั้นค่อยๆ เข้าใจกฎผ่านการมีปฏิสัมพันธ์กับสิ่งแวดล้อม เช่นเดียวกัน LLM ต้องรู้ว่าเรียกใช้เครื่องมืออะไรได้บ้าง (อ่านไฟล์ เขียนโค้ด ค้นหา รันคำสั่ง) ก่อนได้รับคำสั่งงาน (System Prompt) เพื่อจะได้ประเมินได้อย่างแม่นยำว่า "ฉันทำอะไรได้" และ "ฉันควรทำอย่างไร" เมื่อประมวลผลคำสั่ง

ถ้าสลับลำดับ — บอกโมเดลก่อนว่า "งานของคุณคือรีแฟกเตอร์โมดูลนี้" แล้วค่อยบอกว่า "คุณมีเครื่องมือ Read, Edit, Bash" — โมเดลจะขาดข้อมูลสำคัญเกี่ยวกับขอบเขตความสามารถเมื่อทำความเข้าใจงาน อาจวางแผนที่ไม่สมจริงหรือมองข้ามวิธีการที่ใช้ได้

**รู้ไพ่ในมือก่อน แล้วค่อยตัดสินใจว่าจะเล่นอย่างไร** นี่คือตรรกะเชิงปัญญาที่อยู่เบื้องหลังการวาง Tools ก่อน System

## ทำไมเครื่องมือ MCP ก็อยู่ในตำแหน่งนี้ด้วย?

เครื่องมือ MCP (Model Context Protocol) เช่นเดียวกับเครื่องมือในตัว ถูกวางไว้ที่ส่วนเริ่มต้นของพื้นที่ Tools การเข้าใจตำแหน่งของ MCP ในบริบทช่วยประเมินประโยชน์และต้นทุนที่แท้จริง

### ข้อดีของ MCP

- **ขยายความสามารถ**: MCP ให้โมเดลเข้าถึงบริการภายนอก (คิวรีฐานข้อมูล, เรียก API, ปฏิบัติการ IDE, ควบคุมเบราว์เซอร์ ฯลฯ) ก้าวข้ามขอบเขตของเครื่องมือในตัว
- **ระบบนิเวศเปิด**: ใครก็สามารถสร้าง MCP server ได้ โมเดลได้รับความสามารถใหม่โดยไม่ต้องเทรนใหม่
- **โหลดตามต้องการ**: MCP server สามารถเชื่อมต่อ/ตัดการเชื่อมต่อได้ตามสถานการณ์ ประกอบชุดเครื่องมือได้อย่างยืดหยุ่น

### ต้นทุนของ MCP

- **ฆาตกรแคช**: คำจำกัดความ JSON Schema ของเครื่องมือ MCP แต่ละตัวถูกต่อเข้าที่จุดเริ่มต้นของ prefix KV-Cache การเพิ่มหรือลบเครื่องมือ MCP หนึ่งตัว = **แคชทั้งหมดถูกยกเลิกตั้งแต่ต้น** การเชื่อมต่อ/ตัดการเชื่อมต่อ MCP server บ่อยครั้งจะลดอัตราการ hit แคชอย่างมาก
- **prefix บวม**: Schema ของเครื่องมือ MCP มักใหญ่กว่าเครื่องมือในตัว (คำอธิบายพารามิเตอร์โดยละเอียด, ค่า enum ฯลฯ) เครื่องมือ MCP จำนวนมากเพิ่มจำนวน token ในพื้นที่ Tools อย่างมาก บีบพื้นที่บริบทสำหรับ Messages
- **ค่าใช้จ่ายด้านความหน่วง**: การเรียกเครื่องมือ MCP ต้องการการสื่อสารระหว่างโปรเซส (JSON-RPC ผ่าน stdio/SSE) ช้ากว่าการเรียกฟังก์ชันในตัวเป็นอันดับขนาด
- **ความเสี่ยงด้านเสถียรภาพ**: MCP server เป็นโปรเซสภายนอกที่อาจล่ม หมดเวลา หรือส่งคืนรูปแบบที่ไม่คาดคิด ต้องการการจัดการข้อผิดพลาดเพิ่มเติม

### คำแนะนำเชิงปฏิบัติ

| สถานการณ์ | คำแนะนำ |
|-----------|---------|
| บทสนทนายาว, โต้ตอบบ่อย | ลดจำนวนเครื่องมือ MCP ให้น้อยที่สุดเพื่อปกป้องเสถียรภาพ prefix แคช |
| งานสั้น, ปฏิบัติการครั้งเดียว | ใช้เครื่องมือ MCP ได้อย่างอิสระ; ผลกระทบต่อแคชจำกัด |
| เพิ่ม/ลบ MCP server บ่อย | ทุกการเปลี่ยนแปลงทำให้แคชสร้างใหม่ทั้งหมด; พิจารณาตรึงชุดเครื่องมือ |
| Tool Schema ขนาดใหญ่เกินไป | ลด description และ enum เพื่อลดการใช้ token ของ prefix |

ในแผง Context ของ cc-viewer เครื่องมือ MCP แสดงร่วมกับเครื่องมือในตัวในพื้นที่ Tools ให้มุมมองที่ชัดเจนของขนาด Schema แต่ละเครื่องมือและการมีส่วนร่วมต่อ prefix แคช
