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

Prompt ที่​ใช้งาน​ได้​จริง

บท​ที่​แล้ว​คุณ​ยิง Messages API ดิบ​เห็น​ทุก byte ทั้ง field system ที่​ระดับ​บน​สุด และ messages ที่​ใส่ turn ของ​ผู้​ใช้ บท​นี้​ตอบ​คำถาม​ที่​ตาม​มา​ทันที: จะ เขียน​อะไร ลง​ใน​สอง​ช่อง​นั้น​ให้ model ทำงาน​ได้​อย่าง​ที่​ตั้งใจ คน​ที่​เพิ่ง​เริ่ม​มัก​คิด​ว่า Prompt EngineeringPrompt Engineeringการ​ออกแบบ​คำ​สั่ง​ให้ model ทำงาน​ได้​เชื่อถือ​ได้ ด้วย​โครงสร้าง​มากกว่า​ความ​ฉลาด​ของ​ถ้อยคำ — บอก​ให้​ชัด​และ​ตรง, ให้​เหตุผล​เบื้องหลัง​กติกา (ไม่ใช่​แค่​ตัวเลข​เปล่า ๆ), ยก​ตัวอย่าง (ดู Few-shot), ห่อ​แต่ละ​ส่วน​ด้วย​แท็ก XML และ​ตั้ง​บทบาท​ใน System Prompt — หลัก​คือ 'ถ้า​เพื่อน​ร่วม​งาน​ที่​ไม่รู้​บริบท​อ่าน​แล้ว​งง Claude ก็​งง​เหมือน​กัน' และ​เลิก​ตะโกน CRITICAL/MUST กับ model รุ่น​ใหม่Process คือ​การ​หา​ถ้อยคำ​วิเศษ​หรือ​คาถา​ลับ — มัน​ไม่ใช่​เลย prompt ที่​เชื่อถือ​ได้​มา​จาก โครงสร้าง ไม่ใช่​ความ​ฉลาด​ของ​สำนวน คุณ​จะ​ได้​เห็น​สี่​เทคนิค​ที่​ยก​ผลลัพธ์​จาก​เดาสุ่ม​เป็น​เสถียร แล้ว​ประกอบ​มัน​เข้า​เป็น system prompt ของ agent support Order ที่​คอร์ส​นี้​จะ​ใช้​ยาว​ไป​จนถึง capstone

📦 code ตัวอย่าง

คอร์ส​นี้​ค่อยๆ ประกอบ agent สำหรับ support ลูกค้า​บน domain Order ของบริการฟู้ด​เดลิ​เวอรี จาก repo kaen-food-ordering (กำลัง​จัด​ทำ) เป็น​ตัวอย่าง​เดิน​เรื่อง​ตลอด​คอร์ส — system prompt (persona บวก​กฎ​คืน​เงิน) ที่​เรา​สร้าง​ใน​บท​นี้​คือ​ชิ้น​เดียว​กับ​ที่​บท​ที่ 8 หยิบ​ไป​ใช้​ประกอบ agent ตัว​เต็ม

ก่อน​เทคนิคใดๆ Anthropic ให้​เกณฑ์​วัด​ที่​ใช้ได้​เสมอ: “Show your prompt to a colleague with minimal context on the task and ask them to follow it. If they’d be confused, Claude will be too.” — เอา prompt ไป​ให้​เพื่อน​ร่วม​งาน​ที่​แทบ​ไม่รู้​บริบท​ของ​งาน​ลอง​ทำ​ตาม ถ้า​เขา​งง model ก็​งง​เหมือน​กัน กรอบ​ความคิด​ที่​ควร​ถือ​คือ “Think of Claude as a brilliant but new employee who lacks context on your norms and workflows.” — มอง model เป็น​พนักงาน​ใหม่​ที่​เก่ง​มาก แต่​ยัง​ไม่รู้​ธรรมเนียม​และ​ขั้นตอน​ภายใน​ของ​ทีม​คุณ​เลย

