likes
comments
collection
share

深入浅出prompt engineering

作者站长头像
站长
· 阅读数 35

目录

  1. 引言
  2. Prompt Engineering概述
  3. 环境搭建
  4. 编写代码
  5. LLM编程之利好
  6. 总结

一、引言

在大语言模型(LLM)对自然语言处理到炉火纯青的时代,提示词编程(Prompt Engineering)即面向大模型编程(LLMs)已经成为与大语言模型如OpenAI的GPT-4o互动的强大技术。这些技术使开发者能够通过编写合适的提示词来执行复杂的任务,而无需大量代码。本篇文章将深入探讨提示词工程即面向大模型编程的概念,并通过一个示例Node.js应用展示其在爬取豆瓣电影排行榜中的电影信息的应用。

深入浅出prompt engineering

二、Prompt Engineering概述

提示词编程是一门设计和优化输入文本(提示词)的技术,旨在引导语言模型生成所需的响应。提示词编程结合了对模型能力的理解和任务的具体需求,能够将模糊的请求转化为精确的指令,从而引导模型生成准确且相关的输出。

面向大模型编程(Programming with Large Language Models, LLMs)是一种利用大语言模型执行任务的新编程范式。大语言模型如GPT-4o能够理解和生成自然语言文本,具有强大的适应性和灵活性,可以应用于各种任务,从自然语言处理到数据解析再到生成代码。

与传统编程中的面向对象编程(OOP)不同,面向大模型编程并不依赖于严格的编程逻辑和结构,而是通过设计合适的提示词来引导模型生成期望的输出。这种方式简化了编程过程,提高了开发效率,让我们的coding能更

与传统编程的区别

面向对象编程(OOP)

面向对象编程是一种编程思想和方法论,它基于类和对象的概念,通过封装、继承和多态性实现代码的重用和模块化。在OOP中,开发者需要详细设计类的结构、属性和方法,通过编写具体的逻辑代码实现功能。在传统的OOP方式中,编写爬虫程序涉及大量的代码和逻辑,包括HTTP请求处理、HTML解析、数据提取和错误处理等。以下是一些常见的麻烦之处:

  1. 复杂的HTML解析:处理复杂的HTML结构需要编写大量的解析代码,使用正则表达式或专门的解析库(如Cheerio)。
  2. 数据清洗:从网页中提取的数据可能需要大量的清洗和格式化工作,以确保数据的准确性和一致性。
  3. 错误处理:网络请求可能会失败或返回错误状态码,编写健壮的错误处理代码是必不可少的。
  4. 反爬措施:一些网站会采取反爬措施,如IP封禁或验证码,编写代码绕过这些措施需要额外的精力和技巧。
  5. 维护成本高:网站结构可能会频繁变化,需要不断更新爬虫代码以适应新的结构。

面向大模型编程(LLMs)

面向大模型编程则依赖于大语言模型的自然语言处理能力。开发者通过编写提示词,引导模型生成所需的响应,而不需要详细设计逻辑代码。模型能够理解和生成复杂的自然语言文本,从而完成各种任务。

这种编程方式的主要特点是:

  1. 高度抽象:通过提示词直接与模型互动,简化了代码逻辑。
  2. 灵活性强:模型能够处理各种输入和任务,适应性极强。
  3. 快速迭代:无需编写大量的特定逻辑代码,开发周期大大缩短。

三、环境搭建

在开始使用OpenAI的API执行我们的任务之前,我们需要搭建一个Node.js开发环境。 下载并安装适合你操作系统的版本。

初始化项目

在命令行中,进入你的项目目录并运行以下命令初始化一个新的Node.js项目:

npm init -y

这条命令将创建一个默认的package.json文件,包含项目的基本信息。

安装OpenAI包

接下来,安装OpenAI的Node.js包:

npm i openai

这条命令会下载并安装OpenAI包到node_modules目录中,并将其记录在package.json文件中。安装完成后,你就可以在项目中使用OpenAI的API了。

编写代码

导入和配置OpenAI

首先导入OpenAI包,并使用你的API密钥和基础URL设置客户端。

const OpenAI = require('openai');
const client = new OpenAI({
    apiKey: 'your-api-key', // 确保这是有效的API密钥
    baseURL: 'https://api.chatanywhere.tech/v1' // 检查并确保这是正确的API服务地址
});

现在可以进行实操了~

编写提示词

提示词是提示工程的关键部分。在本例中,我们将从一段HTML中提取电影详情。以下是我们将使用的HTML片段:

