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

AI & Vibe Coding

Context คือทุกอย่าง: ส่งข้อมูลโปรเจกต์ให้ AI อย่างพอดี

Context คือทุกอย่าง: ส่งข้อมูลโปรเจกต์ให้ AI อย่างพอดี

เคยไหมที่ขอให้ AI เพิ่มฟีเจอร์เล็ก ๆ แล้วได้โค้ดที่เรียก method ที่ไม่มีในโปรเจกต์ ใช้ชื่อคอลัมน์ผิด หรือเขียนแบบ Laravel ทั้งที่เราใช้ Yii2 ปัญหานี้ส่วนใหญ่ไม่ได้มาจาก AI "โง่" แต่มาจาก AI "ไม่รู้" เพราะเราไม่ได้ให้บริบทที่พอ ในทางกลับกัน การโยนทั้งโปรเจกต์ใส่ AI ก็ไม่ได้ช่วยเสมอไป บทความนี้จะอธิบายว่าทำไม AI เดาผิดเมื่อขาดบริบท ควรแนบไฟล์ไหน วิธีเขียนไฟล์แนวทางโปรเจกต์อย่าง AGENTS.md หรือ CLAUDE.md และวิธีตัดสิ่งที่ไม่จำเป็นออกเพื่อให้ได้คำตอบที่แม่นขึ้น

ทำไม AI เดาผิดเมื่อขาดบริบท

LLM ทำงานโดยสร้างข้อความที่ "น่าจะเป็นที่สุด" จากสิ่งที่อยู่ใน context window ตอนนั้น บวกกับรูปแบบที่เรียนรู้มาจากข้อมูลฝึกจำนวนมหาศาล มันไม่ได้มองเห็นโปรเจกต์ของเราเว้นแต่เราส่งให้ หรือเครื่องมือ agent อ่านไฟล์ให้

เมื่อข้อมูลไม่พอ AI จะเติมช่องว่างด้วยสิ่งที่พบบ่อยในโลกภายนอก ตัวอย่างเช่น

  • เราขอ "เพิ่มฟิลด์เบอร์โทรใน User" AI ไม่เห็นตาราง user จริง จึงเดาชื่อคอลัมน์เป็น phone ทั้งที่ของเราใช้ mobile_no
  • AI ไม่รู้ว่าเราใช้ RBAC ผ่าน authManager จึงเขียนเช็กสิทธิ์แบบ if ($user->role == 'admin')
  • AI ไม่รู้ว่าทีมใช้ PostgreSQL จึงใช้ backtick หรือฟังก์ชันเฉพาะ MySQL ใน SQL

สิ่งที่น่ากลัวคือ AI ไม่บอกว่ามัน "เดา" โค้ดจะดูมั่นใจเหมือนรู้จริง เราจึงต้องให้บริบทที่จำเป็นตั้งแต่ต้น

ไฟล์ไหนควรแนบ ไฟล์ไหนไม่ควร

หลักง่าย ๆ คือ แนบสิ่งที่ AI ต้อง "อ้างอิง" เพื่อเขียนโค้ดให้ถูก ไม่ใช่ทุกอย่างที่เกี่ยวข้องแบบหลวม ๆ

ควรแนบเหตุผล
ไฟล์ที่จะถูกแก้AI ต้องเห็นโค้ดเดิมจึงแก้ได้ตรงจุด
Model / migration ของตารางที่เกี่ยวข้องชื่อคอลัมน์ ชนิดข้อมูล relation และ rules
Interface หรือ class ที่โค้ดใหม่ต้องเรียกป้องกันการแต่ง method ที่ไม่มีอยู่
ตัวอย่างโค้ดแบบเดียวกันที่มีอยู่แล้วให้ AI เลียนแบบ style ของทีม
Error message และ stack trace เต็มสำหรับงาน debug
composer.json (ส่วน require)บอกเวอร์ชัน framework และ library

สิ่งที่ไม่ควรแนบ

  • ไฟล์ .env, *-local.php, key, certificate หรือ dump ฐานข้อมูลจริง
  • ข้อมูลส่วนบุคคลของลูกค้า ถ้าต้องใช้ตัวอย่างข้อมูล ให้สร้างข้อมูลปลอม
  • โฟลเดอร์ vendor/, node_modules/, runtime/, ไฟล์ build และ log ขนาดใหญ่
  • ไฟล์ที่ไม่เกี่ยวกับงาน ซึ่งทำให้ AI สับสนว่าควรโฟกัสตรงไหน

ไฟล์แนวทางโปรเจกต์: AGENTS.md / CLAUDE.md

