วิศวกรรมพรอมต์ที่ใช้งานได้จริงสำหรับ LLM ขนาดเล็ก

ประสิทธิภาพของโมเดลภาษาขนาดใหญ่ขึ้นอยู่กับคำสั่งที่เรา ป้อนเป็นอย่างมาก วิศวกรรมพรอมต์ (Prompt Engineering)คือกระบวนการการสร้างคำถามในลักษณะที่ได้เอาต์พุตที่ดีที่สุดจาก LLM ซึ่งเป็นขั้นตอนสำคัญในการติดตั้งใช้งานฟีเจอร์ที่ใช้ LLM

วิศวกรรมพรอมต์เป็นกระบวนการที่ต้องทำซ้ำ หากเคยทดลองใช้ LLM ที่แตกต่างกัน คุณอาจสังเกตเห็นว่าต้องปรับแต่งพรอมต์เพื่อ ให้ได้ผลลัพธ์ที่ดีขึ้น

รวมถึงโมเดลที่มีขนาดแตกต่างกันด้วย

อินเทอร์เฟซแชทที่ขับเคลื่อนโดย LLM ขนาดใหญ่ เช่น Gemini หรือ ChatGPT มักจะให้ผลลัพธ์ที่น่าพอใจโดยใช้ความพยายามในการป้อนพรอมต์เพียงเล็กน้อย อย่างไรก็ตาม เมื่อใช้ LLM ขนาดเล็กเริ่มต้นที่ไม่ได้ปรับแต่ง คุณจะต้องปรับแนวทาง

LLM ขนาดเล็กจะมีประสิทธิภาพน้อยกว่าและมีแหล่งข้อมูลที่ดึงมาใช้น้อยกว่า

"LLM ขนาดเล็ก" หมายถึงอะไร

การกำหนดขนาด LLM เป็นเรื่องซับซ้อน และผู้สร้างไม่ได้เปิดเผยข้อมูลนี้เสมอไป

ในเอกสารนี้ "LLM ขนาดเล็ก" หมายถึงโมเดลที่มีพารามิเตอร์น้อยกว่า 3 หมื่นล้าน ปัจจุบันโมเดลที่มีพารามิเตอร์ตั้งแต่ 2-3 ล้านไปจนถึง 2-3 พันล้านรายการสามารถทำงานในเบราว์เซอร์บนอุปกรณ์ระดับผู้บริโภคได้อย่างสมจริง

LLM ขนาดเล็กใช้ในกรณีใด

  • Generative AI ในอุปกรณ์/ในเบราว์เซอร์ เช่น หากคุณใช้ Gemma 2B กับ LLM Inference API ของ MediaPipe (แม้จะเหมาะสำหรับอุปกรณ์ที่ใช้ CPU เท่านั้น) หรือ DistilBert ในเบราว์เซอร์ด้วย Transformers.js การดาวน์โหลดโมเดลและการเรียกใช้การอนุมานในอุปกรณ์ของผู้ใช้จะทำได้ก็ต่อเมื่อใช้ LLM ขนาดเล็กเหล่านี้เท่านั้น เพื่อให้การดาวน์โหลดบนเว็บเป็นไปอย่างสมเหตุสมผลและเหมาะกับข้อจำกัดด้านหน่วยความจำและ GPU/CPU ของอุปกรณ์
  • Generative AI ฝั่งเซิร์ฟเวอร์ที่กำหนดเอง โมเดลแบบเปิดขนาดเล็ก เช่น Gemma 2B, Gemma 7B หรือ Gemma 27B พร้อมให้คุณเรียกใช้บนเซิร์ฟเวอร์ของคุณเอง (และปรับแต่งอย่างละเอียดได้หากต้องการ)

เริ่มต้นใช้งาน

อินเทอร์เฟซแชทที่ขับเคลื่อนโดย LLM ขนาดใหญ่ เช่น Gemini หรือ ChatGPT มักจะให้ผลลัพธ์ที่น่าพอใจโดยใช้ความพยายามในการป้อนพรอมต์เพียงเล็กน้อย อย่างไรก็ตาม เมื่อทำงานกับ LLM ขนาดเล็ก คุณจะต้องปรับแนวทาง LLM ขนาดเล็กจะมีประสิทธิภาพน้อยกว่าและมีแหล่งข้อมูลที่ดึงมาใช้น้อยกว่า

