在这个知识爆炸的时代,优质的问题成为了通向智慧宝库的钥匙。正如那句哲言所言:“好的问题也许比答案更重要。”在深入学习吴恩达教授的Prompt Engineering课程后,我对这一理念有了更为深刻的理解与体验。
何为Prompt?
通过大学英语四级的朋友应该都知道,prompt作为名词有提示,提醒的意思,在计算机程序中用于引导用户输入的信息。而我们今天讲的Prompt Engineering就是常讲的提示词工程。
在AI快速发展的时代,LLM (Large Language Model 大模型) 已经深入千家万户,此时的LLM就好比是一座巨大的宝库,里面蕴藏着巨大的潜力和价值。而Prompt就像是把打开这巨大宝库的钥匙,通过精心的设计提示词,我们可以更快捷,更准确的获得与之相匹配的财富。简单点,Prompt就是让你的指令使AI能够更好的识别出来得到你想要的结果。
Prompt的简单示例
可能对于一些小白来说,知道了Prompt的概念之后,并不知道该怎么去使用它。下面以一个简单的代码实例带我们从AI底层实现
require('dotenv').config();
const OpenAI = require ('openai');
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL:'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function (model, prompt) {
const response = await client.chat.completions.create({
model: model, // 适合聊天的模型 很多种
messages: [
{
role: 'user',
content: prompt
}
]
})
return response.choices[0].message.content
}
async function main() {
let text = `
您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示词与写简短的提示词混淆。\
在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,
从而导致更详细和相关的输出
`
let prompt =`
把用三个反引号括起来的文本总结成一句话
\`\`\`${text}\`\`\` //用反斜杠起转义作用
`
const chatCompletion = await getChatResponse('gpt-3.5-turbo', prompt)
console.log(chatCompletion);
main();
这段代码首先前提是我们需要将这个js文件初始化,并安装openai以及dotenv。然后引入相应的模块,require即是node中的引入模块的关键字。再配置相关的openai,初始化OpenAI客户端。调用OpenAI API来创建一个聊天完成(chat completion)请求。指定适合聊天的的模型版本'gpt-3.5-turbo'。
在这里text是我们需要处理的文字,Prompt就是我们的提示词,提示AI我们需要的到的结果。此时AI就可以返回我们需要的结果了,具体结果如下图所示
这个结果已经可以达到我们想要的结果了,但是我们还可以获得一个更好的结果。这就需要我们在
设计模式上下功夫了
Prompt的设计模式
Prompt设计模式是指在与人工智能,特别是大型语言模型(LLMs)交互时,为了获得更准确、更有针对性和创造性的响应,而采用的一系列策略和技巧来构建和优化提问(prompt)的过程。这不仅仅是简单地提出一个问题,而是涉及到如何有效地组织语言、提供上下文、利用示例引导等多种方法来引导模型的思考方向。
一个好的设计模式应该具有以下几点组成
1.清晰明确性: 确保prompt表达清晰,避免模糊或双重含义,使模型能够准确理解问题的核心。
2.上下文丰富:提供足够的背景信息和上下文,帮助模型理解问题所处的环境和条件,从而给出更贴切的答案。
3. 具体化指令:具体说明你想要模型完成的任务类型,比如摘要、创作、解释、对比分析等,而不是仅仅提出一个开放性问题。
4. 示例引导(Few-Shot Prompting) :通过提供几个简短的示例(few-shot examples),展示期望的输出样式或解答方式,这种方法特别适用于指导模型学习特定的格式、风格或回答结构。
let prompt2 = `
您的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
`
const response = await getChatResponse('gpt-3.5-turbo', prompt2);
console.log(response);
}
通过这段代码可以看出,当我们丢给大模型一个具体的例子,大模型就可以根据我们给的例子生成我们需要的东西
在这里需要特别注意!!!
- clear ≠ short,清晰明确并不代表简短,长提示效果会更好!
- 使用分隔符清楚的指示输入的不同部分。 比如使用分隔符(
\\, "", < >, <tag> </tag>, :)区分指令和待处理的文本。可避免提示词与待处理文本冲突。 - 给模型足够的时间思考, 简而言之就是通过指令调整多训练一会模型,让模型输出能够让你满意。