เครื่องมือ AI coding หลายตัวรองรับการอ่านไฟล์คำแนะนำประจำโปรเจกต์โดยอัตโนมัติ ชื่อไฟล์ขึ้นกับเครื่องมือ เช่น AGENTS.md หรือ CLAUDE.md ควรตรวจเอกสารของเครื่องมือที่ใช้ว่ารองรับชื่อไหน ไฟล์นี้ทำหน้าที่เหมือน "คู่มือพนักงานใหม่" ที่ AI อ่านก่อนเริ่มงานทุกครั้ง ทำให้เราไม่ต้องพิมพ์บริบทซ้ำทุก prompt

ตัวอย่างสำหรับโปรเจกต์ Yii2

# Project Guide

## Stack
- PHP 8.x, Yii2 advanced template (frontend, backend, console, common)
- PostgreSQL ผ่าน yii\db\Connection
- เทสต์ด้วย Codeception: vendor/bin/codecept run

## Conventions
- Business logic อยู่ใน common/services ไม่ใส่ใน controller
- Query ใช้ ActiveRecord หรือ Query Builder เท่านั้น ห้ามต่อ string เป็น SQL
- Output ใน view ต้องผ่าน Html::encode() ยกเว้นผ่าน HtmlPurifier แล้ว
- สิทธิ์ใช้ RBAC (Yii::$app->user->can()) ไม่เช็ก role ด้วย if
- ชื่อตารางเป็น snake_case เอกพจน์ เช่น order, order_item

## Commands
- รันเทสต์: vendor/bin/codecept run unit
- migration: php yii migrate (อย่ารันเองโดยไม่ถาม)

