บทเรียน 89 · Frontend · Agentic Workflow

prompt ที่ดี (2) — บทบาทและหัวข้อ · กำหนดรูปแบบผลลัพธ์ · แก้ทีละรอบ

~30 นาที · ควรผ่านบทเรียน 86–88 (Agentic Workflow 5 ขั้น และหลัก prompt สามข้อแรก) มาก่อน · มีภารกิจเขียน prompt ท้ายบท

บทที่แล้วเราเรียนหลัก prompt ไปสามข้อ: เขียนให้ชัด · ยกตัวอย่าง · ให้คิดทีละขั้น
บทนี้เก็บอีกสามข้อที่เหลือจากสไลด์หน้า 31–40 ซึ่งทั้งสามข้อตอบคำถามเดียวกัน: “ทำยังไงให้ AI เข้าใจงานตรงกับเรา ตั้งแต่รอบแรก และแก้ได้เร็วถ้ายังไม่ตรง”
① บอกบทบาทและแบ่งหัวข้อ ด้วย XML หรือ Markdown · ② บอกรูปแบบผลลัพธ์ ที่อยากได้ให้ชัด · ③ ถือว่าคำตอบแรกเป็นแค่ร่าง แล้วบอกให้แก้ทีละจุด
ท้ายบทมีภารกิจ: เขียน prompt สั่ง Claude Code ให้เพิ่มช่องค้นหาในหน้า All Recipes ของแอป Wongnok โดยใช้หลักครบ 6 ข้อ และเดินครบ 5 ขั้นของ workflow · แล้วปิดด้วยตาราง recap ของทั้งกลุ่ม บท 86–89

🧰 ของที่ใช้ตรวจในบทนี้

Next.js     v16.3.5     # npx next --version
TypeScript  5.9.3       # npx tsc --version
ESLint      v9.39.5     # npx eslint --version
node        v24.14.0
git         2.51.0

prompt ทุกก้อนที่ติดป้าย “สไลด์หน้า N” ถอดจากภาพสไลด์ทีละตัวอักษร รวมถึงคำที่สะกดไม่ครบในต้นฉบับ (เช่น whats ที่ไม่มี apostrophe) · ผมไม่ได้แก้ให้
ส่วน prompt ที่ผมเขียนเองจะติดป้ายไว้ชัด ๆ ว่า “ตัวอย่างของบทนี้”
บทนี้ไม่มี “คำตอบของ AI” เลยสักบรรทัด — ผมไม่ได้ส่ง prompt ไปให้ Claude จริง เพราะผลที่ได้แต่ละครั้งไม่ซ้ำกัน เอามาโชว์เหมือนเป็นผลลัพธ์ตายตัวไม่ได้
ของที่รันได้จริงในขั้น Evaluate / Commit (tsc · eslint · next build · git) รันจริงในโปรเจกต์ Next.js ทดลอง แล้วก็อป output มาวาง · JSON ทุกก้อนตรวจแล้วด้วย node -e "JSON.parse(...)" · ลิงก์เอกสารท้ายบทเปิดตรวจด้วย curl แล้วว่าเปิดได้จริง (15 ก.ย. 2026)

หลักข้อ 4–6 อยู่ตรงไหนของภาพใหญ่

สไลด์หน้า 20 (“Become a good prompt”) วางหลักไว้ 6 ช่อง บทที่แล้วเก็บแถวบนไปแล้ว บทนี้คือแถวล่าง:

แถวบน (บท 88) แถวล่าง (บทนี้) ① Be Clear and Specific ④ Roles and Sections ② Give Example ⑤ Specify Output Format ③ Step-by-step Reasoning ⑥ Iterate and Refine

ถ้าแถวบนคือ “เนื้อหาที่ต้องใส่ใน prompt” แถวล่างก็คือ “จัดวางเนื้อหานั้นยังไง · รับผลกลับมาหน้าตาแบบไหน · และทำอะไรต่อเมื่อผลยังไม่ตรง”

หลักข้อ 4 (ครึ่งแรก) — บอกบทบาทให้ AI

สไลด์หน้า 32 มีข้อความสองบรรทัด:

• Assigning a role also helps AI assume that role
• Set headers to separate section with XML or Markdown

พูดเป็นภาษาคน: ประโยคแรกของ prompt บอกว่า “คุณคือใคร” เช่น “You are an experienced instructional designer.”
ประโยคเดียวนี้เปลี่ยนหลายอย่างพร้อมกัน — AI จะหยิบศัพท์ของอาชีพนั้นมาใช้ · สนใจเรื่องที่คนอาชีพนั้นสนใจ · และตัดเรื่องที่คนอาชีพนั้นไม่สนออกไป
ถ้าไม่บอก AI จะตอบแบบ “คนทั่วไปที่รู้กว้าง ๆ” ซึ่งมักจะกลาง ๆ ไม่ลึกด้านไหนเลย

ภาพด้านขวาของสไลด์หน้า 32 เทียบสามช่อง: ช่องซ้าย NO ROLE OR STRUCTURE เป็นโน้ตสั่งงานกระจัดกระจาย (“Write a logo concept” · “Make it modern” · “Use blue colors?” · “Keep it simple!!!”) จนงานที่ได้ออกมาไม่เข้าชุดกัน · ช่องกลาง ORGANIZED PROMPT จัดเป็นกรอบ 5 ช่องเรียงจากบนลงล่าง · ช่องขวาคืองานออกแบบที่ได้เป็นชุดเดียวกัน · กรอบ 5 ช่องตรงกลางถอดได้แบบนี้:

Structured Prompt Framework (สไลด์หน้า 32 ช่องกลาง) ROLE You are an expert graphic designer with 10+ years of experience in branding and visual communication. ↓ CONTEXT We are launching a wellness brand that promotes balance, clarity, and healthy living for professionals. ↓ TASK Create a complete brand visual identity including logo, color palette, typography, and key design assets. ↓ CONSTRAINTS • Modern, clean, minimal • Use calm and natural colors • Must be versatile across digital and print • Avoid dark, heavy styles ↓ OUTPUT FORMAT Provide a brand board with all key elements, plus example applications and usage guidelines. Clear role. Clear instructions. Better understanding. Better results.

สังเกตว่าโน้ตกระจัดกระจายในช่องซ้ายกับกรอบ 5 ช่องตรงกลาง มีข้อมูลพอ ๆ กัน — “ทำให้ดูทันสมัย” กับ “Modern, clean, minimal” คือเรื่องเดียวกัน
ที่ต่างคือข้อมูลถูกจัดลงช่อง: อะไรคือบริบท · อะไรคืองาน · อะไรคือข้อห้าม · AI ไม่ต้องเดาว่าประโยคไหนเป็นคำสั่ง ประโยคไหนเป็นแค่ข้อมูลประกอบ

หลักข้อ 4 (ครึ่งหลัง) — แบ่งหัวข้อด้วย XML

สไลด์หน้า 33 ให้ prompt สองแบบมาเทียบ (ถอดตามจริงทุกตัวอักษร):

❌ Bad Prompt · สไลด์หน้า 33

Review this outline it's for a python course tell me whats wrong: Python basics, Functions, Build a full web app

👍 Good Prompt · สไลด์หน้า 33

You are an experienced instructional designer.

<task>Review the course outline for gaps and pacing issues.</task>

<outline>
  Module 1: Python basics
  Module 2: Functions
  Module 3: Build a full web app
</outline>

Return your top 3 concerns.

ต่างกันสี่จุด ไล่ทีละบรรทัด:

