OpenAi 和 Prompt 工程 的双生武魂 ,发挥大模型的真正实力!

392 阅读6分钟

前言

随着自然语言处理(NLP) 技术的飞速发展,大型语言模型(LLM)如 GPT-3、GPT-4 等已经成为了许多应用场景中的重要工具。这些模型的强大之处在于它们能够理解和生成自然语言,但要充分发挥它们的潜力,关键在于如何设计有效的提示词(Prompt)。本文教如何利用 Prompt 工程,帮助你更好地利用大模型的能力。

什么是 Prompt Engineering ?

Prompt 工程是指设计和优化输入给语言模型的文本提示,以获得所需输出的过程。一个好的提示可以让模型生成更准确、更有用的响应。Prompt 工程不仅仅是编写一段文本,而是涉及到对任务的理解、对模型能力的掌握以及对输出结果评估和优化

在B站里有AI大师级别人物吴恩达教你如何写提示词的教材,大家可以点击左边链接去学习一下! ChatGPT提示工程师&AI大神吴恩达教你写提示词

所以你想要真正的用好大模型,你首先得会的是去调教你的提示词,你得做好你的提示词工程,大模型才会返回你所需要的准确的信息!

一起来创建一个 openAi 的项目

初始化项目

首先,我们需要初始化一个新的 Node.js 项目并安装必要的依赖包。

在项目根目录下操作
npm init -y
npm install openai dotenv

 创建 .env 文件

为了确保 API 密钥的安全性,我们将使用 .env 文件来存储环境变量。在项目根目录下创建一个 .env 文件,并添加以下内容:

API_KEY=your_openai_api_key
BASE_URL=https://api.openai.com/v1

他们两个是使用 openAi 的关键配置:

  • API_KEY 是你的 OpenAI API 密钥,用于身份验证。
  • BASE_URL 是 OpenAI API 的基础 URL。所有的 API 请求都基于这个基础 URL 构建。

众所周知,chat-gpt 是收费的,大家可以去这里注册一下,注册写一个调查问卷会有免费的额度使用!【官网】302.AI - 全功能AI应用平台,按用量付费,开箱即用,开源生态

引入 dotenv 模块

在项目入口文件中,使用 dotenv 模块加载环境变量。

import dotenv from 'dotenv';

// 从 .env 文件中加载环境变量,并将它们添加到 process.env 对象中
dotenv.config();

要记得去用dotenv.config(),它是从 .env 文件中加载环境变量,并将它们添加到 process.env 对象.

在这里和大家介绍一下 process 这个东西 ,想必有很多人都认识这个单词 过程,进程,没错他是进程,process 是 Node.js 中的一个全局对象,提供了与当前进程相关的属性和方法。它允许你访问和修改环境变量(通过 process.env),处理输入输出流,捕获信号,控制进程行为等。 大家可以在输出一下 process 看一看他里面都有什么呀,

image.png 大家可以看到这里面还有我们刚刚使用 dotenv 模块配的环境变量。但是注意只有在你 config() 之和才可以,才可以加到process中呀.

这里大家可以了解一下为什么要去用 dotenv 这个node.js中的模块 , 我这里大概概括一下。

使用 dotenv 可以将敏感信息(如 API 密钥、数据库连接字符串等)和配置选项存储在 .env 文件中,而不是直接写在代码中。这有助于保护敏感信息,避免意外泄露,并且使得在不同环境中(如开发、测试、生产)管理配置更加容易。

引入并实例化 OpenAI 模块

接下来,我们从 node_modules 中引入 openai 模块,并使用从环境变量中加载的 API 密钥和基础 URL 实例化客户端。


import OpenAI from 'openai';

const client = new OpenAI({
    apiKey: process.env.API_KEY,
    baseURL: process.env.BASE_URL,
});
 创建 getCompletion 函数

我们定义一个通用的 getCompletion 函数,用于发送请求并获取响应。


// ES6 默认参数:为函数的参数设置默认值
const getCompletion = async (prompt, model = "gpt-4") => {
    const messages = [
        {
            role: "user",
            content: prompt
        }
    ];

    // 发送请求,生成基于给定消息的文本完成
    const response = await client.chat.completions.create({
        model: model,
        messages: messages,
        // 控制生成内容的随机性:0 最确定,1 最随机
        temperature: 0.5,
    });

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

这里面还是有许多细节需要注意的!

1. 异步函数

首先这个函数是异步的,这是因为发送 API 请求是一个异步操作,因为它涉及到网络通信,需要等待服务器响应。使用 async 和 await 可以更优首先这个函数是异步的,这是因为地处理这种异步操作。

2. 默认参数 (model = "gpt-4") :

如果调用 getCompletion 函数时没有提供 model 参数,默认使用 "gpt-4" 模型,这里是使用了ES6新增的函数参数的默认值。

3. 消息结构 (messages) :
  1. messages 是一个数组,包含一个或多个消息对象。每个消息对象都有 role 和 content 属性。
  2. role 可以是 "user""assistant" 或其他角色,用于标识消息的来源。
  3. content 是消息的内容,即用户提供的提示。
4. tempearture

LLM 生成内容的随机性 但他为 0 最确定 1 最随机!!

5. 为什么是返回 response.choice[0]

通常情况下,你只需要第一个生成的完成消息。因此,使用 choices[0] 可以直接获取第一个完成消息的内容。

我们来实战一下吧!

我们将创建一个 main() 函数作为程序的入口点。在这个函数中,我们将定义一个商品评论,并使用 OpenAI 客户端生成摘要。并且关注于它的产品运输!

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

    // 构建 Prompt,明确任务和角色
    const prompt = `
    你的任务是生成来自电子商务网站产品评论有关时间运输的简单摘要,以便向运输部门提供反馈。
    总结下面用三个反引号分隔的评论。最多用30个字。
    并重点关注任何提及产品运输和交付时间的评论。
    评论:'''${prod_review}'''
    `;

    // 调用 getCompletion 函数生成摘要
    const response = await getCompletion(prompt);
    console.log(response);
};

image.png 我们这样就得到了一个 prompt 模板! 它可以帮助我们去 提炼 评论中有用(或者说想得到)的信息,并反馈给相应的部门,他带我们做到了之前根本做不到的事情!

END

通过本文,我们从零开始学习了如何使用 OpenAI API 和 dotenv 模块构建一个简单的聊天应用,并确保了 API 密钥的安全性。通过加载环境变量,我们可以安全地管理敏感信息;希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎留言交流!