จุด​ที่​วิศวกร C# ต้อง​ปรับ​ความคิด: นี่​ไม่ใช่​การ​เรียก method ที่ signature บังคับ input ให้​ถูกต้อง model จะ​เติม​ช่องว่าง​ที่​คุณ​ไม่​ได้​บอก​ด้วย​การ​เดา งาน​ของ prompt คือ​ปิด​ช่องว่าง​นั้น​ด้วย​บริบท​และ​โครงสร้าง ไม่ใช่​ด้วย​คำ​สั่ง​ที่​ดัง​ขึ้น

เทคนิค​ที่​หนึ่ง — บอก​ให้​ชัด และ​ให้​เหตุผล​กำกับ​กฎ

หัวข้อ​ที่​มีชื่อ​ว่า “เทคนิค​ที่​หนึ่ง — บอก​ให้​ชัด และ​ให้​เหตุผล​กำกับ​กฎ”

model ไม่รู้​สิ่ง​ที่​คุณ​ไม่​ได้​เขียน ถ้า​คุณ​กำกวม มัน​จะ​เลือก​ทาง​เอง เอกสาร​ยก​ตัวอย่าง​ที่​ชัด: ถ้า​คุณ​เขียน​ว่า “‘can you suggest some changes,’ Claude will sometimes provide suggestions rather than implementing them.” — ขอ​แบบ​เปิด​ช่อง​ให้​ตีความ​ว่า “แค่​แนะนำ” ก็ได้ model ก็​จะ​แค่​แนะนำ ไม่​ลงมือ​ทำ​จริง สำหรับ agent ที่​ต้อง ลงมือ เรียก tool ประเด็น​นี้​สำคัญ​มาก และ​เรา​จะ​ย้ำ​มัน​อีก​ครั้ง​ใน​บท​ที่ 4 ตอน​สั่ง​ให้ model เรียก code C#

ที่​ทรง​พลัง​กว่า​การ​สั่ง​เปล่าๆ คือ​การ​บอก เหตุผล เบื้องหลัง​กฎ Anthropic ระบุ​ว่า “Providing context or motivation behind your instructions… can help Claude better understand your goals” และ “Claude is smart enough to generalize from the explanation.” — model ฉลาด​พอ​จะ generalize จาก​คำ​อธิบาย​ไป​ยัง​เคส​ที่​คุณ​ไม่​ได้ list ไว้ แปล​ว่า​กฎ​คืน​เงิน​ของ​เรา​ไม่​ควร​เป็น​แค่​ตัวเลข​เปล่าๆ แต่​ควร​มี​เหตุผล​ติด​ไป​ด้วย เทียบ​สอง​แบบ:

❌ version ดิบ — กฎเปล่า ไม่มีเหตุผล
คืนเงินได้ถ้ายอดไม่เกิน 500 บาท
✅ version มีเหตุผลกำกับ
คืนเงินอัตโนมัติได้ถ้ายอดไม่เกิน 500 บาท เพราะเป็นเพดานที่ทีมยอมรับ
ความเสี่ยงได้โดยไม่ต้องให้คนอนุมัติ ยอดที่สูงกว่านี้ต้องส่งต่อให้
เจ้าหน้าที่ตรวจก่อน เพื่อกันการคืนเงินผิดพลาดจำนวนมาก

version ล่าง​ช่วย​ให้ model รับมือ​เคส​ที่​คุณ​ไม่​ได้​เขียนไว้ตรงๆ ได้ เช่น “ยอด 500 พอดี” หรือ “ออเดอร์​ที่​น่า​สงสัย​ว่า​เป็นการ​ฉ้อโกง” เพราะ​มัน​เข้าใจ เจตนา ของ​เพดาน ไม่ใช่​แค่​ท่อง​ตัวเลข

