เจาะลึกสถาปัตยกรรม System Prompt ของ OpenClaw Agent: สรุปรายละเอียด 9 เลเยอร์แบบครบวงจร

@servasyy_ai
จีน4 เดือนที่ผ่านมา · 05 มี.ค. 2569
641K
1.7K
410
51
0

TL;DR

คู่มือทางเทคนิคเชิงลึกที่อธิบายสถาปัตยกรรม System Prompt 9 เลเยอร์ของ OpenClaw Agents โดยครอบคลุมตั้งแต่กฎพื้นฐานของเฟรมเวิร์ก ไปจนถึงไฟล์ Workspace ที่ผู้ใช้ควบคุมได้ และ Dynamic Hooks ต่างๆ

This document provides a detailed breakdown of the complete System Prompt structure sent by OpenClaw Agent to the LLM.

=> Translate: "เอกสารนี้อธิบายรายละเอียดของโครงสร้าง System Prompt ที่สมบูรณ์ซึ่งถูกส่งโดย OpenClaw Agent ไปยัง LLM"

Then empty blockquotes with <p></p> - keep as is.

Then:

Version:

=> "เวอร์ชัน:"

Then empty, then:

v2.1

=> keep as v2.1

Then empty, then:

Update Time:

=> "เวลาที่อัปเดต:"

Then empty, then:

2026-03-05

=> keep as is

Now headings: "## Overall Architecture Diagram" => "## แผนภาพสถาปัตยกรรมโดยรวม"

Then payload block - keep as is.

"## Quick Navigation (TL;DR)" => "## การนำทางด่วน (TL;DR)"

Then "Must-read for Beginners:" => "สิ่งที่มือใหม่ต้องอ่าน:"

Then list items: translate the list items but keep numbers.

  1. Layer 7 (Workspace Files) - Configuration files you can edit directly. => 1. เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกที่คุณสามารถแก้ไขได้โดยตรง
  1. Layer 8 (Bootstrap Hook) - Where you can write scripts to dynamically inject content. => 2. เลเยอร์ 8 (Bootstrap Hook) - ที่ที่คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิก
  1. Other layers are automatically generated by the framework; just understand them. => 3. เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก เพียงแค่ทำความเข้าใจ

Then "Common Needs:" => "ความต้องการทั่วไป:"

Then bullet list: translate each.

  • Want to define Agent identity? → Edit IDENTITY.md in Layer 7. => - ต้องการกำหนดเอกลักษณ์ของ Agent? → แก้ไข IDENTITY.md ในเลเยอร์ 7
  • Want to add project documentation? → Use the bootstrap-extra-files Hook in Layer 8. => - ต้องการเพิ่มเอกสารโครงการ? → ใช้ bootstrap-extra-files Hook ในเลเยอร์ 8
  • Want to inject real-time context? → Use the before_prompt_build Hook in Layer 8. => - ต้องการแทรกบริบทแบบเรียลไทม์? → ใช้ before_prompt_build Hook ในเลเยอร์ 8
  • Want to control file size? → Adjust the bootstrapMaxChars configuration. => - ต้องการควบคุมขนาดไฟล์? → ปรับการกำหนดค่า bootstrapMaxChars

Then "## Layer 1: OpenClaw Framework Core" => "## เลเยอร์ 1: แกนหลักของ OpenClaw Framework"

"Analogy" => "การเปรียบเทียบ"

Blockquote: <blockquote><p>Like the "Instructions for Use" section of an operation manual—telling the LLM who you are, what you can do, and how you should respond.</p></blockquote>

=> <blockquote><p>เหมือนกับส่วน "คำแนะนำในการใช้งาน" ของคู่มือการใช้งาน—บอก LLM ว่าคุณคือใคร ทำอะไรได้บ้าง และควรตอบสนองอย่างไร</p></blockquote>

"Components" => "ส่วนประกอบ"

payload block id="blk_1" - keep

"Practical Example" => "ตัวอย่างการใช้งาน"

Then the code-like text: "You are running as a "Creative Partner," an AI content creation expert Agent." etc. This is not in a code block, but it's a paragraph. Translate it. Also the tool calling specification and safety boundaries - these are part of the practical example. Translate all natural language.

Current Time: 2026-03-05 14:37:00 CST => เวลาปัจจุบัน: 2026-03-05 14:37:00 CST (keep time format)

