AI时代的挑战与机遇:Prompt Engineering的核心原则解析
引言
5月18日凌晨,OpenAI安全主管、“超级智能对齐团队”负责人Jan Leike在社交平台宣布,离开OpenAI。这也是本周三OpenAI联合创始人兼首席科学家Ilya Sutskever辞职之后,又有一名高管辞职。在去年7月份,OpenAI宣布成立一个新的研究团队“超级对齐”,要用AI监督AI的方式,解决超智能“AI对齐”问题。“AI对齐”的意思是,要求AI系统的目标要和人类的价值观与利益相一致。公司创始人之一伊利亚·苏茨克沃被任命为团队共同负责人。而现在AI风险团队解散是公司内部最近出现动荡的又一证据,也再次引发了人们对该公司在开发AI产品时如何平衡速度与安全的质疑。OpenAI章程规定,必须安全地开发通用人工智能(AGI),即可以与人类匹敌或超越人类的技术。近些年来AI的发展势头过于迅猛,其主要得益于
NLP
(自然语言处理)的突破,使得一个零基础的萌新也能与LLM对话,并使用AI去生成所需内容。AI的发展趋势是不可逆的,我们个人应不断学习如何去更好使用AI。AI生成内容(AIGC,Artificial Intelligence Generated Content)
被誉为一座巨大的金库,其潜力无穷,而prompt则是打开这座宝藏的钥匙。掌握如何设计有效的prompt是挖掘AIGC价值的关键。
本文将通过一个基于Node.js的后端项目主要来讲解吴恩达的Prompt Engineering
准则,并讲述一些开发规范,指导你如何进行有效的提示词设计。
目录
- 后端项目配置
- Key安全问题
- 代码复用与封装
- Prompt设计原则
- 示例代码
- 总结
后端项目配置
环境配置
在开始使用大型语言模型(LLM)之前,我们需要先设置Node.js环境,并安装必要的模块:
- 初始化项目:在项目根目录下运行
npm init -y
,生成package.json
文件。 - 安装必要模块:运行
npm install openai
和npm install dotenv
来安装OpenAI SDK和dotenv包。
使用环境变量
为了安全地处理API密钥,我们将使用环境变量。首先,在项目根目录下创建 .env
文件,添加以下内容:
OPENAI_API_KEY=your_api_key_here
接着,在代码中使用 dotenv
包读取环境变量:
require('dotenv').config();
const OpenAI = require('openai');
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY, // 使用环境变量中的API密钥
baseURL: 'https://api.chatanywhere.tech/v1' // 检查并确保这是正确的API服务地址
});
Key 安全问题
如何妥善处理API密钥?
为了保证API密钥的安全性,遵循以下准则:
- 使用环境变量:将API密钥存储在环境变量中,而不是硬编码在代码中。
- 使用dotenv包:通过
dotenv
包加载环境变量文件,将密钥信息读取到代码中。
require('dotenv').config();
console.log(process.env.OPENAI_API_KEY); // 安全读取环境变量中的API密钥
环境变量与进程
在Node.js中,process
是一个全局对象,代表当前运行的进程。进程是操作系统分配资源的最小单元,而线程是进程的执行单元。举个不恰当的比喻,进程就相当于是董事长,而线程就相当于是要干实事的CEO。通过 process.env
,我们可以访问环境变量,这些变量在应用程序启动时由操作系统传递给进程。
console.log(process.env.OPENAI_API_KEY); // 输出环境变量中的API密钥
操作系统通过进程来管理资源分配,每个进程可以包含多个线程。环境变量是操作系统层级的配置,通过 process.env
可以在代码中访问这些变量,从而实现安全、灵活的配置管理。
代码复用与封装
Don't Repeat Yourself (DRY) 原则
DRY原则强调避免代码重复,通过封装和模块化来提高代码的可维护性和复用性。以下是一个封装函数的示例,用于获取聊天响应:
const getChatResponse = async function(model, prompt, n) {
const response = await client.chat.completions.create({
model: model,
n: n,
messages: [
{
role: 'user',
content: prompt
}
]
});
return response.choices[0].message.content;
}
吴恩达 Prompt 设计原则
提供清晰明确的提示
一个清晰、具体的提示可以显著提高模型生成相关和准确响应的几率。模糊或不明确的提示往往会导致无关或不正确的输出。
长提示效果更好
长提示通常能够提供更多的上下文和细节,帮助模型更好地理解任务和生成更相关的输出。在此用一个总结的prompt展示一下效果。
// 多行 特别适合详细设置 prompt
let text = `
您应该提供尽可能清晰,具体的指示,以表达您希望模型执行的任务\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性,\
不要将写清晰的提示词与简短的提示词混淆\
在许多情况下更长的提示词可以为模型提供更多的清晰度和上下文信息,
从而导致更详细和相关的输出,
`
// LLM 的 nlp 总结能力
// 转译
let prompt = `
把用三个反引号括起来的文本总结成一句话,20词以内,输出英语。
\'\'\'${text}\'\'\'
`
const chatCompletion = await getChatResponse('gpt-3.5-turbo',prompt,1);
console.log(chatCompletion);
结果如下
Provide clear and specific instructions to guide the model towards the desired output and reduce irrelevant or incorrect responses.
由此可见,AI的总结能力针不戳!
示例提示(Few-shot Learning)
通过提供几个示例,可以展示模型的学习能力,并引导其生成符合预期的响应。下面将用孩子与祖父母的问答来展示。
let prompt2 =`
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
`
const response = await getChatResponse('gpt-3.5-turbo',prompt2,1);
console.log(response);
<祖父母>: 坚强的树木是在风暴中成长而茁壮的,锻造坚韧的品质需要经历挑战和困难,如同琢磨出宝石的坚硬和光芒一样。
AI的模仿能力也太强了吧!
示例代码
以下是一个完整的示例,展示了如何使用上述原则进行Prompt设计:
// node 里面的模块化里的关键字,引入模块
// 从本地node_modules引入 openai模块,OpenAI
const OpenAI = require('openai');
// 安全意识
require('dotenv').config();
// 环境变量
// console.log(process.env.OPENAI_KEY_API,'-------');
const client = new OpenAI({
apiKey: 'sk-6hn5DRu3IgUAymGVSFVAOa8l3HnKmkh9ShLgWvFHWTlVrU3s', // 确保这是有效的API密钥
baseURL: 'https://api.chatanywhere.tech/v1' // 检查并确保这是正确的API服务地址
});
const getChatResponse = async function(model,prompt,n){
const response = await client.chat.completions.create({
model: model, // 适合聊天的模型 很多种
//定义
n:n, //生成n条
messages: [
{
role: 'user',
content: prompt
}
]
});
return response.choices[0].message.content;
}
async function main(){
// es6 的模板字符串 比传统的" ",''动态解析
// 多行 特别适合详细设置 prompt
let text = `
您应该提供尽可能清晰,具体的指示,以表达您希望模型执行的任务\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性,\
不要将写清晰的提示词与简短的提示词混淆\
在许多情况下更长的提示词可以为模型提供更多的清晰度和上下文信息,
从而导致更详细和相关的输出,
`
// LLM 的 nlp 总结能力
// 转译
let prompt = `
把用三个反引号括起来的文本总结成一句话,20词以内,输出英语。
\'\'\'${text}\'\'\'
`
// const chatCompletion = await getChatResponse('gpt-3.5-turbo',prompt,1);
// console.log(chatCompletion);
let prompt2 =`
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
`
const response = await getChatResponse('gpt-3.5-turbo',prompt2,1);
console.log(response);
}
main();
总结
通过本文的讲解,我们可以看到,在AI生成内容的时代,掌握有效的Prompt Engineering方法至关重要。我们通过一个基于Node.js的后端项目,详细介绍了如何配置环境、管理API密钥和环境变量,以及通过DRY原则实现代码复用和封装。在Prompt设计方面,清晰明确的提示、长提示和示例提示都是提高LLM性能的关键方法。通过实际的示例代码,我们展示了如何将这些原则应用于实际开发中,以最大化AI模型的潜力和实用性。
AI技术正在快速发展,未来将会有更多创新和挑战。希望本文能够帮助你更好地理解和应用Prompt Engineering准则,充分利用AI生成内容的巨大潜力,为你的项目和工作带来更高的效率和创意。继续学习和探索,与AI一起迎接更加智能化的未来!
转载自:https://juejin.cn/post/7371357451750555700