การ​ใส่​ตัวอย่าง​ของ input กับ output ที่​ต้องการ​ลง​ไป​ใน prompt เรียก​ว่า Few-shotFew-shotเทคนิค​ใส่​ตัวอย่าง input-output ที่​ถูกต้อง​ลง​ใน prompt เพื่อ​กำกับ​รูปแบบ โทน และ​โครงสร้าง​ของ​คำ​ตอบ — เป็น​หนึ่ง​ใน​วิธี​ที่​ได้​ผล​ที่สุด​ใน​การ​บังคับ​ทิศทาง output ของ Claude ตัวอย่าง​ควร​ตรง​ประเด็น หลากหลาย และ​มี​โครงสร้าง​ชัด (ห่อ​ใน `<example>`…`</example>`) แนะนำ 3–5 ตัวอย่าง​เพื่อ​ผล​ดี​ที่สุดProcess และ​เอกสาร​บอกตรงๆ ว่า “Examples are one of the most reliable ways to steer Claude’s output format, tone, and structure.” — เป็น​วิธี​ที่​เชื่อถือ​ได้ที่สุด​วิธี​หนึ่ง​ใน​การ​คุม​รูปแบบ น้ำเสียง และ​โครงสร้าง​ของ​คำ​ตอบ อธิบาย​เป็น​ย่อหน้า​ยาว​สิบ​บรรทัด​ว่า​อยาก​ได้​โทน​ไหน สู้​ยก​ตัวอย่าง​สาม​อัน​ให้​ดู​ไม่​ได้

เกณฑ์​ของ​ตัวอย่าง​ที่​ดี​มี​สาม​ข้อ — Relevant / Diverse / Structured คือ​ตรง​กับ​งาน​จริง ครอบคลุม​หลาย​สถานการณ์ (ไม่ใช่​เคส​ง่าย​ซ้ำๆ) และ​ห่อ​ไว้​ใน​โครงสร้าง​ชัดเจน และ​ปริมาณ​ที่​แนะนำ​คือ “Include 3–5 examples for best results.” ตัวอย่าง​สำหรับ agent support ของ​เรา (ใน​บท​นี้​ขอ​ยก​มาสอง​อัน​พอ​เพื่อ​ประหยัด​พื้นที่ แม้​เป้า​จริง​คือ 3–5) ห่อ​แต่ละ​อัน​ด้วย​แท็ก <example>:

<example>
ลูกค้า: อาหารมาช้ากว่าที่แจ้งไปเกินหนึ่งชั่วโมง
ตอบ: ขอโทษด้วยจริง ๆ ครับ ผมขอตรวจสถานะออเดอร์ให้ก่อนนะครับ
แล้วจะดูแนวทางชดเชยที่เหมาะสมให้
</example>
<example>
ลูกค้า: ขอคืนเงินออเดอร์ ORD-1042 หน่อย ได้ของไม่ครบ
ตอบ: รับทราบครับ ผมขอเช็กรายละเอียดออเดอร์ ORD-1042 ก่อน
ถ้ายอดอยู่ในเกณฑ์ที่คืนได้ทันที ผมจะดำเนินการให้เลยครับ
</example>

สอง​ตัวอย่าง​นี้ แสดง โทน​ที่​สุภาพ การ​เช็ก​ข้อมูล​ก่อน​ตัดสิน และ​การ​อ้าง​กฎ​คืน​เงิน โดย​ไม่​ต้อง​บรรยาย​เป็น​คำ​สั่ง​ยาวๆ model จะ​เลียน​โครงสร้าง​นี้​กับ​เคส​ใหม่​ที่​ไม่​เคย​เห็น

พอ prompt เริ่ม​มี​หลาย​ส่วน — คำ​สั่ง ตัวอย่าง ข้อมูล​ออเดอร์ กฎ — model ต้อง​แยก​ออกว่า​ตรง​ไหน​คือ​อะไร Anthropic แนะนำ XML tag: “XML tags help Claude parse complex prompts unambiguously… Wrapping each type of content in its own tag… reduces misinterpretation.” — ห่อ​เนื้อหา​แต่ละ​ชนิด​ไว้​ใน​แท็ก​ของ​ตัวเอง ลด​โอกาส​ที่ model จะ​เข้าใจ​ผิด​ว่า​ส่วน​ไหน​เป็น​ส่วน​ไหน