<tr class="item">
<td width="100" valign="top">
    <a class="nbg" href="https://movie.douban.com/subject/35503073/" title="对你的想象">
        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp" width="75" alt="对你的想象" class="">
    </a>
</td>
<td valign="top">
    <div class="pl2">
        <a href="https://movie.douban.com/subject/35503073/" class="">
            对你的想象
            / <span style="font-size:13px;">关于你的想法 / 概念中的你</span>
        </a>
        <p class="pl">2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...</p>
        <div class="star clearfix">
            <span class="allstar30"></span>
            <span class="rating_nums">5.9</span>
            <span class="pl">(21308人评价)</span>
        </div>
    </div>
</td>
</tr>

我们将指示模型解析此HTML并以JSON格式返回电影详情。

const prompt = `
<tr class="item">
            <td width="100" valign="top">               
                    <a class="nbg" href="https://movie.douban.com/subject/35503073/" title="对你的想象">
                        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp" width="75" alt="对你的想象" class="">
                    </a>
            </td>
            <td valign="top">
                <div class="pl2">
                    <a href="https://movie.douban.com/subject/35503073/" class="">
                        对你的想象
                        / <span style="font-size:13px;">关于你的想法 / 概念中的你</span>
                    </a>
                    <p class="pl">2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...</p>               
                        <div class="star clearfix">
                                <span class="allstar30"></span>
                                <span class="rating_nums">5.9</span>
                                <span class="pl">(21745人评价)</span>
                        </div>
                </div>
            </td>
        </tr>
这是一段电影html,请获取电影名(name),封面链接(picture),简介(info),评分(score),评论人数(commentsNumber).请使用括号的单词作为属性名,以JSON的格式返回。
`

调用OpenAI API

通过调用OpenAI API,我们可以生成所需的输出。

async function main() {
    try {
        const chatCompletion = await client.chat.completions.create({
            model: 'gpt-3.5-turbo', // 适合聊天的模型
            messages: [
                { role: 'user', content: prompt }
            ]
        });
        console.log(chatCompletion.choices[0].message.content);
    } catch (error) {
        console.error('Error:', error);
    }
}

main();

运行结果

运行上述代码后,OpenAI的GPT-3.5模型将解析HTML并生成如下格式的JSON:

{
    "name": "对你的想象",
    "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.webp",
    "info": "2024-03-16(西南偏南电影节) / 2024-05-02(美国网络) / 安妮·海瑟薇 / 尼古拉斯·加利齐纳 / 艾拉·鲁宾 / 安妮·玛莫罗 / 瑞德·斯科特 / 帕芮·马费尔德 / 乔丹·亚伦·霍尔 / 玛蒂尔达·吉安诺普洛斯 / Meg Millidge / 奇克·曼诺哈 / Ray Cham / Jaiden...",
    "score": "5.9",
    "commentsNumber": "21745"
}

可以发现完美爬取电影信息 深入浅出prompt engineering

五、面向大模型编程之利好

简化复杂任务

通过提示词编程,开发者可以简化传统上需要复杂代码的任务。例如,解析HTML以提取特定信息通常需要正则表达式或专门的HTML解析库,而使用LLMs则只需几行提示词即可完成。

灵活性和适应性

LLMs具备强大的适应性,能够处理多种格式的输入和任务。这种灵活性使得开发者可以快速调整和优化提示词,以适应不同的数据结构和需求。

加速开发周期

由于LLMs能够处理广泛的任务,使用它们可以显著加速开发周期。开发者无需编写大量的特定逻辑代码,而是通过设计合适的提示词来实现目标功能。

高度抽象

面向大模型编程通过高度抽象的提示词直接与模型互动,减少了代码复杂性和逻辑错误的可能性。这种方式不仅提高了开发效率,还降低了维护成本。

六、总结

本文通过展示如何利用提示词编程和OpenAI的GPT-3.5模型爬取豆瓣电影网站的电影信息,充分体现了面向大模型编程的优势。提示词编程为与大语言模型互动提供了一种高效、灵活的方式。通过设计合适的提示词,开发者可以轻松完成诸如解析网页内容、生成文本和回答问题等复杂任务。面向大模型编程简化了传统编程的复杂性,提高了开发效率,具有广阔的应用前景。在未来,随着大语言模型的不断发展,如GPT4o的发布,提示词编程和面向大模型编程将会成为开发者不可或缺的工具,让我们为即将到来的技术革命做好准备!

转载自:https://juejin.cn/post/7369877722486046774
评论
请登录