ข้ามไปยังเนื้อหาหลัก

การแบ่งกลุ่มงานแบบ Context Rollover

Context rollover เป็นฟีเจอร์ความสอดคล้องของการแปลในระดับเอกสาร ที่นำหน้าต่างของการแปลก่อนหน้ามาส่งต่อไปยังกลุ่มงานถัดไป เพื่อให้ LLM มี "หน่วยความจำระยะสั้น" ข้ามขอบเขตของกลุ่มงาน

เหตุผลที่มีฟีเจอร์นี้

เมื่อแปลไฟล์ขนาดใหญ่ (100+ คีย์ หรือเอกสาร Markdown ที่ยาว) champollion จะแบ่งงานออกเป็นกลุ่มๆ หากไม่มี rollover แต่ละกลุ่มจะถูกแปลอย่างอิสระ — LLM จะไม่มีความทรงจำเกี่ยวกับสิ่งที่แปลไปในกลุ่มก่อนหน้า ซึ่งก่อให้เกิดปัญหาดังนี้:

  • การเบี่ยงเบนของคำศัพท์: คำภาษาอังกฤษเดียวกันถูกแปลต่างกันในแต่ละกลุ่ม (เช่น "dashboard" → "tableau de bord" ในกลุ่มที่ 1, "panneau" ในกลุ่มที่ 3)
  • ความล้มเหลวของการอ้างอิง: สรรพนามและการอ้างอิงที่ข้ามขอบเขตกลุ่มสูญเสียบริบทที่อ้างถึง
  • ความไม่สอดคล้องของน้ำเสียง: โทนการเขียนอาจเปลี่ยนแปลงระหว่างกลุ่ม (เป็นทางการ → ไม่เป็นทางการ → เป็นทางการ)

ปัญหานี้ได้รับการบันทึกไว้อย่างดีในวรรณกรรมด้าน MT แนวทาง sliding window ได้รับการยืนยันจากงานวิจัยด้านการแปลด้วยเครื่องในระดับเอกสาร (ACL, WMT workshops)

วิธีการทำงาน

Sliding Window

เมื่อเปิดใช้งาน contextRollover pipeline การแปลจะรักษาหน้าต่างของคู่คีย์-ค่าที่แปลล่าสุดไว้ หลังจากแต่ละกลุ่มเสร็จสิ้น ส่วนหนึ่งของผลลัพธ์ (ค่าเริ่มต้น: 20% ของ batchSize) จะถูกนำไปใส่ใน prompt ของกลุ่มถัดไปในฐานะ "การแปลอ้างอิง"

Batch 1: Translate keys 1-80 → LLM sees: system prompt + keys 1-80
Batch 2: Translate keys 81-160 → LLM sees: system prompt + [16 reference translations from batch 1] + keys 81-160
Batch 3: Translate keys 161-240 → LLM sees: system prompt + [16 reference translations from batch 2] + keys 161-240

การแปลอ้างอิงจะถูกแทรกเข้าไปในข้อความของผู้ใช้พร้อมป้ายกำกับที่ชัดเจน:

--- Previous translations for context (do NOT re-translate these) ---
"nav.dashboard": "Tableau de bord"
"nav.settings": "Paramètres"
"header.welcome": "Bienvenue sur la plateforme"
---

{
"content.main_heading": "Getting Started with Your Dashboard",
...
}

กลยุทธ์การเลือก

สองโหมดสำหรับการเลือกว่าจะนำการแปลใดส่งต่อไป:

กลยุทธ์พฤติกรรมเหมาะสำหรับ
tail (ค่าเริ่มต้น)การแปล N รายการล่าสุดจากกลุ่มก่อนหน้าเอกสารแบบลำดับ, เนื้อหา Markdown
diverseเลือกรายการที่ครอบคลุมประเภทคีย์ที่แตกต่างกัน (ปุ่ม, หัวข้อ, คำอธิบาย)ไฟล์ JSON ขนาดใหญ่ที่มีองค์ประกอบ UI หลายประเภท

งบประมาณ Token

หน้าต่าง rollover ใช้ input token Champollion คำนวณต้นทุน token โดยประมาณและแจ้งเตือนหากหน้าต่างเกิน 15% ของ context window โดยประมาณของโมเดล การแจ้งเตือนจะรวมคำแนะนำในการลดขนาด:

[WARN] Rollover window is ~2400 tokens (18% of model context).
Consider reducing rolloverSize to 0.15 or lowering batchSize.

Global Context Pre-Pass

การเรียก LLM แบบ first-pass ที่เป็นตัวเลือกเสริม ซึ่งทำงานก่อนการแปลเริ่มต้น LLM จะวิเคราะห์เนื้อหาต้นฉบับทั้งหมดและสร้างผลลัพธ์ดังนี้:

  1. สรุปเอกสาร — คำอธิบาย 2-3 ประโยคเกี่ยวกับสิ่งที่กำลังแปล
  2. Named Entities — ชื่อผลิตภัณฑ์, คำศัพท์ทางเทคนิค, และคำนามเฉพาะพร้อมคำแนะนำการจัดการ
  3. รายการความสอดคล้องของคำศัพท์ — คำสำคัญที่ LLM ระบุว่าต้องการการแปลที่สอดคล้องกัน

