生成式人工智能中的提示工程基本原则

生成式人工智能提示工程原则

介绍

在本文中,我们将讨论生成式人工智能中的ChatGPT提示工程。自2022年11月以来,ChatGPT一直是技术界和非技术界人士讨论最多的话题之一。它是一种智能对话的形式,标志着智能对话时代的来临。人们可以询问几乎任何问题,涉及科学、艺术、商业、体育等等,并且可以得到这些问题的答案。

本文是数据科学博文马拉松的一部分。

ChatGPT

Chat Generative Pre-trained Transformer,通常称为ChatGPT,代表Chat Generative Pre-trained Transformer的首字母缩写,意味着它根据用户提示生成新文本的作用。这种对话框架通过在庞大的数据集上进行训练来创建原创内容。Sam Altman的OpenAI因开发出最重要的语言模型之一ChatGPT而受到赞誉。这个卓越的工具可以轻松执行文本生成、翻译和摘要任务。它是GPT的第三个版本。我们将不讨论ChatGPT的界面、工作原理等,因为我们大多数人都知道如何使用聊天机器人。然而,我们将讨论LLM。

什么是提示工程?

生成式人工智能中的提示工程是一种利用AI语言模型的先进工具。它通过开发策略性提示来优化语言模型的性能,并给模型明确而具体的指令。下面是一个给出指令的示例。

向模型明确地给出指令是有益的,因为这样可以使答案精确准确。例如,”99*555等于多少?请确保你的回答准确”比”99*555等于多少?”更好。

大型语言模型(LLM)

LLM是一种基于人工智能的算法,利用神经网络技术在大量数据上生成类似人类的文本,采用自监督学习技术。OpenAI的Chat GPT和Google的BERT是LLM的一些示例。LLM有两种类型。

1. 基础LLM – 根据文本训练数据预测下一个单词。例如 – 从前有一位国王和他的皇后与王子住在一座宫殿里。告诉我,法国的首都是什么?法国最大的城市是什么?法国的人口是多少?基础LLM预测斜体字部分。

2. 指令调整的LLM – 遵循指令。它采用人类反馈的强化学习(RLHF)。例如 – 你知道法国的首都是什么吗?巴黎是法国的首都。指令调整的LLM预测斜体字部分。指令调整的LLM不太可能产生不需要的输出。在这篇文章中,重点将放在指令调整的LLM上。

提示指南

首先,我们需要安装openAI。

!pip install openai

这行代码将安装openai,如下所示:

然后,我们将加载API密钥和相关的Python库。为此,我们需要安装python-dotenv。它从.env文件中读取键值对,并帮助开发符合12因素原则的应用程序。

pip install python-dotenv

这行代码将安装 python-dotenv 如下。

OpenAI API 使用 API 密钥进行身份验证。API 密钥可以从 OpenAI 网站的 API 密钥页面检索。它是一个秘密,请勿分享。现在,我们将导入 openai

import openai
openai.api_key="sk-"

然后,我们将设置 openai 密钥,这是一个秘密密钥。将其设置为环境变量。在这个项目中,我们已经在环境中设置了它。

import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

openai.api_key  = os.getenv('OPENAI_API_KEY')

这里将使用 OpenAI 的 GPT-3.5-turbo 模型和聊天完成终端。此辅助函数可以更有效地使用提示并查看生成的输出。

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # 这是模型输出的随机程度
    )
    return response.choices[0].message["content"]

提示原则

提示的两个基本原则是写清晰和具体的指令,并给模型一些时间思考。现在将讨论实现这些原则的技巧。第一个技巧是使用分隔符来明确标识特定的输入。分隔符是提示和特定文本之间的清晰标点符号。三个反引号、引号、XML 标签和章节标题都是分隔符,可以使用任何一个。因此,在以下代码中,我们尝试总结从 Google 新闻提取的文本。

