大语言模型的效果在很大程度上取决于我们向其提供的指令。提示工程是指以一种方式构建问题,从 LLM 中获得最佳输出的过程。这是实现基于 LLM 的功能的关键步骤。
提示工程是一个迭代过程。如果您尝试过不同的 LLM,可能已经注意到,您需要调整提示才能获得更好的结果。
对于不同大小的模型,情况也是如此。
采用大型 LLM(例如 Gemini 或 ChatGPT)的聊天界面通常只需最少的提示即可生成令人满意的结果。不过,如果使用未经过微调的默认较小 LLM,则需要调整方法。
LLM 越小,其功能就越弱,可供参考的信息池就越小。
“较小的 LLM”是什么意思?
定义 LLM 大小 很复杂,而且制造商并不总是会披露这些大小。
在本文档中,“较小的 LLM”是指参数少于 300 亿的任何模型。 目前,在消费类设备的浏览器中,可以实际运行具有几百万到几十亿个参数的模型。
较小的 LLM 在哪些地方使用?
- 设备端/浏览器端生成式 AI,例如,您将 Gemma 2B 与 MediaPipe 的 LLM 推理 API(甚至适用于仅使用 CPU 的设备)搭配使用,或者在浏览器中将 DistilBert 与 Transformers.js 搭配使用。只有使用这些较小的 LLM,才能在用户设备上下载模型并运行推理,以便保持合理的网络下载量,并适应设备的内存和 GPU/CPU 限制。
- 自定义服务器端生成式 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:
输入(评价) | 输出(评分) | |
---|---|---|
更大的 LLM(Gemini 1.5) | 较小的 LLM(Gemma 2B) | |
非常喜欢这款耳机的佩戴舒适度!能很好地分散重量,即使长途跋涉也能带来出乎意料的舒适感。值得推荐。 | 5 | 4 星(满分 5 星)** |
肩带很脆弱,在重负荷下会开始扎进我的肩膀。 | 1 | 2/5 |
虽然 Gemini 1.5 可以通过这个简单的提示提供所需的输出,但 Gemma 的输出不太理想:
- 格式不正确。我们要求评分为整数。
- 评分似乎不太准确。第一个评价非常热情,因此给出了 5 星评价。
为解决此问题,我们需要使用提示工程技术,包括单样本、少样本和多样本提示以及思维链提示。我们还必须提供明确的格式说明,并要求模型应使用完整的评分范围。
例如:
`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`;
输入(评价) | 使用较小 LLM (Gemma 2B) 的输出 |
---|---|
非常喜欢这款耳机的佩戴舒适度!能很好地分散重量,即使进行长途跋涉也能带来出乎意料的舒适感。值得推荐。 |
分析:这条评价非常积极,强调了商品的贴合度和舒适度,表明对商品非常满意。这也证明了我们给出高分是合理的。 评分(整数):5 |
肩带很脆弱,在重载下会开始扎进我的肩膀。 |
**分析:** 评价突出指出了肩带舒适度存在严重问题。这也表明,本产品可能不适合重载或长时间外出使用。 **评分:** 1(最差) |
我们更详尽的提示,结合少样本提示和思维链提示技术,可提供更准确的分级。
需要手动解析输出
虽然您应始终手动清理和解读 LLM 的输出,但对于较小的 LLM 尤其如此,因为它们可能会生成不太精致的结果,并且可能需要提供思维链接提示。
在第一个示例中,我们使用了思维链提示,因此输出既包含分析,也包含评分,我们需要手动解析评分。另请注意,上一部分输出的格式不一致:模型有时会输出 Markdown,但并非每次都会。
// 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 差异
Gemini API 或 OpenAI 等 LLM 云 API 通常是大型 LLM 的入口点,提供方便的提示功能。例如,Gemini 1.5 Pro 提供系统说明和 JSON 模式。
目前,这些功能并不总是适用于自定义模型或使用浏览器内 AI API(例如 MediaPipe LLM Inference API 或 Transformers.js)访问的较小 LLM。虽然这不一定是技术限制,但浏览器内 AI API 往往更精简。
注意令牌限制
由于您为较小的 LLM 提供的提示需要包含示例或更详细的说明,因此提示可能会更长,并且会占用更多输入令牌限制(如果有)。
此外,较小的模型往往具有较小的输入令牌数上限。例如,Gemini 1.5 Pro 的输入令牌数上限为 100 万,而 Gemma 模型的上下文窗口为 8, 000 个。
使用令牌数函数可避免达到限制。
调整时间估算
在工程时间估算中考虑提示设计和测试。
由于 API 差异和令牌限制,您可能需要花费更多时间和精力为较小的 LLM 撰写提示,而不是较大的 LLM。测试和验证 LLM 的输出可能也需要付出更多努力。
提示工程师与微调
对于 Web 开发者而言,与自定义训练和微调相比,提示工程是我们利用生成式 AI 的首选方式。但在某些用例中,即使是高级提示工程也可能不够用,尤其是在您使用较小的 LLM 时。
在以下情况下,请使用微调:
- 您需要针对特定任务实现卓越的准确性和性能。微调会直接调整模型的内部参数,以获得最佳结果。
- 您拥有与任务相关且经过精心整理的数据,这些数据已标记为首选输出。您需要这些数据才能有效地进行微调。
- 您会反复使用模型来实现相同的用途。微调可以一次完成,并用于特定任务。