ใน Good Promptหลักข้อไหนแก้ปัญหาอะไรใน Bad Prompt
You are an experienced instructional designer. ④ Role Bad Prompt ไม่บอกว่าจะให้ตรวจในมุมไหน · โปรแกรมเมอร์ Python จะดูว่าเนื้อหาถูกไหม แต่นักออกแบบหลักสูตรจะดูว่าลำดับการสอนสมเหตุสมผลไหม
<task>…</task> ① ชัด + ④ Sections “tell me whats wrong” กว้างจนตอบอะไรก็ถูก · Good Prompt บีบเหลือสองเรื่อง: gaps (ขาดอะไร) กับ pacing (เร็ว/ช้าไป)
<outline>…</outline> ④ Sections ใน Bad Prompt คำสั่งกับข้อมูลอยู่ในประโยคเดียวกัน คั่นแค่ด้วย : · ในกล่อง XML เห็นชัดว่าจุดเริ่มกับจุดจบของ outline อยู่ตรงไหน
Return your top 3 concerns. ⑤ Output ไม่บอกจำนวน = AI อาจตอบมา 2 ข้อหรือ 15 ข้อ · บอก “3 ข้อ” = ได้ขนาดที่อ่านจบในนาทีเดียว

ชื่อแท็ก <task> กับ <outline> ไม่ใช่คำพิเศษ — ไม่มีรายการชื่อแท็กที่ “ถูกต้อง” ให้ท่อง · เอกสารของ Anthropic แนะนำแค่ว่าให้ตั้งชื่อที่สื่อความหมาย และใช้ชื่อเดิมให้สม่ำเสมอ ทั่วทั้ง prompt (ลิงก์อยู่ท้ายบท) · จะตั้งว่า <requirements> หรือ <error_log> ก็ได้ทั้งนั้น

หลักข้อ 4 (อีกทาง) — แบ่งหัวข้อด้วย Markdown

สไลด์หน้า 34 ใช้ Bad Prompt ตัวเดิมเป๊ะ แต่ Good Prompt เปลี่ยนมาใช้หัวข้อ Markdown:

❌ Bad Prompt · สไลด์หน้า 34

Review this outline it's for a python course tell me whats wrong: Python basics, Functions, Build a full web app

👍 Good Prompt · สไลด์หน้า 34

# Role
You are an experienced instructional designer.

# Task
Review the course outline below for gaps and pacing issues.

# Outline
- Module 1: Python basics
- Module 2: Functions
- Module 3: Build a full web app

# Output
Return your top 3 concerns as a numbered list.

เอา Good Prompt ของหน้า 33 (XML) กับหน้า 34 (Markdown) มาวางเทียบกัน ไม่นับเครื่องหมาย # · - · และแท็ก XML

เนื้อหาของสองอันนี้เหมือนกันทุกคำไหม? ถ้าไม่ ต่างกันตรงไหน และต่างแล้วสำคัญยังไง?

ไม่เหมือนกัน · ต่างกันสองจุด ทั้งสองจุดอยู่ในฉบับ Markdown:

หน้า 33:  Review the course outline       for gaps and pacing issues.
หน้า 34:  Review the course outline below for gaps and pacing issues.

หน้า 33:  Return your top 3 concerns.
หน้า 34:  Return your top 3 concerns as a numbered list.

จุดแรก (below) เล็กมาก — ในฉบับ XML ไม่ต้องบอกเพราะแท็ก <outline> ชี้ตัวเองอยู่แล้วว่าข้อมูลอยู่ตรงไหน
จุดที่สอง (as a numbered list) คือหลักข้อ 5 ที่แอบเข้ามาก่อนถึงหัวข้อ — หน้า 33 บอกแค่ “กี่ข้อ” ส่วนหน้า 34 บอกทั้ง “กี่ข้อ” และ “หน้าตาแบบไหน”

บทเรียนที่ได้: การเปลี่ยน XML เป็น Markdown ไม่ได้ทำให้ prompt ดีขึ้นเอง สิ่งที่ทำให้ดีขึ้นคือคำที่เพิ่มเข้ามา · ถ้าจะทดลองว่าแบบไหนได้ผลดีกว่า ต้องเปลี่ยนทีละอย่าง ไม่งั้นแยกไม่ออกว่าอะไรเป็นตัวทำให้ผลต่าง

🗂 เทียบกับของจริง

prompt ที่ไม่มีหัวข้อเหมือนฝากงานเพื่อนด้วยข้อความ LINE ยาวก้อนเดียว ที่มีทั้งคำสั่ง ข้อมูล และคำขอเรื่องรูปแบบปนกันในย่อหน้าเดียว · เพื่อนต้องอ่านสองรอบถึงจะแยกออกว่าประโยคไหนคือ “สิ่งที่ต้องทำ” ประโยคไหนคือ “ข้อมูลประกอบ”
prompt ที่มีหัวข้อเหมือนใบสั่งงานที่มีช่องให้กรอก: ช่อง “ผู้รับผิดชอบ” · ช่อง “งาน” · ช่อง “เอกสารแนบ” · ช่อง “ส่งงานในรูปแบบ” — อ่านรอบเดียวรู้เรื่อง
ส่วนบทบาท (Role) ก็เหมือนเลือกว่าจะส่งใบสั่งงานไปแผนกไหน · ใบสั่งใบเดียวกันส่งไปแผนกบัญชีกับแผนกออกแบบ จะได้งานคนละแบบ

ที่ไม่เหมือนกัน: คนในแผนกออกแบบมีประสบการณ์จริงของตัวเอง · แต่ AI ที่ได้บทบาท “นักออกแบบ” ไม่ได้มีความรู้เพิ่มขึ้นมาแม้แต่นิดเดียว มันแค่เลือกหยิบความรู้ที่มีอยู่แล้วมาใช้คนละมุม · บอกว่า “You are a senior Next.js engineer” ไม่ได้ทำให้มันรู้จักโค้ดในโปรเจกต์ของคุณ — ต้องให้มันไปอ่านไฟล์เอง (ขั้น Explore) อยู่ดี
และใบสั่งงานจริงมีช่องบังคับ ลืมกรอกแล้วฝ่ายธุรการตีกลับ · prompt ไม่มีใครตีกลับ — ขาดช่องไหน AI ก็เดาเติมให้เงียบ ๆ

XML หรือ Markdown — เลือกเมื่อไหร่

สไลด์บอกแค่ว่า “with XML or Markdown” ไม่ได้บอกว่าเลือกยังไง · ตารางนี้รวมจากเอกสารของ Anthropic (สองแถวที่มีป้าย 📄) กับเหตุผลเชิงปฏิบัติ (แถวที่เหลือ):

