大语言模型的效果在很大程度上取决于我们向其提供的指令。提示工程是指以从 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 模型的上下文窗口为 8000。
使用令牌数函数可避免达到限制。
调整时间估算
在工程时间估算中考虑提示设计和测试。
由于 API 差异和令牌限制,您可能需要花费更多时间和精力为较小的 LLM 撰写提示,而不是较大的 LLM。测试和验证 LLM 的输出可能也需要付出更多努力。
提示工程师还是微调?
对于 Web 开发者而言,与自定义训练和微调相比,提示工程是我们利用生成式 AI 的首选方式。但在某些用例中,即使是高级的提示工程也是不够的,尤其是当您使用较小的 LLM 时。
在以下情况下,请使用微调:
- 您需要针对特定任务实现卓越的精确性和性能。微调会直接调整模型的内部参数,以获得最佳结果。
- 您拥有与任务相关且经过精心整理的数据,这些数据已标记为首选输出。您需要这些数据才能有效地进行微调。
- 您可以反复出于相同目的使用模型。微调可以一次完成,并用于特定任务。