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

AI & Vibe Coding

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

เขียน 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 และราคาติดลบ (ต้อง throw InvalidArgumentException)

ผลที่ได้จาก 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 ของคุณที่ใช้เวลาไม่เกินหนึ่งชั่วโมง แล้วทดลองดังนี้

  1. เขียน prompt สั้น ๆ หนึ่งประโยคแบบที่เคยทำ ส่งให้ AI แล้วเก็บผลไว้
  2. เขียน prompt ใหม่ตาม template 5 ส่วนด้านบน ส่งใน session ใหม่
  3. เทียบผลทั้งสองแบบ: ใช้ framework ถูกไหม ตรวจสิทธิ์ไหม จัดการกรณีพิเศษไหม ต้องแก้อีกกี่จุด
  4. บันทึก template ที่ปรับแล้วไว้ใน repository ของทีม เพื่อให้ทุกคนใช้มาตรฐานเดียวกัน
ติดปัญหาตอนทำตาม? ถามในชุมชน

ความคิดเห็น (0)

ยังไม่มีความคิดเห็น — เริ่มคุยเป็นคนแรก ถามสิ่งที่สงสัย หรือแชร์ประสบการณ์ของคุณ