บริบทส่วนกลางนี้จะถูกแทรกเข้าไปในข้อความระบบของทุกกลุ่ม ทำให้แต่ละกลุ่มรับรู้เอกสารทั้งหมดแม้จะเห็นเพียงส่วนหนึ่ง

โมเดลสำหรับ Pre-Pass

การดึง global context ใช้การเรียก LLM แยกต่างหากที่มีราคาถูก (ค่าเริ่มต้น: google/gemini-3.5-flash ที่ temperature 0.1) โดยไม่คำนึงถึงโมเดลการแปลที่ผู้ใช้กำหนดค่าไว้ นี่คืองานดึงข้อมูล metadata ไม่ใช่งานแปล — ความเร็วและต้นทุนสำคัญกว่าผลลัพธ์เชิงสร้างสรรค์

การแบ่งเนื้อหาเป็นส่วนๆ

สำหรับเอกสาร Markdown ที่ยาว (การแปลเนื้อหา) เนื้อหาอาจเกิน context window ที่มีประสิทธิภาพของ LLM หรือโมเดลอาจตัดทอนผลลัพธ์ การแบ่งเนื้อหาจะแยกเอกสารออกเป็นส่วนที่ทับซ้อนกัน โดยแต่ละส่วนจะถูกแปลอย่างอิสระแล้วนำมาประกอบกันใหม่

กลยุทธ์การแบ่ง

การแบ่งเนื้อหาเป็นส่วนๆ ใช้ลำดับความสำคัญแบบ cascade — โดยลองจุดแบ่งที่มีความหมายเชิงความหมายมากที่สุดก่อน:

  1. ขอบเขตหัวข้อ — เครื่องหมาย ## และ ### สร้างหน่วยการแปลที่เป็นธรรมชาติ แต่ละส่วนมีความสมบูรณ์ในตัวเองเพียงพอสำหรับการแปลอิสระ และหัวข้อให้บริบทเชิงโครงสร้างแก่ LLM เกี่ยวกับสิ่งที่กำลังแปล
  2. ขอบเขตย่อหน้า — หากส่วนหัวข้อเดียวเกินขนาด chunk ให้แบ่งที่บรรทัดว่างสองบรรทัด (\n\n) ย่อหน้าเป็นขอบเขตที่ดีที่สุดรองลงมาเพราะแสดงถึงความคิดที่สมบูรณ์
  3. ขอบเขตประโยค — ทางเลือกสุดท้ายสำหรับย่อหน้าที่ยาวมาก (เช่น ตารางขนาดใหญ่, ข้อความหนาแน่น) แบ่งที่ขอบเขตจุด-เว้นวรรคโดยเคารพคำย่อ

บล็อกที่ได้รับการป้องกัน (code fences, shortcodes — ดู วิธีการทำงานของ Sync) จะไม่ถูกแบ่งข้ามส่วน หากบล็อกที่ได้รับการป้องกันจะถูกตัด จุดแบ่งจะเลื่อนไปก่อนหรือหลังบล็อกนั้น

ตัวกระตุ้น Auto-Chunking

การแบ่งเนื้อหาเปิดใช้งานได้สองวิธี:

ตัวกระตุ้นพฤติกรรม
contentChunkSize ที่กำหนดในการตั้งค่าแบ่งเนื้อหาเอกสารทั้งหมดที่เกินจำนวน token นั้นล่วงหน้า
โมเดลส่งคืน finish_reason: "length"แบ่งเนื้อหาอัตโนมัติเป็น fallback แม้ไม่มีการตั้งค่า

ตัวกระตุ้น fallback หมายความว่าการแบ่งเนื้อหาทำงานเป็นตาข่ายนิรภัยแม้คุณไม่ได้กำหนดค่าไว้ — หากโมเดลตัดทอน champollion จะลองใหม่อัตโนมัติด้วยการแบ่งเนื้อหา

การกำหนดค่า

  • contentChunkSize: จำนวน token สูงสุดต่อส่วน (ค่าเริ่มต้น: null = ส่งเนื้อหาทั้งหมด; กำหนดเป็น 4000 สำหรับเอกสารที่ยาว)
  • contentOverlap: Token ที่ทับซ้อนกันระหว่างส่วน (ค่าเริ่มต้น: 200) การทับซ้อนช่วยให้การเปลี่ยนผ่านที่ขอบเขตของส่วนราบรื่น

เมื่อการแบ่งเนื้อหาทำงาน context rollover จะถูกนำไปใช้โดยอัตโนมัติระหว่างส่วน — ผลลัพธ์ที่แปลแล้วของย่อหน้าสุดท้ายของส่วนก่อนหน้าจะถูกเพิ่มไว้ที่ต้น prompt ของส่วนถัดไป