=== Tool Calling Specification === => === ข้อกำหนดการเรียกใช้เครื่องมือ ===

  • Use XML-style tool calling format. => - ใช้รูปแบบการเรียกใช้เครื่องมือแบบ XML
  • Each tool call must include a unique tool_call_id. => - การเรียกใช้เครื่องมือแต่ละครั้งต้องมี tool_call_id ที่ไม่ซ้ำกัน
  • Tool results are returned via <tool_result> tags. => - ผลลัพธ์ของเครื่องมือจะถูกส่งกลับผ่านแท็ก <tool_result>
  • Consider AbortSignal when executing tools to support cancellation. => - พิจารณา AbortSignal เมื่อเรียกใช้เครื่องมือเพื่อรองรับการยกเลิก

=== Safety Boundaries === => === ขอบเขตความปลอดภัย ===

  • Strictly prohibited from executing destructive operations (rm -rf, formatting, etc.). => - ห้ามดำเนินการทำลายล้างโดยเด็ดขาด (rm -rf, ฟอร์แมต ฯลฯ)
  • Sensitive user information must be encrypted when handled. => - ข้อมูลผู้ใช้ที่ละเอียดอ่อนต้องถูกเข้ารหัสเมื่อมีการจัดการ
  • Prohibited from sending messages to unauthorized channels. => - ห้ามส่งข้อความไปยังช่องทางที่ไม่ได้รับอนุญาต

"Design Trade-offs" => "การแลกเปลี่ยนในการออกแบบ"

Why design it this way? => ทำไมถึงออกแบบเช่นนี้?

  • Trade-off: Flexibility vs. Consistency => - การแลกเปลี่ยน: ความยืดหยุ่น vs ความสอดคล้อง
  • Decision: Unified generation at the framework layer ensures consistent basic behavior for all Agents. => - การตัดสินใจ: การสร้างแบบรวมศูนย์ที่เลเยอร์เฟรมเวิร์กช่วยให้พฤติกรรมพื้นฐานสอดคล้องกันสำหรับ Agent ทั้งหมด
  • Benefits: Users don't need to repeat basic rules for every Agent. All Agents automatically gain new capabilities when the framework upgrades. Reduces the risk of configuration errors. => - ข้อดี: ผู้ใช้ไม่ต้องทำซ้ำกฎพื้นฐานสำหรับทุก Agent Agent ทั้งหมดจะได้รับความสามารถใหม่โดยอัตโนมัติเมื่อเฟรมเวิร์กอัปเกรด ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
  • Cost: Users cannot modify these core rules. Special behaviors must be implemented indirectly via Layer 7/8. => - ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขกฎหลักเหล่านี้ได้ พฤติกรรมพิเศษต้องถูกนำไปใช้ทางอ้อมผ่านเลเยอร์ 7/8

Continue similarly for all sections. I'll produce the final translation in full.</think><blockquote>

<p>เอกสารนี้อธิบายรายละเอียดของโครงสร้าง System Prompt ที่สมบูรณ์ซึ่งถูกส่งโดย OpenClaw Agent ไปยัง LLM</p>

</blockquote>



เวอร์ชัน:



v2.1



เวลาที่อัปเดต:



2026-03-05

แผนภาพสถาปัตยกรรมโดยรวม

huangserva - inline image

การนำทางด่วน (TL;DR)

สิ่งที่มือใหม่ต้องอ่าน:

  1. เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกที่คุณสามารถแก้ไขได้โดยตรง
  2. เลเยอร์ 8 (Bootstrap Hook) - ที่ที่คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิก
  3. เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก เพียงแค่ทำความเข้าใจ

ความต้องการทั่วไป:

  • ต้องการกำหนดเอกลักษณ์ของ Agent? → แก้ไข IDENTITY.md ในเลเยอร์ 7
  • ต้องการเพิ่มเอกสารโครงการ? → ใช้ bootstrap-extra-files Hook ในเลเยอร์ 8
  • ต้องการแทรกบริบทแบบเรียลไทม์? → ใช้ before_prompt_build Hook ในเลเยอร์ 8
  • ต้องการควบคุมขนาดไฟล์? → ปรับการกำหนดค่า bootstrapMaxChars

เลเยอร์ 1: แกนหลักของ OpenClaw Framework

การเปรียบเทียบ

เหมือนกับส่วน "คำแนะนำในการใช้งาน" ของคู่มือการใช้งาน—บอก LLM ว่าคุณคือใคร ทำอะไรได้บ้าง และควรตอบสนองอย่างไร

ส่วนประกอบ

huangserva - inline image

ตัวอย่างการใช้งาน

คุณกำลังทำงานในฐานะ "Creative Partner" ซึ่งเป็น Agent ผู้เชี่ยวชาญด้านการสร้างเนื้อหาด้วย AI