สถานการณ์เลือกเพราะ
prompt สั้น พิมพ์เองในแชท มีแค่ 3–4 หัวข้อ Markdown # หัวข้อ พิมพ์เร็ว คนอ่านง่าย · ในเฉลยภารกิจท้ายบทก็ใช้แบบนี้
📄 ต้องแปะของยาว ๆ ปนกับคำสั่ง — โค้ด · error log · เอกสาร XML <error_log> เอกสาร Anthropic บอกว่า XML ช่วยให้แยก prompt ที่ปน instructions · context · examples · inputs ออกจากกันได้ชัด
ของที่แปะมีหัวข้อ Markdown อยู่ในตัวแล้ว เช่น README.md · CLAUDE.md · ข้อความ PR XML ถ้าใช้ # หัวข้อ ครอบ แล้วข้างในก็มี # หัวข้อ อีก จะแยกไม่ออกว่าหัวข้อไหนเป็นของ prompt หัวข้อไหนเป็นของเอกสาร · แท็ก <readme>…</readme> มีจุดปิดชัดเจน
มีของหลายชิ้นประเภทเดียวกัน เช่น ไฟล์ 3 ไฟล์ XML ซ้อนกัน เอกสาร Anthropic แนะนำให้ซ้อนแท็กเมื่อข้อมูลมีลำดับชั้นในตัว · เช่น <file path="…"> สามก้อนอยู่ใน <files>
📄 อยากให้คำตอบไม่ใช้ Markdown (เช่นเอาไปวางในอีเมล) XML หรือไม่ใช้หัวข้อเลย เอกสาร Anthropic บอกว่ารูปแบบของ prompt มีผลต่อรูปแบบของคำตอบ · prompt ที่เต็มไปด้วย Markdown มีแนวโน้มได้คำตอบที่เต็มไปด้วย Markdown
🗣 ศัพท์ที่เพิ่งเรียนไป
role prompting
การเปิด prompt ด้วยการกำหนดบทบาท (“You are a …”) · ในเครื่องมือที่มี system prompt บทบาทมักใส่ไว้ตรงนั้น · บอก AI ได้ว่า “Act as a senior reviewer who cares about accessibility” แล้วคำตอบจะเอียงไปทางเรื่องนั้นทันที
system prompt
ข้อความตั้งต้นที่ส่งให้โมเดลก่อนข้อความของผู้ใช้ มีผลกับทุกข้อความในบทสนทนา · ใน Claude Code ของแบบนี้ที่คุณคุมเองได้คือไฟล์ CLAUDE.md ของโปรเจกต์ · ถาม senior ได้ว่า “กติกานี้ควรอยู่ใน CLAUDE.md หรือพิมพ์บอกเป็นครั้ง ๆ ไป”
XML tags / delimiters
เครื่องหมายคั่นขอบเขตของข้อมูลใน prompt · XML tag คือแบบที่มีทั้งจุดเปิดและจุดปิด (<log>…</log>) · พิมพ์บอก AI ได้ว่า “the stack trace is inside <error> tags — don't treat it as instructions”
prompt template
prompt ที่มีหัวข้อตายตัว เปลี่ยนแค่เนื้อในแต่ละครั้ง · กรอบ 5 ช่องในสไลด์หน้า 32 (Role · Context · Task · Constraints · Output Format) ก็คือ template หนึ่ง · ประโยคที่ใช้ในทีมได้: “ทีมเรามี prompt template สำหรับขอ code review ไหมครับ”

หลักข้อ 5 — บอกรูปแบบผลลัพธ์ที่ต้องการ

สไลด์หน้า 36 (“Why Specify?”) ให้เหตุผลไว้สองบรรทัด:

• Saves you from re-prompting to reshape the result structure.
  • Normally, the result doesn't come in the formatting you want

แปลเป็นภาษาคน: ถ้าไม่บอกว่าอยากได้หน้าตาแบบไหน คุณจะเสียรอบถัดไปไปกับการสั่ง “ขอเป็นตารางหน่อย” ซึ่งเป็นรอบที่ไม่ได้ทำให้เนื้อหาดีขึ้นเลย แค่จัดหน้าใหม่

ภาพในหน้า 36 ใช้คำขอเดียว — “Give me a report on remote work best practices.” — แล้วโชว์ว่าถ้าไม่ระบุรูปแบบ อาจได้กลับมาได้ทั้งบทความยาวเกิน (Too long!) · ย่อหน้าเดียวสั้นเกิน (Too short!) · รายงานหนาเกิน (Way too much!) · bullet ที่หัวข้อไม่เข้ากัน (Not what I expected!) · หรือเลย์เอาต์ผิดแบบ (Wrong format!)
ช่องกลางคือ FORMAT SPECIFICATION ที่แจกแจงออกมาเป็น 6 เรื่อง:

เรื่อง (สไลด์หน้า 36)ค่าที่ใส่ในตัวอย่างคำสั่งในสไลด์
OUTPUT TYPETableI want the output as a table.
LENGTH5 RowsKeep it to exactly 5 rows.
TONEProfessionalUse a professional and neutral tone.
STRUCTURE4 ColumnsInclude 4 specific columns.
FORMATMarkdownReturn the table in Markdown format.
INCLUDE SUMMARYYesAdd a brief summary below the table.

แล้วสไลด์หน้า 37 ย่อทั้งหมดนั้นให้เหลือประโยคเดียว:

❌ Bad Prompt · สไลด์หน้า 37

Give me some marketing channel ideas.

👍 Good Prompt · สไลด์หน้า 37

List 5 marketing channels in a table with columns: Channel, Best for, Est. cost (Low/Med/High). One line per channel.

Good Prompt ประโยคเดียวนี้ล็อกไว้ 5 อย่าง เทียบกับ 6 เรื่องในหน้า 36:

คำใน Good Promptล็อกอะไรถ้าไม่ล็อก
5LENGTH“some” อาจเป็น 3 หรือ 20
in a tableOUTPUT TYPEอาจได้ย่อหน้ายาว หรือ bullet
columns: Channel, Best for, Est. costSTRUCTUREแต่ละช่องทางอาจบอกข้อมูลไม่เหมือนกัน เอามาเทียบกันไม่ได้
(Low/Med/High)ค่าที่ยอมรับได้ในคอลัมน์อาจได้ “฿5,000” · “ถูก” · “แล้วแต่” ปนกันในคอลัมน์เดียว
One line per channel.ความยาวของแต่ละช่องช่องหนึ่งอาจยาวเป็นย่อหน้า

จุดที่คนมองข้ามคือ (Low/Med/High) — มันไม่ได้แค่บอกรูปแบบ แต่จำกัดคำตอบให้เหลือแค่สามค่า ซึ่งทำให้เรียงหรือกรองต่อได้ทันที เหมือน union type "EASY" | "MEDIUM" | "HARD" ที่คุณเขียนให้ level ของสูตรอาหารในแอป Wongnok

ใช้กับ Claude Code: บอกว่าจะให้รายงานผลกลับมายังไง

ตอนสั่ง Claude Code แก้โค้ด ผลลัพธ์หลักคือไฟล์ที่ถูกแก้ · แต่ยังมีผลลัพธ์รองคือข้อความสรุปตอนจบงาน ซึ่งถ้าไม่บอก ก็จะได้ความยาวและหน้าตาที่เดาไม่ได้เหมือนภาพหน้า 36
ตัวอย่างของบทนี้ — ท่อนท้าย prompt ที่บอกรูปแบบรายงาน:

# ตัวอย่างของบทนี้ (ไม่ได้มาจากสไลด์)
# Output
When you finish, reply with exactly these 3 sections:
1. Files changed — one line per file: path + what changed
2. Checks — the result of tsc, eslint, and next build (pass/fail)
3. Open questions — anything you assumed; write "none" if nothing

ถ้ารายงานนั้นจะถูกสคริปต์อ่านต่อ (ไม่ใช่คนอ่าน) ให้ขอเป็น JSON แล้ววางโครงให้ดู · โครงข้างล่างผ่าน JSON.parse จริง:

$ node -e 'const o = JSON.parse(`…โครงข้างล่าง…`); console.log("valid JSON, keys:", Object.keys(o).join(", "))'
{
  "summary": "Added name search and an empty state to RecipeList",
  "filesChanged": ["containers/RecipeList/RecipeList.tsx"],
  "checks": { "tsc": "pass", "eslint": "pass", "build": "pass" },
  "openQuestions": []
}
# output จริง:
valid JSON, keys: summary, filesChanged, checks, openQuestions