champollion.config.json
{
"contentChunkSize": 4000,
"contentOverlap": 200
}

สำหรับระบบความยืดหยุ่นในการแปลเนื้อหาทั้งหมด (การลองใหม่แบบ diagnostic, model fallback, การบัญชีความล้มเหลว) ดู Content Resilience

การกำหนดค่า

เริ่มต้นอย่างรวดเร็ว

champollion.config.json
{
"contextRollover": true,
"globalContext": true,
"contentChunkSize": 4000,
"contentOverlap": 200
}

ตัวเลือกทั้งหมด

champollion.config.json (advanced)
{
"contextRollover": {
"size": 0.2,
"strategy": "tail",
"maxTokens": null
},
"globalContext": {
"model": "google/gemini-3.5-flash",
"maxEntities": 20,
"temperature": 0.1
},
"contentChunkSize": 4000,
"contentOverlap": 200,
"contentFallbackChain": [
"google/gemini-2.5-flash",
"anthropic/claude-sonnet-4"
]
}
ฟิลด์ประเภทค่าเริ่มต้นคำอธิบาย
contextRolloverboolean | objectfalseเปิดใช้งาน sliding window rollover
contextRollover.sizenumber0.2สัดส่วนของ batchSize ที่จะส่งต่อ (0.0–1.0)
contextRollover.strategystring"tail"กลยุทธ์การเลือก: "tail" หรือ "diverse"
contextRollover.maxTokensnumber | nullnullขีดจำกัดสูงสุดของงบประมาณ token สำหรับ rollover
globalContextboolean | objectfalseเปิดใช้งาน global context pre-pass
globalContext.modelstring"google/gemini-3.5-flash"โมเดลสำหรับการเรียก pre-pass
globalContext.maxEntitiesnumber20จำนวน named entities สูงสุดที่จะดึงออกมา
globalContext.temperaturenumber0.1Temperature สำหรับการเรียก pre-pass
contentChunkSizenumber | nullnullToken สูงสุดต่อส่วนเนื้อหา (null = ไม่แบ่งส่วน)
contentOverlapnumber200Token ที่ทับซ้อนกันระหว่างส่วนเนื้อหา
contentFallbackChainstring[][]โมเดล fallback สำหรับการแปลเนื้อหาเมื่อโมเดลที่กำหนดค่าไว้ล้มเหลวเชิงโครงสร้าง

เมื่อใดควรใช้

สถานการณ์คำแนะนำ
ไฟล์ JSON ขนาดเล็ก (< 50 คีย์)ไม่จำเป็น — กลุ่มเดียว ไม่มีปัญหาขอบเขต
ไฟล์ JSON ขนาดใหญ่ (100+ คีย์)เปิดใช้งาน contextRollover เพื่อความสอดคล้องของคำศัพท์
เอกสาร Markdown ที่ยาวเปิดใช้งาน contextRollover + contentChunkSize + globalContext
เอกสารทางเทคนิคเปิดใช้งาน globalContext เพื่อดึง entity
UI strings ที่มีน้ำเสียงหลายแบบใช้ contextRollover กับ strategy: "diverse"

สถานะการพัฒนา

ฟีเจอร์สถานะ
Sliding window rollover (key-value)🔲 วางแผนไว้
Sliding window rollover (content)🔲 วางแผนไว้
Global context pre-pass🔲 วางแผนไว้
Content chunking🔲 วางแผนไว้
Auto-chunking เมื่อมีการตัดทอน🔲 วางแผนไว้
กลยุทธ์การเลือก diverse🔲 วางแผนไว้

วรรณกรรมอ้างอิง

ฟีเจอร์นี้มีพื้นฐานจากงานวิจัยที่ตีพิมพ์เกี่ยวกับการแปลด้วยเครื่องในระดับเอกสาร:

  • แนวทาง Sliding window: ได้รับการยืนยันว่าช่วยปรับปรุงคะแนน BLEU, chrF, และ COMET เมื่อใช้ LLM สำหรับการแปล (ACL 2023–2025 workshops on document-level MT)
  • Multi-knowledge fusion: การแทรกสรุปเอกสารและรายการ entity เป็น global context ช่วยปรับปรุงความสอดคล้องของคำศัพท์ในเอกสารที่ยาว
  • Context-Aware Prompting (CAP): การเลือกบริบทที่เกี่ยวข้องผ่าน attention scores หรือความคล้ายคลึงเชิงความหมายสำหรับ in-context learning

ดูเพิ่มเติม

  • Content Resilience — การลองใหม่แบบ diagnostic, model fallback, และการบัญชีความล้มเหลว
  • วิธีการทำงานของ Sync — batch pipeline ที่ rollover เสริมประสิทธิภาพ
  • Coaching Data — ฟีเจอร์เสริมสำหรับการแทรกไวยากรณ์/พจนานุกรม
  • Translation Memory — แคช TM ที่ทำงานร่วมกับ rollover