Kỹ thuật câu lệnh thực tế cho các LLM nhỏ hơn

Tính hiệu quả của một mô hình ngôn ngữ lớn phụ thuộc rất nhiều vào những chỉ dẫn mà chúng ta đưa ra cho mô hình đó. Thiết kế câu lệnh là quy trình tạo câu hỏi theo cách giúp mô hình ngôn ngữ lớn (LLM) đưa ra kết quả tốt nhất. Đây là một bước quan trọng trong việc triển khai một tính năng dựa trên LLM.

Thiết kế câu lệnh là một quá trình lặp lại. Nếu đã thử nghiệm với nhiều LLM, có lẽ bạn nhận thấy rằng bạn cần điều chỉnh câu lệnh để đạt được kết quả tốt hơn.

Điều này cũng đúng với các mô hình có kích thước khác nhau.

Các giao diện trò chuyện sử dụng các LLM lớn (chẳng hạn như Gemini hoặc ChatGPT) thường có thể tạo ra kết quả thoả đáng mà bạn chỉ cần đưa ra câu lệnh ở mức tối thiểu. Tuy nhiên, khi làm việc với một LLM nhỏ hơn, mặc định và chưa được tinh chỉnh, bạn cần điều chỉnh phương pháp của mình.

LLM nhỏ hơn có ít sức mạnh hơn và có ít thông tin hơn để khai thác.

"LLM nhỏ hơn" nghĩa là gì?

Việc xác định kích thước của LLM rất phức tạp và các nhà sản xuất không phải lúc nào cũng công bố kích thước của LLM.

Trong tài liệu này, "LLM nhỏ hơn" có nghĩa là mọi mô hình có dưới 30 tỷ tham số. Tính đến hôm nay, các mô hình có từ vài triệu đến vài tỷ tham số có thể chạy một cách thực tế trong trình duyệt, trên các thiết bị dành cho người tiêu dùng.

LLM nhỏ hơn được dùng ở đâu?

  • AI tạo sinh trên thiết bị/trong trình duyệt, ví dụ: nếu bạn đang sử dụng Gemma 2B với API Suy luận LLM của MediaPipe (thậm chí phù hợp với các thiết bị chỉ có CPU) hoặc DistilBert trong trình duyệt bằng Transformers.js. Bạn chỉ có thể tải mô hình xuống và chạy suy luận trên thiết bị của người dùng bằng các LLM nhỏ hơn này, để giữ cho các lượt tải xuống trên web ở mức hợp lý và phù hợp với các hạn chế về bộ nhớ và GPU/CPU của thiết bị.
  • AI tạo sinh tuỳ chỉnh phía máy chủ. Bạn có thể chạy các mô hình có trọng số mở nhỏ như Gemma 2B, Gemma 7B hoặc Gemma 27B trên máy chủ của riêng mình (và có thể tinh chỉnh).

Bắt đầu

Các giao diện trò chuyện sử dụng các LLM lớn (chẳng hạn như Gemini hoặc ChatGPT) thường có thể tạo ra kết quả thoả đáng mà bạn chỉ cần đưa ra câu lệnh ở mức tối thiểu. Tuy nhiên, khi làm việc với các LLM nhỏ hơn, bạn cần điều chỉnh phương pháp của mình. LLM nhỏ hơn có ít sức mạnh hơn và có ít thông tin hơn để khai thác.

Cung cấp bối cảnh và hướng dẫn chính xác về định dạng

Để đạt được kết quả tối ưu với các mô hình ngôn ngữ lớn (LLM) nhỏ, hãy tạo câu lệnh chi tiết và cụ thể hơn.

Ví dụ:

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

Review: "${review}"
Rating:
Đầu vào (đánh giá) Kết quả (mức phân loại)
  LLM lớn hơn (Gemini 1.5) LLM nhỏ hơn (Gemma 2B)
Tôi rất thích kiểu dáng này! Phân bổ trọng lượng tốt và mang lại cảm giác thoải mái đáng ngạc nhiên ngay cả khi bạn đi bộ đường dài cả ngày. Nên dùng. 5 4/5 sao**
Dây đeo khá mỏng và bắt đầu hằn lên vai tôi khi tôi mang vác nặng. 1 2/5

Mặc dù Gemini 1.5 cung cấp đầu ra mong muốn với câu lệnh đơn giản này, nhưng đầu ra của Gemma không đáp ứng được yêu cầu:

  • Định dạng không chính xác. Chúng tôi yêu cầu một số nguyên cho điểm xếp hạng.
  • Thông tin đánh giá có vẻ không chính xác. Bài đánh giá đầu tiên đủ nhiệt tình để cho thấy đó là bài đánh giá 5 sao.

Để khắc phục vấn đề này, chúng ta cần sử dụng các kỹ thuật thiết kế câu lệnh, Câu lệnh một, vài và nhiều lầncâu lệnh chuỗi suy luận. Chúng tôi cũng phải cung cấp hướng dẫn rõ ràng về định dạng và yêu cầu mô hình phải sử dụng toàn bộ dải điểm xếp hạng.

Ví dụ:

`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`;
Đầu vào (đánh giá) Đầu ra với một LLM nhỏ hơn (Gemma 2B)

Tôi rất thích kiểu dáng này! Phân bổ trọng lượng tốt và thoải mái đến bất ngờ ngay cả khi đi bộ đường dài cả ngày. Nên dùng.