เวลาปัจจุบัน: 2026-03-05 14:37:00 CST

=== ข้อกำหนดการเรียกใช้เครื่องมือ ===

  • ใช้รูปแบบการเรียกใช้เครื่องมือแบบ XML
  • การเรียกใช้เครื่องมือแต่ละครั้งต้องมี tool_call_id ที่ไม่ซ้ำกัน
  • ผลลัพธ์ของเครื่องมือจะถูกส่งกลับผ่านแท็ก <tool_result>
  • พิจารณา AbortSignal เมื่อเรียกใช้เครื่องมือเพื่อรองรับการยกเลิก

=== ขอบเขตความปลอดภัย ===

  • ห้ามดำเนินการทำลายล้างโดยเด็ดขาด (rm -rf, ฟอร์แมต ฯลฯ)
  • ข้อมูลผู้ใช้ที่ละเอียดอ่อนต้องถูกเข้ารหัสเมื่อมีการจัดการ
  • ห้ามส่งข้อความไปยังช่องทางที่ไม่ได้รับอนุญาต

การแลกเปลี่ยนในการออกแบบ

ทำไมถึงออกแบบเช่นนี้?

  • การแลกเปลี่ยน: ความยืดหยุ่น vs ความสอดคล้อง
  • การตัดสินใจ: การสร้างแบบรวมศูนย์ที่เลเยอร์เฟรมเวิร์กช่วยให้พฤติกรรมพื้นฐานสอดคล้องกันสำหรับ Agent ทั้งหมด
  • ข้อดี: ผู้ใช้ไม่ต้องทำซ้ำกฎพื้นฐานสำหรับทุก Agent Agent ทั้งหมดจะได้รับความสามารถใหม่โดยอัตโนมัติเมื่อเฟรมเวิร์กอัปเกรด ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
  • ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขกฎหลักเหล่านี้ได้ พฤติกรรมพิเศษต้องถูกนำไปใช้ทางอ้อมผ่านเลเยอร์ 7/8

เลเยอร์ 2: คำจำกัดความของเครื่องมือ

การเปรียบเทียบ

เหมือนกับรายการเครื่องมือของมีดพกสวิส—บอก LLM ว่าคุณมีเครื่องมืออะไรบ้าง แต่ละชิ้นทำอะไร และวิธีการใช้งาน

ส่วนประกอบ

huangserva - inline image

ตัวอย่างคำจำกัดความของเครื่องมือ

{

"name": "read",

"description": "อ่านเนื้อหาไฟล์ รองรับไฟล์ข้อความและรูปภาพ (jpg/png/gif/webp) รูปภาพจะถูกส่งเป็นไฟล์แนบ ข้อความที่ส่งออกถูกจำกัดที่ 2000 บรรทัดหรือ 50KB",

"parameters": {

"type": "object",

"properties": {

"path": {

"type": "string",

"description": "เส้นทางไฟล์ (สัมพัทธ์หรือสัมบูรณ์)"

},

"offset": {

"type": "number",

"description": "หมายเลขบรรทัดเริ่มต้น (นับจาก 1)"

},

"limit": {

"type": "number",

"description": "จำนวนบรรทัดสูงสุดที่จะอ่าน"

}

},

"required": ["path"]

}

}

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องใช้ JSON Schema?

  • การแลกเปลี่ยน: ความยืดหยุ่น vs ความปลอดภัยของประเภทข้อมูล
  • การตัดสินใจ: ใช้ JSON Schema ที่เข้มงวดเพื่อกำหนดพารามิเตอร์ของเครื่องมือ
  • ข้อดี: LLM เข้าใจการใช้งานเครื่องมือได้แม่นยำยิ่งขึ้น เฟรมเวิร์กสามารถตรวจสอบพารามิเตอร์ก่อนเรียกใช้ สร้างเอกสารและคำจำกัดความของประเภทได้โดยอัตโนมัติ
  • ต้นทุน: การเพิ่มเครื่องมือใหม่ต้องเขียน Schema ทั้งหมด ไม่สามารถรองรับโครงสร้างพารามิเตอร์แบบไดนามิกสมบูรณ์

เลเยอร์ 3: ทะเบียนทักษะ

การเปรียบเทียบ

