dotenv和openai:JavaScript编程中的安全素养和prompt engineering素养养成

381 阅读3分钟

前言

在上一篇文章中 (爬虫:传统编程与AIGC的碰撞 - 掘金 (juejin.cn)) 我们通过OPENAI的资源库来调用AI应用至爬虫项目当中去,使用了APIKey,而在日常的开发中,这类信息的暴露会导致我们的APIKey被他人拿去使用导致使用次数达到上限。那我们应该如何解决呢?

这时候就需要使用到Node.js中的dotenv库来解决我们的问题了

那如何使用dotenv库呢?

首先,和openai和cheerio一样,dotenv是Node.js的资源库,所以我们要在终端中输入npm i dotenv命令

image.png

在package.json文件中也能看到,我们已经导入了dotenv的依赖,能看到安装好的安装包和它的版本

image.png

然后我们在相同文件夹目录下新建一个.env文件

.env是环境变量

image.png

并在这个文件中输入以下内容:

# OPENAI
OPENAI_API_KEY = *你的APIKey*

在JS文件中输入require('dotenv').config(); 即可读取根目录下.env文件中的对象

// require  node里面的模块化里的关键字,引入模块
// 从本地node_modules引入openai模块,OpenAI
require('dotenv').config();
// 环境变量
console.log(process.env,'------');
const OpenAI = require('openai');

const client = new OpenAI({

    apiKey: process.env.OPENAI_API_KEY,
    baseURL:'https://api.chatanywhere.tech/v1'
})

这样就可解决了密钥的安全隐患

Prompt engineering:感受AIGC强大的nlp能力

创建一个名为getChatResponse的异步函数,并定义model和prompt两个参数,再通过创建一个名为response的异步函数调用await client.chat.completions.create方法生成AI的回复内容。

const getChatResponse = async function (model,prompt,n) {
    const response = await client.chat.completions.create({
        model: model,//适合聊天的模型 很多种
        //n:2,    // 生成2messages:[{
            role:'user',
            content:prompt
        }]
    })

   return response.choices[0].message.content; //返回AI回复内容的第一条信息
}

至此便完成了函数的封装。

接下来体验prompt engineering的魅力时刻

让他将下列文本按照同风格输出:

async function main(){
 let prompt2 = `
        您的任务是以一致的风格回答问题。

        <孩子>: 教我耐心。

        <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。

        <孩子>: 教我韧性。
        `
        const response2 = await getChatResponse('gpt-3.5-turbo',prompt2);
        console.log(response2);
}


main();

image.png

完整代码:

// require  node里面的模块化里的关键字,引入模块
// 从本地node_modules引入openai模块,OpenAI
require('dotenv').config();
// 环境变量
console.log(process.env,'------');
const OpenAI = require('openai');

const client = new OpenAI({

    apiKey: process.env.OPENAI_API_KEY,
    baseURL:'https://api.chatanywhere.tech/v1'
})

const getChatResponse = async function (model,prompt,n) {
    const response = await client.chat.completions.create({
        model: model,//适合聊天的模型 很多种
        //n:2,    // 生成2条
        messages:[{
            role:'user',
            content:prompt
        }]
    })

   return response.choices[0].message.content; 
}

async function main(){
    // es6 模板字符串 比 "" ''可以动态解析
    // 可以支持多行 特别适合详细的设置prompt
    let text = `
    您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\
    这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
    不要将写清晰的提示吃与写简短的提示词混淆。\
    在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,
    从而拿到更详细和相关的输出。
    `

    // LLM 的 nlp总结能力
    //转译
    let prompt = `
    把用三个反引号括起来的文本总结成一句话,20字以内。
    \`\`\`${text}\`\`\`
        `

        // const chatCompletion = await client.chat.completions.create({
        //     model:'gpt-3.5-turbo',//适合聊天的模型 很多种
        //     n:2,    // 生成2条
        //     messages:[{
        //         role:'user',
        //         content:prompt
        //     }]
        // })
        const chatCompletion = await getChatResponse('gpt-3.5-turbo',prompt);
        // console.log(chatCompletion.choices[0].message.content);

        let prompt2 = `
        您的任务是以一致的风格回答问题。

        <孩子>: 教我耐心。

        <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。

        <孩子>: 教我韧性。
        `
        const response2 = await getChatResponse('gpt-3.5-turbo',prompt2);
        console.log(response2);
}


main();

掘友们,尽情的放飞想象,让我们一起迎接AIGC时代的到来,一起学习prompt engineering。