吴恩达Prompt系列探索:AI客服实践

802 阅读4分钟

一 引言

在数字化时代,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

文件目录结构如下:

image.png

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()

效果展示

image.png

到此我们的AI客服就实现了,这里我们的prompt比较规范,主要遵循了以下原则:

  1. 明确性(Clarity)

    • Prompt清晰地指定了要识别的项目,包括情绪(正面或负面)、评论者是否表达愤怒、评论者购买的商品以及制造商品的公司。
    • 每个要识别的项目都使用了简洁明了的术语进行描述,避免了歧义。
  2. 结构化(Structure)

    • Prompt要求回复格式化为JSON对象,并指定了特定的键(“情绪”、“愤怒”、“商品”和“品牌”)。
    • 这种结构化的回复格式使得信息更加易于解析和使用。
  3. 指示性(Instruction)

    • Prompt不仅指定了要识别的信息,还提供了详细的指示,包括如何处理不存在的信息(使用“未知”作为值)和如何将愤怒值格式化为布尔值。
    • 这些指示确保了回复的一致性和准确性。
  4. 适应性(Adaptability)

    • Prompt通过占位符${lamp_review}来插入具体的评论文本,这使得prompt可以适应不同的输入情况。
    • 这种适应性使得prompt可以重复用于不同的评论分析任务。
  5. 简洁性(Brevity)

    • Prompt在提供必要信息的同时保持了简洁性,避免了冗长的描述和不必要的细节。
    • 简洁的prompt使得用户更容易理解和使用。
  6. 用户友好性(User-Friendliness)

    • Prompt使用了易于理解的语言和术语,没有使用过于专业或复杂的词汇。
    • 提供了明确的格式要求和指示,帮助用户生成符合要求的回复。

这些原则共同确保了prompt的有效性和实用性,使得AI模型能够根据prompt的指示准确地识别和提取评论文本中的关键信息。

感兴趣的掘友们可以尝试一下。