Phân tích: Bài đánh giá này rất tích cực và nhấn mạnh sự vừa vặn và thoải mái của sản phẩm, cho thấy sự hài lòng cao với sản phẩm. Điều này giúp bạn có được điểm xếp hạng cao.

Điểm xếp hạng (số nguyên): 5

Dây đeo khá mỏng và bắt đầu hằn lên vai tôi khi tôi mang vác nặng.

**Phân tích:** Bài đánh giá nêu bật một vấn đề đáng kể về sự thoải mái của dây đeo. Điều này cũng cho thấy sản phẩm có thể không phù hợp với tải trọng lớn hoặc các chuyến đi chơi kéo dài.

**Điểm xếp hạng:** 1 (thấp nhất)

Câu lệnh chi tiết hơn của chúng tôi, kết hợp với kỹ thuật đặt câu lệnh dựa trên một vài ví dụ và kỹ thuật tạo câu lệnh theo chuỗi suy luận, giúp đưa ra điểm xếp hạng chính xác hơn.

Dự kiến sẽ phân tích cú pháp đầu ra theo cách thủ công

Mặc dù bạn luôn phải dọn dẹp và diễn giải kết quả đầu ra của LLM theo cách thủ công, nhưng điều này đặc biệt đúng đối với các LLM nhỏ hơn. Các LLM này có thể tạo ra kết quả ít hoàn thiện hơn và có thể yêu cầu câu lệnh theo chuỗi suy luận.

Trong ví dụ đầu tiên, chúng ta đã sử dụng câu lệnh gợi ý theo chuỗi suy luận, nên đầu ra bao gồm cả thông tin phân tích và điểm xếp hạng. Chúng ta cần phân tích điểm xếp hạng theo cách thủ công. Ngoài ra, hãy lưu ý đến định dạng không nhất quán trong đầu ra ở phần trước: đôi khi mô hình này xuất ra markdown, nhưng không phải lúc nào cũng vậy.

// 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);
}

Lưu ý về sự khác biệt giữa các API

Các API đám mây LLM như Gemini API hoặc OpenAI (thường là điểm truy cập vào các LLM lớn hơn) cung cấp các tính năng hữu ích về câu lệnh. Ví dụ: Gemini 1.5 Pro cung cấp hướng dẫn hệ thốngchế độ JSON.

Hiện tại, những tính năng này không phải lúc nào cũng có sẵn để sử dụng mô hình tuỳ chỉnh hoặc cho các LLM nhỏ hơn được truy cập bằng API AI trong trình duyệt, chẳng hạn như MediaPipe LLM Inference API hoặc Transformers.js. Mặc dù đây không nhất thiết là một hạn chế về kỹ thuật, nhưng các API AI trong trình duyệt có xu hướng tinh gọn hơn.

Hạn mức mã thông báo của Mind

Vì câu lệnh của bạn cho các LLM nhỏ hơn cần có ví dụ hoặc hướng dẫn chi tiết hơn, nên câu lệnh đó có thể sẽ dài hơn và chiếm nhiều hạn mức mã thông báo đầu vào hơn (nếu có).

Ngoài ra, các mô hình nhỏ hơn thường có giới hạn mã thông báo đầu vào nhỏ hơn. Ví dụ: Gemini 1.5 Pro có giới hạn 1 triệu token đầu vào, trong khi các mô hình Gemma có cửa sổ ngữ cảnh 8K.

Sử dụng các hàm đếm mã thông báo để tránh đạt đến giới hạn.

Điều chỉnh thời gian ước tính

Tính đến việc thiết kế và thử nghiệm câu lệnh trong thời gian ước tính của nhóm kỹ thuật.

Do sự khác biệt về API và giới hạn mã thông báo, bạn có thể sẽ cần nhiều thời gian và công sức hơn để tạo câu lệnh cho một LLM nhỏ hơn so với một LLM lớn hơn. Việc kiểm thử và xác thực đầu ra của LLM cũng có thể tốn nhiều công sức hơn.

Kỹ sư thiết kế câu lệnh so với tinh chỉnh?

Đối với nhà phát triển web, thiết kế câu lệnh là phương pháp mà chúng tôi ưu tiên để tận dụng AI tạo sinh thay vì huấn luyện và tinh chỉnh tuỳ chỉnh. Tuy nhiên, ngay cả thiết kế câu lệnh nâng cao cũng có thể không đủ trong một số trường hợp sử dụng, đặc biệt là nếu bạn đang sử dụng một LLM (mô hình ngôn ngữ lớn) nhỏ hơn.

Sử dụng tính năng tinh chỉnh khi:

  • Bạn cần độ chính xác và hiệu suất cao nhất cho một tác vụ cụ thể. Tinh chỉnh trực tiếp điều chỉnh các thông số nội bộ của mô hình để có kết quả tối ưu.
  • Bạn có dữ liệu được tuyển chọn kỹ lưỡng, phù hợp với nhiệm vụ của bạn và đã được gắn nhãn bằng các đầu ra ưu tiên. Bạn cần dữ liệu này để tinh chỉnh hiệu quả.
  • Bạn sử dụng mô hình này cho cùng một mục đích nhiều lần. Bạn có thể tinh chỉnh một lần và dùng lại cho một tác vụ cụ thể.