เหมือนกับ "เมนูพิเศษ" ของร้านอาหาร—บอก LLM ว่ามี "สูตรอาหาร" แบบมืออาชีพใดบ้างที่สามารถเรียกใช้ได้

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องใช้การสแกนไดเรกทอรีแทนการลงทะเบียนด้วยตนเอง?

  • การแลกเปลี่ยน: ความยืดหยุ่น vs ต้นทุนการบำรุงรักษา
  • การตัดสินใจ: สแกนไดเรกทอรี ~/development/openclaw/skills/ โดยอัตโนมัติ
  • ข้อดี: การเพิ่ม Skill ใหม่只需วางไว้ในไดเรกทอรี ไม่จำเป็นต้องเปลี่ยนคอนฟิก Agent ทั้งหมดได้รับ Skill ใหม่โดยอัตโนมัติ ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
  • ต้นทุน: ไม่สามารถควบคุมได้อย่างแม่นยำว่า Skill ใดบ้างที่พร้อมใช้งานสำหรับแต่ละ Agent Skill ทั้งหมดถูกแทรกเข้าไปใน System Prompt (เพิ่มการใช้โทเค็น)

ส่วนประกอบ

huangserva - inline image

เลเยอร์ 4: นามแฝงของโมเดล

การเปรียบเทียบ

เหมือนกับ "ทางลัด"—กำหนดนามแฝงสั้นๆ ให้กับเส้นทางโมเดลที่ซับซ้อนเพื่อให้เรียกใช้ได้ง่าย

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องมีนามแฝงของโมเดล?

  • การแลกเปลี่ยน: ความยืดหยุ่น vs ความสามารถในการอ่าน
  • การตัดสินใจ: อนุญาตให้ผู้ใช้กำหนดนามแฝงสั้นๆ สำหรับโมเดลที่ใช้งานบ่อย
  • ข้อดี: ลดความซับซ้อนในการเรียกใช้โมเดล (glm-5 แทน zhipu/glm-5) รองรับการสลับระหว่าง Provider หลายตัว (นามแฝงเดียวกันสามารถแมปไปยัง Provider ต่างกัน) อำนวยความสะดวกในการทดสอบ A/B และการย้ายโมเดล
  • ต้นทุน: ต้องดูแลไฟล์กำหนดค่านามแฝง อาจทำให้สับสน (นามแฝงเดียวกันอาจชี้ไปยังโมเดลต่างกันสำหรับ Agent ต่างกัน)

ส่วนประกอบ

huangserva - inline image

ตัวอย่างการใช้งาน

ใน System Prompt นามแฝงของโมเดลจะแสดงเป็น:

Model Aliases

  • GLM-5: zhipu/glm-5
  • Opus 4.6: xiaowang886/claude-opus-4-6-thinking
  • Sonnet 4.5: xiaowang886/claude-sonnet-4-5

LLM สามารถใช้ชื่อแฝงเพื่อสลับโมเดล: /model glm-5

เลเยอร์ 5: ข้อกำหนดของโปรโตคอล

การเปรียบเทียบ

เหมือนกับ "กฎจราจร"—กำหนดโปรโตคอลมาตรฐานสำหรับการโต้ตอบของ Agent กับระบบ

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องมีข้อกำหนดของโปรโตคอล?

  • การแลกเปลี่ยน: เสรีภาพ vs ความสอดคล้อง
  • การตัดสินใจ: กำหนดโปรโตคอลการโต้ตอบที่เป็นมาตรฐาน (Silent Replies, Heartbeats, Reply Tags ฯลฯ)
  • ข้อดี: รับประกันพฤติกรรมที่สอดคล้องกันในทุก Agent รองรับการตรวจสอบอัตโนมัติและการตรวจสอบสถานะ ทำให้การทำงานร่วมกันของ Agent หลายตัวง่ายขึ้น
  • ต้นทุน: จำกัดเสรีภาพในการแสดงออกของ Agent ต้องการให้ LLM ปฏิบัติตามโปรโตคอลอย่างเคร่งครัด (อาจถูกละเว้น)

ส่วนประกอบ

huangserva - inline image

ตัวอย่างการใช้งาน

ตัวอย่าง Silent Replies:

ผู้ใช้: ได้รับ

Agent: NO_REPLY

ตัวอย่าง Heartbeats:

ระบบ: [Heartbeat Poll]

Agent: HEARTBEAT_OK

ตัวอย่าง Reply Tags:

Agent: [[reply_to_current]] งานเสร็จสมบูรณ์ ✓

เลเยอร์ 6: ข้อมูลรันไทม์

การเปรียบเทียบ