ระบุบริบทและคำสั่งรูปแบบที่แม่นยำ

หากต้องการให้ LLM ขนาดเล็กทำงานได้ดีที่สุด ให้สร้างพรอมต์ที่ละเอียดและเฉพาะเจาะจงมากขึ้น

เช่น

Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.

Review: "${review}"
Rating:
Input (review) เอาต์พุต (การจัดประเภท)
  LLM ขนาดใหญ่ขึ้น (Gemini 1.5) LLM ขนาดเล็ก (Gemma 2B)
ชอบทรงนี้มาก กระจายน้ำหนักได้ดีและสวมใส่สบายอย่างน่าประหลาดใจแม้จะเดินป่าตลอดทั้งวัน ขอแนะนำ 5 4 จาก 5 ดาว**
สายสะพายเปื่อยยุ่ย และเริ่มกดทับไหล่เมื่อบรรทุกของหนัก 1 2/5

แม้ว่า Gemini 1.5 จะให้เอาต์พุตที่ต้องการด้วยพรอมต์ง่ายๆ นี้ แต่เอาต์พุตของ Gemma กลับไม่น่าพอใจ

  • รูปแบบไม่ถูกต้อง เราขอจำนวนเต็มสำหรับคะแนน
  • การจัดประเภทดูเหมือนจะไม่ถูกต้องนัก รีวิวแรกมีข้อความที่กระตือรือร้นมากพอที่จะบ่งบอกถึงรีวิวระดับ 5 ดาว

ในการแก้ไขปัญหานี้ เราต้องใช้เทคนิควิศวกรรมพรอมต์ (Prompt Engineering) การแจ้งแบบ 1, 2-3 และหลายครั้ง และการแจ้งแบบลูกโซ่ความคิด นอกจากนี้ เรายังต้องระบุวิธีการจัดรูปแบบที่ชัดเจนและยืนยันว่าโมเดลควร ใช้ช่วงคะแนนทั้งหมด

เช่น

`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
    \n\n
    Here are some examples of reviews and their corresponding analyses and
    ratings:
    \n\n
    Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
    use, but it's perfect for urban exploring.'
    Analysis: The reviewer appreciates the product's style and basic
    functionality. They express some uncertainty about its ruggedness but
    overall find it suitable for their intended use, resulting in a positive,
    but not top-tier rating.
    Rating (integer): 4
    \n\n
    Review: 'It's a solid backpack at a decent price. Does the job, but nothing
    particularly amazing about it.'
    Analysis: This reflects an average opinion. The backpack is functional and
    fulfills its essential purpose. However, the reviewer finds it unremarkable
    and lacking any standout features deserving of higher praise.
    Rating (integer): 3
    \n\n
    Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
    Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
    Rating (integer): 1
    \n\n
    Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
    Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
    Rating (integer): 5
    \n\n
    Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
    Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
    Rating (integer): 1
    \n\n
    Now, here is the review you need to assess:
    \n
    Review: "${review}" \n`;
Input (review) เอาต์พุตที่มี LLM ขนาดเล็กกว่า (Gemma 2B)

ชอบทรงนี้มาก กระจายน้ำหนักได้ดีและ สบายอย่างน่าประหลาดใจแม้จะเดินป่าตลอดทั้งวัน ขอแนะนำ

การวิเคราะห์: รีวิวนี้เป็นรีวิวเชิงบวกอย่างมากและเน้นย้ำถึง ความพอดีและความสบายของผลิตภัณฑ์ ซึ่งบ่งบอกถึงความพึงพอใจต่อผลิตภัณฑ์เป็นอย่างมาก ซึ่งเป็นเหตุผลที่ทำให้ได้คะแนนสูง

คะแนน (จำนวนเต็ม): 5

สายสะพายเปราะบางและเริ่มกดทับไหล่ เมื่อบรรทุกของหนัก

