零基础学习 prompt Engineering 心得!

114 阅读3分钟

从智能客服到内容生成,AI正逐渐改变我们的工作和生活方式,今天我将给大家分享如何使用OpenAI的API结合Node.js来构建一个高效的文本处理应用,该应用能够自动摘要电子商务网站上的产品评论,并提供有价值的反馈给运输部门。

项目背景

假设您是一家电商平台的技术负责人,需要定期收集用户对产品和物流服务的反馈。传统的手动处理方式耗时费力,而且容易出错。通过使用OpenAI的API,我们可以自动化这一过程,提高效率和准确性。

7.jpg

技术栈

  • Node.js: 用于构建后端服务
  • OpenAI API: 提供强大的自然语言处理能力
  • dotenv: 管理环境变量,确保敏感信息的安全

环境搭建

初始化项目

首先,确保您的开发环境中已安装Node.js,然后初始化它:

npm init -y

安装依赖

安装必要的依赖包,包括openaidotenv

npm i openai
npm i dotenv
  • npm i openai这条命令用于安装 openai 包。
  • npm i dotenv这条命令用于安装 dotenv 包。dotenv 是一个轻量级的 Node.js 模块,用于加载环境变量到 process.env 中。这些环境变量通常存储在一个 .env 文件中,这样可以避免在代码中硬编码敏感信息,如 API 密钥、数据库连接字符串等。

如果你已经下载并安装了 pnpm 包管理工具,可以使用 pnpm 替代 npm 来管理项目的依赖。pnpm 是一个更快、更节省磁盘空间的包管理工具,特别适合大型项目。以下是pnpm 全局包管理工具的安装代码:

npm i -g pnpm

配置环境变量

在项目根目录下创建一个名为.env的文件,并添加您的OpenAI API密钥和其他必要配置:

OPENAI_API_KEY= 你的openai_api_key
OPENAI_BASE_URL=https://api.openai.com/v1

同时,在项目的.gitignore文件中加入.env,以防止将敏感信息提交至版本控制系统。

代码实现

引入模块和配置环境变量

在项目根目录下创建一个名为main.mjs的文件,这是我们的主应用程序文件。首先,引入必要的模块并配置环境变量:

import OpenAI from 'openai';
import dotenv from 'dotenv';

dotenv.config();

const client = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY,
    baseURL: process.env.OPENAI_BASE_URL
});

设计Prompt

设计一个有效的Prompt是使用OpenAI API的关键。一个好的Prompt应该明确、具体,并且能够引导模型生成高质量的响应。以下是我们为产品评论摘要设计的Prompt:

const generatePrompt = (review) => `
你的任务是生成来自电子商务网站的产品评论有关时间运输的简短摘要,以便向运输部门提供反馈。
总结下面用三个返引号分格的评论,最多30个字。
并重点关注任何提及产品运输和交付的方面。
评论'''${ review }'''
`;

调用OpenAI API

定义一个异步函数getCompletion,该函数接受一个提示词和一个模型名称作为参数,返回由OpenAI API生成的响应:

const getCompletion = async (prompt, model = "gpt-4") => {
    const messages = [{ role: 'user', content: prompt }];
    const response = await client.chat.completions.create({
        model: model,
        messages: messages,
        temperature: 0.9
    });
    return response.choices[0].message.content;
};

主函数

编写一个主函数main,该函数将调用getCompletion函数并打印出结果:

const main = async () => {
    const prod_review = `我女儿生日时买了这个熊猫毛绒玩具,她很喜欢,到处都带着。
    它柔软、超级可爱,脸看起来很友好。
    不过,相对于我付的价格来说,它有点小。
    我想,同样的价格,也许还有其他更大的选择。
    它比预期早到了一天,所以我有机会自己玩了一会儿,然后才把它送给她。`;

    const prompt = generatePrompt(prod_review);
    const response = await getCompletion(prompt);
    console.log('生成的摘要:', response);
};

main().catch((error) => {
    console.error('发生错误:', error);
});

错误处理

为了使应用更加健壮,我们添加了错误处理机制。在主函数中,使用try-catch块来捕获并处理可能出现的错误:

const main = async () => {
    try {
        const prod_review = `我女儿生日时买了这个熊猫毛绒玩具,她很喜欢,到处都带着。
        它柔软、超级可爱,脸看起来很友好。
        不过,相对于我付的价格来说,它有点小。
        我想,同样的价格,也许还有其他更大的选择。
        它比预期早到了一天,所以我有机会自己玩了一会儿,然后才把它送给她。`;

        const prompt = generatePrompt(prod_review);
        const response = await getCompletion(prompt);
        console.log('生成的摘要:', response);
    } catch (error) {
        console.error('发生错误:', error);
    }
};

main();

测试应用

保存所有更改后,您可以通过运行以下命令来测试您的应用:

node main.mjs

结果展示:

image.png

进一步优化

批量处理

为了提高效率,您可以批量处理多个评论。例如,可以将多个评论放入一个数组,然后一次性发送给OpenAI API:

const batchProcessReviews = async (reviews) => {
    const prompts = reviews.map(generatePrompt);
    const responses = await Promise.all(prompts.map(prompt => getCompletion(prompt)));
    return responses;
};

const main = async () => {
    try {
        const reviews = [
            `我女儿生日时买了这个熊猫毛绒玩具,她很喜欢,到处都带着。它柔软、超级可爱,脸看起来很友好。不过,相对于我付的价格来说,它有点小。我想,同样的价格,也许还有其他更大的选择。它比预期早到了一天,所以我有机会自己玩了一会儿,然后才把它送给她。`,
            `这款手机非常棒,性能出色,电池续航也很长。但是快递员送货时态度不好,让人不太满意。`
        ];

        const summaries = await batchProcessReviews(reviews);
        summaries.forEach((summary, index) => {
            console.log(`评论 ${index + 1} 的摘要: ${summary}`);
        });
    } catch (error) {
        console.error('发生错误:', error);
    }
};

main();

优化Prompt

为了进一步提高生成摘要的质量,您可以尝试不同的Prompt设计。例如,可以增加更多的上下文信息,或者调整temperature参数来控制生成内容的多样性:

const generatePrompt = (review) => `
你的任务是生成来自电子商务网站的产品评论有关时间运输的简短摘要,以便向运输部门提供反馈。
总结下面用三个返引号分格的评论,最多30个字。
并重点关注任何提及产品运输和交付的方面。
请确保摘要准确、简洁。
评论'''${ review }'''
`;

结论

随着对AI技术的深入了解,我们可以探索更多有趣的应用场景,不断推动技术创新,希望这篇文章对您有所帮助!