引言
随着科技的进步,AI客服已经成为企业与客户之间不可或缺的桥梁。然而,要让AI客服真正理解并回应人类的情感和需求,并非易事。在吴恩达教授的《Prompt Engineering》课程中,我们学到了如何通过精心设计的提示(prompt),引导大型语言模型生成符合预期的回答或行为,从而实现更智能、更贴心的服务。本文将详细探讨这一过程,并结合实际代码示例展示其应用。
正文
1. 环境配置:dotenv包的作用
首先,让我们了解一下dotenv这个包的作用。dotenv是一个非常实用的Node.js模块,它允许我们将敏感信息(如API密钥)存储在一个名为.env的文件中,而不是直接硬编码在源代码里。这样做不仅提高了安全性,还方便了不同环境下的部署和维护。例如,在项目根目录下创建一个.env文件:
OPENAI_API_KEY=your_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
然后,在JavaScript文件顶部添加以下代码来加载这些环境变量:
import dotenv from 'dotenv';
dotenv.config();
这行代码会读取.env文件中的内容,并将其添加到process.env对象中,使得我们可以像这样访问API密钥:
(这里使用了 ES6 的 解构)
const { OPENAI_API_KEY, OPENAI_BASE_URL } = process.env;
2. 接入OpenAI API:openai包详解
接下来是openai包的介绍。openai是官方提供的Node.js客户端库,用于简化与OpenAI服务的交互。安装后,可以通过如下方式实例化一个OpenAI客户端对象:
import OpenAI from 'openai';
// 实例化openai对象
const client = new OpenAI({
apiKey: OPENAI_API_KEY,
baseURL: OPENAI_BASE_URL,
});
这里我们传递了两个参数给构造函数:apiKey用于身份验证,而baseURL指定了请求的目标地址。有了这个客户端实例,就可以轻松调用各种API端点了,比如创建聊天完成、图像生成等。
3. 构建高效的提示:get_completion函数解析
为了让AI客服能够根据特定任务生成合适的回答,我们需要定义一个通用的方法——get_completion。该方法接收用户提供的提示文本以及可选的模型名称作为参数,返回由OpenAI模型生成的结果。具体实现如下:
/**
* 异步函数,用于从 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,
messages,
temperature: 0, // 控制输出的随机性,值越低越确定
});
// 返回解析后的模型响应内容
return response.choices[0].message.content;
}
在这个函数中,我们设置了temperature参数为0,意味着希望得到最接近输入文本的答案。当然,根据实际情况也可以调整这个值以获得不同的效果。
4. 应用场景:多样的提示设计
为了更好地理解如何利用上述工具构建高效的AI客服系统,下面列举了几种常见的应用场景及对应的提示设计。我们将按照吴恩达教授提出的五个步骤来设计和优化每个提示,确保它们能有效地指导AI客服的工作。
吴恩达Prompt Engineering五步法实践
1. 理解任务需求
首先,明确你想要AI客服完成的任务是什么。对于情感分析与自动回复的任务,我们的目标是根据客户的评论情绪生成相应的电子邮件回复。为此,我们需要设定预期输出格式,即一封正式且有礼貌的邮件,其中包含对评论的具体回应。
const review = `
因此,他们仍然以 70-10 左右的价格在季节性销售,价格也比之前的 29 美元低。
所以它看起来还不错,但如果你看看底座,刀片锁定到位的部分看起来不如几年前的版本那么好,但
我打算非常温柔地使用它(例如,我先在搅拌机中粉碎非常硬的物品,如豆子、冰、米饭等。然后在
搅拌机中将它们粉碎成我想要的份量,然后切换到搅拌刀片以获得更细的面粉,并在制作冰沙时先
使用十字切割刀片,然后如果我需要它们更细/更少的浆状,则使用平刀片)。制作冰沙的特别提
示:将水果和蔬菜切碎并冷冻(如果使用菠菜,请稍微炖一下,然后冷冻直至可以使用;如果制作冰
糕,请使用小型或中型食品加工机),这样就可以避免在制作冰沙时添加太多冰块。
大约一年后,电机发出奇怪的声音。
我打电话给客服,但保修期已过,所以我不得不再买一个。仅供参考:这类产品的整体质量已经下
降,因此他们有点指望品牌认知度和消费者忠诚度来维持销售。大约两天后就收到了。
`
const prompt = `
你是一名客服AI助理。
你的任务是向尊贵的客户发送电子邮件回复。
给定以'''分隔的客户评论的客户发送电子邮件,
生成回复以感谢客户的评论。
如果情绪是正面或者是中性的,感谢他们的评论。
如果情绪是负面的,道歉并建议他们可以联系客服。
确保使用评论中的具体细节。
用简洁专业的语气写作。
在电子邮件中签名为"AI客服代理"。
客户评论:'''${review}'''
评论情绪:${sentiment}
`;
输出如下:
在这里我们发现大模型并没有一个细节并没有按照我们的要求来完成,我们要让它针对用户提出的问题作出回应,这是由于GPT-3.5-turbo这个大模型的性能不够,但当我们使用GPT-4O就会得到更加符合我们的要求的结果(但是这个大模型太贵了大学生暂时还用不起哈哈):
这段提示明确了AI客服的任务,即根据评论的情绪作出适当的反应,同时保持交流的专业性和友好性。
2. 设计清晰具体的提示
提供足够的背景信息,以便模型更好地理解问题。在信息抽取与智能推荐的例子中,我们要求AI客服识别出用户购买的商品及其制造商,并进一步了解他们对产品的满意度。为此,我们在提示中加入了详细的说明和示例。
const lamp_review = `
需要一盏漂亮的灯放在我的卧室,这盏灯有额外的存储空间,而且价格也不太高。
很快就收到了。我们灯的灯串在运输过程中断了,公司很乐意给我们寄来一根新的。
几天之内就到了。组装起来很容易。
我缺少一个零件,所以我联系了他们的支持人员,他们很快就给我找到了缺失的零件!
在我看来,Lumina 是一家关心客户和产品的好公司!!
`
const prompt = `
从评论文本中识别以下项目:
- 评论者购买的商品
- 制造商品的公司
评论以三个反引号分隔。
将你的回复格式化为JSON对象,其中"商品"和"品牌"作为键。
如果信息不存在,请使用"未知"作为值。
让你的回复尽可能简短。
评论内容:'''${lamp_review}'''
`;
这段提示不仅告诉了AI客服需要做什么,还提供了如何做(如JSON格式)的具体指导。
3. 测试与评估
初步验证提示是否按预期工作。我们可以先用简单的测试案例检查结果,然后逐步引入更多复杂的评论进行评估。例如,针对一段关于灯具的评论,我们可以要求AI客服完成以下任务:
const prompt = `
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 评论者是否表达愤怒?(真或假)
- 评论者购买的商品
- 制造商品的公司
评论以三个反引号分隔。
将您的回复格式化为 JSON 对象,其中
“情绪”、“愤怒”、“商品”和“品牌”作为键。
如果信息不存在,请使用“未知”
作为值。
让您的回复尽可能简短。
将愤怒值格式化为布尔值。
评论文本: '''${lamp_review}'''
`;
const response = await get_completion(prompt);
console.log(response);
通过这种方式,我们可以观察AI客服的表现,并记录任何不准确的地方或不符合预期的行为。
4. 调整优化
根据之前的评估结果,进一步完善提示措辞,使其更加精确。例如,如果发现某些情况下AI客服未能正确判断情绪,我们可以增加更多的示例或调整描述方式。此外,还可以尝试改变一些可配置选项,如温度(temperature),看看对输出质量的影响。
5. 持续迭代
定期审查并更新提示策略,以适应业务逻辑的变化和技术进步。长期跟踪模型在生产环境中的表现,确保其持续满足业务需求。鼓励团队成员分享经验和最佳实践,共同推动领域内技术的发展。
结语
综上所述,吴恩达教授的《Prompt Engineering》课程不仅教会了我们如何设计优秀的提示,更重要的是启发了人们对AI技术潜力的认识。通过结合情感识别、信息抽取以及自然语义编程等多种手段,AI客服正在变得越来越聪明、体贴。这一切都是为了实现一个共同的目标——让每一次交互都能传递温暖与信任,真正拉近人与机器之间的距离。相信在未来,我们会见证更多激动人心的变化!