text = f"""
由于正在解决的持续供应挑战,苹果向其庞大的客户群体发送的 iPhone 15 的货运可能会遇到延迟。\
这些进展发生在苹果即将举行的活动前几周。尽管 iPhone 15 系列的预计发布日期是 9 月 12 日,但苹果尚未正式确认此日期。\
"""
prompt = f"""
将由三个反引号分隔的文本总结为一个句子。
```{text}```
"""
response = get_completion(prompt)
print(response)

JSON 和 HTML 输出

从输出中,我们可以看到文本已经被总结了。下一个技巧是要求结构化的 JSON 和 HTML 输出。在下面的示例中,我们尝试生成一个由拉宾德拉纳特·泰戈尔书写的五本书的列表,以 JSON 格式提供,并查看相应的输出。

prompt = f"""
生成一个由拉宾德拉纳特·泰戈尔书写的五本书的标题列表,
在 JSON 格式中提供它们,具有以下键:
book_id,title,genre。
"""
response = get_completion(prompt)
print(response)

JSON 输出

同样,在下面的示例中,我们尝试以 JSON 格式获取三本医疗惊悚小说的输出,包括书籍 ID、标题和作者。

prompt = f"""
生成一个由三本医疗惊悚小说的书名列表,
在 JSON 格式中提供它们,具有以下键:
book_id,title,author。
"""
response = get_completion(prompt)
print(response)

HTML 格式

在这两种情况下,我们都按照要求的格式收到了输出。现在,我们将找出拉宾德拉纳特·泰戈尔写的书籍,并以 HTML 格式呈现。

prompt = f"""
生成一个包含五本书的标题和作者(均为拉宾德拉纳特·泰戈尔)的列表。以以下键的HTML格式提供:book_id,title,genre。
"""
response = get_completion(prompt)
print(response)

加载库

现在,我们已经以HTML格式接收到输出。为了查看HTML,我们需要加载库,可以使用以下代码行。

from IPython.display import display, HTML

display(HTML(response))

现在我们看到了我们想要的确切输出。另一个技巧是“零-shot提示”。在这里,我们不会对模型进行特定的训练,而是依靠过去的知识、推理和灵活性。任务是计算一个圆锥的体积,我们知道它的高度和半径。让我们看看模型在输出中的表现。

prompt = f"""
计算一个圆锥的体积,如果高度=20厘米,半径=5厘米
"""
response = get_completion(prompt)
print(response)

可以看到,模型对这个任务给出了逐步的解决方案。首先,它写出了公式,放入了数值,进行了计算,而没有进行特定的训练。

少量提示

第一个原则的最后一个技巧是“少量提示”。在这里,我们指示模型以一致的风格回答。模型的任务是以一致的风格回答问题。一个学生和一个老师之间进行了一次对话。学生请教老师关于细胞理论的知识。然后,我们让模型教授关于微生物学理论的知识。下面是示例。

prompt = f"""
你的任务是以一致的风格回答。

<学生>: 教我关于细胞理论。

<老师>: 细胞理论是生物学的基本科学理论,根据这个理论,细胞被认为是所有活体组织的基本单位。
细胞理论最初由德国科学家泰奥多尔·施万和马蒂亚斯·雅各布·施莱登于1838年提出,
这个理论认为所有的植物和动物都是由细胞组成的。

<孩子>: 教我关于微生物学理论。
"""
response = get_completion(prompt)
print(response)

所以,模型按照我们的要求进行了回答。它获取了关于微生物学理论的信息,并且准确回答了问题。到目前为止,我们讨论的所有技巧或方法都遵循了第一个原则:明确和具体的指示。现在,我们将研究如何实施第二个原则,即给模型一些时间来思考。第一种技术是指定完成任务所需的步骤。在下面的示例中,我们使用了一个新闻摘要来执行文本中提到的步骤。

