引言
根据 AI 大佬吴恩达教授的Prompt Engineering
原则。本文将利用OpenAI
,创建一个能够根据客户的评论分析客户的心情,并回应的智能AI客服。让AI与自然语言(nlp
)相融合,驱动的电商客服转型。
环境配置
首先保证你拥有node.js
环境。创建一个新文件,在新文件夹下,初始化一个后端项目,并安装所需要的模块包,本次所需要的有openai
和dotenv
(用来保护你的个人隐私)。
bash
npm init -y // 初始化 生成一个package.json文件
npm i openai // 安装openai
npm i dotenv // 安装dotenv
安装后可以在package.json
文件的dependencies
依赖中找到安装的openai
、dotenv
和它们的版本号。
在根目录下创建一个.env
文件,在.env
文件中保存我们的密钥和和转发地址。
bash
OPENAI_API_KEY= 你自己的密钥
OPENAI_BASE_URL= http://api.302.ai/v1 // 我使用的转发地址
如果你还没有你自己的密钥,你可以在302.AI中生成密钥。免费获取1$,用来使用AI。
我们将.env
写入到.gitignore
文件中,gitignore
就不会把.env
中的内容提交到远程库,这样就保护了我们的密钥安全。
基础架构
创建main.mjs
入口文件,mjs
文件允许你使用ECMAScript模块(ESM)
在main.mjs中:
javascript
// 导入模块包
import OpenAI from "openai";
import dotenv from "dotenv"; // 模块引入放在头部,不会重复
// .env 本项目 环境变量配置文件
dotenv.config(); // 将.env文件中的内容读取到process.env中
// 全面es6
// 全局环境对象
const {
OPENAI_API_KEY,
OPENAI_BASE_URL,
} = process.env;
// 实例化openai对象
const client = new OpenAI({
apiKey: OPENAI_API_KEY,
baseURL: OPENAI_BASE_URL,
});
// get_completion 函数封装
// async 是 es7
// 异步函数,用于获取OpenAI的完成结果。
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, // 使用指定的模型
messages, // 使用创建的消息数组
temperature: 0, // 设置温度为0,以获得最可能的输出
// 0~1之间 靠近0 保守 靠近1 随机多样
});
// 返回模型生成的第一个完成结果的内容
return response.choices[0].message.content;
};
简单分析一下上面的代码:
- 使用
import...from
将下载的模块包导入 - 加载环境变量到
Node.js
应用程序中 - 使用解构的方法在
process.env
中解构出要使用的密钥和转发地址 - 实例化
openai
对象,使用你的密钥和转发地址 - 封装了调用
OpenAI API
逻辑的异步函数get_completion
,用于获取OpenAI的完成结果。参数设为下面要设置、修改的提示词(prompt
)和你要使用的大模型(LLM
),在这里可以先使用gpt-3.5-turbo
,如果效果不好,可以换成gpt-4o
在get_completion
中:
- 创建一个包含用户提示的消息数组,用来模拟用户提出的s问题
- 创建一个聊天完成请求,调用OpenAI的API,需要设置成
await
来等待接收到上面的messages
。AI
设置为聊天模式(chat
),生成文本(completions
),creat
允许你指定模型、输入提示(prompt
)、以及一系列控制生成行为的参数(使用的LLM(model
),用户消息数组(messages
),文本的随机性和多样性(temperature
))。 - 最后返回结果,LLM会给出多个结果,我们在这里只返回一个结果
Prompt Engineering的应用
在设计具体的业务逻辑时,吴恩达教授在其课程中强调了"角色赋予"、"任务明确化"以及"格式约定"的重要性。这意味着我们需要给定清晰的任务描述,让模型知道它应该做什么;同时也要规定好输出格式,以便于后续处理。
先创建main
异步函数,并调用。我们将在main
函数中使用我们的OpenAI
:
javascript
const main = async () => {
}
main()
具体实现如下,我给出了一个正面的评论和一个负面的评论:
javascript
const main = async () => {
// const review = `
// 因此,他们仍然以 70-10 左右的价格在季节性销售,价格也比之前的 29 美元低。
// 所以它看起来还不错,但如果你看看底座,刀片锁定到位的部分看起来不如几年前的版本那么好,但我打算非常温柔地使用它(例如,我先在搅拌机中粉碎非常硬的物品,如豆子、冰、米饭等。然后在搅拌机中将它们粉碎成我想要的份量,然后切换到搅拌刀片以获得更细的面粉,并在制作冰沙时先使用十字切割刀片,然后如果我需要它们更细/更少的浆状,则使用平刀片)。制作冰沙的特别提示:将水果和蔬菜切碎并冷冻(如果使用菠菜,请稍微炖一下,然后冷冻直至可以使用;如果制作冰糕,请使用小型或中型食品加工机),这样就可以避免在制作冰沙时添加太多冰块。
// 大约一年后,电机发出奇怪的声音。
// 我打电话给客服,但保修期已过,所以我不得不再买一个。仅供参考:这类产品的整体质量已经下降,因此他们有点指望品牌认知度和消费者忠诚度来维持销售。大约两天后就收到了。
// `
const review = `
需要一盏漂亮的灯放在我的卧室,这盏灯有额外的存储空间,而且价格也不太高。
很快就收到了。我们灯的灯串在运输过程中断了,公司很乐意给我们寄来一根新的。
几天之内就到了。组装起来很容易。
我缺少一个零件,所以我联系了他们的支持人员,他们很快就给我找到了缺失的零件!
在我看来,Lumina 是一家关心客户和产品的好公司!!
`;
const prompt = `
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 评论者是否表达愤怒?(真或假)
- 评论者购买的商品
- 制造商品的公司
评论以三个反引号分隔。
将您的回复格式化为 JSON 对象,其中
"情绪"、"愤怒"、"商品"和"品牌"作为键。
如果信息不存在,请使用"未知"
作为值。
让您的回复尽可能简短。
将愤怒值格式化为布尔值。
评论文本: '''${review}'''
`;
const response = await get_completion(prompt);
console.log(response);
}
负面评论 正面评论 (如果结果有些问题,可以把大模型换成gpt-4o
)
将prompt更改,让AI给出回复
javascript
const prompt = `
你是一名客服AI助理。
你的任务是向尊贵的客户发送电子邮件回复。
给定以'''分隔的评论的客户发送电子邮件,
生成回复以感谢客户的评论。
如果情绪是正面或中性的,感谢他们的评论。
如果情绪是负面的,道歉并建议他们可以联系客户。
确保使用评论中的具体细节。
用简洁专业的语气写作。
在电子邮件中签名为"AI客服代理"
客户评论:'''${review}'''
`
负面评论
正面评论
可以看到AI帮助我们分析了客户的心情并成功给出了回复!!!
结论
综上所述,通过结合OpenAI
的强大语言模型与吴恩达教授所倡导的Prompt Engineering
理念,我们可以构建出既灵活又高效的AI客服解决方案。这样的系统不仅能够快速准确地处理大量客户咨询,还能持续学习和适应新的交流模式,最终为企业带来更好的用户体验和服务质量。