引言
如今,大型语言模型(LLM)逐渐成为企业和个人开发者的重要工具。这些模型能够解决各种复杂的语言任务,如翻译、摘要、问答等。然而,要充分利用这些模型的能力,这就需要提示词(Prompt)的加持。
如果你对这些一点都不了解,不要紧,本文将从零开始,完美结合Prompt,让LLM的能力发挥到极致。
什么是Prompt设计模式?
首先,我们要知道什么是Prompt设计模式?
Prompt设计模式是一种策略,用于构造输入给语言模型的文本,以引导模型产生预期的输出。良好的Prompt设计不仅可以提高模型的响应质量,还能增强其相关性和实用性。
吴恩达的Prompt Engineering原则
吴恩达是目前人工智能和机器学习领域国际上最权威的学者之一。在他的Prompt Engineering原则中有以下几个原则:
- 编写清晰、具体的指令:给出的的指令要做到完整、清晰的描述所需要的功能,并且提供充足的上下文。
- 给模型时间思考:如果任务过长或是有多个步骤,可以分步给出指令,指导模型在下结论之前找出一个自己的解法。
- 编写结构化的指令:指令做到结构化,能够让LLM更好的理解所需内容,减少犯错的可能。
如果你想要进一步深入了解Prompt Engineering,不妨来看看吴恩达大神的课程,能够帮助你快速规范和完善你自己的Prompt语句。
ChatGPT提示工程师&AI大神吴恩达教你写提示词prompt engineering
实践案例
下面开始我们这次的实践案例:
对电子商务网站的产品评论进行简短摘要
在实验开始之前,我们要先保证我们拥有Node.js环境 Node.js官方安装传送门
1. 初始化项目,安装所需要的模块
首先,创建一个新文件夹,在命令行中执行npm init -y来快速创建一个新的Node.js后端项目。这一步将自动生成一个package.json文件,其中包含了项目的基本信息和默认设置。下载openai和dotenv。
npm init -y
npm i openai // 下载openai,会出现一个node_modules
npm i dotenv // 下载dotenv,用于加载环境变量,需要使用到dotenv来保护个人的敏感信息
现在来查看package.json文件,可以看到文件最后添加了dependencies依赖项,中间有下载的模块和对应的版本。
"dependencies": {
"dotenv": "^16.4.5",
"openai": "^4.73.0"
}
以后就可以通过这个依赖项来快速下载openai和dotenv了,你可以尝试去其他备用的文件夹初始化项目,然后删掉node_modules文件,在json文件中添加dependencies{},然后npm i,就可以把刚刚删除的node_modules重新安装回来。
npm i //安装所有依赖中的模块
2. 创建接口文件,配置环境变量
创建main.mjs作为接口文件
为了保护敏感信息,如API密钥,建议使用环境变量来管理这些信息。Node.js社区推荐使用dotenv库来简化这个过程。
- 在项目根目录下创建一个名为
.env的文件,用于存放你的密钥和转发地址,例如:OPENAI_API_KEY= 你自己的密钥 OPENAI_API_BASE_URL=http://api.302.ai/v1 - 确保将
.env文件添加到.gitignore文件中,防止意外提交到版本控制系统。.gitignore是Git 仓库中用于指定哪些文件或目录不应该被 Git 跟踪的配置文件。 - 在main.mjs中引入
dotenv并调用dotenv.config(),这将自动加载.env文件中的变量到process.env对象中:import dotenv from 'dotenv'; //导入dotenv dotenv.config(); //加载.env文件到process.env中
3.开始LLM与Prompt完美结合
import OpenAI from 'openai'; //导入openai
import dotenv from 'dotenv'; //导入dotenv
dotenv.config(); //加载.env
// 启动一个进程 process 后端
// env 对象 环境对象
// 进程是分配资源的最小单位
console.log(process.env);
我们查看process.env,可以看到,在.env文件中的内容成功传到了process.env中
继续
// 创建实例
const client = new OpenAI({
// node 里的进程对象
// 分别调用密钥和转发地址
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_API_BASE_URL,
})
// 通用的LLM 聊天完成接口函数,复用
// 第一个参数用于接收prompt
// model默认使用gpt-4o
const getCompletion = async (prompt, model = "gpt-4o") => {
// 模拟用户提出问题
const messsages = [{
role: "user",
content: prompt,
}];
// AIGC chat 接口,AI回答问题
const response = await client.chat.completions.create({
model: model, // 使用哪个LLM
messages: messsages, // 哪个问题
// LLM 生成内容的随机性 0~1 越小越确定 越大越随意
temperature: 0.9,
})
return response.choices[0].message.content;
}
const main = async () => {
// 产品评论
const prod_review = `
我女儿生日时买了这个熊猫毛绒玩具,她很喜欢,到处都带着。
它柔软、超级可爱,脸看起来很友好。
不过,相对于我付的价格来说,它有点小。
我想,同样的价格,也许还有其他更大的选择。
它比预期早到了一天,所以我有机会自己玩了一会儿,然后才把它送给她。
`;
// 初级prompt 设计原则
// 准确表达任务
// 给他一个角色
// 规范将评论用三个反引号分割,减少出错的可能
// 商品评论promot 模板
// 一个较为简单的prompt
// const prompt = `
// 您的任务是生成来自电子商务网站产品评论的简单摘要。
// 总结下面用三个反引号分割的评论,最多30个字。
// 评论:'''${prod_review}'''
// `
// 更为准确的prompt
const prompt = `
你的任务是生成来自电子商务网站的产品评论的有关时间运输的简短摘要,
以便向运输部门提供反馈。
总结以下用三个反引号分割的评论,最多30个字。
并重点关注任何提及产品运输和交付的方面。
评论:'''${prod_review}'''.
`
const response = await getCompletion(prompt)
console.log(response);
}
main()
简单的prompt生成的结果
更为准确的prompt生成的结果
可以看得出,这两个结果的差别还是很大的,这也更能体现出propmt语言规范,准确的重要性和必要性。
结语
Prompt设计模式是连接人类意图与机器智能的关键桥梁。现如今LLM不断发展,每个方面或多或少都出现了AI,未来必定是AI的时代。熟练掌握Prompt设计是十分重要的。这次我们简单学习了一下如何在LLM中使用Prompt,深入学习后,Prompt将会有更多可能。