มอง​แบบ​วิศวกร มัน​คือ​การ​ให้ schema เบาๆ กับ​ข้อความ prompt — เหมือน​คุณ deserialize JSON ได้​ง่าย​กว่า​การ regex string ก้อน​เดียว model ก็​อ้างอิง <rules> หรือ <order_data> ได้​ตรง​กว่า​การ​เดา​จาก​ย่อหน้า​ปน​กัน แท็ก​จะ​ใช้​ชื่อ​อะไร​ก็ได้ ขอ​แค่​เปิด-ปิด​ให้​ครบ​และ​ตั้ง​ชื่อ​ให้​สื่อ​ความ

เทคนิค​สุดท้าย​คือ​หัวใจ​ของ​บท​นี้ System PromptSystem Promptคำ​สั่ง​ระดับ​บน​สุด​ที่​กำหนด​บทบาท น้ำเสียง และ​กติกา​ให้ model ก่อน​บทสนทนา​จะ​เริ่ม เช่น​ตั้ง​ให้​เป็น 'เจ้าหน้าที่ support ของบริการฟู้ด​เดลิ​เวอรี' — ใน​การ​เรียก API ดิบ​มัน​คือ field `system` ระดับ​บน​สุด (ไม่ใช่ message ที่ role เป็น system) แค่​ประโยค​เดียว​ก็​เปลี่ยน​พฤติกรรม​ได้ ส่วน​ใน Microsoft.Extensions.AI มัน​กลาย​เป็น ChatMessage ที่ ChatRole.System แทนArchitecture คือ​ช่อง​ที่​คุณ​กำหนด บทบาท ให้ model ก่อน​บทสนทนา​จะ​เริ่ม และ​มัน​ได้​ผล​จริง: “Setting a role in the system prompt focuses Claude’s behavior and tone for your use case. Even a single sentence makes a difference.” — แค่​ประโยค​เดียว​ก็​เปลี่ยน​พฤติกรรม​และ​น้ำเสียง​ได้​แล้ว เอกสาร​ยก​ตัวอย่าง​พื้นฐาน​ว่า System = "You are a helpful coding assistant specializing in Python." — สำหรับ​คอร์ส​นี้​เรา​เปลี่ยน​เป็น​บทบาท​เจ้าหน้าที่ support ฟู้ด​เดลิ​เวอรี

จำ​จาก​บท​ที่ 2 ได้​ว่า​ใน​การ​เรียก​ดิบ system เป็น field ที่​ระดับ​บน​สุด​ของ request ไม่ใช่ message ที่​มี role: "system" เรา​เอา​สี่​เทคนิค​ข้าง​บน​มา​รวม​กัน​เป็น string ก้อน​เดียว​ที่​จะ​ไป​อยู่​ใน field นั้น:

// system prompt ของ agent support — ไปอยู่ใน field system ที่ระดับบนสุด
// ของ request ดิบจากบทที่ 2 (ไม่ใช่ message ที่มี role: "system")
var systemPrompt = """
You are a customer-support agent for a food-delivery service.
Be warm, concise, and always look up real data before acting.
<rules>
- คืนเงินอัตโนมัติได้ถ้ายอดไม่เกิน 500 บาท เพราะเป็นเพดานที่ทีมยอมรับ
ความเสี่ยงได้โดยไม่ต้องให้คนอนุมัติ ยอดที่สูงกว่านี้ต้องส่งต่อ
ให้เจ้าหน้าที่ตรวจก่อน เพื่อกันการคืนเงินผิดพลาดจำนวนมาก
- ตรวจสถานะออเดอร์จริงก่อนเสมอ ห้ามเดาจากความจำ
- ถ้าไม่มีข้อมูลพอ ให้ถามลูกค้ากลับ อย่าแต่งข้อมูลออเดอร์ขึ้นเอง
</rules>
""";
var body = new {
model = "claude-opus-4-8", // ตัวอย่าง ณ 2026-07 — id ของ model เลื่อนตามเวลา
max_tokens = 1024,
system = systemPrompt, // ← persona บวกกฎ อยู่ตรงนี้ ไม่มี temperature
messages = new[] {
new { role = "user", content = "ขอคืนเงินออเดอร์ ORD-1042 หน่อยครับ" }
}
};