เหมือนกับ "แดชบอร์ด"—บอก LLM ถึงสถานะแบบเรียลไทม์ของสภาพแวดล้อมการทำงานปัจจุบัน

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องแทรกข้อมูลรันไทม์ทุกครั้ง?

  • การแลกเปลี่ยน: การใช้โทเค็น vs ความถูกต้องของบริบท
  • การตัดสินใจ: แทรกสถานะรันไทม์ล่าสุดในทุกคำขอ
  • ข้อดี: LLM รู้เวลาปัจจุบัน (หลีกเลี่ยงความสับสนเรื่องเวลา) LLM รู้โมเดลปัจจุบัน (หลีกเลี่ยงการตัดสินความสามารถผิด) LLM รู้สภาพแวดล้อมปัจจุบัน (หลีกเลี่ยงข้อผิดพลาดเรื่องเส้นทาง)
  • ต้นทุน: ใช้โทเค็น ~2KB ต่อคำขอ ข้อมูลอาจมีความซ้ำซ้อน

ส่วนประกอบ

huangserva - inline image

ตัวอย่างการใช้งาน

Runtime

เลเยอร์ 7: Workspace Files ★ ผู้ใช้สามารถควบคุมได้

การเปรียบเทียบ

เหมือนกับ "บันทึกการทำงานของคุณ"—เหล่านี้คือไฟล์คอนฟิกแบบคงที่ที่คุณสามารถแก้ไขได้โดยตรง

การแลกเปลี่ยนในการออกแบบ

ทำไมเฉพาะเลเยอร์นี้เท่านั้นที่แก้ไขแบบคงที่ได้?

  • การแลกเปลี่ยน: ความเสถียรของเฟรมเวิร์ก vs เสรีภาพของผู้ใช้
  • การตัดสินใจ: แยกส่วนที่ "เปลี่ยนแปลง" ออกจากส่วนที่ "ไม่เปลี่ยนแปลง" เลเยอร์เฟรมเวิร์กรับประกันความสอดคล้อง ในขณะที่เลเยอร์ผู้ใช้อนุญาตให้ปรับแต่งเองได้
  • ข้อดี: ผู้ใช้สามารถกำหนดเอกลักษณ์ ข้อกำหนดการทำงาน และความจำของ Agent การอัปเกรดเฟรมเวิร์กจะไม่ทำลายคอนฟิกของผู้ใช้ ไฟล์คอนฟิกสามารถควบคุมเวอร์ชัน สำรองข้อมูล และแชร์ได้
  • ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขพฤติกรรมหลักของเฟรมเวิร์ก ต้องเรียนรู้เฟรมเวิร์ก TELOS และโครงสร้างไฟล์

ไฟล์หลัก

huangserva - inline image

เลเยอร์ 8: ระบบ Bootstrap Hook ★ ผู้ใช้สามารถควบคุมได้

การเปรียบเทียบ

เหมือนกับ "เข็มฉีดยาที่ตั้งโปรแกรมได้"—คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิกเข้าไปใน System Prompt ขณะรันไทม์

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องมีระบบ Hook?

  • การแลกเปลี่ยน: ความเรียบง่ายของคอนฟิกคงที่ vs ความยืดหยุ่นของการแทรกแบบไดนามิก
  • การตัดสินใจ: จัดหากลไก Hook แบบไดนามิกควบคู่ไปกับ Workspace Files แบบคงที่
  • ข้อดี: สามารถปรับเนื้อหาที่แทรกตามบริบท (ช่องทาง ผู้ส่ง เวลา) สามารถเรียกใช้คำสั่งเชลล์และแทรกผลลัพธ์ (เช่น สภาพอากาศปัจจุบัน, สถานะ Git) สามารถอ่านไฟล์ภายนอกและแทรก (เช่น เอกสารโครงการ, เอกสาร API) รองรับตรรกะแบบมีเงื่อนไข (if/else)
  • ต้นทุน: ต้องเรียนรู้ไวยากรณ์ของระบบ Hook และกลไกการทริกเกอร์ ข้อผิดพลาดของสคริปต์ Hook อาจทำให้ System Prompt ผิดปกติ เพิ่มความซับซ้อนของระบบ

กลไก Hook สี่อย่าง

  1. agent:bootstrap Hook (ระบบ Hook ภายใน)

ตำแหน่งที่ทริกเกอร์: applyBootstrapHookOverrides() ใน bootstrap-hooks.ts

ความสามารถ:

  • ควบคุมอาร์เรย์ bootstrapFiles อย่างสมบูรณ์
  • สามารถเพิ่ม ลบ หรือแก้ไขไฟล์
  • สามารถจัดลำดับไฟล์ใหม่
  • สามารถแก้ไขเนื้อหาไฟล์

