面向开发人员的chatgpt提示工程-自用回顾note

发布时间 2023-05-03 14:45:59作者: Leo2Gooo

关键原则

1. 编写清晰具体的指令

1.1 使用限定符区分prompt 和 文本

Pasted image 20230430123729
Pasted image 20230430123729

1.2 结构化输出

Pasted image 20230430123839
Pasted image 20230430123839

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

Pasted image 20230430123918
Pasted image 20230430123918

1.4 小批量提示

Pasted image 20230430124914
Pasted image 20230430124914

2. 给模型时间来思考

2.1 指定完成任务的步骤

prompt_2 = f"""
Your task is to perform the following actions: 
1 - Summarize the following text delimited by 
  <> with 1 sentence.
2 - Translate the summary into French.
3 - List each name in the French summary.
4 - Output a json object that contains the 
  following keys: french_summary, num_names.

Use the following format:
Text: <text to summarize>
Summary: <summary>
Translation: <summary translation>
Names: <list of names in Italian summary>
Output JSON: <json with summary and num_names>

Text: <{text}>
"""

response = get_completion(prompt_2)
print("\nCompletion for prompt 2:")
print(response)
Pasted image 20230503091331
Pasted image 20230503091331

2.2 指导模型(在急于得出结论之前)制定自己的解决方案

prompt = f"""
Your task is to determine if the student's solution \
is correct or not.
To solve the problem do the following:
- First, work out your own solution to the problem. 
- Then compare your solution to the student's solution \ 
and evaluate if the student's solution is correct or not. 
Don't decide if the student's solution is correct until 
you have done the problem yourself.

Use the following format:
Question:
"""

question here
"""
Student's solution:
"""

"""
student's solution here
"""

Actual solution:
"""
steps to work out the solution and your solution here
"""

Is the student's solution the same as actual solution \
just calculated:
"""
yes or no
"""
Student grade:
"""
correct or incorrect
"""

