一 引言
在数字化时代,AI技术正以前所未有的速度改变着各行各业。其中,电商行业作为数字化转型的前沿阵地,AI客服的应用尤为引人注目。本文将结合吴恩达的Prompt Engineering课程,探讨如何利用OpenAI的API与prompt技术,实现AI客服。
二 项目介绍
实现一个基于OpenAI的自然语言处理功能,具体来说,它通过调用OpenAI的API来生成对客户评论的回复。
三 环境配置(vscode编辑器)
创建assistant文件夹,导航到终端运行以下命令:
1.npm init -y //快速初始化一个新的 Node.js 项目,这个命令会自动生成一个默认的 package.json 文件,而不需要你通过交互式提示来填写信息。
2.npm i openai //安装名为 openai 的 npm 包的命令,这个命令会尝试从 npm 仓库中下载并安装 openai 包及其依赖项到你的项目中。
3.npm i dotenv//安装名为 dotenv 的 npm 包的命令,这个命令会下载并安装 dotenv 包及其依赖项到你的 Node.js 项目中。dotenv 是一个零依赖的模块,它加载了 .env 文件中的环境变量到 process.env 。 然后新建文件main.mjs和.env
文件目录结构如下:
4.接着在.env文件里面 写入 OPENAI_API_KEY=xxxxxxx//你的API密匙
OPENAI_BASE_URL=api.302.ai/v1 //定义一个名为 OPENAI_BASE_URL 的环境变量,其值为一个 URL。这个 URL 是与 API 进行通信的基础地址。在这个例子中,它指向一个与 OpenAI 兼容的第三方服务的 API 端点。
这里提一嘴:
将 v1OPENAI_API_KEY=... 和 OPENAI_BASE_URL=api.302.ai/v1 这两句代码写到 .env 文件中为安全性考虑.env 文件通常不会被包含在版本控制系统中(通过添加到 .gitignore 文件来避免),这有助于防止敏感信息(如 API 密钥)被意外泄露到代码仓库中。 将敏感信息存储在 .env 文件中,而不是硬编码在源代码中,可以提高应用程序的安全性。防止别人去github爬取你的api。
四.上代码(main.mjs)
import dotenv from 'dotenv';
import OpenAI from 'openai';// 模块引入放在头部,清晰明了
// .env 本项目 环境变量 配置文件
dotenv.config();
// 全面es6
// 全局环境对象
const {
OPENAI_API_KEY,
OPENAI_API_BASE_URL,
} = process.env;
// 实例化openai对象
const client = new OpenAI({
apiKey: OPENAI_API_KEY,
baseURL: OPENAI_API_BASE_URL,
});
// get_completion 函数封装
// async 是 es7
/**
* 异步函数,用于获取 OpenAI GPT-3.5-turbo 模型的文本生成结果
* @param {string} prompt - 用户提供的提示文本
* @param {string} model - 要使用的 OpenAI 模型,默认为 'gpt-3.5-turbo'
* @returns {Promise<string>} - 解析后的模型生成文本
*/
const get_completion = async (prompt, model = 'gpt-3.5-turbo') => {
// 创建一个包含用户角色和提示内容的消息对象
const messages = [
{
role: 'user',
content: prompt,
},
];
// 使用 OpenAI API 创建一个聊天补全请求
const response = await client.chat.completions.create({
model: model,
messages: messages,
temperature: 0, // 控制生成文本的随机性,0 表示最低随机性
});
// 从响应中提取并返回第一个选择的消息内容
return response.choices[0].message.content;
};
const main = async () =>{
const lamp_review = `
需要一盏漂亮的灯放在我的卧室,这盏灯有额外的存储空间,而且价格也不太高。
很快就收到了。我们灯的灯串在运输过程中断了,公司很乐意给我们寄来一根新的。
几天之内就到了。组装起来很容易。
我缺少一个零件,所以我联系了他们的支持人员,他们很快就给我找到了缺失的零件!
在我看来,Lumina 是一家关心客户和产品的好公司!!
`
const prompt = `
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 评论者是否表达愤怒?(真或假)
- 评论者购买的商品
- 制造商品的公司
评论以三个反引号分隔。
将您的回复格式化为 JSON 对象,其中
“情绪”、“愤怒”、“商品”和“品牌”作为键。
如果信息不存在,请使用“未知”
作为值。
让您的回复尽可能简短。
将愤怒值格式化为布尔值。
评论文本: '''${lamp_review}'''
`
const response = await get_completion(prompt);
console.log(response)
}
main()
效果展示
到此我们的AI客服就实现了,这里我们的prompt比较规范,主要遵循了以下原则:
-
明确性(Clarity) :
- Prompt清晰地指定了要识别的项目,包括情绪(正面或负面)、评论者是否表达愤怒、评论者购买的商品以及制造商品的公司。
- 每个要识别的项目都使用了简洁明了的术语进行描述,避免了歧义。
-
结构化(Structure) :
- Prompt要求回复格式化为JSON对象,并指定了特定的键(“情绪”、“愤怒”、“商品”和“品牌”)。
- 这种结构化的回复格式使得信息更加易于解析和使用。
-
指示性(Instruction) :
- Prompt不仅指定了要识别的信息,还提供了详细的指示,包括如何处理不存在的信息(使用“未知”作为值)和如何将愤怒值格式化为布尔值。
- 这些指示确保了回复的一致性和准确性。
-
适应性(Adaptability) :
- Prompt通过占位符
${lamp_review}来插入具体的评论文本,这使得prompt可以适应不同的输入情况。 - 这种适应性使得prompt可以重复用于不同的评论分析任务。
- Prompt通过占位符
-
简洁性(Brevity) :
- Prompt在提供必要信息的同时保持了简洁性,避免了冗长的描述和不必要的细节。
- 简洁的prompt使得用户更容易理解和使用。
-
用户友好性(User-Friendliness) :
- Prompt使用了易于理解的语言和术语,没有使用过于专业或复杂的词汇。
- 提供了明确的格式要求和指示,帮助用户生成符合要求的回复。
这些原则共同确保了prompt的有效性和实用性,使得AI模型能够根据prompt的指示准确地识别和提取评论文本中的关键信息。
感兴趣的掘友们可以尝试一下。