ใครสามารถลงทะเบียน:

  • ปลั๊กอิน OpenClaw
  • Workspace Hooks (ไดเรกทอรี ~/.openclaw/workspace-*/hooks/)
  • โมดูลภายใน

ตัวอย่างโค้ด:

registerInternalHook("agent:bootstrap", (event) => {

const context = event.context as AgentBootstrapHookContext;

// Full control over bootstrapFiles array

context.bootstrapFiles = [

{ path: "CUSTOM.md", content: "Custom Content" }

];

});

  1. bootstrap-extra-files Hook (Bundled Hook)

ตำแหน่งที่ทริกเกอร์: handler.ts ใน hooks/bundled/bootstrap-extra-files/

ความสามารถ:

  • แนบไฟล์เท่านั้น ไม่แก้ไขไฟล์ที่มีอยู่
  • ระบุไฟล์เพิ่มเติมผ่านไฟล์คอนฟิก

ตัวอย่างคอนฟิก:

{

"hooks": {

"bootstrap-extra-files": {

"enabled": true,

"paths": ["extra/*.md", "docs/CONTEXT.md"]

}

}

}

สถานการณ์ที่เหมาะสม:

  • ต้องแทรกไฟล์บริบทเฉพาะโครงการ
  • ไม่ต้องการแก้ไขไฟล์ Bootstrap 8 ไฟล์เริ่มต้น
  • ต้องโหลดเอกสารเพิ่มเติมแบบไดนามิก
  1. before_prompt_build Hook (Plugin Hook)

ตำแหน่งที่ทริกเกอร์: runBeforePromptBuild() ใน attempt.ts

ความสามารถ:

  • แก้ไข prompt สุดท้าย (หลังสร้าง system prompt ก่อนส่งไปยัง LLM)
  • สามารถเพิ่มบริบทด้านหน้า (เพิ่มเนื้อหาก่อน prompt)
  • สามารถแทนที่ systemPrompt

ข้อมูลเหตุการณ์:

{

prompt: string; // User input

messages: unknown[]; // Session message history

}

ค่าที่ส่งกลับ:

{

prependContext?: string; // Content added before the prompt

systemPrompt?: string; // Overrides the system prompt

}

สถานการณ์ที่เหมาะสม:

  • ต้องปรับ prompt แบบไดนามิกตามประวัติเซสชัน
  • ต้องแทรกบริบทแบบเรียลไทม์ (เช่น เวลาปัจจุบัน สภาพอากาศ)
  • ต้องแทนที่ system prompt ทั้งหมด
  1. bootstrapMaxChars / bootstrapTotalMaxChars (รายการคอนฟิก)

ประเภท: รายการคอนฟิก (ไม่ใช่ Hook)

ความสามารถ:

  • ควบคุมงบประมาณตัวอักษร
  • ค่าเริ่มต้นของไฟล์เดียว: 20K
  • ค่าเริ่มต้นรวม: 150K
  • ส่วนที่เกินจะถูกตัดโดยใช้ 70% แรก + 20% สุดท้าย

ตำแหน่งคอนฟิก:

{

"agents": {

"defaults": {

"bootstrapMaxChars": 20000,

"bootstrapTotalMaxChars": 150000

}

}

}

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

สถานการณ์ที่ 1: ต้องการเพิ่มเอกสารโครงการ

วิธีแก้ไขที่แนะนำ: bootstrap-extra-files

{

"hooks": {

"bootstrap-extra-files": {

"enabled": true,

"paths": ["docs/API.md", "docs/ARCHITECTURE.md"]

}

}

}

สถานการณ์ที่ 2: ต้องการโหลดไฟล์แบบไดนามิกตามประเภทงาน

วิธีแก้ไขที่แนะนำ: Custom agent:bootstrap Hook

registerInternalHook("agent:bootstrap", (event) => {

const context = event.context as AgentBootstrapHookContext;

const sessionKey = context.sessionKey;

// Load different files based on session type

if (sessionKey.includes("coding")) {

context.bootstrapFiles.push({

path: "CODING_GUIDELINES.md",

content: fs.readFileSync("...").toString()

});

}

});

สถานการณ์ที่ 3: ต้องการแทรกบริบทแบบเรียลไทม์ (เช่น เวลาปัจจุบัน)

วิธีแก้ไขที่แนะนำ: before_prompt_build Hook

on("before_prompt_build", (event, ctx) => {

return {

prependContext: Current Time: ${new Date().toISOString()}

};

});

เลเยอร์ 9: บริบทขาเข้า

