深入浅出prompt engineering
目录
- 引言
- Prompt Engineering概述
- 环境搭建
- 编写代码
- LLM编程之利好
- 总结
一、引言
在大语言模型(LLM)对自然语言处理到炉火纯青的时代,提示词编程(Prompt Engineering)即面向大模型编程(LLMs)已经成为与大语言模型如OpenAI的GPT-4o互动的强大技术。这些技术使开发者能够通过编写合适的提示词来执行复杂的任务,而无需大量代码。本篇文章将深入探讨提示词工程即面向大模型编程的概念,并通过一个示例Node.js应用展示其在爬取豆瓣电影排行榜中的电影信息的应用。
二、Prompt Engineering概述
提示词编程是一门设计和优化输入文本(提示词)的技术,旨在引导语言模型生成所需的响应。提示词编程结合了对模型能力的理解和任务的具体需求,能够将模糊的请求转化为精确的指令,从而引导模型生成准确且相关的输出。
面向大模型编程(Programming with Large Language Models, LLMs)
是一种利用大语言模型执行任务的新编程范式。大语言模型如GPT-4o能够理解和生成自然语言文本,具有强大的适应性和灵活性,可以应用于各种任务,从自然语言处理到数据解析再到生成代码。
与传统编程中的面向对象编程(OOP)不同,面向大模型编程并不依赖于严格的编程逻辑和结构,而是通过设计合适的提示词来引导模型生成期望的输出。这种方式简化了编程过程,提高了开发效率,让我们的coding能更快!
与传统编程的区别
面向对象编程(OOP)
面向对象编程是一种编程思想和方法论,它基于类和对象的概念,通过封装、继承和多态性实现代码的重用和模块化。在OOP中,开发者需要详细设计类的结构、属性和方法,通过编写具体的逻辑代码实现功能。在传统的OOP方式中,编写爬虫程序涉及大量的代码和逻辑,包括HTTP请求处理、HTML解析、数据提取和错误处理等。以下是一些常见的麻烦之处:
- 复杂的HTML解析:处理复杂的HTML结构需要编写大量的解析代码,使用正则表达式或专门的解析库(如Cheerio)。
- 数据清洗:从网页中提取的数据可能需要大量的清洗和格式化工作,以确保数据的准确性和一致性。
- 错误处理:网络请求可能会失败或返回错误状态码,编写健壮的错误处理代码是必不可少的。
- 反爬措施:一些网站会采取反爬措施,如IP封禁或验证码,编写代码绕过这些措施需要额外的精力和技巧。
- 维护成本高:网站结构可能会频繁变化,需要不断更新爬虫代码以适应新的结构。
面向大模型编程(LLMs)
面向大模型编程则依赖于大语言模型的自然语言处理能力。开发者通过编写提示词,引导模型生成所需的响应,而不需要详细设计逻辑代码。模型能够理解和生成复杂的自然语言文本,从而完成各种任务。
这种编程方式的主要特点是:
- 高度抽象:通过提示词直接与模型互动,简化了代码逻辑。
- 灵活性强:模型能够处理各种输入和任务,适应性极强。
- 快速迭代:无需编写大量的特定逻辑代码,开发周期大大缩短。
三、环境搭建
在开始使用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"
}
可以发现完美爬取电影信息
五、面向大模型编程之利好
简化复杂任务
通过提示词编程,开发者可以简化传统上需要复杂代码的任务。例如,解析HTML以提取特定信息通常需要正则表达式或专门的HTML解析库,而使用LLMs则只需几行提示词即可完成。
灵活性和适应性
LLMs具备强大的适应性,能够处理多种格式的输入和任务。这种灵活性使得开发者可以快速调整和优化提示词,以适应不同的数据结构和需求。
加速开发周期
由于LLMs能够处理广泛的任务,使用它们可以显著加速开发周期。开发者无需编写大量的特定逻辑代码,而是通过设计合适的提示词来实现目标功能。
高度抽象
面向大模型编程通过高度抽象的提示词直接与模型互动,减少了代码复杂性和逻辑错误的可能性。这种方式不仅提高了开发效率,还降低了维护成本。
六、总结
本文通过展示如何利用提示词编程和OpenAI的GPT-3.5模型爬取豆瓣电影网站的电影信息,充分体现了面向大模型编程的优势。提示词编程为与大语言模型互动提供了一种高效、灵活的方式。通过设计合适的提示词,开发者可以轻松完成诸如解析网页内容、生成文本和回答问题等复杂任务。面向大模型编程简化了传统编程的复杂性,提高了开发效率,具有广阔的应用前景。在未来,随着大语言模型的不断发展,如GPT4o的发布,提示词编程和面向大模型编程将会成为开发者不可或缺的工具,让我们为即将到来的技术革命做好准备!
转载自:https://juejin.cn/post/7369877722486046774