few-shot ทำให้ output มีรูปแบบสม่ำเสมอและนำไปใช้ได้
แนวคิด
บางครั้งคุณเขียนคำสั่งละเอียดยิบว่าอยากได้ output หน้าตาแบบไหน แต่ผลที่ได้ยังไม่คงเส้นคงวา บางรอบมีครบทุก field บางรอบขาด บางรอบเรียงต่างกัน เอกสารระบุชัดว่าเทคนิคที่ได้ผลที่สุดในการทำให้ output มีรูปแบบสม่ำเสมอและนำไปใช้ได้จริง คือ few-shot หรือ multishot prompting ไม่ใช่การเพิ่มคำอธิบายอีกชั้น
few-shot คือการใส่ตัวอย่าง input คู่กับ output ที่ต้องการลงไปใน prompt ให้โมเดลเห็นของจริงว่าผลลัพธ์ที่ดีหน้าตาเป็นอย่างไร เอกสารแนะนำให้ใส่ราว 3 ถึง 5 ตัวอย่าง และห่อไว้ในแท็ก example เพื่อให้โมเดลแยกออกจากคำสั่ง ตัวอย่างสื่อรูปแบบได้ในแบบที่คำบรรยายทำไม่ได้
ทำไมสำคัญ
เหตุผลที่คำอธิบายอย่างเดียวมักไม่พอ เพราะภาษาธรรมชาติกำกวมโดยธรรมชาติ คำว่า "สรุปสั้น ๆ" หรือ "ระบุตำแหน่งให้ชัด" ตีความได้หลายแบบ พอไม่มีตัวอย่างยึด โมเดลจึงเติมช่องว่างเอง ผลคือ output แกว่ง ในทางกลับกัน ตัวอย่างที่ดีเพียงไม่กี่อันปักหมุดรูปแบบไว้แน่น โมเดลลอกโครงจากตัวอย่างได้ตรงกว่าเดาจากคำ
เรื่องนี้สำคัญมากเมื่อ output ต้องถูกเครื่องอ่านต่อ เช่น finding ของ code review ที่ต้องมีครบทั้ง location, issue, severity และ suggested fix ทุกครั้ง เพื่อให้ pipeline นำไปโพสต์เป็น PR comment ได้ ถ้ารูปแบบไม่คงที่ ตัว parser จะพังหรือได้ข้อมูลไม่ครบ few-shot ที่แสดง finding ตัวอย่างเต็มรูปแบบ จึงทำให้ทุก finding ออกมาในโครงเดียวกัน
few-shot ยังต่างจากการบังคับ schema ด้วย tool use ในบทถัด ๆ ไป schema บังคับ "โครงสร้าง" ว่าต้องมี field อะไรบ้าง แต่ few-shot สอน "สไตล์และเนื้อหา" ของแต่ละ field ด้วย เช่น ระดับรายละเอียดของ suggested fix ควรมากแค่ไหน หรือ location ควรเขียนเป็นรูปแบบใด สองอย่างนี้เสริมกัน ไม่ใช่แทนกัน ใช้ few-shot เพื่อคุมน้ำเสียงและความละเอียด และใช้ schema เพื่อรับประกันว่าฟิลด์ครบ
ตัวอย่าง
<examples>
<example>
input: ฟังก์ชัน calculateTotal ลืมคูณ quantity
output:
location: src/cart.js:42
issue: total คำนวณจาก price อย่างเดียว ไม่ได้คูณ quantity
severity: high
suggested_fix: เปลี่ยนเป็น total += item.price * item.quantity
</example>
<example>
input: ฟังก์ชัน parseDate ไม่จัดการ input ว่าง
output:
location: src/date.js:15
issue: เรียก .split บน input ที่อาจเป็น null ทำให้ throw
severity: medium
suggested_fix: เพิ่มการเช็ค input ว่างก่อนเรียก .split
</example>
</examples>
โมเดลเห็นสองตัวอย่างนี้แล้วจะผลิต finding ใหม่ในโครงเดียวกันครบทั้งสี่ field ทุกครั้ง
เช็คความเข้าใจ
เมื่อคำอธิบายละเอียดแล้วแต่ output ยังไม่สม่ำเสมอ เทคนิคใดได้ผลที่สุดตามเอกสาร และใส่กี่ตัวอย่าง
few-shot กับการบังคับ schema ด้วย tool use เสริมกันอย่างไร