前言
在上一篇文章中 (爬虫:传统编程与AIGC的碰撞 - 掘金 (juejin.cn)) 我们通过OPENAI的资源库来调用AI应用至爬虫项目当中去,使用了APIKey,而在日常的开发中,这类信息的暴露会导致我们的APIKey被他人拿去使用导致使用次数达到上限。那我们应该如何解决呢?
这时候就需要使用到Node.js中的dotenv库来解决我们的问题了
那如何使用dotenv库呢?
首先,和openai和cheerio一样,dotenv是Node.js的资源库,所以我们要在终端中输入npm i dotenv
命令
在package.json文件中也能看到,我们已经导入了dotenv的依赖,能看到安装好的安装包和它的版本
然后我们在相同文件夹目录下新建一个.env文件
.env是环境变量
并在这个文件中输入以下内容:
# 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, // 生成2条
messages:[{
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();
完整代码:
// 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。