text = f"""
AAP领导人阿尔温德·凯杰里瓦尔(Arvind Kejriwal)周日向马迪亚邦的选民承诺了各种“保证”,包括免费电力、医疗服务、高质量学校的建设,
以及每月给无业青年3000卢比的津贴。AAP全国协调人在这里的一个党派会议上,间接讽刺了马迪亚邦首席部长希夫拉吉·辛格·乔汉(Shivraj Singh Chouhan),
并呼吁人们不要再相信“欺骗他的侄子和侄女”的“妈妈”。
"""
# 示例 1
prompt_1 = f"""
执行以下操作:
1 - 使用1个句子对以下文本进行摘要。
2 - 将摘要翻译成法语。
3 - 列出法语摘要中的每个名字。
4 - 输出一个包含以下键的json对象:
   french_summary(法语摘要)、num_names(名称数)。

请使用换行符分隔你的答案。

文本:
```{text}```
"""
response = get_completion(prompt_1)
print("Prompt 1 的输出结果:")
print(response)

输出表明模型对文本进行了总结,将摘要翻译成了法语,列出了姓名等。另一种策略是指导模型不要得出结论,而是对问题进行自我训练。以下是这种策略的示例

prompt = f"""
确定学生的解答是否正确。

问题:
我正在建造一个太阳能发电装置,我需要帮助解决财务问题。
- 土地成本为每平方英尺100美元
- 我可以购买每平方英尺250美元的太阳能电池板
- 我谈判了一个维护合同,每年费用为固定的10万美元,再加上每平方英尺10美元
作为平方英尺数量的函数,第一年运营的总成本是多少?

学生的解答:
设x为装置的面积(平方英尺)。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护成本:100,000 + 100x
总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
"""
response = get_completion(prompt)
print(response)

prompt = f"""
你的任务是确定学生的解答是否正确。
解决问题请按照以下步骤进行:
- 首先,自己解决问题。
- 然后将你的解答与学生的解答进行比较,并评估学生的解答是否正确。在自己解决问题之前,不要决定学生的解答是否正确。

使用以下格式:
问题:
```
这里是问题
```
学生的解答:
```
学生的解答在这里
```
实际解答:
```
解决问题的步骤和你的解答在这里
```
学生的解答是否与实际解答一致:
```
是或否
```
学生的成绩:
```
正确或不正确
```

问题:
```
我正在建造一个太阳能发电装置,我需要帮助解决财务问题。
- 土地成本为每平方英尺100美元
- 我可以购买每平方英尺250美元的太阳能电池板
- 我谈判了一个维护合同,每年费用为固定的10万美元,再加上每平方英尺10美元
作为平方英尺数量的函数,第一年运营的总成本是多少?
``` 
学生的解答:
```
设x为装置的面积(平方英尺)。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护成本:100,000 + 100x
总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
```
实际解答:
"""
response = get_completion(prompt)
print(response)

输出表明模型在问题上正常工作并产生了期望的输出。

结论

生成式人工智能可以彻底改变学术界、医学科学、动画行业、工程领域和许多其他领域。拥有超过1亿用户的ChatGPT证明了生成式人工智能已经席卷了世界。我们有很高的希望,我们正处于创造力、效率和进步的黎明时代。

主要要点

  • 生成式人工智能可以通过ChatGPT轻松生成文本、翻译、摘要、数据可视化和模型创建。
  • 生成式人工智能中的提示工程是一种通过开发战术提示并给出模型明确而具体的指示来利用生成式人工智能的各种能力的工具。
  • 大型语言模型是一种将神经网络技术应用于大量数据以生成类似人类文本的算法。
  • 通过提示的原则,我们可以进行各种数据生成任务。
  • 通过适当的提示,我们可以让模型产生期望的输出。

希望这篇文章能为您的阅读增添价值。

常见问题

参考资料

  • https://colinscotland.com/unleash-the-power-of-chatgpt-11-epic-prompt-engineering-tips/
  • Learn Prompt Engineering in 2 hours: Learn ChatGPT Prompt Engineering to Boost Efficiency and Output (GPT 4). (2023). (n.p.): Cryptoineer Inc.
  • https://etinsights.et-edge.com/leading-large-language-models-llms-shaping-real-life-applications-revealed/

此文章中显示的媒体不归Analytics Vidhya所有,而是由作者自行决定使用。