在这个AI盛行的大模型时代,越来越多的工程都可以交给我们的AI;在编程领域中,使用AI工具同样也能够给我们带来许多的便利;想要AI大模型能够输出我们期望的输出,我们就得设计出详细的prompt(提示词)去引导AI输出我们的想要的结果;今天就让我们来学习一下吴恩达系列中的Prompt Engineering------提示词工程。
何为Prompt ?
如果说LLM大模型 是一座宝藏金库 的话,那Prompt 可以说是打开这座宝藏的钥匙;因为我们可以给大模型说清楚我们的需求,即Prompt提示词,大模型的NLP自然语言处理能力会理解这段Prompt并生成相应的内容,所以说掌握了对Prompt的设计,就能拿到大模型里面丰富的内容;就相当于开启了LLM大模型这座宝藏。
接下来,让我们一起创建一个node后端文件,来感受AI的力量;
kotlin
// 如下命令可以初始化后端文件,并导入ai的包
npm init -y package.json 文件
npm i openai 安装了openai sdk
// 会向package.json 添加dependencies 依赖
Key 安全问题
在使用我们的AI大模型之前,我们要思考一个问题那就是如何妥善处理我们的api-key;因为我们在调用openai这个包时,就要通过api-key去访问大模型,所以api-key的安全问题是首当其冲的;我们不应该让api-key轻易地就暴露在代码之中,这时候就该引出我们的.env文件了。
环境变量储存
.env
文件是一种用于存储环境变量的配置文件;env是环境变量对象,它包含着所有的环境变量;通过console.log(process.env,'------');
这条命令时,就能拿到所有的环境变量。
dotenv
是一个零依赖的Node.js库,用于从.env
文件加载环境变量到process.env
对象中。这个操作通过调用dotenv.config()
方法完成,它默认查找项目根目录下的.env
文件,并把文件中的键值对(key=value)格式 的数据添加到process.env
对象中;这样就能在代码中读取到env对象了。
php
require('dotenv').config();
const client = new OpenAI({
apiKey: process.env.OpenAI_API_KEY,
baseURL: 'https://api.chatanywhere.tech/v1'
})
其中的process.env
是一个特殊的属性,它是一个进程对象 ,包含了当前进程的所有环境变量 。在Node.js中,process
是一个全局对象 ,它代表了当前Node.js进程。当你运行一段代码的时候,就是开启了一个新的进程;进程是分配资源的最小单元。
与进程关系密切的还有线程,那什么是线程呢? 如果说进程是董事长,那线程就是小弟,是CEO;线程是归进程管理的,它可以说是代码执行的最小单位 。进程负责分配大致资源,而线程就是把从进程那边拿到的资源进行更加详细的工作分配。 层级管理关系: 操作系统 (window/mac/linux)<- 进程(process)<- 环境变量(env)<- project
.env文件:
ini
# OPENAI
OPENAI_API_KEY = *******
# 数据库
MYSQL_USER=root
MYSQL_PASSWORD=123456
这样就用env对象储存好了我们的api-key;可以通过process.env.OpenAI_API_KEY
去获取,这样就解决好了Key的安全问题。
prompt设计模式
在吴恩达系列中,关于prompt的设计,可以大概分为三点:
- 提供清晰、明确的提示,
- 长提示效果更好
- 给它一些例子 ,few shot 展示LLM的学习能力
如果说大模型是弹药库,那prompt就是它的目标,我们设计清晰、明确的提示词,就相当于给了大模型一个准确的定位,让它能够指哪打哪。
javascript
// 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){
const response = await client.chat.completions.create({
model : model,// 适合聊天的模型 很多种大模型
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 getChatResponse('gpt-3.5-turbo', prompt)
// console.log(chatCompletion.choices);
console.log(chatCompletion);
let prompt2 = `
您的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
`
const response = await getChatResponse('gpt-3.5-turbo', prompt2)
console.log(response);
}
main();
有时候好的问题比答案也许更重要;把时间花在设计prompt上,能够让我们得出更加准确的答案!
OPENAI_API_KEY 获取方法
最后附上Key的获取方法,有需要的可以自取。