## ห้าม
- ห้ามอ่านหรือแก้ไฟล์ .env และ */config/*-local.php
- ห้ามเพิ่ม dependency โดยไม่ถาม
- ห้ามแก้ไฟล์ใน vendor/

หลักการเขียนไฟล์นี้ให้ได้ผล

  • สั้นและเจาะจง เขียนเฉพาะสิ่งที่ AI ไม่สามารถรู้เองจากโค้ด เช่น กติกาทีม คำสั่งรันเทสต์ ข้อห้าม
  • เป็นคำสั่งที่ตรวจได้ "ใช้ Html::encode" ดีกว่า "เขียนโค้ดให้ปลอดภัย"
  • อัปเดตเมื่อเจอปัญหาซ้ำ ถ้า AI ทำผิดแบบเดิมสองครั้ง ให้เพิ่มกติกาลงไฟล์นี้
  • commit เข้า repository ให้ทั้งทีมและทุกเครื่องมือใช้มาตรฐานเดียวกัน
  • ไม่ใส่ secret เพราะไฟล์นี้จะถูกส่งเข้า AI ทุกครั้ง

ขนาด context: มากไปก็ไม่ดี

โมเดลแต่ละตัวมีขีดจำกัดว่ารับข้อความได้เท่าไรในหนึ่งครั้ง เรียกว่า context window วัดเป็น token ถึงแม้หลายโมเดลจะรับได้มาก แต่การใส่ข้อมูลเยอะเกินมีผลเสีย

  • ความแม่นยำลดลง ข้อมูลสำคัญถูกกลบด้วยข้อมูลที่ไม่เกี่ยว AI อาจหยิบตัวอย่างผิดไฟล์มาใช้
  • ช้าขึ้นและแพงขึ้น ทุก token ที่ส่งมีค่าใช้จ่ายและเวลาประมวลผล
  • บทสนทนายาวเกินไปทำให้ AI "ลืม" กติกาที่บอกไว้ตอนต้น เมื่อ session ยาวมาก เครื่องมือบางตัวจะสรุปหรือตัดข้อความเก่าทิ้ง

ข้อควรรู้สำหรับคนไทย: ข้อความภาษาไทยมักใช้จำนวน token มากกว่าข้อความภาษาอังกฤษที่มีความหมายเท่ากัน การเขียนคำสั่งเทคนิคเป็นภาษาอังกฤษสั้น ๆ ปนไทยจึงช่วยประหยัดได้บ้าง แต่ความชัดเจนสำคัญกว่าการประหยัด

เทคนิคตัดสิ่งไม่จำเป็น

  1. ส่งเฉพาะฟังก์ชันที่เกี่ยว ไม่ต้องส่ง controller ทั้งไฟล์ 800 บรรทัด ถ้างานแก้แค่ action เดียว แต่บอกว่ามี method อื่นอยู่ด้วย
  2. ใช้ schema แทนข้อมูล ส่งโครงสร้างตาราง (\d order ใน psql หรือ migration) แทนข้อมูลจริงหลายพันแถว
  3. ตัด log ให้เหลือส่วนสำคัญ error message, stack trace ส่วนที่เป็นโค้ดของเรา และ request ที่ทำให้เกิดปัญหา
  4. เริ่ม session ใหม่เมื่อเปลี่ยนเรื่อง ไม่ลากบทสนทนาเรื่อง A ยาว ๆ แล้วมาทำเรื่อง B ต่อ
  5. สรุปก่อนเริ่มใหม่ ถ้างานยาว ให้ AI สรุปสิ่งที่ตัดสินใจไปแล้วเป็นข้อ ๆ แล้วใช้สรุปนั้นเปิด session ใหม่

ตัวอย่างดึง schema จาก PostgreSQL แบบไม่มีข้อมูลจริง เพื่อแนบให้ AI

pg_dump --schema-only --no-owner --table=public.order --table=public.order_item mydb > schema.sql

ให้ agent หาบริบทเอง แต่ต้องคุม

เครื่องมือแบบ agent สามารถค้นและเปิดไฟล์ในโปรเจกต์ได้เอง ฟังดูสะดวก แต่ไม่ได้แปลว่าเราไม่ต้องคิดเรื่องบริบท agent อาจอ่านไฟล์ที่ไม่เกี่ยวจนเปลือง context หรือเลือกตัวอย่างโค้ดเก่าที่ทีมเลิกใช้แล้วมาเลียนแบบ วิธีคุมที่ได้ผลคือ

  • ชี้จุดเริ่มต้นให้ เช่น "เริ่มอ่านจาก backend/controllers/OrderController.php และ common/models/Order.php"
  • บอกตัวอย่างที่ต้องการให้เลียนแบบ เช่น "ใช้รูปแบบเดียวกับ InvoiceService"
  • บอกสิ่งที่ไม่ต้องอ่าน เช่น โฟลเดอร์โมดูลเก่าที่รอลบ
  • ให้ agent สรุปก่อนว่าเข้าใจโครงสร้างอย่างไร แล้วเราแก้ความเข้าใจผิดก่อนเริ่มเขียนโค้ด

ขั้นตอนสุดท้ายนี้สำคัญมาก การแก้ความเข้าใจผิดตั้งแต่ระดับแผนเสียเวลาไม่กี่วินาที แต่ถ้าปล่อยให้ไปเจอในโค้ดที่เขียนเสร็จแล้ว อาจต้องรื้อทั้งชุด

เช็กลิสต์ก่อนส่ง prompt

  • AI รู้ stack และเวอร์ชันหรือยัง (จากไฟล์แนวทางหรือใน prompt)
  • แนบไฟล์ที่จะแก้ และ model/schema ที่เกี่ยวข้องแล้วหรือยัง
  • มีตัวอย่างโค้ดของทีมให้ AI เลียนแบบหรือไม่
  • ตรวจแล้วว่าไม่มี secret หรือข้อมูลส่วนบุคคลติดไป
  • ตัดไฟล์และ log ที่ไม่เกี่ยวออกแล้ว
  • บทสนทนานี้ยังอยู่ในเรื่องเดียวกัน ไม่ยาวจนควรเริ่มใหม่

สรุป

  • AI เห็นเฉพาะสิ่งที่อยู่ใน context เมื่อข้อมูลขาด มันจะเดาจากสิ่งที่พบบ่อยและไม่บอกว่าเดา
  • แนบไฟล์ที่จะแก้ schema interface และตัวอย่างโค้ดของทีม ไม่แนบ secret และข้อมูลจริง
  • ไฟล์แนวทางโปรเจกต์อย่าง AGENTS.md หรือ CLAUDE.md ช่วยให้ไม่ต้องพิมพ์บริบทซ้ำ และควรอัปเดตเมื่อเจอปัญหาซ้ำ
  • context มากเกินไปทำให้แม่นยำน้อยลง ช้าลง และแพงขึ้น
  • เริ่ม session ใหม่เมื่อเปลี่ยนเรื่อง และใช้สรุปแทนประวัติแชตยาว ๆ

ลองทำ

สร้างไฟล์แนวทางโปรเจกต์ให้โปรเจกต์ที่คุณทำอยู่

  1. เขียนหัวข้อ Stack, Conventions, Commands และ ห้าม อย่างละ 3–5 บรรทัด ความยาวรวมไม่เกินหนึ่งหน้าจอ
  2. ขอให้ AI ทำงานเล็ก ๆ หนึ่งงานโดยยังไม่มีไฟล์นี้ แล้วจดว่ามันเดาผิดอะไรบ้าง
  3. ใส่ไฟล์แนวทางแล้วสั่งงานเดิมใน session ใหม่ เทียบผล
  4. เพิ่มกติกาสำหรับข้อผิดพลาดที่ยังเหลืออยู่ แล้ว commit ไฟล์เข้า repository
ติดปัญหาตอนทำตาม? ถามในชุมชน

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

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