สมมติคุณพิมพ์โครงตัวอย่างใน prompt ด้วยมือ แล้วเผลอใส่ comma ท้ายแบบที่ TypeScript ยอม:

{ "checks": { "tsc": "pass", }, }

JSON.parse อ่านผ่านไหม? และถ้าไม่ผ่าน ทำไมเรื่องนี้ถึงสำคัญกับการกำหนดรูปแบบผลลัพธ์?

ไม่ผ่าน · ผลรันจริงบน node v24.14.0:

$ node -e 'try { JSON.parse(`{ "checks": { "tsc": "pass", }, }`) } catch (e) { console.log(e.name + ": " + e.message) }'
SyntaxError: Expected double-quoted property name in JSON at position 29 (line 1 column 30)

TypeScript / JavaScript ยอมให้มี comma ท้าย (trailing comma) แต่ JSON ไม่ยอม
ปัญหาคือโครงตัวอย่างที่คุณใส่ใน prompt คือสิ่งที่ AI จะเลียนแบบ (หลักข้อ 2 · ยกตัวอย่าง) — ให้ตัวอย่างที่พังไป ก็มีโอกาสได้ผลที่พังกลับมา แล้วสคริปต์ที่อ่านต่อก็จะพังตาม
ตรวจโครงตัวอย่างด้วย JSON.parse ก่อนเอาไปใส่ใน prompt ทุกครั้ง

📋 เทียบกับของจริง

บอกรูปแบบผลลัพธ์ก็เหมือนส่งแบบฟอร์มเปล่าไปพร้อมคำขอ
ถ้าหัวหน้าบอกว่า “สรุปยอดขายเดือนนี้มาหน่อย” คนหนึ่งส่งเป็นอีเมลยาว อีกคนส่งเป็น Excel อีกคนส่งเป็นสไลด์ · ถูกหมดทุกคน แต่หัวหน้าต้องมานั่งแปลงให้เป็นแบบเดียวกันก่อนจะเทียบได้
ถ้าแนบไฟล์ Excel ที่มีหัวคอลัมน์ไว้แล้ว — สาขา · ยอดขาย · เทียบเดือนก่อน (ขึ้น/ลง/เท่าเดิม) — ทุกคนส่งกลับมาหน้าตาเดียวกัน เอามารวมกันได้ทันที

ที่ไม่เหมือนกัน: แบบฟอร์ม Excel บังคับได้จริง — ช่องที่ตั้งเป็นตัวเลขจะพิมพ์ตัวอักษรไม่ได้ · แต่รูปแบบที่เขียนใน prompt เป็นแค่คำขอ AI ทำตามเป็นส่วนใหญ่ แต่ไม่มีอะไรรับประกัน ว่าจะได้ 5 แถวเป๊ะหรือ JSON ที่ valid ทุกครั้ง · ถ้าผลลัพธ์จะถูกโปรแกรมอ่านต่อ ต้องมีโค้ดตรวจอีกชั้น (เช่น JSON.parse ใน try/catch) อย่าเชื่อว่าเขียนใน prompt แล้วจะได้ตามนั้นเสมอ

🗣 ศัพท์เรื่องรูปแบบผลลัพธ์
output format / response format
ข้อกำหนดว่าคำตอบต้องหน้าตาแบบไหน: ประเภท (ตาราง/รายการ/JSON) · ความยาว · โครง · น้ำเสียง · พิมพ์บอก AI ได้ว่า “Answer in a Markdown table with exactly these columns: …”
schema
พิมพ์เขียวของข้อมูล: มีฟิลด์อะไรบ้าง · แต่ละฟิลด์เป็น type อะไร · ฟิลด์ไหนต้องมี · คุ้นกับคำนี้แล้วจาก struct ใน Go และ type ใน TypeScript · ถาม senior ได้ว่า “ผลลัพธ์จาก AI ตัวนี้เราตรวจ schema ก่อนใช้ไหม”
enum (ค่าที่เลือกได้จำกัด)
คอลัมน์ที่ยอมรับได้แค่ไม่กี่ค่า เช่น Low/Med/High ในสไลด์หน้า 37 · ทำให้ผลลัพธ์เรียงและกรองต่อได้ · บอก AI ได้ว่า “the priority field must be one of: low, medium, high”
trailing comma
comma ตัวสุดท้ายก่อนปิดวงเล็บ · JavaScript/TypeScript ยอม แต่ JSON ไม่ยอม · เป็นสาเหตุอันดับต้น ๆ ของ SyntaxError ตอน parse JSON ที่เขียนด้วยมือ

หลักข้อ 6 — แก้ทีละรอบ ถือว่าคำตอบแรกคือร่าง

สไลด์หน้า 39 (“Iterate What?”) มีประโยคหลักหนึ่งประโยค กับคำเตือนหนึ่งกล่อง:

• Treat the first output as a draft. Tell the model what to fix

⚠️ Warning:
Prompting is a conversation, not a one-shot.

ภาพในหน้า 39 เป็นวงจร 6 ขั้นที่วนจนกว่าจะได้ผลที่ต้องการ (Repeat Until Desired Outcome):

① Prompt ──────────→ ② Response Provide an initial Receive the AI's response. prompt or request. │ ↑ ↓ ⑥ Better Response ③ Review Receive an improved, Review the output carefully. higher quality response. │ ↑ ↓ ⑤ Improve Prompt ←────────── ④ Identify Issues Refine instructions, add Identify gaps, errors, details, clarify constraints. or missing elements.

ด้านซ้ายของภาพเป็น prompt รอบแรกที่กว้างมาก — Write about productivity for my audience. — ตามด้วยคำตอบที่สไลด์วาดไว้ว่าจืดและทั่วไป · ด้านขวาคือ prompt รอบที่ปรับแล้ว:

# สไลด์หน้า 39 · IMPROVED PROMPT
Write a friendly, practical guide on productivity for remote workers. Include key strategies, examples, and a short checklist. Use clear headings and bullets. Keep it under 500 words.