การเปรียบเทียบ

เหมือนกับ "ข้อมูลการจราจรแบบเรียลไทม์"—แทรกข้อมูลบริบทของการสนทนาปัจจุบันแบบไดนามิกในทุกคำขอ

การแลกเปลี่ยนในการออกแบบ

ทำไมต้องแทรกบริบททุกครั้ง?

  • การแลกเปลี่ยน: การใช้โทเค็น vs ความต่อเนื่องของการสนทนา
  • การตัดสินใจ: แทรกเมทาดาทาของข้อความล่าสุด ข้อมูลผู้ส่ง และประวัติการสนทนาในทุกคำขอ
  • ข้อดี: LLM รู้ว่าผู้ใดกำลังพูดอยู่ (หลีกเลี่ยงความสับสนเรื่องผู้ส่ง) LLM รู้ประวัติการสนทนา (รักษาความต่อเนื่องของบริบท) LLM รู้ว่าถูก @mention หรือไม่ (ตัดสินใจว่าจะตอบสนองหรือไม่)
  • ต้นทุน: ใช้โทเค็น ~3KB ต่อคำขอ ประวัติการสนทนาอาจมีสัญญาณรบกวน

ส่วนประกอบ

huangserva - inline image

กระบวนการสร้าง System Prompt ที่สมบูรณ์

huangserva - inline image
huangserva - inline image
huangserva - inline image

สรุปเลเยอร์ที่ผู้ใช้สามารถควบคุมได้

OpenClaw มี กลไกที่ผู้ใช้สามารถควบคุมได้ 3 ประเภท:

  1. เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกแบบคงที่ สถานการณ์: การกำหนดเอกลักษณ์ Agent ข้อกำหนดการทำงาน และความจำ ข้อดี: ง่าย ใช้งานง่าย ควบคุมเวอร์ชันได้ง่าย ข้อเสีย: ไม่สามารถปรับเปลี่ยนแบบไดนามิก
  2. เลเยอร์ 8 (Bootstrap Hook System) - สคริปต์การแทรกแบบไดนามิก สถานการณ์: การแทรกเนื้อหาตามบริบท การเรียกใช้คำสั่ง การอ่านไฟล์ภายนอก ข้อดี: ยืดหยุ่น มีประสิทธิภาพ รองรับตรรกะและคำสั่ง ข้อเสีย: ต้องเรียนรู้ระบบ Hook ข้อผิดพลาดของสคริปต์ทำให้เกิดปัญหา
  3. การควบคุมเลเยอร์ 9 ทางอ้อม (บริบทขาเข้า) - การมีอิทธิพลต่อบริบทโดยการส่งข้อความ สถานการณ์: การมีอิทธิพลต่อพฤติกรรมของ LLM ผ่านประวัติการแชทหรือข้อความที่อ้างถึง ข้อดี: ไม่ต้องตั้งค่า ปฏิสัมพันธ์ที่เป็นธรรมชาติ ข้อเสีย: ไม่สามารถควบคุมได้แม่นยำ

ตารางเปรียบเทียบขนาด

⚠️



หมายเหตุ: ข้อมูลต่อไปนี้เป็นค่าประมาณ ขนาดจริงแตกต่างกันไปตามคอนฟิกและบริบทรันไทม์ เลเยอร์เฟรมเวิร์ก (เลเยอร์ 1-6 + 9) ตามทฤษฎีแล้วควรจะเหมือนกัน แต่อาจแตกต่างกันเล็กน้อยเนื่องจากคำจำกัดความของเครื่องมือ ทักษะที่โหลด ฯลฯ

huangserva - inline image

หมายเหตุ:

  • เลเยอร์ 7 และเลเยอร์ 8 เป็นส่วนที่ผู้ใช้ควบคุมได้ ขนาดแตกต่างกันไปตามคอนฟิกของ Agent
  • เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติ และตามทฤษฎีแล้วเหมือนกันทุก Agent
  • การวัดจริงอาจแตกต่างกันเนื่องจากความพร้อมของเครื่องมือ การโหลดทักษะ และบริบทรันไทม์

ข้อเสนอแนะในการปรับปรุงประสิทธิภาพ

  1. การปรับแต่งส่วนที่ผู้ใช้ควบคุมได้ (เลเยอร์ 7 + 8)

เนื่องจากเลเยอร์ 7 และ 8 ถูกควบคุมโดยผู้ใช้ นี่คือกลยุทธ์การปรับแต่ง:

การปรับแต่งเลเยอร์ 7 (ไฟล์คงที่):

