# เนื้อหาที่แคชใน KV-Cache

## Prompt Caching คืออะไร?

เมื่อคุณสนทนากับ Claude ทุกคำขอ API จะส่งบริบทการสนทนาทั้งหมด (system prompt + คำจำกัดความเครื่องมือ + ข้อความในอดีต) กลไก prompt caching ของ Anthropic จะแคชเนื้อหาคำนำหน้าที่คำนวณไว้แล้วบนเซิร์ฟเวอร์ หากคำขอถัดไปมีคำนำหน้าที่ตรงกัน ก็จะนำผลลัพธ์ที่แคชไว้มาใช้ซ้ำโดยตรง ข้ามการคำนวณซ้ำ ลดเวลาตอบสนองและค่าใช้จ่ายได้อย่างมาก

ใน cc-viewer กลไกนี้เรียกว่า "KV-Cache" ซึ่งตรงกับ prompt caching ในระดับ Anthropic API ไม่ใช่ key-value cache ของชั้น attention ใน transformer ภายใน LLM

## วิธีการทำงานของแคช

Prompt caching ของ Anthropic รวมคีย์แคชในลำดับคงที่:

```
Tools → System Prompt → Messages (จนถึงจุดแบ่งแคช)
```

ตราบใดที่คำนำหน้านี้ตรงกันทุกประการกับคำขอใดก็ตามภายในหน้าต่าง TTL API จะเข้าถึงแคช (ส่งกลับ `cache_read_input_tokens`) แทนที่จะคำนวณใหม่ (`cache_creation_input_tokens`)

> **Claude Code ไม่ได้พึ่งพาคุณสมบัติ `cache_control` อย่างเคร่งครัด เซิร์ฟเวอร์จะร่วมมือในการลบคุณสมบัติเหล่านี้บางส่วน แต่ยังสามารถสร้างแคชได้ดี ดังนั้นการไม่เห็นคุณสมบัติ `cache_control` ไม่ได้หมายความว่าไม่มีการแคช**
>
> สำหรับไคลเอนต์พิเศษอย่าง Claude Code เซิร์ฟเวอร์ของ Anthropic ไม่ได้พึ่งพาคุณสมบัติ `cache_control` ในคำขอทั้งหมดเพื่อกำหนดพฤติกรรมการแคช เซิร์ฟเวอร์จะดำเนินนโยบายการแคชอัตโนมัติสำหรับฟิลด์เฉพาะ (เช่น system prompt, คำจำกัดความเครื่องมือ) แม้ว่าคำขอจะไม่มีแท็ก `cache_control` อย่างชัดเจน ดังนั้นเมื่อคุณไม่เห็นคุณสมบัตินี้ในเนื้อหาคำขอ ไม่ต้องสงสัย — เซิร์ฟเวอร์ได้ดำเนินการแคชเบื้องหลังแล้ว เพียงแต่ไม่ได้เปิดเผยข้อมูลนี้ให้ไคลเอนต์ทราบ นี่คือความเข้าใจโดยปริยายระหว่าง Claude Code กับ Anthropic API

## "เนื้อหาที่แคชใน KV-Cache ปัจจุบัน" คืออะไร?

"เนื้อหาที่แคชใน KV-Cache ปัจจุบัน" ที่แสดงใน cc-viewer คือเนื้อหาที่แยกออกมาจากคำขอ MainAgent ล่าสุด ซึ่งอยู่ก่อนขอบเขตแคช (cache breakpoint) โดยเฉพาะรวมถึง:

- **System Prompt**: คำสั่งระบบของ Claude Code รวมถึงคำสั่ง agent หลัก ข้อกำหนดการใช้เครื่องมือ คำสั่งโครงการ CLAUDE.md ข้อมูลสภาพแวดล้อม เป็นต้น
- **Tools**: รายการคำจำกัดความเครื่องมือที่พร้อมใช้งานในปัจจุบัน (เช่น Read, Write, Bash, Agent, เครื่องมือ MCP เป็นต้น)
- **Messages**: ส่วนที่แคชของประวัติการสนทนา (โดยปกติคือข้อความที่เก่ากว่า จนถึงแท็ก `cache_control` ตัวสุดท้าย)