แถบล่างของภาพ (FEEDBACK THAT DRIVES IMPROVEMENT) คือสูตรแปลง “อาการ” เป็น “สิ่งที่ต้องบอก” — ตารางนี้ถอดจากภาพ แล้วผมเติมคอลัมน์ขวาว่าในงานโค้ดหน้าตาเป็นยังไง
(ภาพเดียวกันยังมีกล่อง REVIEW: WHAT'S NOT WORKING? ใต้คำตอบรอบแรก ที่ไล่อาการไว้ห้าข้อ: Missing requirements · Wrong tone · Incomplete information · Formatting problems · Unclear output — คือขั้น ③ Review กับ ④ Identify Issues ของวงจรข้างบนนั่นเอง)

อาการ (สไลด์)Action (สไลด์)ในงานโค้ดกับ Claude Code
Too formal
Make it friendlier.
Adjust tone and styleข้อความ UI แข็งเกิน → “button labels should be short and casual, max 2 words”
Missing details
Add requirements.
Provide context, goals, and specificsลืมเคส empty state → “also handle the case where no recipe matches”
Wrong format
Specify structure.
Define the desired format clearlyสรุปงานยาวเป็นเรียงความ → “list changed files only, one per line”
Too long
Add length limits.
Set word or character limitsแก้ไป 12 ไฟล์ทั้งที่ขอแก้จุดเดียว → “limit the change to RecipeList.tsx”
Incomplete answer
Clarify expectations.
Define depth and coverage neededเขียนโค้ดแต่ไม่รันตรวจ → “run tsc, eslint and next build, and fix any failures”

แล้วสไลด์หน้า 40 เทียบให้เห็นว่า “แก้ทีละรอบ” ต่างจาก “เริ่มใหม่” ยังไง:

❌ Bad Prompt · สไลด์หน้า 40

(first output is too formal) → start over with a brand-new prompt.

👍 Good Prompt · สไลด์หน้า 40

Good draft, but too formal. Rewrite it warmer, cut the jargon, and shorten the intro to one sentence.

Good Prompt ของหน้า 40 สั้นมาก แต่มีสามส่วนที่ครบ:

ส่วน Bad Prompt ไม่ได้ผิดเพราะ “เริ่มใหม่ไม่ได้” แต่ผิดเพราะทิ้งข้อมูลที่เพิ่งได้มา — รอบแรกบอกแล้วว่าเนื้อหาใช้ได้ ติดแค่น้ำเสียง · เริ่มใหม่ด้วย prompt ที่ไม่ได้บอกเรื่องน้ำเสียง ก็มีโอกาสได้ปัญหาเดิมกลับมาอีก

⚠️ “ห้ามเริ่มใหม่” ไม่ใช่กฎตายตัว — เอกสาร Claude Code บอกอีกด้านไว้

หน้า Best practices ของ Claude Code (ลิงก์ท้ายบท) หัวข้อ Course-correct early and often เห็นด้วยกับสไลด์ว่าให้แก้ทิศทางเร็ว ๆ บ่อย ๆ — แต่มีเงื่อนไขต่อท้าย: ถ้าแก้เรื่องเดิมไปเกินสองครั้งใน session เดียวแล้วยังไม่ได้ ให้สั่ง /clear แล้วเริ่ม session ใหม่ด้วย prompt ที่ดีขึ้น ซึ่งรวมสิ่งที่เรียนรู้จากรอบที่ล้มเหลวเข้าไปแล้ว
เหตุผลคือทุกความพยายามที่ล้มเหลวยังค้างอยู่ใน context · ยิ่งแก้ซ้ำ ยิ่งมีตัวอย่างที่ผิดกองอยู่ให้ AI เห็น
รวมสองแหล่งเป็นกฎเดียว: ร่างแรกใกล้แล้ว ติดไม่กี่จุด → คุยต่อ แบบ Good Prompt หน้า 40 · แก้จุดเดิมซ้ำเกินสองรอบ → /clear แล้วเขียน prompt ใหม่ ที่ใส่บทเรียนจากรอบก่อนเข้าไปด้วย (ซึ่งไม่ใช่ “brand-new prompt” แบบในหน้า 40 เพราะมันไม่ได้ทิ้งสิ่งที่เรียนมา)

รอบแก้ในงานโค้ด — เอา error จริงไปเป็น feedback

ในงานเขียนบทความ “อาการ” คือความรู้สึกของคนอ่าน · ในงานโค้ด อาการที่ดีที่สุดคือข้อความ error จริงจากขั้น Evaluate เพราะมันบอกไฟล์ บรรทัด และสาเหตุมาครบ
ข้างล่างนี้ผมเขียน RecipeList.tsx ในโปรเจกต์ทดลองโดยตั้งใจเรียก recipe.title ทั้งที่ type Recipe มีแต่ name แล้วรัน tsc จริง:

$ npx tsc --noEmit; echo "rc=$?"
containers/RecipeList/RecipeList.tsx(11,12): error TS2339: Property 'title' does not exist on type 'Recipe'.
rc=2

ข้อความรอบถัดไปที่ดีจะหน้าตาประมาณนี้ (ตัวอย่างของบทนี้):

tsc fails with the error below. Fix it by using the existing `name` field —
do not add a `title` field to the Recipe type. Then re-run tsc and eslint.

<tsc_output>
containers/RecipeList/RecipeList.tsx(11,12): error TS2339: Property 'title' does not exist on type 'Recipe'.
</tsc_output>

สังเกตว่าข้อความสั้นนี้ใช้หลักครบสามข้อของบทนี้: แปะ error ไว้ในแท็ก XML (④) · บอกทางแก้ที่ไม่ต้องการ (“do not add a title field”) เพราะมีสองทางที่ทำให้ error หาย แต่ถูกแค่ทางเดียว · และบอกว่าจบรอบแล้วต้องทำอะไร (⑤ + ⑥)

💇 เทียบกับของจริง

แก้ทีละรอบเหมือนตัดผม · ช่างตัดเสร็จ ยื่นกระจกให้ดูข้างหลัง คุณไม่ได้ลุกไปร้านใหม่เพราะด้านข้างยาวไปนิด · คุณบอกว่า “ทรงโอเคแล้ว ด้านข้างเอาสั้นอีกหน่อย ข้างหน้าไม่ต้องแตะ”
ประโยคนี้โครงเดียวกับ Good Prompt หน้า 40 เป๊ะ: บอกส่วนที่ดี · บอกจุดที่ต้องแก้ · บอกสิ่งที่ห้ามแตะ

ที่ไม่เหมือนกัน: ผมที่ตัดไปแล้วต่อกลับไม่ได้ · แต่โค้ดที่ Claude Code แก้ย้อนกลับได้ (git · หรือ /rewind ใน Claude Code) เพราะงั้นอย่ากลัวให้มันลอง
และช่างตัดผมยิ่งคุยนานยิ่งเข้าใจคุณมากขึ้น · AI กลับกัน — บทสนทนาที่ยาวและเต็มไปด้วยความพยายามที่ผิด ทำให้มันทำงานแย่ลงได้ ถึงจุดหนึ่ง “ไปร้านใหม่พร้อมรูปทรงผมที่ต้องการ” (/clear + prompt ที่ดีขึ้น) ก็เป็นทางที่เร็วกว่า

🗣 ศัพท์เรื่องแก้ทีละรอบ
one-shot vs iterative prompting
one-shot ในบริบทของสไลด์หน้า 39 คือหวังว่าส่ง prompt ครั้งเดียวแล้วได้ของเสร็จ · iterative คือวางแผนไว้ตั้งแต่แรกว่าจะมีหลายรอบ · (ระวังสับสนกับ one-shot / few-shot ของบท 88 ซึ่งหมายถึง “ยกตัวอย่างกี่ตัว”) · บอกทีมได้ว่า “อันนี้ต้อง iterate กับ AI สักสองสามรอบ อย่าคาดหวังว่ารอบแรกจะจบ”
context / context window
ทุกอย่างที่ AI “เห็น” ใน session นั้น: prompt ทุกข้อความ · ไฟล์ที่อ่าน · output ของคำสั่งที่รัน · มีขนาดจำกัด และของที่ไม่เกี่ยวข้องทำให้ผลแย่ลงได้ · ถาม senior ได้ว่า “session นี้ context รกแล้ว ควร /clear ไหม”
/clear · /rewind
คำสั่งใน Claude Code · /clear ล้าง context เริ่มใหม่ · /rewind (หรือกด Esc สองครั้ง) ย้อนบทสนทนาและโค้ดกลับไปจุดก่อนหน้า · ทั้งสองอยู่ในหน้า Best practices หัวข้อ Course-correct early and often
course-correct
แก้ทิศทางกลางทาง ก่อนที่งานจะไปไกล · ใน Claude Code กด Esc หยุดได้ทันทีโดย context ยังอยู่ · ประโยคที่ใช้ได้เลย: “stop — before editing more files, show me your plan”

ภารกิจ — เขียน prompt สั่งงานจริงบนแอป Wongnok

ภาพหน้า All Recipes ในสไลด์ของกลุ่ม Next.js app มีช่อง Search recipes by name และแถบสลับ STATE สี่แบบ (Default · Loading · Empty · Error) · แต่ container RecipeList ที่คุณประกอบในบท 85 (ถอดจากสไลด์หน้า 49) ยังแค่ .map() ข้อมูล mock ออกมาทั้ง 8 สูตร — ยังไม่มีช่องค้นหา และยังไม่มี empty state ที่ผูกกับผลการค้นหา

ก่อนลงมือ ลองดู prompt ที่มือใหม่มักพิมพ์ใส่ Claude Code:

add search to recipes page

prompt นี้ขาดหลักข้อไหนบ้างใน 6 ข้อ? และมันพา Claude Code ข้ามขั้นไหนของ workflow 5 ขั้น?

ขาดทั้ง 6 ข้อ — ไล่ดู:

  • ① ไม่ชัด: ค้นจากอะไร (ชื่อ? ระดับความยาก? ชื่อเจ้าของ?) · ค้นตอนพิมพ์หรือตอนกด · ไม่เจอแล้วแสดงอะไร
  • ② ไม่มีตัวอย่าง input → output ว่าพิมพ์อะไรแล้วต้องเจออะไร
  • ③ ไม่ได้ขอให้คิดหรือวางแผนก่อน
  • ④ ไม่มีบทบาท ไม่มีหัวข้อ · ไม่ได้บอกกติกาของโปรเจกต์ (components/ · containers/)
  • ⑤ ไม่ได้บอกว่าจบงานแล้วให้รายงานอะไร
  • ⑥ ข้อนี้ไม่ได้อยู่ใน prompt แรก แต่คือสิ่งที่คุณต้องทำหลังได้ผล — prompt นี้ไม่มีเกณฑ์อะไรให้ใช้ Review เลย

เรื่อง workflow: prompt แบบนี้เชิญให้กระโดดไปขั้น Code ทันที ข้าม Explore กับ Plan · และไม่ได้สั่ง Evaluate ด้วย · เอกสาร Claude Code เตือนตรง ๆ ว่าการปล่อยให้ข้ามไปเขียนโค้ดเลย อาจได้โค้ดที่แก้ปัญหาผิดข้อ (หัวข้อ Explore first, then plan, then code) · แต่หน้าเดียวกันก็บอกด้วยว่างานเล็กที่อธิบาย diff ได้ในประโยคเดียวข้ามการวางแผนได้ — งานนี้แตะ state · UI · และเคสค้นไม่เจอ จึงไม่เข้าข่ายงานเล็ก

🎯 ภารกิจ: prompt สำหรับ “ช่องค้นหาสูตรอาหาร + empty state”

เขียน prompt (เป็นภาษาอังกฤษหรือไทยก็ได้) สำหรับสั่ง Claude Code ในโปรเจกต์ Wongnok ที่คุณสร้างมาในบท 79–85 โดย:

  1. ใช้หลักครบ 6 ข้อ: ชัดเจน (บอกขอบเขต + สิ่งที่ห้ามแตะ) · มีตัวอย่าง input → output อย่างน้อย 3 เคส · ขอให้คิด/วางแผนก่อน · มี Role และแบ่งหัวข้อ · บอกรูปแบบรายงานตอนจบ · และเตรียมข้อความรอบที่สองไว้หนึ่งข้อความสำหรับกรณีที่ผลรอบแรกยังไม่ตรง
  2. เดินครบ 5 ขั้น: Explore → Plan → Code → Evaluate → Commit · ต้องมีจุดที่ให้ Claude Code หยุดรอคุณอนุมัติแผนก่อนแก้ไฟล์ · และต้องบอกว่า Commit ได้หลัง Evaluate ผ่านเท่านั้น (คำเตือนสไลด์หน้า 18)
  3. ใน Evaluate ต้องมีการตรวจที่รันได้จริง ไม่ใช่แค่ “make sure it works” · และต้องย้อนกลับไปเทียบกับ requirement เดิม (คำเตือนสไลด์หน้า 17)
  4. เขียนเสร็จแล้ว ตรวจตัวเองด้วยตาราง 6 หลัก × 5 ขั้นในหัวข้อ recap ข้างล่างว่าครบทุกช่อง

นี่คือ prompt ตัวอย่างหนึ่งแบบ ไม่ใช่คำตอบเดียวที่ถูก · และไม่ใช่ผลลัพธ์ของ AI — ผมไม่ได้ส่ง prompt นี้ให้ Claude Code รัน
ชื่อไฟล์และชื่อเมนูในตัวอย่างอิงตามโค้ดของบท 85 (containers/RecipeList/RecipeList.tsx · RECIPES_MOCK_DATA ใน containers/RecipeList/recipes.ts · @/components/RecipeCard) · ข้อความ empty state ใช้ตามสไลด์หน้า 43 (บท 84) ถ้าโปรเจกต์ของคุณตั้งชื่อต่างไป ให้แก้ตามของจริง

รอบที่ 1 — prompt แรก (ใช้หัวข้อ Markdown)

# Role
You are a senior Next.js engineer who follows existing project conventions strictly.

# Context
- Next.js App Router project "Wongnok", TypeScript, Tailwind, shadcn/ui.
- `app/recipes/page.tsx` renders `RecipeList` from `containers/RecipeList/RecipeList.tsx`
  (a "use client" component), which maps over `RECIPES_MOCK_DATA` from `./recipes`
  and renders `RecipeCard` from `@/components/RecipeCard`.
- Convention: `components/` = pure presentational, `containers/` = stateful composition.

# Task
Add a "search by recipe name" input and an empty state to the All Recipes page.

# Requirements
- Filter while typing. Case-insensitive. Trim spaces before matching.
- Match on `name` only.
- Empty input shows all recipes.
- No match shows: No recipes match your search
- Keep `RecipeCard` presentational — put state and filtering in `RecipeList`.
- Do not change `RECIPES_MOCK_DATA`, `RecipeCard`'s props, or any other page.

# Examples
<examples>
input: ""            → all 8 recipes
input: "beef"        → only "Beef Wellington"
input: "  BEEF "     → same as "beef"
input: "pizza"       → empty state: No recipes match your search
</examples>

# Steps
1. Explore: read RecipeList.tsx, recipes.ts, RecipeCard, and app/recipes/page.tsx. Do not edit anything yet.
2. Plan: think step by step, then show me which files you will change, and why,
   plus any edge case you see. STOP and wait for my approval.
3. Code: implement only the approved plan.
4. Evaluate: run `npx tsc --noEmit`, `npx eslint .`, `npx next build`, and fix any failure.
   Then re-check every item in Requirements and Examples, one by one.
5. Commit: only after step 4 fully passes, commit with a clear conventional message.

# Output
When done, reply with exactly 3 sections:
1. Files changed — one line per file
2. Checks — tsc / eslint / build: pass or fail
3. Requirements — each requirement with ✅ or ❌

ไล่เช็คว่าครบ 6 หลัก:

หลักอยู่ตรงไหนใน prompt
① Be Clear and Specific# Requirements — ทุกข้อตอบคำถามที่โจทย์ปล่อยว่าง และมีบรรทัด “Do not change …” กำหนดขอบเขต
② Give Example<examples> 4 เคส รวมเคสเว้นวรรค+ตัวใหญ่ และเคสไม่เจอ
③ Step-by-step Reasoningขั้น Plan: “think step by step, then show me …”
④ Roles and Sections# Role + หัวข้อ Markdown ทั้งหมด + ตัวอย่างอยู่ในแท็ก XML (ใช้สองแบบผสมกันได้)
⑤ Specify Output Format# Output — 3 หัวข้อ ตายตัว · ✅/❌ เป็นค่าที่เลือกได้จำกัด
⑥ Iterate and Refineจุด STOP หลัง Plan คือรอบแก้รอบแรก · และข้อความรอบที่ 2 ข้างล่าง

รอบที่ 2 — ข้อความแก้ ถ้าผลรอบแรกยังไม่ตรง

สมมติแผนที่ได้มาจะย้าย state ไปไว้ใน page.tsx และจะเพิ่ม prop ใหม่ให้ RecipeCard — ข้อความรอบถัดไปตามโครง Good Prompt หน้า 40:

Good plan, but two changes before you code:
1. Keep the state in RecipeList, not page.tsx — page.tsx must stay a Server Component.
2. Do not add a prop to RecipeCard. Filtering happens before rendering the cards.
Show me the updated plan, then wait again.

ขั้น Evaluate + Commit เป็นยังไงเมื่อรันจริง

ผมสร้างโปรเจกต์ทดลองที่มี RecipeCard · RecipeList · ข้อมูล mock 8 สูตรตามโครงบท 85 แล้ว commit ไว้ก่อน · จากนั้นเขียนช่องค้นหาตาม requirement ข้างบนเองด้วยมือ เพื่อดูว่าคำสั่งใน prompt ให้ผลหน้าตาแบบไหน · ต่อไปนี้คือ output จริงของคำสั่ง ไม่ใช่ข้อความจาก AI

$ npx tsc --noEmit; echo "rc=$?"
containers/RecipeList/RecipeList.tsx(11,12): error TS2339: Property 'title' does not exist on type 'Recipe'.
rc=2

# ↑ ขั้น Evaluate เจอ failure → วนกลับไปขั้น Code (สไลด์หน้า 17) · แก้ title เป็น name แล้วรันใหม่

$ npx tsc --noEmit; echo "rc=$?"
rc=0

$ npx eslint .; echo "rc=$?"
rc=0

$ npx next build
Route (app)
┌ ○ /
├ ○ /_not-found
└ ○ /recipes

○  (Static)  prerendered as static content

ตรรกะกรองชุดเดียวกัน รันด้วย node กับตัวอย่าง 4 เคสใน prompt:

$ node probe.mjs
""         -> 8
"beef"     -> 1 Beef Wellington
"  BEEF "  -> 1 Beef Wellington
"pizza"    -> 0

แล้วค่อย Commit เมื่อผ่านครบ:

$ git add -A && git diff --cached --stat
 containers/RecipeList/RecipeList.tsx | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

$ git commit -m "feat(recipes): add name search with empty state to recipe list"
$ git log --oneline -1
5486fd0 feat(recipes): add name search with empty state to recipe list

(--stat ขึ้นแค่ไฟล์เดียวตรงกับที่ Requirements บอกให้แก้แค่ใน RecipeList · hash ของ commit ในเครื่องคุณจะไม่ตรงกับของผม · ถ้าเห็นไฟล์ที่ไม่ได้อยู่ในแผนโผล่มาใน --stat นั่นคือสัญญาณให้หยุดถามก่อน commit)

⚠️ กับดักที่เจอจริงระหว่างตรวจ: tsc พังทั้งที่ยังไม่ได้เขียนอะไรผิด

ในโปรเจกต์ที่เพิ่ง clone มาและยังไม่เคย next build เลย npx tsc --noEmit รอบแรกขึ้น error นี้เพิ่มมาอีกบรรทัด:

app/layout.tsx(20,50): error TS2304: Cannot find name 'LayoutProps'.

LayoutProps เป็น type ที่ Next.js 16 สร้างให้ตอน build หรือตอนสั่ง npx next typegen · รัน npx next typegen (ขึ้น ✓ Types generated successfully) แล้ว error นี้หายไป เหลือแค่ error title ที่ตั้งใจใส่
ถ้าเจอใน Evaluate ของ Claude Code ให้บอกมันใน prompt ว่า “run npx next typegen before tsc” · ไม่งั้นมันอาจพยายาม “แก้” layout.tsx ที่ไม่ได้เสียอะไรเลย

Recap ทั้งกลุ่ม — บท 86 ถึง 89

⚠️ สไลด์ไม่มีหน้า Recap

สไลด์หน้า 3 (Agenda) ประกาศไว้ 4 หัวข้อ: 01 Setup · 02 Agentic Workflow · 03 Prompting · 04 Recap — “Why we should know agentic workflow”
แต่ไฟล์สไลด์ที่ได้มาจบที่หน้า 40 ซึ่งเป็นตัวอย่างของ Iterate and Refine · ไม่มีหน้าไหนเป็นหัวข้อ 04 Recap · ตารางข้างล่างจึงสรุปจากเนื้อหาหน้า 12–40 เอง ไม่ได้ถอดจากหน้า Recap

Workflow 5 ขั้น (สไลด์หน้า 14–18)

ขั้นสไลด์บอกว่าสิ่งที่ต้องใส่ใน prompt
1 · Explore Like a researcher, gather context before touching anything · เป้าหมายคือ mental model ของสิ่งที่มีอยู่ ยังไม่ใช่เขียนโค้ด “read … do not edit anything yet”
2 · Plan Decide the approach before implementing · A good plan is reviewable “show me which files you will change … STOP and wait for my approval”
3 · Code Execute the plan · follow the conventions found during explore · ไม่เพิ่ม scope กลางทาง “implement only the approved plan”
4 · Evaluate Run tests, lint, type-check, execute the code, and review the diff · ⚠️ Should check the original requirements · failure วนกลับไป Code คำสั่งตรวจที่รันได้จริง + “re-check every requirement”
5 · Commit Write a clear commit message · ⚠️ Only reached after Eval passes “only after step 4 fully passes, commit …”

หลัก prompt 6 ข้อ (สไลด์หน้า 20)

บทหลักสิ่งเดียวที่ต้องจำ
88① Be Clear and Specificprompt ที่ไม่ชัดได้คำตอบที่ไม่ชัด · บอกงาน ขอบเขต ข้อจำกัด
88② Give Exampleโชว์ input → output ที่ “ดี” ให้ดู · AI เลียนแบบตัวอย่าง รวมถึงข้อผิดในตัวอย่างด้วย
88③ Step-by-step Reasoningงานตรรกะหลายขั้น ให้คิดทีละขั้นก่อนตอบ · ถ้ารู้ขั้นอยู่แล้ว เขียนขั้นให้เลย
89④ Roles and Sectionsบอกว่า “เป็นใคร” แล้วแยกคำสั่งออกจากข้อมูลด้วยหัวข้อ · XML เมื่อต้องแปะของยาวหรือของที่มี Markdown อยู่แล้ว
89⑤ Specify Output Formatบอกประเภท · จำนวน · โครง · ค่าที่ยอมรับ · รูปแบบใน prompt คือคำขอ ไม่ใช่การบังคับ
89⑥ Iterate and Refineร่างแรกคือร่าง · บอกส่วนที่ดี + อาการ + วิธีแก้ที่ตรวจได้ · แก้จุดเดิมเกินสองรอบ → /clear แล้วเขียนใหม่ให้ดีขึ้น

สองตารางนี้เชื่อมกันยังไง

Explore Plan Code Evaluate Commit ① Clear ● ● ● ขอบเขต + requirement ใช้ตรวจตอน Evaluate ② Example ● ● ตัวอย่าง input → output คือ test case ③ Step-by-step ● ให้คิดก่อนเสนอแผน ④ Role/Sections ● ● ● ● ● หัวข้อ # Steps ทำให้ 5 ขั้นเห็นชัด ⑤ Output format ● ● ● แผนที่รีวิวได้ · รายงานผลตรวจ · commit message ⑥ Iterate ● ● ● STOP หลัง Plan · failure วนกลับ Code

ถ้าจำได้อย่างเดียวจากกลุ่มนี้ ให้จำว่า workflow 5 ขั้นคือ “ลำดับของงาน” ส่วนหลัก 6 ข้อคือ “วิธีพูดในแต่ละขั้น” — prompt ที่ดีแต่ข้าม Evaluate ก็ยังได้โค้ดที่ดูถูกแต่ไม่ได้ตรวจ · workflow ครบแต่ prompt กำกวม ก็ได้แผนที่รีวิวไม่ได้

ลองตอบดู

Good Prompt ของสไลด์หน้า 33 (XML) กับหน้า 34 (Markdown) — ข้อไหนอธิบายความต่างได้ถูกต้อง?

ตัวเลือกที่ 2 ถูก · เทียบบรรทัดต่อบรรทัดแล้ว ฉบับ Markdown เขียนว่า Review the course outline below … และ Return your top 3 concerns as a numbered list.
ตัวเลือกที่ 1 ผิดเพราะมีคำต่างกันจริงสองจุด · ตัวเลือกที่ 3 ผิดเพราะทั้งสองฉบับมี You are an experienced instructional designer. (ฉบับ Markdown แค่ย้ายไปอยู่ใต้หัวข้อ # Role) · ตัวเลือกที่ 4 ผิดเพราะทั้งสองฉบับขอ top 3 เท่ากัน
จุดที่ต้องจำ: เปลี่ยนรูปแบบหัวข้อไม่ได้ทำให้ prompt ดีขึ้นเอง · คำที่เพิ่มเข้ามา (โดยเฉพาะเรื่องรูปแบบผลลัพธ์) ต่างหากที่เปลี่ยนผล

คุณจะให้ Claude Code อ่าน README.md ของโปรเจกต์ (ซึ่งมีหัวข้อ ## Setup ## Usage อยู่ข้างใน) แล้วสรุปขั้นตอนติดตั้ง — ควรแบ่งส่วนใน prompt ยังไง?

ตัวเลือกที่ 4 ถูก · แท็ก XML มีจุดเปิดและจุดปิดชัดเจน หัวข้อ ## ที่อยู่ข้างในจึงไม่ปนกับหัวข้อของ prompt · ตรงกับที่เอกสาร Anthropic บอกว่า XML ช่วยแยก prompt ที่ปนคำสั่งกับเนื้อหาที่แปะเข้ามา
ตัวเลือกที่ 1 ผิดเพราะหัวข้อ # ของ prompt กับ ## ของ README จะกลายเป็นลำดับหัวข้อชุดเดียวกัน แยกไม่ออกว่า README จบตรงไหน · ตัวเลือกที่ 2 ผิดเพราะ “แยกเองได้เสมอ” ไม่มีอะไรรับประกัน และคือสิ่งที่ Bad Prompt หน้า 33 ทำ · ตัวเลือกที่ 3 ผิดเพราะต้องแก้เนื้อหาต้นฉบับโดยไม่จำเป็น · และหัวข้อ Markdown ที่ครอบอีกชั้นก็ยังไม่มีจุดปิด บอกไม่ได้อยู่ดีว่า README จบตรงไหน
จุดที่ต้องจำ: ของที่แปะเข้ามามี Markdown อยู่ในตัว → ครอบด้วย XML

Claude Code เสนอแผนมาถูกเกือบหมด ติดแค่จะเพิ่ม prop ใหม่ให้ RecipeCard ซึ่งคุณไม่ต้องการ — ข้อความถัดไปแบบไหนตรงกับหลักข้อ 6 ที่สุด?

ตัวเลือกที่ 1 ถูก · โครงเดียวกับ Good Prompt สไลด์หน้า 40: บอกส่วนที่ดี (Good plan) · บอกจุดที่ผิด · บอกวิธีแก้ที่ตรวจได้ · และบอกขั้นต่อไป
ตัวเลือกที่ 2 ผิดเพราะไม่บอกว่าผิดตรงไหน — AI อาจรื้อส่วนที่ถูกทิ้งไปด้วย · ตัวเลือกที่ 3 คือ Bad Prompt หน้า 40 ที่แย่กว่าเดิม: ทิ้งสิ่งที่เพิ่งรู้ แล้วส่ง prompt เดิมที่พาไปจุดเดิม · ตัวเลือกที่ 4 ข้ามจุดที่ Plan มีไว้ให้รีวิว (สไลด์หน้า 15 “A good plan is reviewable”) แล้วโค้ดที่เขียนต่อจาก prop นั้นอาจพึ่งมันไปหลายจุดแล้ว
จุดที่ต้องจำ: แก้ที่แผนถูกกว่าแก้ที่โค้ดเสมอ

คุณบอก Claude Code ให้แก้ bug เดียวกันไปสามรอบใน session เดียว แต่ละรอบก็ยังพังแบบเดิม — เอกสาร Best practices ของ Claude Code แนะนำให้ทำอะไร?

ตัวเลือกที่ 3 ถูก · หัวข้อ Course-correct early and often บอกว่าถ้าแก้เรื่องเดิมเกินสองครั้ง context จะเต็มไปด้วยวิธีที่ล้มเหลว ให้ /clear แล้วเริ่มด้วย prompt ที่เจาะจงกว่า ซึ่งรวมสิ่งที่เรียนรู้มาแล้ว
ตัวเลือกที่ 1 ผิดเพราะเน้นเสียงไม่ได้เพิ่มข้อมูลใหม่ และความพยายามที่ผิดยังค้างอยู่ใน context · ตัวเลือกที่ 2 ผิดตรงข้ามกับเอกสาร — session ยาวที่มีของไม่เกี่ยวข้องทำให้ผลแย่ลงได้ · ตัวเลือกที่ 4 สรุปเกินข้อมูลที่มี ปัญหาอาจอยู่ที่ prompt หรือ context ไม่ใช่ที่ตัวโมเดล
จุดที่ต้องจำ: สไลด์หน้า 40 ห้าม “เริ่มใหม่แบบทิ้งข้อมูล” · เอกสารแนะนำ “เริ่มใหม่แบบพกบทเรียนไปด้วย” — สองอย่างนี้ไม่ขัดกัน

ถามกลับได้เลย

เอา prompt ที่คุณเขียนในภารกิจมาคุยได้เลย โดยเฉพาะถ้า:
• คุณไม่แน่ใจว่าบรรทัดไหนควรเป็น Requirement บรรทัดไหนควรเป็น Constraint ·
• คุณใช้ prompt นั้นกับ Claude Code จริงแล้ว ได้แผนหรือโค้ดที่ไม่ตรง แล้วอยากรู้ว่าควรพิมพ์รอบที่สองว่าอะไร — เอาทั้ง prompt · แผนที่ได้ · และ output ของ tsc / eslint / next build มาทั้งก้อน
นี่คือบทสุดท้ายของเว็บในตอนนี้ · ถ้ามีเรื่องไหนตลอด 89 บทที่ยังค้างในหัว ถามกลับมาได้เหมือนกัน

อ้างอิง