เขียน Prompt สำหรับงานโค้ด: บอก AI ให้เข้าใจงานจริง

หลายคนลองให้ AI เขียนโค้ดแล้วผิดหวัง เพราะได้โค้ดที่ "ดูดี" แต่ไม่ตรงกับโปรเจกต์ ใช้ framework ผิดเวอร์ชัน หรือข้ามเงื่อนไขสำคัญไป สาเหตุส่วนใหญ่ไม่ใช่เพราะ AI เก่งไม่พอ แต่เพราะเราบอกงานไม่ครบ บทความนี้จะให้โครง prompt ที่ใช้ได้กับงานโค้ดเกือบทุกแบบ ได้แก่ บริบท เป้าหมาย ข้อจำกัด ตัวอย่าง input/output และเกณฑ์เสร็จ พร้อมตัวอย่าง prompt แย่เทียบกับ prompt ดีสำหรับงาน PHP/Yii2 ที่นำไปใช้ได้ทันที
ทำไม prompt สั้น ๆ ถึงได้โค้ดที่ใช้ไม่ได้
ลองนึกว่าเราจ้างนักพัฒนา freelance ที่เก่งมากแต่ไม่เคยเห็นโปรเจกต์เราเลย แล้วส่งข้อความไปว่า "ทำระบบสมัครสมาชิกให้หน่อย" เขาต้องเดาเอาเองทั้งหมด ทั้งภาษา framework ฐานข้อมูล รูปแบบรหัสผ่าน การยืนยันอีเมล AI ก็เหมือนกัน เมื่อข้อมูลไม่พอ มันจะเลือก "ค่าที่พบบ่อยที่สุด" ซึ่งอาจไม่ใช่สิ่งที่เราใช้
สิ่งที่ AI ต้องเดาเมื่อเราไม่บอก มักได้แก่
- เวอร์ชันภาษาและ framework (PHP 7 หรือ 8, Yii2 หรือ Laravel)
- ฐานข้อมูล (MySQL หรือ PostgreSQL ซึ่ง syntax บางอย่างต่างกัน)
- โครงสร้างโปรเจกต์ (basic หรือ advanced template)
- มาตรฐานโค้ดของทีม เช่น ใช้ ActiveRecord หรือ Query Builder
- เงื่อนไขทางธุรกิจที่ไม่มีใครเขียนไว้ เช่น "ลูกค้า VIP ได้ส่วนลดเพิ่ม"
โครง prompt 5 ส่วนสำหรับงานโค้ด
| ส่วน | คำถามที่ต้องตอบ | ตัวอย่าง |
|---|---|---|
| 1. บริบท | ทำงานในระบบอะไร stack อะไร โค้ดเกี่ยวข้องอยู่ไหน | Yii2 advanced, PHP 8.x, PostgreSQL, ตาราง order |
| 2. เป้าหมาย | ต้องการให้เกิดอะไร เพื่อใคร | ให้ admin export รายการสั่งซื้อเป็น CSV |
| 3. ข้อจำกัด | ห้ามทำอะไร ต้องใช้อะไร | ห้ามเพิ่ม dependency, ใช้ query builder, ห้ามแตะไฟล์อื่น |
| 4. ตัวอย่าง input/output | ข้อมูลเข้าและผลที่คาดหวังเป็นอย่างไร | แถวตัวอย่าง 2–3 แถว และ CSV ที่ควรได้ |
| 5. เกณฑ์เสร็จ | จะรู้ได้อย่างไรว่างานเสร็จ | เทสต์ผ่าน, ไฟล์เปิดใน Excel ภาษาไทยไม่เพี้ยน |
ไม่จำเป็นต้องยาวทุกครั้ง งานเล็กอาจมีแค่ 3–4 บรรทัด แต่ควรผ่านครบทั้ง 5 คำถามในหัว
ตัวอย่างที่ 1: ฟังก์ชันคำนวณ
Prompt แบบแย่
เขียนฟังก์ชันคำนวณ VAT
ปัญหา: ไม่รู้ว่าราคาที่ส่งเข้ามารวม VAT แล้วหรือยัง อัตราเท่าไร ปัดเศษอย่างไร ใช้ float หรือไม่ AI จะเลือกเองทั้งหมด
Prompt แบบดี
บริบท: PHP 8 ใน Yii2 project, class
common\helpers\TaxHelper(ยังไม่มี ให้สร้างใหม่)เป้าหมาย: ฟังก์ชันแยก VAT จากราคาที่รวม VAT แล้ว
ข้อจำกัด: รับและคืนค่าเป็นจำนวนเต็มหน่วยสตางค์ (int) เพื่อเลี่ยงปัญหา float, อัตรา VAT รับเป็น parameter, ปัดเศษแบบ half-up, ใช้
declare(strict_types=1), ห้ามใช้ library เพิ่มตัวอย่าง: ราคารวม 10700 สตางค์ อัตรา 7 → ราคาก่อน VAT 10000, VAT 700
เกณฑ์เสร็จ: คืน array
['net' => int, 'vat' => int]ที่ net + vat เท่ากับราคารวมเสมอ และเขียน unit test อย่างน้อย 4 เคส รวมกรณีราคา 0 และราคาติดลบ (ต้อง throwInvalidArgumentException)
ผลที่ได้จาก prompt แบบนี้มักใกล้เคียงกับที่ต้องการตั้งแต่รอบแรก เช่น
<?php
declare(strict_types=1);
namespace common\helpers;
use InvalidArgumentException;
final class TaxHelper
{
/**
* @return array{net:int, vat:int}
*/
public static function splitVat(int $grossSatang, int $ratePercent): array
{
if ($grossSatang < 0 || $ratePercent < 0) {
throw new InvalidArgumentException('Amount and rate must be non-negative');
}
// net = gross * 100 / (100 + rate) ปัดแบบ half-up ด้วยเลขจำนวนเต็ม
$divisor = 100 + $ratePercent;
$net = intdiv($grossSatang * 100 * 2 + $divisor, $divisor * 2);
return ['net' => $net, 'vat' => $grossSatang - $net];
}
}
สังเกตว่าเกณฑ์ "net + vat เท่ากับราคารวมเสมอ" ทำให้ AI คำนวณ VAT จากผลต่าง แทนการคำนวณแยกแล้วปัดเศษสองครั้งจนยอดไม่ตรง นี่คือพลังของการบอกเกณฑ์เสร็จ
ตัวอย่างที่ 2: action ใน Yii2
Prompt แบบแย่
เพิ่มหน้า export order เป็น CSV
Prompt แบบดี
Yii2 advanced template, backend app, PHP 8, PostgreSQL
ใน
backend\controllers\OrderControllerเพิ่มactionExportCsv()ที่ export order ตามตัวกรองเดียวกับOrderSearchที่หน้า index ใช้ข้อกำหนด:
- เฉพาะผู้ใช้ role
admin(เพิ่มใน AccessControl behavior ที่มีอยู่ ไม่สร้างใหม่)- คอลัมน์: id, created_at (Y-m-d H:i), customer_name, total (2 ตำแหน่ง)
- ใส่ UTF-8 BOM ให้ Excel อ่านภาษาไทยได้
- ใช้
batch()ทีละ 500 แถว เพราะข้อมูลอาจมีหลายแสนแถว- ป้องกัน CSV injection: ค่าที่ขึ้นต้นด้วย = + - @ ให้เติม ' นำหน้า
- ห้ามแก้ไฟล์อื่นนอกจาก controller นี้
ส่งกลับมาเฉพาะโค้ดที่เปลี่ยน พร้อมอธิบายสั้น ๆ ว่าทดสอบด้วยมืออย่างไร
prompt นี้ยาวขึ้น แต่ตัดรอบการแก้ไปได้หลายรอบ และที่สำคัญคือใส่เรื่องสิทธิ์และความปลอดภัยไว้ตั้งแต่ต้น ซึ่ง AI มักไม่ทำเองถ้าไม่ได้ขอ
เทคนิคเสริมที่ช่วยได้มาก
- ให้ถามกลับก่อน: ต่อท้ายว่า "ถ้ามีข้อมูลไม่พอ ให้ถามคำถามก่อนเริ่มเขียน" ช่วยให้ AI ไม่เดาเงียบ ๆ
- ขอแผนก่อนโค้ด: งานที่แตะหลายไฟล์ ให้ AI เสนอแผนเป็นข้อ ๆ ก่อน เราตรวจแผนแล้วค่อยให้ลงมือ
- แนบโค้ดจริงที่เกี่ยวข้อง: model, migration หรือ controller ที่มีอยู่ ดีกว่าการอธิบายด้วยคำพูด (รายละเอียดในบทความ "Context คือทุกอย่าง")
- บอกสิ่งที่ห้ามทำอย่างชัดเจน: เช่น ห้ามเปลี่ยน public method signature, ห้ามใช้ raw SQL ต่อ string
- กำหนดรูปแบบคำตอบ: "ส่งเป็น diff" หรือ "ส่งเฉพาะฟังก์ชันที่แก้" ทำให้ review ง่ายขึ้น
- แยกงานใหญ่เป็นงานย่อย: หนึ่ง prompt หนึ่งเป้าหมาย ตรวจและ commit ก่อนไปงานถัดไป
Prompt รอบถัดไป: สั่งแก้ให้ได้ผล
งานจริงแทบไม่มีครั้งไหนจบในรอบเดียว prompt รอบที่สอง สาม สี่ จึงสำคัญไม่แพ้รอบแรก ข้อผิดพลาดที่พบบ่อยคือการตอบกลับสั้น ๆ ว่า "ยังไม่ได้" หรือ "error ครับ" ซึ่งทำให้ AI ต้องเดาอีกรอบว่าอะไรผิด
| แบบที่ควรเลี่ยง | แบบที่ดีกว่า |
|---|---|
| ยัง error อยู่ | รัน php yii order/export แล้วได้ error นี้ [แปะ error เต็ม] เกิดที่บรรทัด 42 ของ OrderController |
| ไม่ใช่แบบนี้ | CSV ที่ได้มีคอลัมน์ total เป็น 1500 แต่ต้องการ 1,500.00 ส่วนอื่นถูกแล้ว แก้เฉพาะการจัดรูปแบบตัวเลข |
| ทำใหม่หมดเลย | แนวทางที่ใช้ asArray()->all() กินหน่วยความจำเกิน ให้เปลี่ยนเป็น batch(500) โดยคงโครงสร้างอื่นไว้ |
หลักคือบอกสามอย่างเสมอ: ทำอะไรไป (คำสั่งหรือขั้นตอนที่รัน) ได้ผลอะไร (error หรือ output จริง) และ คาดหวังอะไร พร้อมระบุว่าส่วนไหนถูกแล้วไม่ต้องแตะ จะช่วยป้องกันไม่ให้ AI รื้อส่วนที่ใช้ได้ไปด้วย ถ้าวนแก้เกินสามสี่รอบแล้วยังไม่ดีขึ้น ให้หยุด ย้อนกลับไป commit ล่าสุด แล้วเขียน prompt แรกใหม่ให้ชัดขึ้น มักเร็วกว่าการแก้ต่อไปเรื่อย ๆ
Template ที่คัดลอกไปใช้ได้
## บริบท
- Stack: PHP 8.x, Yii2 (advanced), PostgreSQL
- ไฟล์ที่เกี่ยวข้อง: [แนบหรือระบุ path]
## เป้าหมาย
- [สิ่งที่ต้องการ 1–2 ประโยค]
## ข้อจำกัด
- ห้ามแก้ไฟล์อื่นนอกจาก [...]
- ใช้ Query Builder หรือ ActiveRecord ห้ามต่อ string เป็น SQL
- แสดงผลผ่าน Html::encode
- ห้ามเพิ่ม dependency
## ตัวอย่าง
- Input: [...]
- Output ที่คาดหวัง: [...]
## เกณฑ์เสร็จ
- [ ] เทสต์ [...] ผ่าน
- [ ] กรณี [...] ได้ผล [...]
ถ้าข้อมูลไม่พอ ให้ถามก่อนเริ่ม
สรุป
- โค้ดที่ไม่ตรงใจส่วนใหญ่มาจากการที่ AI ต้องเดาสิ่งที่เราไม่ได้บอก
- ใช้โครง 5 ส่วน: บริบท เป้าหมาย ข้อจำกัด ตัวอย่าง input/output และเกณฑ์เสร็จ
- ใส่ข้อกำหนดด้านสิทธิ์และความปลอดภัยไว้ใน prompt ตั้งแต่ต้น
- เกณฑ์เสร็จที่วัดได้ (เช่น เทสต์) ช่วยบังคับให้ AI เลือกวิธีที่ถูกต้อง
- งานใหญ่ให้ขอแผนก่อน แล้วแบ่งเป็นงานย่อย
ลองทำ
เลือกงานจริงหนึ่งงานใน backlog ของคุณที่ใช้เวลาไม่เกินหนึ่งชั่วโมง แล้วทดลองดังนี้
- เขียน prompt สั้น ๆ หนึ่งประโยคแบบที่เคยทำ ส่งให้ AI แล้วเก็บผลไว้
- เขียน prompt ใหม่ตาม template 5 ส่วนด้านบน ส่งใน session ใหม่
- เทียบผลทั้งสองแบบ: ใช้ framework ถูกไหม ตรวจสิทธิ์ไหม จัดการกรณีพิเศษไหม ต้องแก้อีกกี่จุด
- บันทึก template ที่ปรับแล้วไว้ใน repository ของทีม เพื่อให้ทุกคนใช้มาตรฐานเดียวกัน
ความคิดเห็น (0)
ยังไม่มีความคิดเห็น — เริ่มคุยเป็นคนแรก ถามสิ่งที่สงสัย หรือแชร์ประสบการณ์ของคุณ