✅ กลยุทธ์แบบลีนที่แนะนำ:

  • IDENTITY.md: เก็บโครงสร้าง TELOS หลัก ลบคำอธิบายที่ซ้ำซ้อน ใช้ตารางแทนย่อหน้า
  • AGENTS.md: ใช้รายการตรวจสอบแทนย่อหน้ายาว แสดงคำสั่งในบล็อกโค้ด ลบคำอธิบายกฎที่ซ้ำกัน
  • MEMORY.md: พึ่งพาการส่งออกอัตโนมัติของ MemOS ไม่ต้องเพิ่มเนื้อหาด้วยตนเอง ปล่อยให้ระบบดูแล

❌ สิ่งที่ควรหลีกเลี่ยง:

  • อย่าทำซ้ำคำอธิบายที่ OpenClaw framework รู้อยู่แล้ว
  • อย่าคัดลอกคำอธิบายทักษะโดยละเอียดลงใน Workspace Files
  • อย่าใช้สำนวนโวหารหรือภาษาตกแต่งมากเกินไป

การปรับแต่งเลเยอร์ 8 (ระบบ Hook):

✅ กลยุทธ์การใช้งานที่แนะนำ:

  • ให้ความสำคัญกับ bootstrap-extra-files (สถานการณ์ง่าย)
  • ใช้ agent:bootstrap เมื่อต้องการตรรกะแบบมีเงื่อนไข (สถานการณ์ซับซ้อน)
  • ใช้ before_prompt_build สำหรับบริบทแบบเรียลไทม์ (สถานการณ์ไดนามิก)

❌ สิ่งที่ควรหลีกเลี่ยง:

  • อย่ารันการดำเนินการที่ใช้เวลานานใน Hook (บล็อกการสร้าง System Prompt)
  • อย่าแทรกเนื้อหามากเกินไปใน Hook (เกินขีดจำกัดโทเค็น)
  • อย่าใช้ dependencies ภายนอกที่ไม่เสถียรใน Hook (ทำให้เกิดข้อผิดพลาดในการเริ่มต้น)
  1. กลยุทธ์การตัดแต่ง Prompt

หาก System Prompt มีขนาดใหญ่เกินไป ให้พิจารณา:

huangserva - inline image

สรุป

System Prompt ของ OpenClaw ไม่ใช่ไฟล์เดียว แต่เป็น สถาปัตยกรรม 9 เลเยอร์ ที่ถูกออกแบบอย่างพิถีพิถัน:

  • เลเยอร์ 1-6: สร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก รับประกันความสอดคล้องและความเสถียร
  • เลเยอร์ 7: ไฟล์คอนฟิกแบบคงที่ที่ผู้ใช้แก้ไขได้ (IDENTITY.md, AGENTS.md ฯลฯ)
  • เลเยอร์ 8: สคริปต์การแทรกแบบไดนามิกที่ผู้ใช้ตั้งโปรแกรมได้ (Bootstrap Hook System)
  • เลเยอร์ 9: บริบทแบบเรียลไทม์ที่เฟรมเวิร์กแทรกโดยอัตโนมัติ (บริบทขาเข้า)

มี 2 เลเยอร์ที่ผู้ใช้ควบคุมได้ (เลเยอร์ 7 + 8) ไม่ใช่แค่เลเยอร์ 7 ตามที่เคยระบุไว้ผิด

การเข้าใจความแตกต่างและการเชื่อมต่อระหว่างเลเยอร์เหล่านี้คือกุญแจสำคัญในการควบคุมการกำหนดค่า OpenClaw

บันทึกในคลิกเดียว

อ่านบทความไวรัลเชิงลึกด้วย AI ใน YouMind

Save the source, ask focused questions, summarize the argument, and turn a viral article into reusable notes in one AI workspace.

Explore YouMind
สำหรับครีเอเตอร์

เปลี่ยน Markdown ของคุณให้เป็นบทความ 𝕏 ที่สะอาดตา

เวลาคุณเผยแพร่งานเขียนยาวของตัวเอง การจัดรูปแบบรูปภาพ ตาราง และบล็อกโค้ดให้เข้ากับ 𝕏 นั้นน่าปวดหัว YouMind เปลี่ยนร่าง Markdown ทั้งฉบับให้เป็นบทความ 𝕏 ที่สะอาดตาและพร้อมโพสต์ทันที

ลอง Markdown เป็น 𝕏

แพตเทิร์นให้ถอดรหัสเพิ่มเติม

บทความไวรัลล่าสุด

สำรวจบทความไวรัลเพิ่มเติม