Question:
"""
I'
m building a solar power installation and I need help \
working out the financials. 
- Land costs $100 / square foot
- I can buy solar panels for $250 / square foot
- I negotiated a contract for maintenance that will cost \
me a flat $100k per year, and an additional $10 / square \
foot
What is the total cost for the first year of operations \
as a function of the number of square feet.
"""
Student's solution:
"""

Let x be the size of the installation in square feet.
Costs:
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 100x
Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
"""
Actual solution:
"""

response = get_completion(prompt)
print(response)

3 模型局限性

Pasted image 20230503094611
Pasted image 20230503094611

如果在其训练过程中,模型被暴露于大量的知识之中,那么它并没有完美地记忆所见到的信息,因此它并不十分清楚它的知识边界。 这意味着它可能会尝试回答有关深奥话题的问题,并且可能会虚构听起来很有道理但实际上不正确的东西。我们将这些捏造的想法称为幻觉。因此,我将向您展示一个例子,在这个例子中模型会产生幻觉。这是一个例子,展示了模型如何编造一个来自真实牙刷公司的虚构产品名称的描述。因此,这个提示是:“告诉我关于Boy的AeroGlide Ultra Slim智能牙刷的情况。”如果我们运行它,模型将为我们提供一个相当逼真的虚构产品的描述。

提示工程需要迭代

当我使用大型语言模型构建应用程序时,我认为我从来没有在第一次尝试中使用最终应用程序中使用的提示。这并不重要。只要您有一个良好的迭代过程来改进提示,那么你就能够找到对完成所需任务的好提示。您可能已经听我说过,当我训练机器学习模型时,它几乎从不在第一次工作。事实上,如果我第一次训练的模型能工作,我会非常惊讶。我认为在提示时,第一次能够得到有效结果的机会可能会更高一些,但与他所说的一样,第一个提示是否有效并不重要。最重要的是找到适合您的应用程序使用的提示的过程。因此,让我们进入代码中,让我展示一些框架,以思考如何迭代开发提示。好的,所以如果您以前曾与我一起上过机器学习课程,您可能会看到我使用的图表,即在机器学习开发中,您通常有一个想法,然后实现它。

因此,编写代码、获取数据、训练模型,这将给您带来实验结果。然后您可以查看该输出,进行误差分析,找出工作或不工作的地方,然后甚至可以更改您解决问题的确切想法或方法,再更改您的实现并运行另一个实验等等,不断迭代,以获得有效的机器学习模型。如果您不熟悉机器学习并且以前未见过此图表,则不用担心,对于本演示的其余内容并不重要。

但是当您编写使用LLM开发应用程序的提示时,该流程可能会非常类似,您有一个想法,想要完成的任务,然后可以尝试编写第一个提示,希望它的表述清晰具体,并且如果合适,可以给系统一些时间进行思考,然后运行它并查看结果。如果第一次效果不好,则迭代的过程中可以找出原因,例如:指示不够清晰或算法没有足够的时间进行思考,从而充实思路、改进提示,如此循环多次,直到开发应用程序所需的提示得以完成。

总结类应用

1. 文字总结

Pasted image 20230503103535
Pasted image 20230503103535

2. 针对某种信息总结

Pasted image 20230503103705
Pasted image 20230503103705

Pasted image 20230503103710
Pasted image 20230503103710

3. 尝试“提取”而不是“总结”

Pasted image 20230503103807
Pasted image 20230503103807

4. 针对多项信息总结

Pasted image 20230503104017
Pasted image 20230503104017

Pasted image 20230503104022
Pasted image 20230503104022
Pasted image 20230503104027
Pasted image 20230503104027

推理类应用

1. 产品评价文本情感分类

我要使用的最重要的示例是一个台灯的评论。因此,我要编写一个提示来分类这个评论的情感。
如果我想让系统告诉我,你知道的,这个评论的情感是什么,我可以编写以下产品评论的情感是什么,在常规的分隔符和评论文本等信息后运行它。然后让我们运行一下。它显示该产品评论的情感是积极的,这似乎是非常正确的。这个台灯并不完美,但这位顾客似乎很满意。看起来是一家关心顾客和产品的好公司。

Pasted image 20230503105651
Pasted image 20230503105651

Pasted image 20230503105702
Pasted image 20230503105702

2. 文本情感分类

Pasted image 20230503105834
Pasted image 20230503105834

3. 文本信息提取

Pasted image 20230503110014
Pasted image 20230503110014

4. 文本主体推断

Pasted image 20230503111823
Pasted image 20230503111823

Pasted image 20230503111853
Pasted image 20230503111853

5. 文本信息分析

Pasted image 20230503111915
Pasted image 20230503111915

转换类应用

1. 翻译任务

Pasted image 20230503112353
Pasted image 20230503112353

2. 通用翻译器

Pasted image 20230503112633
Pasted image 20230503112633

3. 语调转换

Pasted image 20230503113238
Pasted image 20230503113238

4. 格式转换

Pasted image 20230503113532
Pasted image 20230503113532

5. 语法拼写检查

Pasted image 20230503113551
Pasted image 20230503113551

扩展类应用

扩展是将短文本(例如一组指令或主题列表)扩展为较长的文本(例如有关某个主题的电子邮件或文章)的任务。这有一些很好的用途,比如如果你将大型语言模型用作头脑风暴的伙伴。但我也想承认一些有问题的用例,例如如果有人使用它,他们生成大量的垃圾邮件。

我们还将使用模型的另一个输入参数,称为温度,这允许你变化模型响应的探索程度和多样性的程度。所以让我们开始吧。在我们开始之前,我们将进行通常的设置。因此,设置OpenAI Python包,然后定义我们的助手函数getCompletion,现在我们要编写一个针对客户评论的自定义电子邮件响应,因此,鉴于客户评论和情感,我们将生成一个自定义响应。

Pasted image 20230503114815
Pasted image 20230503114815

1. 自定义对客户电子邮件的自动答复

Pasted image 20230503114829
Pasted image 20230503114829

Pasted image 20230503114847
Pasted image 20230503114847

2. 提醒模型使用客户电子邮件中的详细信息

Pasted image 20230503114910
Pasted image 20230503114910

打造聊天机器人

使用大型语言模型的其中一个令人兴奋的方面是,您只需投入适量的努力即可使用它来构建自定义聊天机器人。ChatGPT是一个Web界面,通过它你可以使用大型语言模型进行会话,从而拥有一个交互式的聊天界面。但是,其中的一个很酷的功能是,您也可以使用大型语言模型来构建自定义的聊天机器人,为餐厅扮演AI客户服务代理或AI点餐员等角色。

首先,我们将像往常一样设置OpenAI Python包。聊天模型(如ChatGPT)实际上是被训练成将一系列消息作为输入,并返回由模型生成的消息作为输出。虽然聊天格式旨在使此类多轮对话变得容易,但我们已经通过以前的视频看到,它对于没有对话的单一任务同样有用。

Pasted image 20230503115009
Pasted image 20230503115009

下一步,我们将定义两个辅助函数。第一个是我们在所有视频中都使用的 getCompletion 函数。但是,如果你仔细看一下,我们给出了一个提示,但实际上在函数内部,我们是将这个提示放置到类似用户消息的消息中。这是因为 ChatGPT 模型是一个聊天模型,意味着它被训练成将一系列消息作为输入,然后返回一个由模型生成的消息作为输出。因此,用户消息是输入,而助手消息是输出。 第二个辅助函数是 generateResponse。这个函数将接受一个用户消息,并生成一个 ChatGPT 模型生成的相应助手消息。 通过这两个函数,我们能够与 AIGPT 模型进行交互并生成对话。

Pasted image 20230503115037
Pasted image 20230503115037

1. 对话助手

这里,我们的信息有两条,一条是助手的信息:你是一个友好的聊天机器人,另一条信息是用户的第一条反馈:嗨,我的名字是伊莎。我们想要获取用户的第一条信息。所以,让我们执行一下第一条助手信息。第一条反馈是:你好伊莎,很高兴见到你。你今天需要我的帮助吗?现在,让我们尝试另一个例子。这里我们的信息还是有两条,一条是系统信息:你是一个友好的聊天机器人,另一条信息是第一条用户反馈:是的,你能提醒我我的名字是什么吗?我们想要得到回应。然而,你会发现,这个模型实际上还不知道我的名字。所以,每一次与语言模型的交互都是独立的。这意味着,在当前的交互中,你必须提供所有相关的信息,供模型从中获取。如果你想让模型在交互中从先前的对话中获取信息,你必须将之前的对话作为输入提供给模型,我们称之为“上下文”。

Pasted image 20230503115743
Pasted image 20230503115743

Pasted image 20230503115759
Pasted image 20230503115759

Pasted image 20230503115821
Pasted image 20230503115821

2. OrderBot

现在,你将会建立自己的聊天机器人。这个聊天机器人将被称为“订餐机器人”,我们将使用自动化的方式来收集用户的提示和助手的反馈来构建这个聊天机器人。订餐机器人将用于在一家比萨饼店中接收订单。首先,我们将定义这个“帮助函数”,它将会收集我们的用户消息,以便我们避免手动输入它们。与之前一样,这个函数将从用户界面中收集提示,并将它们附加到一个称为上下文的列表中,然后每次都会使用该上下文来调用模型。