吴恩达系列之:Prompt Engineering——提示词工程

在这个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的获取方法,有需要的可以自取。

github.com/chatanywher...

相关推荐
AI小杨几秒前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
晨曦_子画5 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
道可云7 分钟前
道可云人工智能&元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
大数据·人工智能·3d·机器人·ar·vr
人工智能培训咨询叶梓16 分钟前
探索开放资源上指令微调语言模型的现状
人工智能·语言模型·自然语言处理·性能优化·调优·大模型微调·指令微调
zzZ_CMing16 分钟前
大语言模型训练的全过程:预训练、微调、RLHF
人工智能·自然语言处理·aigc
newxtc17 分钟前
【旷视科技-注册/登录安全分析报告】
人工智能·科技·安全·ddddocr
成都古河云18 分钟前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
UCloud_TShare21 分钟前
浅谈语言模型推理框架 vLLM 0.6.0性能优化
人工智能
软工菜鸡25 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
vivid_blog32 分钟前
大语言模型(LLM)入门级选手初学教程 III
人工智能·语言模型·自然语言处理