สังเกต​ว่า​ยัง​คง​กติกา​เดิม​จาก​บท​ที่ 2 ครบ — header จริง​คือ x-api-key และ anthropic-version: 2023-06-01 (ใน code ตั้ง​ค่า​ตอน​สร้าง HttpClient) และ ไม่มี temperature ใน​ตัว body เลย เรา​คุม​พฤติกรรม​ของ model ผ่าน​ถ้อยคำ​ใน system prompt ล้วนๆ นี่​คือ​ความหมาย​ที่แท้​จริง​ของ “กำกับ​ผ่าน prompt แทน temperature” ที่​ปัก​ไว้​ตั้งแต่​บท​แรก

2 surface ของ​คำ​ว่า message ใน C# — อย่า​ปน​กัน

system prompt ก้อน​นี้​อยู่​ใน field system ของ request ดิบ (บท​ที่ 2–4) แต่​พอ​ถึง​บท​ที่ 5 เรา​จะ​เขียน​การ​เรียก​เดิม​ด้วย​สำนวน .NET ผ่าน IChatClient ของ Microsoft.Extensions.AI — ตรง​นั้น system prompt เดิม​นี้​จะ​ถูก​แปลง​ร่าง​เป็น message ที่​มี role เป็น ChatRole.System (คือ new ChatMessage(ChatRole.System, systemPrompt)) ไม่ใช่ field ที่​ระดับ​บน​สุด​อีก​ต่อ​ไป เนื้อหา​เหมือน​เดิม​เป๊ะ แค่​คนละ API — จำ​ไว้​ว่า​เป็น​คนละ surface กัน จะ​ได้​ไม่​เอา shape ของ2 API มา​ปน​กัน​ตอน​เขียน​จริง

ข้อ​สุดท้าย​ที่​คน​เพิ่ง​เริ่ม​ต้อง​ได้ยิน คือ​นิสัย​เก่า​ที่​ควร​เลิก เอกสาร​ตัวอย่าง​จาก​ยุค​ก่อน​ชอบ​เน้น​ด้วยคำสั่งตัวใหญ่ๆ ว่า CRITICAL: You MUST... แต่​กับ model รุ่น​ปัจจุบัน Anthropic แนะนำ​ตรง​ข้าม: “Where you might have said ‘CRITICAL: You MUST use this tool when…’, you can use more normal prompting like ‘Use this tool when…’.” — เขียน​แบบ​ปกติ​ธรรมดา​ก็​พอ ไม่​ต้อง​ตะโกน

เหตุผล​เชื่อม​กับ​กฎ​ทอง​ต้นบท: model รุ่น​ใหม่​ทำ​ตาม​คำ​สั่ง​ที่​เขียน​ชัดเจน​ได้​ดี​อยู่​แล้ว การ​อัด​ตัวพิมพ์​ใหญ่​กับ​เครื่องหมาย​อัศเจรีย์​ไม่​ได้​เพิ่ม​ความ​เชื่อฟัง มี​แต่​ทำให้ prompt อ่าน​ยาก​และ​ดูแล​ยาก​ขึ้น ความ​ชัด​มา​จาก​โครงสร้าง​และ​เหตุผล ไม่ใช่​จาก​ระดับ​เสียง

