前言
本指南将结合吴恩达教授的Prompt Engineering理念,带你从零开始,学习如何利用Prompt设计模式构建高效、有趣的AI问答。无论你是编程新手还是有一定经验的开发者,都能从中受益。
1. 什么是Prompt设计模式?
Prompt设计模式是一种通过精心构造的文本提示(Prompt)来引导AI模型生成特定内容的技术。这种模式特别适合于基于LLMs的应用开发,因为它能帮助模型理解用户的意图,从而产生更加精准和个性化的回应。
2. 吴恩达的Prompt Engineering原则
吴恩达教授在其课程中提出了几个关键的Prompt设计原则,这些原则有助于提高模型的性能和输出质量:
- 明确性:清晰地说明你需要模型做什么。
- 角色设定:给模型指定一个角色,例如“你是一名专业的客服代表”。
- 格式指导:如果需要特定格式的输出,应在Prompt中明确指出。
- 提供示例:给出一些例子可以帮助模型更好地理解你的意图。
- 多轮对话:通过多轮对话逐步引导模型,使其更好地理解上下文。
3. 准备工作:环境配置与依赖管理
在开始之前,确保你的开发环境已经准备就绪。我们将使用Node.js作为后端语言,通过npm安装必要的库:
npm init -y
npm install openai
npm install dotenv
第一步我们先构成了一个后端项目,然后引入相关的依赖,做AI项目当然得引入openai,接着我们讲讲为什么要引入dotenv?
讲解:
在项目根目录创建一个.env文件,添加如下内容:
OPENAI_API_KEY=your_api_key_here
OPENAI_API_BASE_URL=https://api.openai.com/v1
上面这些是我们等会要调用openai时所要用的。
同时,在.gitignore文件中添加.env,这一步的重要性可以体现为:
环境变量管理.env 文件用于存储环境变量,这些变量通常包含敏感信息,如API密钥、数据库连接字符串等。通过将这些信息放在.env文件中,可以避免将它们硬编码在代码中,从而提高安全性。
防止敏感信息泄露.env 文件通常会被添加到.gitignore文件中,这样就不会被提交到版本控制系统(如GitHub)。这可以有效防止敏感信息(如API密钥)被公开访问,从而降低安全风险。
提高代码的可维护性和可移植性
将配置信息从代码中分离出来,可以使代码更加干净和易于维护。当需要更改配置时,只需修改.env文件,而无需修改代码本身。
就比如你要上传你的源码时,如果你在.gitignore文件中添加了.env文件,那么你在.env文件中的重要信息,可以被调用,但是别人看不到,在用于工作时,更加的安全,也是必备的技能点。
4. 构建基础的AI交互接口
import OpenAI from 'openai';
import dotenv from 'dotenv';
// 启动一个进程 process 后端
// env 对象 环境对象
// 进程是分配资源的最小单位
dotenv.config();
console.log(process.env); // 看看.env是否能引入
const client=new OpenAI({
// node 里的进程对象
apiKeys:process.env.OPENAI_API_KEY,
baseURL:process.env.OPENAI_API_BASE_URL
});
// es6 默认参数
// 通用的LLM 聊天完成接口函数, 复用
const getCompletion=async(prompt,model="gpt-3.5-turbo")=>{
// 模拟用户提的问题
const message=[{
role:"user",
content:prompt
}];
// AIGC chat 接口
const response=await client.chat.completions.create({
model:"gpt-3.5-turbo",
messages:message,
temperature:0.9 // LLM 生成内容的随机性 0-1 1 最随机 0 最确定
});
return response.choices[0].message.content;
}
讲解: 让我们来慢慢剖析每一步的作用。 import OpenAI from 'openai'; import dotenv from 'dotenv';
import OpenAI from 'openai';
import dotenv from 'dotenv';
将引入的依赖导入项目之中
dotenv.config();
console.log(process.env);
将.env 读入process.env 对象中,后面就可以调用process.env,来引入key了。
const client=new OpenAI({
// node 里的进程对象
apiKeys:process.env.OPENAI_API_KEY,
baseURL:process.env.OPENAI_API_BASE_URL
});
1.创建 OpenAI 客户端实例:
new OpenAI({...}) 是一个构造函数调用,用于创建一个新的 OpenAI 客户端实例。这个实例将用于与 OpenAI 的 API 进行交互。
2.配置 API 密钥:apiKeys: process.env.OPENAI_API_KEY 这一部分指定了 API 请求所需的认证密钥。process.env.OPENAI_API_KEY 是从环境变量中读取的 API 密钥。通过这种方式,可以避免将敏感信息硬编码在代码中,从而提高安全性。
3. 配置基础 URL: baseURL: process.env.OPENAI_API_BASE_URL 这一部分指定了 API 请求的基础 URL。process.env.OPENAI_API_BASE_URL 是从环境变量中读取的基础 URL。这个URL可以使用国内的一些接口。
const getCompletion=async(prompt,model="gpt-3.5-turbo")=>{
// 模拟用户提的问题
const message=[{
role:"user",
content:prompt
}];
// AIGC chat 接口
const response=await client.chat.completions.create({
model:"gpt-3.5-turbo",
messages:message,
// LLM 生成内容的随机性 0-1 1 最随机 0 最确定
temperature:0.9
});
return response.choices[0].message.content;
}
我们创造了一个模板,想使用对话类的AI,有了这个模板以后不需要每次打一次代码,
1. 将prompt当作参数传入对象中,这样prompt就不是一成不变的,可以随情况而更改。
2.model="gpt-3.5-turbo"这一步的含义是你使用的模型,如果你没有输入你想用哪个模型,就使用默认的model="gpt-3.5-turbo"。
3. 最后将message封装,再调用调用 OpenAI API,最后返回内容。
response.choices:API 响应中的choices数组包含了多个生成的响应。通常情况下,我们只需要第一个响应。response.choices[0].message.content:提取第一个响应的消息内容。
总结: 为什么需要设计模板?模板的好处?
- 1. 提高代码复用性
通过将请求 OpenAI API 的逻辑封装在一个单独的函数中,可以在多个地方复用这个函数,而不需要重复编写相同的代码。例如,如果你在多个地方需要调用 OpenAI 的 API 来生成文本,可以直接调用 getCompletion 函数,而不需要每次都重新写一遍请求逻辑。
- 2. 提高代码可维护性
将功能封装在函数中,使得代码更加模块化。如果需要修改请求 API 的方式(例如,改变模型、调整参数等),只需修改 getCompletion 函数中的代码,而不需要在多个地方进行修改。这大大减少了代码维护的工作量,降低了出错的可能性。
案例实操:
使用上面的模板。我们再对模板进行调用:
const main = async () => {
//假设这是用户购物后的评论
const prod_review = `
我女儿生日时买了这个熊猫毛绒玩具,她很喜欢,到处都带着。
它柔软、超级可爱,脸看起来很友好。
不过,相对于我付的价格来说,它有点小。
我想,同样的价格,也许还有其他更大的选择。
它比预期早到了一天,所以我有机会自己玩了一会儿,然后才把它送给她。
`;
const prompt = `
你的任务是生成来自电子商务网站的产品评论的有关时间运输的简短摘要,
以便向运输部门提供反馈。
总结以下用三个反引号分隔的评论,最多30个字。
并重点关注任何提及产品运输和交付的方面。
评论:''''${ prod_review }''''
`
const response=await getCompletion(prompt,'gpt-4o')
console.log(response);// 输出AI帮你总结的内容
}
main();
讲解
const prod_review:实际场景中,假设这是用户购物后的评论,你如果是大公司的物流分析员,你如果从这段评论中,分析自己公司需要改进的地方呢?你可以先这样想想,之后就可以类似性调教AI,思考过后,我们进入promptprompt:如何写好prompt是我们开发AI相关项目的关键,请看上面案例,案例中具有一些特点。- 准确表达任务:你的任务是:......
- 给他一个角色 :例如你是十年老JS,后端大佬,PS技术人员等等。
- 进行一定的限定:如案例中的 三个反引号 减少它犯错的可能。
结语:
通过本文,想必你已经了解了一下promopt的相关用法,未来肯定是属于AI的。我也在学习中,写的有问题的地方,请大家提出。如果觉得本文对你有帮助,还请点赞呢。