动手学大模型LLM应用开发之提示词工程(Prompt Engineering)

本文主要是介绍动手学大模型LLM应用开发之提示词工程(Prompt Engineering),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 一、什么是提示词工程(Prompt Engineering)?
    • 二、Prompt 设计的原则及使用技巧
      • 原则一:编写清晰、具体的指令
        • 1、使用分隔符清晰地表示输入的不同部分
        • 2、寻求结构化的输出
        • 3、要求模型检查是否满足条件
        • 4、提供少量示例
      • 原则二:给模型时间去思考
        • 1、指定完成任务所需的步骤
        • 2、指导模型在下结论之前找出一个自己的解法
    • 三、参考资料

一、什么是提示词工程(Prompt Engineering)?

提示工程(Prompt Engineering)是一个相对较新的研究方向,用于研究如何编写和优化提示池,以便更好、更有效地使用大语言模型。
我们每一次访问大模型,给模型的输入就是 Prompt,大模型给我们的返回结果我们称之为 Completion。
在这里插入图片描述

二、Prompt 设计的原则及使用技巧

一个好的 Prompt 设计极大地决定了其能力的上限与下限。设计高效 Prompt 有两个关键原则编写清晰、具体的指令给予模型充足思考时间

原则一:编写清晰、具体的指令

1、使用分隔符清晰地表示输入的不同部分

在编写 Prompt 时,我们可以使用各种标点符号作为“分隔符”,将不同的文本部分区分开来。分隔符就像是 Prompt 中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用 ```,“”",< >, ,: 等做分隔符,只要能明确起到隔断作用即可。

在以下的例子中,我们给出一段话并要求 LLM 进行总结,在该示例中我们使用 ```来作为分隔符:

(1)、首先,我们调用 OpenAI 的 API ,封装一个对话函数,使用 gpt-3.5-turbo 这个模型。

import os
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())client = OpenAI(# This is the default and can be omitted# 获取环境变量 OPENAI_API_KEYapi_key=os.environ.get("OPENAI_API_KEY"),# 访问api的网址,中转api需设置base_url=os.environ.get("OPENAI_BASE_URL")
)# 如果你需要通过代理端口访问,还需要做如下配置
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
os.environ["HTTP_PROXY"] = 'http://127.0.0.1:7890'# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt,model="gpt-3.5-turbo"):'''prompt: 对应的提示词model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT)。你也可以选择其他模型。https://platform.openai.com/docs/models/overview'''messages = [{"role": "user", "content": prompt}]# 调用 OpenAI 的 ChatCompletion 接口response = client.chat.completions.create(model=model,messages=messages,temperature=0)return response.choices[0].message.content

(2)、对比分析使用分隔符和不使用分隔符的大模型回答的效果

使用分隔符运行效果:
在这里插入图片描述
不使用分隔符运行效果:
在这里插入图片描述
总结:通过以上实验我们可以看出,使用分隔符能够有效的让大模型明白我们的用途,防止歧义。

2、寻求结构化的输出

有时候我们需要语言模型给我们一些结构化的输出,而不仅仅是连续的文本。希望大模型能够给我们返回按照某种格式组织的内容,例如 JSON、HTML 等,这种结构能够让我们方便在代码中处理。

在以下示例中,我们要求 LLM 生成三本书的标题、作者和类别,并要求 LLM 以 JSON 的格式返回给我们,为便于解析,我们指定了 JSON 的键名。
在这里插入图片描述

3、要求模型检查是否满足条件

如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。

在如下示例中,我们将分别给模型两段文本,分别是制作茶的步骤以及一段没有明确步骤的文本。我们将要求模型判断其是否包含一系列指令,如果包含则按照给定格式重新编写指令,不包含则回答“未提供步骤”。
在这里插入图片描述
上述示例中,模型可以很好地识别一系列的指令并进行输出。在接下来一个示例中,我们将提供给模型
没有预期指令的输入,模型将判断未提供步骤。
在这里插入图片描述

4、提供少量示例

“Few-shot” prompting(少样本提示),即在要求模型执行实际任务之前,给模型提供一两个参考样例,让模型了解我们的要求和期望的输出样式。

例如,在以下的样例中,我们先给了一个 {<学术>:<圣贤>} 对话样例,然后要求模型用同样的隐喻风格回答关于“孝顺”的问题,可以看到 LLM 回答的风格和示例里<圣贤>的文言文式回复风格是十分一致的。这就是一个 Few-shot 学习示例,能够帮助模型快速学到我们要的语气和风格。
在这里插入图片描述
总结:利用少样本样例,我们可以轻松“预热”语言模型,让它为新的任务做好准备。这是一个让模型快速上手新
任务的有效策略。

原则二:给模型时间去思考

给予语言模型充足的推理时间,是 Prompt Engineering 中一个非常重要的设计原则。提高模型的推理时间,我们可以详细的指定完成任务所需的步骤以及要求模型在下结论之前找出一个自己的解法引导模型深度思考。

1、指定完成任务所需的步骤

接下来我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示这一策略的效果。

首先我们描述了杰克和吉尔的故事,并给出提示词执行以下操作:

  • 首先,用一句话概括三个反引号限定的文本。
  • 第二,将摘要翻译成英语。
  • 第三,在英语摘要中列出每个名称。
  • 第四,输出包含以下键的 JSON 对象:英语摘要和人名个数。要求输出以换行符分隔。

在这里插入图片描述

2、指导模型在下结论之前找出一个自己的解法

在设计 Prompt 时,我们还可以通过明确指导语言模型进行自主思考,来获得更好的效果。
举个例子,假设我们要语言模型判断一个数学问题的解答是否正确。仅仅提供问题和解答是不够的,语
言模型可能会匆忙做出错误判断。

相反,我们可以在 Prompt 中先要求语言模型自己尝试解决这个问题,思考出自己的解法,然后再与提
供的解答进行对比,判断正确性。这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出
更准确的判断。

接下来我们会给出一个问题和一份来自学生的解答,要求模型判断解答是否正确:

在这里插入图片描述
但是注意,学生的解决方案实际上是错误的。(维护费用项100x应为10x,总费用450x应为360x)。我们可以通过指导模型先自行找出一个解法来解决这个问题。

在接下来这个 Prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确。同时,我们给定了输出的格式要求。通过拆分任务、明确步骤,让
模型有更多时间思考,有时可以获得更准确的结果。
在这里插入图片描述

三、参考资料

llm-universe

这篇关于动手学大模型LLM应用开发之提示词工程(Prompt Engineering)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916138

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件