flowchart TB
  subgraph VAGUE["prompt กำกวม ไม่มีโครงสร้าง"]
    V1["ช่วยจัดการคำขอคืนเงินหน่อย"] --> V2["model เดาเอง"]
    V2 --> V3["ตอบไม่นิ่ง<br/>เดายอด ข้ามการเช็ก โทนหลุด"]
  end
  subgraph SOLID["system prompt มีโครงสร้าง"]
    S1["บทบาท บวกกฎมีเหตุผล"] --> S4["model มีกรอบ"]
    S2["ตัวอย่าง few-shot"] --> S4
    S3["ห่อด้วย XML tag"] --> S4
    S4 --> S5["ตอบเสถียร<br/>เช็กก่อน อ้างกฎ โทนคงเส้น"]
  end
  classDef bad fill:#dc2626,stroke:#7f1d1d,color:#f8fafc;
  classDef good fill:#16a34a,stroke:#065f46,color:#f8fafc;
  class V3 bad;
  class S5 good;

คำ​บรรยาย​ภาพ: บน (แดง) — prompt กำกวม​ปล่อย​ให้ model เดา​ช่องว่าง​เอง ผล​จึง​ไม่​นิ่ง เดา​ยอด​คืน​เงิน ข้ามการเช็ก​ข้อมูล โทน​หลุด​ได้ ล่าง (เขียว) — system prompt ที่​ประกอบ​จาก​สาม​ชิ้น (บทบาท​บวก​กฎ​ที่​มี​เหตุผล ตัวอย่าง few-shot และ​การ​ห่อ​ด้วย XML tag) ให้​กรอบ​ที่​ชัด ผล​จึง​เสถียร เช็ก​ข้อมูล​ก่อน​ลงมือ อ้าง​กฎ​ถูก และ​คง​โทน​เดิม ความ​เชื่อถือ​ได้​มา​จาก​โครงสร้าง ไม่ใช่​ถ้อยคำ​ที่​ฉลาด​หรือ​ดัง​กว่า

ตอน​นี้​คุณ​มี system prompt ที่​ตั้ง​บทบาท​และ​กฎ​คืน​เงิน​ให้ agent แล้ว แต่​มัน​ยัง พูด ได้​อย่าง​เดียว — ยัง​เช็ก​สถานะ​ออเดอร์​จริง​ไม่​ได้ ตรง ORD-1042 ใน​ตัวอย่าง​ข้าง​บน model ได้​แต่​บอกว่า “ขอ​เช็กก่อน” โดย​ไม่มี​ทาง​ไป​เช็ก​จริง บท​ต่อ​ไป​เติม​มือ​ให้​มัน: บท​ที่ 4 สอน tool use — ให้ model เรียก code C# ของ​คุณ​อย่าง getOrder(orderId) เพื่อ​ไป​ดึง​ข้อมูล​จริง​มา​ตอบ แทน​การ​เดา และ​คุณ​จะ​เห็น​ว่า​กฎ “บอก​ให้​ชัด​ว่า​ต้อง​ลงมือ” จาก​บท​นี้​กลับ​มา​สำคัญ​อีก​ครั้ง​ตอน​สั่ง​ให้ model เลือก​ใช้ tool


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​สังเคราะห์​จาก​หน้า​เดียว​รวบยอด​ของ Anthropic อ่าน​ต่อ​ได้ที่​ต้นทาง​โดยตรง:

  • Anthropic, “Prompt engineering overview” — กฎ​ทอง “ให้​เพื่อน​ลอง​ทำ​ตาม” กรอบ “พนักงาน​ใหม่​ที่​เก่ง​แต่​ยัง​ไม่รู้​บริบท” การ​ให้​เหตุผล​กำกับ​คำ​สั่ง การ​ยก example (Relevant/Diverse/Structured, 3–5 อัน) การ​ห่อ​ด้วย XML tag การ​ตั้ง​บทบาท​ผ่าน system prompt และ​คำ​แนะนำ​ให้​เลิก​ตะโกน CRITICAL/MUST กับ model รุ่น​ปัจจุบัน เข้าถึง 2026-07-19

เช็กความเข้าใจ — บทที่ 3

ข้อ 1 / 3

ทำไมเอกสารจึงแนะนำให้ใส่ 'เหตุผล' กำกับกฎคืนเงิน แทนที่จะเขียนแค่ตัวเลขเพดานเปล่าๆ?