**การวิเคราะห์:** รีวิวเน้นย้ำปัญหาด้านความสบายที่สำคัญของ สายรัด นอกจากนี้ ยังบ่งบอกว่าผลิตภัณฑ์อาจไม่เหมาะกับการบรรทุกหนัก หรือการเดินทางเป็นเวลานาน

**คะแนน:** 1 (แย่ที่สุด)

พรอมต์ที่ซับซ้อนมากขึ้นของเรา เมื่อรวมกับเทคนิค Few-Shot Prompting และการแจ้งแบบลูกโซ่ความคิด จะช่วยให้การจัดประเภทแม่นยำยิ่งขึ้น

คาดหวังการแยกวิเคราะห์เอาต์พุตด้วยตนเอง

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

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

// Use try/catch to catch (parsing) errors
try {
  // Parse the output for a rating
  const int = /[1-5]/;
  const ratingAsString = llmOutput.match(int)[0];
  // Parse as int
  const ratingAsInt = parseInt(ratingAsString);
  // `checkRating` checks the rating is a number between 1 and 5, since the
  // regEx may catch a number like "100"
  const finalRating = checkRating(ratingAsInt);
} catch (e) {
  console.error('Error', e);
}

ความแตกต่างของ Mind API

API ของ LLM บนระบบคลาวด์ เช่น Gemini API หรือ OpenAI ซึ่งมักเป็นจุดเริ่มต้นของ LLM ขนาดใหญ่ จะมีฟีเจอร์พรอมต์ที่มีประโยชน์ เช่น Gemini 1.5 Pro มีคำสั่งระดับระบบและ โหมด JSON

ปัจจุบันฟีเจอร์เหล่านี้อาจไม่พร้อมใช้งานเสมอไปสำหรับการใช้โมเดลที่กำหนดเอง หรือสำหรับ LLM ขนาดเล็กที่เข้าถึงได้โดยใช้ AI API ในเบราว์เซอร์ เช่น MediaPipe LLM Inference API หรือ Transformers.js แม้ว่านี่จะไม่ใช่ข้อจำกัดทางเทคนิค แต่ AI API ในเบราว์เซอร์มักจะมีขนาดเล็กกว่า

ขีดจำกัดโทเค็นของ Mind

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

นอกจากนี้ โมเดลขนาดเล็กมักจะมีขีดจำกัดโทเค็นอินพุตที่น้อยกว่า ตัวอย่างเช่น Gemini 1.5 Pro มีขีดจำกัดโทเค็นอินพุต 1 ล้านโทเค็น ขณะที่โมเดล Gemma มีหน้าต่างบริบท 8, 000 โทเค็น

ใช้ฟังก์ชันการนับโทเค็น เพื่อหลีกเลี่ยงไม่ให้เกินขีดจำกัด

ปรับการประมาณเวลา

พิจารณาการออกแบบและการทดสอบพรอมต์ในการประมาณเวลาทางวิศวกรรม

เนื่องจากความแตกต่างของ API และขีดจำกัดของโทเค็น คุณจึงอาจต้องใช้เวลาและความพยายามมากขึ้น ในการสร้างพรอมต์สำหรับ LLM ขนาดเล็กกว่า LLM ขนาดใหญ่ การทดสอบและตรวจสอบ เอาต์พุตของ LLM อาจต้องใช้ความพยายามมากขึ้นด้วย

วิศวกรพรอมต์เทียบกับการปรับแต่ง

สำหรับนักพัฒนาเว็บ วิศวกรรมพรอมต์ (Prompt Engineering) เป็นวิธีที่เราต้องการใช้ประโยชน์จาก Generative AI มากกว่าการฝึกและการปรับแต่งที่กำหนดเอง แต่แม้ว่าวิศวกรรมพรอมต์ (Prompt Engineering) ขั้นสูงก็อาจไม่เพียงพอในบางกรณีการใช้งาน โดยเฉพาะอย่างยิ่งหากคุณใช้ LLM ขนาดเล็ก

ใช้การปรับแต่งเมื่อ

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