การจัดรูปแบบ Gemma และวิธีการของระบบ

การจัดรูปแบบสำหรับการปรับแต่งการสอน

โมเดลที่มีการปรับแต่งการสอน (IT) จะได้รับการฝึกด้วยตัวจัดรูปแบบเฉพาะซึ่งจะใส่คำอธิบายประกอบตัวอย่างการปรับแต่งการสอนทั้งหมดด้วยข้อมูลเพิ่มเติม ทั้งในช่วงการฝึกและการอนุมาน ตัวจัดรูปแบบมีจุดประสงค์ 2 ประการ ได้แก่

  1. การระบุบทบาทในการสนทนา เช่น บทบาทของระบบ ผู้ใช้ หรือผู้ช่วย
  2. การกำหนดขอบเขตการสนทนา โดยเฉพาะในการสนทนาที่มีหลายตา

ด้านล่างนี้เราจะระบุโทเค็นการควบคุมที่ Gemma ใช้และกรณีการใช้งาน โปรดทราบว่าโทเค็นควบคุมจะสงวนไว้เฉพาะสำหรับเครื่องมือทำโทเค็นของเราเท่านั้น

  • โทเค็นที่บ่งบอกถึงการเลี้ยวของผู้ใช้: user
  • โทเค็นที่บ่งบอกถึงการเลี้ยวโมเดล: model
  • โทเค็นสำหรับระบุจุดเริ่มต้นของการเปลี่ยนบทสนทนา: <start_of_turn>
  • โทเค็นสำหรับระบุการสิ้นสุดเทิร์นของบทสนทนา: <end_of_turn>

ตัวอย่างบทสนทนามีดังนี้

<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
Gemma<end_of_turn>
<start_of_turn>model
Gemma who?<end_of_turn>

โทเค็น "<end_of_turn>\n" คือตัวคั่นการเลี้ยว และคำนำหน้าข้อความแจ้งคือ "<start_of_turn>model\n" ซึ่งหมายความว่าถ้าคุณต้องการเรียกโมเดลด้วยคำถาม เช่น "กฎของ Cramer คืออะไร" คุณควรป้อนโมเดลต่อไปนี้แทน

"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"

โปรดทราบว่าหากต้องการปรับแต่งโมเดล Gemma ที่ฝึกไว้แล้วล่วงหน้าด้วยข้อมูลของคุณเอง คุณสามารถใช้สคีมาดังกล่าวสำหรับโทเค็นควบคุมได้ ตราบใดที่รูปแบบนั้นสอดคล้องกันระหว่างการฝึกกับกรณีการใช้งานการอนุมาน

วิธีการสำหรับระบบ

โมเดลจะไม่ได้รับการฝึกด้วยคำสั่งของระบบสำหรับทั้งการปรับปรุงภายใต้การควบคุมดูแล (SFT) และการเรียนรู้แบบเสริมแรงจากความคิดเห็นของมนุษย์ (RLHF) ทำให้โทเค็นการจัดรูปแบบที่เกี่ยวข้องสำหรับ Gemma มีเพียง <start_of_turn>, <end_of_turn>, user และ model เท่านั้น เช่น

<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>

การจัดรูปแบบสำหรับงาน FIM

ตัวแปร CodeGemma 2B และ 7B ปรับแต่งมาเป็นพิเศษเพื่องานการเติมโค้ด

กล่าวคือ โมเดลจะได้รับการฝึกจากโทเค็นควบคุมการจัดรูปแบบ 4 ตัวที่คุณสามารถใช้ช่วยสร้างข้อความแจ้งของโมเดลสำหรับงานเขียนโค้ดแบบFill-In-The-Middle (FIM)

บริบท โทเค็น
คำนำหน้า FIM `<
คำต่อท้าย FIM `<
FIM ปานกลาง `<
ตัวคั่นไฟล์ `<

ใช้โทเค็น FIM ในการกำหนดตำแหน่งเคอร์เซอร์และบริบทโดยรอบสำหรับ CodeGemma ในการเติมโค้ด ใช้โทเค็นตัวคั่นไฟล์สำหรับบริบทที่มีหลายไฟล์

ตัวอย่าง - สร้างพรอมต์ FIM

ส่วนนี้จะใช้ตัวอย่างซ้ำในการเริ่มต้นอย่างรวดเร็วของ Keras CodeGemma เพื่อแสดงวิธีสร้างพรอมต์สำหรับงาน FIM

ลองพิจารณาโค้ดต่อไปนี้

import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
   sys.exit(0) # Line 3

| จะระบุตำแหน่งของเคอร์เซอร์ซึ่งเป็นตำแหน่งที่จำเป็นต้องเขียนโค้ด โปรดทราบว่าจะมีช่องว่างก่อนเคอร์เซอร์และบรรทัดที่ 1 และ 2 จะมีอักขระขึ้นบรรทัดใหม่ตรงส่วนท้าย

คำนำหน้าคือ

import

โดยมีช่องว่างที่ตอนท้าย

คำต่อท้ายมีดังนี้

⏎
if __name__ == '__main__':⏎
   sys.exit(0)

ด้วยการขึ้นบรรทัดใหม่ตอนเริ่มต้น

พรอมต์ควรสร้างดังนี้

<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
   sys.exit(0)<|fim_middle|>

ข้อควรทราบมีดังนี้

  • ไม่ควรเว้นวรรคระหว่างโทเค็น FIM ใดๆ กับคำนำหน้าและคำต่อท้าย
  • โทเค็นตรงกลาง FIM จะอยู่ที่ช่วงท้ายเพื่อให้โมเดลมีการเติมข้อมูลต่อไป
  • คำนำหน้าหรือคำต่อท้ายอาจว่างเปล่า ทั้งนี้ขึ้นอยู่กับตำแหน่งของเคอร์เซอร์ในปัจจุบันในไฟล์ หรือบริบทที่คุณต้องการกำหนดให้โมเดล

การทำความเข้าใจเอาต์พุตของโมเดล

การตอบสนองของโมเดลสำหรับตัวอย่างด้านบนจะเป็นดังนี้

<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n    sys.exit(0)<|fim_middle|>sys\n<|file_separator|>

โมเดลจะทำซ้ำข้อความแจ้งการป้อนข้อมูลและจัดเตรียม sys เป็นการเติมโค้ด

เมื่อใช้โมเดล CodeGemma สำหรับงาน FIM ให้สตรีมโทเค็นการตอบสนองและใช้โทเค็น FIM หรือโทเค็นตัวคั่นไฟล์เป็นตัวคั่นเพื่อหยุดสตรีมมิงและรับรหัสที่สำเร็จ