การจัดรูปแบบ 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

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

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

บริบทโทเค็น
คำนำหน้า FIM <|fim_prefix|>
คำต่อท้าย FIM <|fim_suffix|>
FIM middle <|fim_middle|>
ตัวคั่นไฟล์ <|file_separator|>

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

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

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

ลองดูโค้ดต่อไปนี้

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

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

คำนำหน้าจึงจะเป็น

import

โดยเว้นวรรค 1 ช่องไว้ท้าย

คำต่อท้ายคือ


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 หรือตัวคั่นไฟล์เป็นตัวคั่นเพื่อหยุดสตรีมและรับโค้ดที่สมบูรณ์