## ทำไมต้องดูเนื้อหาแคช?

1. **ทำความเข้าใจบริบท**: รู้ว่า Claude "จำ" เนื้อหาใดในปัจจุบัน ช่วยให้คุณประเมินว่าพฤติกรรมนั้นตรงตามที่คาดหวังหรือไม่
2. **การเพิ่มประสิทธิภาพค่าใช้จ่าย**: การเข้าถึงแคชมีค่าใช้จ่ายน้อยกว่าการคำนวณใหม่มาก การดูเนื้อหาแคชช่วยให้คุณเข้าใจว่าทำไมคำขอบางรายการจึงเรียกใช้การสร้างแคชใหม่ (cache rebuild)
3. **การแก้ไขข้อบกพร่องในการสนทนา**: เมื่อคำตอบของ Claude ไม่ตรงตามที่คาดหวัง การตรวจสอบเนื้อหาแคชสามารถยืนยันว่า system prompt และข้อความในอดีตถูกต้อง
4. **การตรวจสอบคุณภาพบริบท**: ในระหว่างการแก้ไขข้อบกพร่อง การเปลี่ยนแปลงการกำหนดค่า หรือการปรับ prompt KV-Cache-Text จะให้มุมมองที่เป็นศูนย์กลาง ช่วยให้คุณยืนยันอย่างรวดเร็วว่าบริบทหลักไม่ได้เสื่อมลงหรือถูกปนเปื้อนด้วยเนื้อหาที่ไม่คาดคิด — โดยไม่ต้องตรวจสอบข้อความต้นฉบับทีละรายการ

## กลยุทธ์การแคชหลายระดับ

KV-Cache ที่ตรงกับ Claude Code ไม่ได้มีเพียงสำเนาเดียว เซิร์ฟเวอร์จะสร้างแคชแยกต่างหากสำหรับ Tools และ System Prompt ซึ่งเป็นอิสระจากแคชส่วน Messages ข้อดีของการออกแบบนี้คือ: เมื่อสแต็กข้อความเกิดความผิดพลาด (เช่น การตัดบริบท การแก้ไขข้อความ) และจำเป็นต้องสร้างใหม่ จะไม่ทำให้แคชของ Tools และ System Prompt เป็นโมฆะไปด้วย หลีกเลี่ยงการคำนวณใหม่ทั้งหมด

นี่คือกลยุทธ์การเพิ่มประสิทธิภาพจากฝั่งเซิร์ฟเวอร์ในขั้นตอนปัจจุบัน — เพราะคำจำกัดความเครื่องมือและ System Prompt ค่อนข้างเสถียรในระหว่างการใช้งานปกติและไม่ค่อยเปลี่ยนแปลง การแคชแยกต่างหากจะลดค่าใช้จ่ายในการสร้างใหม่ที่ไม่จำเป็นให้มากที่สุด ดังนั้นเมื่อคุณสังเกตแคช คุณจะพบว่านอกจากการสร้าง Tools ใหม่ที่ต้องรีเฟรชแคชทั้งหมด การเสียหายของ System Prompt และ Messages ยังคงมีแคชที่สืบทอดได้

## วงจรชีวิตของแคช

- **การสร้าง**: ในคำขอแรกหรือหลังจากแคชหมดอายุ API จะสร้างแคชใหม่ (`cache_creation_input_tokens`)
- **การเข้าถึง**: เมื่อคำขอถัดไปมีคำนำหน้าที่ตรงกัน แคชจะถูกนำกลับมาใช้ใหม่ (`cache_read_input_tokens`)
- **การหมดอายุ**: แคชมี TTL 5 นาที (ระยะเวลาการมีชีวิต) และหมดอายุโดยอัตโนมัติเมื่อหมดเวลา
- **การสร้างใหม่**: เมื่อ system prompt รายการเครื่องมือ โมเดล หรือเนื้อหาข้อความเปลี่ยนแปลง คีย์แคชไม่ตรงกัน จะเรียกใช้การสร้างแคชใหม่ในระดับที่ตรงกัน
