- หน้าแรก
- Documentation
- เซสชัน
- การบีบอัดและสรุปสาขา
การบีบอัดและสรุปสาขา
การบีบอัดและสรุปสาขาเป็นสองกลไกที่ทำให้เซสชันที่ยาวนานยังคงใช้งานได้โดยไม่สูญเสียบริบทการทำงานก่อนหน้า
- การบีบอัด เขียนประวัติเก่าใหม่เป็นสรุปบนสาขาปัจจุบัน
- สรุปสาขา บันทึกบริบทของสาขาที่ถูกละทิ้งระหว่างการนำทางด้วย
/tree
ทั้งสองถูกบันทึกเป็นรายการเซสชันและแปลงกลับเป็นข้อความบริบทผู้ใช้เมื่อสร้างอินพุต LLM ใหม่
ไฟล์การนำไปใช้งานหลัก
หัวข้อที่มีชื่อว่า “ไฟล์การนำไปใช้งานหลัก”src/session/compaction/compaction.tssrc/session/compaction/branch-summarization.tssrc/session/compaction/pruning.tssrc/session/compaction/utils.tssrc/session/session-manager.tssrc/session/agent-session.tssrc/session/messages.tssrc/extensibility/hooks/types.tssrc/config/settings-schema.ts
โมเดลรายการเซสชัน
หัวข้อที่มีชื่อว่า “โมเดลรายการเซสชัน”การบีบอัดและสรุปสาขาเป็นรายการเซสชันระดับหลัก ไม่ใช่ข้อความ assistant/user ธรรมดา
CompactionEntrytype: "compaction"summary,shortSummaryที่เป็นทางเลือกfirstKeptEntryId(ขอบเขตการบีบอัด)tokensBeforedetails,preserveData,fromExtensionที่เป็นทางเลือก
BranchSummaryEntrytype: "branch_summary"fromId,summarydetails,fromExtensionที่เป็นทางเลือก
เมื่อมีการสร้างบริบทใหม่ (buildSessionContext):
- การบีบอัดล่าสุดบนเส้นทางที่ใช้งานอยู่จะถูกแปลงเป็นข้อความ
compactionSummaryหนึ่งรายการ - รายการที่เก็บไว้จาก
firstKeptEntryIdไปยังจุดบีบอัดจะถูกรวมซ้ำ - รายการที่อยู่ถัดไปบนเส้นทางจะถูกต่อท้าย
- รายการ
branch_summaryจะถูกแปลงเป็นข้อความbranchSummary - รายการ
custom_messageจะถูกแปลงเป็นข้อความcustom
บทบาทกำหนดเองเหล่านั้นจะถูกแปลงเป็นข้อความผู้ใช้ที่ส่งไปยัง LLM ใน convertToLlm() โดยใช้เทมเพลตแบบคงที่:
prompts/compaction/compaction-summary-context.mdprompts/compaction/branch-summary-context.md
ขั้นตอนการบีบอัด
หัวข้อที่มีชื่อว่า “ขั้นตอนการบีบอัด”ตัวกระตุ้น
หัวข้อที่มีชื่อว่า “ตัวกระตุ้น”การบีบอัดสามารถทำงานได้สามวิธี:
- แบบแมนวล:
/compact [instructions]เรียกAgentSession.compact(...) - การกู้คืนจากล้นอัตโนมัติ: หลังจากข้อผิดพลาดของ assistant ที่ตรงกับการล้นของบริบท
- การบีบอัดแบบเกณฑ์อัตโนมัติ: หลังจากเทิร์นสำเร็จเมื่อบริบทเกินเกณฑ์
รูปแบบการบีบอัด (ภาพ)
หัวข้อที่มีชื่อว่า “รูปแบบการบีบอัด (ภาพ)”Before compaction:
entry: 0 1 2 3 4 5 6 7 8 9 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┘ └────────┬───────┘ └──────────────┬──────────────┘ messagesToSummarize kept messages ↑ firstKeptEntryId (entry 4)
After compaction (new entry appended):
entry: 0 1 2 3 4 5 6 7 8 9 10 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┬─────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ cmp │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┴─────┘ └──────────┬──────┘ └──────────────────────┬───────────────────┘ not sent to LLM sent to LLM ↑ starts from firstKeptEntryId
What the LLM sees:
┌────────┬─────────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ system │ summary │ usr │ ass │ tool │ tool │ ass │ tool │ └────────┴─────────┴─────┴─────┴──────┴──────┴─────┴──────┘ ↑ ↑ └─────────────────┬────────────────┘ prompt from cmp messages from firstKeptEntryIdการบีบอัดแบบล้นซ้ำ vs การบีบอัดแบบเกณฑ์
หัวข้อที่มีชื่อว่า “การบีบอัดแบบล้นซ้ำ vs การบีบอัดแบบเกณฑ์”เส้นทางอัตโนมัติสองเส้นทางนี้แตกต่างกันโดยเจตนา:
-
การบีบอัดแบบล้นซ้ำ
- ตัวกระตุ้น: ข้อผิดพลาดของ assistant ในโมเดลปัจจุบันถูกตรวจพบว่าเป็นการล้นของบริบท
- ข้อความแสดงข้อผิดพลาดของ assistant ที่ล้มเหลวจะถูกลบออกจากสถานะ agent ที่ใช้งานอยู่ก่อนลองซ้ำ
- การบีบอัดอัตโนมัติทำงานด้วย
reason: "overflow"และwillRetry: true - เมื่อสำเร็จ agent จะดำเนินการต่ออัตโนมัติ (
agent.continue()) หลังการบีบอัด
-
การบีบอัดแบบเกณฑ์
- ตัวกระตุ้น:
contextTokens > contextWindow - compaction.reserveTokens - ทำงานด้วย
reason: "threshold"และwillRetry: false - เมื่อสำเร็จ ถ้า
compaction.autoContinue !== falseจะฉีดพรอมต์สังเคราะห์:"Continue if you have next steps."
- ตัวกระตุ้น:
การตัดทอนก่อนการบีบอัด
หัวข้อที่มีชื่อว่า “การตัดทอนก่อนการบีบอัด”ก่อนการตรวจสอบการบีบอัด การตัดทอนผลลัพธ์เครื่องมืออาจทำงาน (pruneToolOutputs)
นโยบายการตัดทอนเริ่มต้น:
- ป้องกันโทเคนผลลัพธ์เครื่องมือใหม่ล่าสุด
40_000รายการ - ต้องการประหยัดรวมประมาณการอย่างน้อย
20_000 - ไม่ตัดทอนผลลัพธ์เครื่องมือจาก
skillหรือreadเลย
ผลลัพธ์เครื่องมือที่ถูกตัดทอนจะถูกแทนที่ด้วย:
[Output truncated - N tokens]
หากการตัดทอนเปลี่ยนรายการ พื้นที่จัดเก็บเซสชันจะถูกเขียนใหม่และสถานะข้อความ agent จะถูกรีเฟรชก่อนการตัดสินใจบีบอัด
ตรรกะขอบเขตและจุดตัด
หัวข้อที่มีชื่อว่า “ตรรกะขอบเขตและจุดตัด”prepareCompaction() พิจารณาเฉพาะรายการนับจากรายการการบีบอัดล่าสุด (ถ้ามี)
- ค้นหาดัชนีการบีบอัดก่อนหน้า
- คำนวณ
boundaryStart = prevCompactionIndex + 1 - ปรับ
keepRecentTokensโดยใช้อัตราส่วนการใช้งานที่วัดได้เมื่อมี - รัน
findCutPoint()บนหน้าต่างขอบเขต
จุดตัดที่ถูกต้องรวมถึง:
- รายการข้อความที่มีบทบาท:
user,assistant,bashExecution,hookMessage,branchSummary,compactionSummary - รายการ
custom_message - รายการ
branch_summary
กฎหลัก: ห้ามตัดที่ toolResult
หากมีรายการข้อมูลเมตาที่ไม่ใช่ข้อความอยู่ก่อนหน้าจุดตัดทันที (model_change, thinking_level_change, ป้ายชื่อ ฯลฯ) รายการเหล่านั้นจะถูกดึงเข้าในบริเวณที่เก็บไว้โดยเลื่อนดัชนีตัดไปข้างหลังจนกระทั่งพบข้อความหรือขอบเขตการบีบอัด
การจัดการเทิร์นแยก
หัวข้อที่มีชื่อว่า “การจัดการเทิร์นแยก”หากจุดตัดไม่ได้อยู่ที่จุดเริ่มต้นเทิร์นผู้ใช้ การบีบอัดจะถือว่าเป็นเทิร์นแยก
การตรวจจับจุดเริ่มต้นเทิร์นถือว่าสิ่งเหล่านี้เป็นขอบเขตเทิร์นผู้ใช้:
message.role === "user"message.role === "bashExecution"- รายการ
custom_message - รายการ
branch_summary
การบีบอัดเทิร์นแยกสร้างสรุปสองรายการ:
- สรุปประวัติ (
messagesToSummarize) - สรุปคำนำหน้าเทิร์น (
turnPrefixMessages)
สรุปที่จัดเก็บสุดท้ายถูกรวมเป็น:
<history summary>
---
**Turn Context (split turn):**
<turn prefix summary>การสร้างสรุป
หัวข้อที่มีชื่อว่า “การสร้างสรุป”compact(...) สร้างสรุปจากข้อความสนทนาที่ซีเรียลไลซ์:
- แปลงข้อความผ่าน
convertToLlm() - ซีเรียลไลซ์ด้วย
serializeConversation() - ห่อใน
<conversation>...</conversation> - รวม
<previous-summary>...</previous-summary>ตามต้องการ - ฉีดบริบท hook เป็นรายการ
<additional-context>ตามต้องการ - ดำเนินการพรอมต์สรุปด้วย
SUMMARIZATION_SYSTEM_PROMPT
การเลือกพรอมต์:
- การบีบอัดครั้งแรก:
compaction-summary.md - การบีบอัดซ้ำพร้อมสรุปก่อนหน้า:
compaction-update-summary.md - การผ่านครั้งที่สองของเทิร์นแยก:
compaction-turn-prefix.md - สรุป UI สั้น:
compaction-short-summary.md
โหมดสรุประยะไกล:
- หาก
compaction.remoteEndpointถูกตั้งค่า การบีบอัดจะ POST:{ systemPrompt, prompt }
- คาดหวัง JSON ที่มีอย่างน้อย
{ summary }
บริบทการดำเนินการไฟล์ในสรุป
หัวข้อที่มีชื่อว่า “บริบทการดำเนินการไฟล์ในสรุป”การบีบอัดติดตามกิจกรรมไฟล์สะสมโดยใช้การเรียกเครื่องมือของ assistant:
read(path)→ ชุดที่อ่านwrite(path)→ ชุดที่แก้ไขedit(path)→ ชุดที่แก้ไข
พฤติกรรมสะสม:
- รวมรายละเอียดการบีบอัดก่อนหน้าเฉพาะเมื่อรายการก่อนหน้าสร้างโดย pi (
fromExtension !== true) - ในเทิร์นแยก รวมการดำเนินการไฟล์คำนำหน้าเทิร์นด้วย
readFilesไม่รวมไฟล์ที่ถูกแก้ไขด้วย
ข้อความสรุปจะมีแท็กไฟล์ต่อท้ายผ่านเทมเพลตพรอมต์:
<read-files>...</read-files><modified-files>...</modified-files>การบันทึกและโหลดซ้ำ
หัวข้อที่มีชื่อว่า “การบันทึกและโหลดซ้ำ”หลังจากสร้างสรุป (หรือสรุปที่ hook ให้มา) เซสชัน agent จะ:
- ต่อท้าย
CompactionEntryด้วยappendCompaction(...) - สร้างบริบทใหม่ผ่าน
buildSessionContext() - แทนที่ข้อความ agent สดด้วยบริบทที่สร้างใหม่
- ส่งเหตุการณ์ hook
session_compact
ขั้นตอนการสรุปสาขา
หัวข้อที่มีชื่อว่า “ขั้นตอนการสรุปสาขา”การสรุปสาขาเชื่อมกับการนำทางต้นไม้ ไม่ใช่การล้นของโทเคน
ตัวกระตุ้น
หัวข้อที่มีชื่อว่า “ตัวกระตุ้น”ระหว่าง navigateTree(...):
- คำนวณรายการที่ถูกละทิ้งจากใบเก่าไปยังบรรพบุรุษร่วมโดยใช้
collectEntriesForBranchSummary(...) - หากผู้เรียกร้องขอสรุป (
options.summarize) ให้สร้างสรุปก่อนสลับใบ - หากมีสรุป ให้แนบไว้ที่เป้าหมายการนำทางโดยใช้
branchWithSummary(...)
ในทางปฏิบัติ สิ่งนี้มักถูกขับเคลื่อนโดยขั้นตอน /tree เมื่อ branchSummary.enabled เปิดใช้งานอยู่
รูปแบบการสลับสาขา (ภาพ)
หัวข้อที่มีชื่อว่า “รูปแบบการสลับสาขา (ภาพ)”Tree before navigation:
┌─ B ─ C ─ D (old leaf, being abandoned) A ───┤ └─ E ─ F (target)
Common ancestor: AEntries to summarize: B, C, D
After navigation with summary:
┌─ B ─ C ─ D ─ [summary of B,C,D] A ───┤ └─ E ─ F (new leaf)การเตรียมการและงบประมาณโทเคน
หัวข้อที่มีชื่อว่า “การเตรียมการและงบประมาณโทเคน”generateBranchSummary(...) คำนวณงบประมาณเป็น:
tokenBudget = model.contextWindow - branchSummary.reserveTokens
จากนั้น prepareBranchEntries(...) จะ:
- การผ่านครั้งแรก: รวบรวมการดำเนินการไฟล์สะสมจากรายการที่สรุปทั้งหมด รวมถึงรายละเอียด
branch_summaryที่สร้างโดย pi ก่อนหน้า - การผ่านครั้งที่สอง: เดินจากใหม่ล่าสุดไปเก่าสุด เพิ่มข้อความจนกว่าจะถึงงบประมาณโทเคน
- ให้ความสำคัญกับการรักษาบริบทล่าสุด
- อาจยังรวมรายการสรุปขนาดใหญ่ใกล้ขอบงบประมาณเพื่อความต่อเนื่อง
รายการการบีบอัดจะถูกรวมเป็นข้อความ (compactionSummary) ระหว่างอินพุตการสรุปสาขา
การสร้างสรุปและการบันทึก
หัวข้อที่มีชื่อว่า “การสร้างสรุปและการบันทึก”การสรุปสาขา:
- แปลงและซีเรียลไลซ์ข้อความที่เลือก
- ห่อใน
<conversation> - ใช้คำแนะนำกำหนดเองหากมี มิฉะนั้น
branch-summary.md - เรียกโมเดลสรุปด้วย
SUMMARIZATION_SYSTEM_PROMPT - เติมด้านหน้าด้วย
branch-summary-preamble.md - ต่อท้ายแท็กการดำเนินการไฟล์
ผลลัพธ์จะถูกจัดเก็บเป็น BranchSummaryEntry พร้อมรายละเอียดเสริม (readFiles, modifiedFiles)
จุดสัมผัสของส่วนขยายและ hook
หัวข้อที่มีชื่อว่า “จุดสัมผัสของส่วนขยายและ hook”session_before_compact
หัวข้อที่มีชื่อว่า “session_before_compact”Hook ก่อนการบีบอัด
สามารถ:
- ยกเลิกการบีบอัด (
{ cancel: true }) - ให้เพย์โหลดการบีบอัดกำหนดเองเต็มรูปแบบ (
{ compaction: CompactionResult })
session.compacting
หัวข้อที่มีชื่อว่า “session.compacting”Hook การปรับแต่งพรอมต์/บริบทสำหรับการบีบอัดเริ่มต้น
สามารถคืนค่า:
prompt(แทนที่พรอมต์สรุปหลัก)context(บรรทัดบริบทเพิ่มเติมที่ฉีดเข้าใน<additional-context>)preserveData(จัดเก็บบนรายการการบีบอัด)
session_compact
หัวข้อที่มีชื่อว่า “session_compact”การแจ้งเตือนหลังการบีบอัดพร้อม compactionEntry ที่บันทึกไว้และแฟล็ก fromExtension
session_before_tree
หัวข้อที่มีชื่อว่า “session_before_tree”ทำงานบนการนำทางต้นไม้ก่อนการสร้างสรุปสาขาเริ่มต้น
สามารถ:
- ยกเลิกการนำทาง
- ให้
{ summary: { summary, details } }กำหนดเองที่ใช้เมื่อผู้ใช้ร้องขอการสรุป
session_tree
หัวข้อที่มีชื่อว่า “session_tree”เหตุการณ์หลังการนำทางที่เปิดเผยใบใหม่/เก่าและรายการสรุปเสริม
พฤติกรรมรันไทม์และความหมายของความล้มเหลว
หัวข้อที่มีชื่อว่า “พฤติกรรมรันไทม์และความหมายของความล้มเหลว”- การบีบอัดแบบแมนวลจะยกเลิกการดำเนินการ agent ปัจจุบันก่อน
abortCompaction()ยกเลิกทั้งตัวควบคุมการบีบอัดแบบแมนวลและอัตโนมัติ- การบีบอัดอัตโนมัติส่งเหตุการณ์เซสชันเริ่ม/สิ้นสุดสำหรับการอัปเดต UI/สถานะ
- การบีบอัดอัตโนมัติสามารถลองผู้สมัครโมเดลหลายรายและลองซ้ำความล้มเหลวชั่วคราว
- ข้อผิดพลาดการล้นถูกแยกออกจากเส้นทางลองซ้ำทั่วไปเพราะจัดการโดยการบีบอัด
- หากการบีบอัดอัตโนมัติล้มเหลว:
- เส้นทางการล้นส่ง
Context overflow recovery failed: ... - เส้นทางเกณฑ์ส่ง
Auto-compaction failed: ...
- เส้นทางการล้นส่ง
- การสรุปสาขาสามารถยกเลิกได้ผ่านสัญญาณยกเลิก (เช่น Escape) คืนค่าผลลัพธ์การนำทางที่ยกเลิก/ยุติ
การตั้งค่าและค่าเริ่มต้น
หัวข้อที่มีชื่อว่า “การตั้งค่าและค่าเริ่มต้น”จาก settings-schema.ts:
compaction.enabled=truecompaction.reserveTokens=16384compaction.keepRecentTokens=20000compaction.autoContinue=truecompaction.remoteEndpoint=undefinedbranchSummary.enabled=falsebranchSummary.reserveTokens=16384
ค่าเหล่านี้ถูกใช้ในรันไทม์โดย AgentSession และโมดูลการบีบอัด/สรุปสาขา