【吴恩达】ChatGPT提示工程师 笔记【第五课Inferring(推断)】

课程5地址

在这节课中,你将从产品评论和新闻文章中推断出情感和主题。

这个新的视频是关于推断。我喜欢把这些任务想象成模型接收一段文本作为输入,然后执行某种分析。所以这可能包括提取标签,提取名称,理解一段文本的情感等等。所以,如果你想提取一段文本的情感,积极或消极,在传统的机器学习工作流中,你需要收集标签数据集,训练一个模型,弄清楚如何在云中部署模型并做出推断。这样做可能效果很好,

但是,你知道,这需要大量的工作来完成这个过程。而且对于每个任务,如情感与提取名字等,你需要训练和部署一个单独的模型。大型语言模型的一个非常好的特点是,对于许多这样的任务,你只需编写一个提示,然后它就可以立即开始生成结果。这在应用开发方面带来了巨大的速度。而且你只需要使用一个模型,一个API来完成许多不同的任务,而不需要弄清楚如何训练和部署大量的不同模型。

那么,让我们跳进代码,看看你如何利用这个。这是我们通常的起始代码。我会运行这个。我将使用的最合适的例子是一个台灯的评论,"需要一盏适合卧室的好灯,这个灯还有额外的储物空间"等等。让我写一个提示来分类这个评论的情感。如果我想让系统告诉我,情感是什么。我可以写,"以下产品评论的情感是什么",然后使用通常的分隔符和评论文本等,让我们运行这个。这个说,"产品评论的情感是积极的。",这实际上,看起来相当正确。这个灯不完美,但是这个顾客似乎很满意。似乎是一个非常关心顾客和产品的公司。我认为积极的情感似乎是正确的答案。现在这个打印出整个句子,"产品评论的情感是积极的。" 如果你想得到一个更简洁的回答,以便于后处理,我可以把这个提示加上另一条指示,让你的答案只有一个词,积极或消极。所以它就只打印出积极这样,这使得一段文本更容易取出这个输出并处理它,做一些事情。

让我们看另一个提示,还是使用台灯评论。在这里,我有,"确定以下评论的作者正在表达的情绪列表。在这个列表中包括不超过五个项目。" 大型语言模型非常擅长从一段文本中提取具体的东西。在这种情况下,我们在表达情绪,这对于理解你的客户对特定产品的想法可能很有用。对于很多客户支持组织来说,理解特定用户是否极其不满是非常重要的。所以,你可能有一个不同的分类问题,比如这样的,"以下评论的作者是否在表达愤怒?"。因为如果有人真的很生气,那么可能值得多花点注意力去看一下客户评论,让客户支持或客户成功的人去找出问题所在,让客户满意。在这种情况下,客户并不生气。注意到,在监督学习中,如果我想要建立所有这些分类器,那么我无法在这个视频中看到的几分钟内,用监督学习来完成这件事。我建议你暂停这个视频,尝试改变一些这些提示。也许问一下客户是否表现出喜悦,或者问一下是否有任何缺失的部分,看看你能否找到一个提示,来对这个台灯评论做出不同的推断。

让我展示一些你可以用这个系统做的更多事情,特别是从客户评论中提取更丰富的信息。所以,信息提取是自然语言处理中的一部分,与从一段文本中提取你想知道的某些事情有关。所以在这个提示中,我要求它识别以下项目,购买的物品,以及制造该物品的公司的名称。再次,如果你正在尝试总结一个在线购物电子商务网站的许多评论,那么对于你的大量评论来说,找出哪些是物品,谁制造了物品,找出积极和消极的情感,跟踪特定物品或特定制造商的积极或消极情感的趋势,可能会很有用。并且在这个例子中,我将要求它以一个JSON对象的形式格式化你的回应,其中"Item"和"Brand"作为关键字。所以,如果我做了那个,它说物品是一个灯,品牌是Lumina,你可以很容易地将这个加载到Python字典中,然后对这个输出进行额外的处理。在我们经历的例子中,你看到了如何编写一个提示来识别情感,找出是否有人生气,然后还有提取物品和品牌。

提取所有这些信息的一种方法是使用三个或四个提示,并调用"get_completion",你知道,三次或四次,一次一次地提取这些不同的观点。但是,事实证明,你实际上可以编写一个单一的提示,一次性提取所有这些信息。所以,让我们说"识别以下项目,提取情感,评论者是否在表达愤怒,购买的物品,制造它的公司"。然后在这里,我也会告诉它,将愤怒值格式化为一个布尔值,让我运行那个。并且这个输出一个JSON,其中情感是积极的,愤怒,并且没有引号围绕假,因为我要求它只输出一个布尔值。提取的物品为"带有额外储物空间的灯",而不是灯,看起来还好。但是这样你可以用一个提示从一段文本中提取多个字段。

像往常一样,随时可以暂停视频,自己尝试一下这个的不同变化。或者甚至尝试输入一个完全不同的评论,看看你是否仍然可以准确地提取这些东西。现在,我见过大型语言模型的一个酷应用是推断主题。给定一长段文本,你知道,这段文本是关于什么的?主题是什么?这是一篇关于政府工作人员对他们工作的机构的看法的虚构报纸文章。所以,最近政府进行的调查,你知道,等等。"结果显示,NASA是一个受欢迎的部门,满意度评分很高。

我是NASA的粉丝,我喜欢他们所做的工作,但这是一篇虚构的文章。因此,对于这样的文章,我们可以用这个提示来确定接下来的文本中讨论的五个主题。让我们将每个项目做成一到两个词长,用逗号分隔的列表形式来回答。所以,如果我们运行这个,你知道,我们会得到这篇文章。这是关于政府调查的,关于工作满意度的,关于NASA的,等等。所以总的来说,我认为这是对主题列表的很好的提取。当然,你也可以将其分割,得到一个包含这篇文章的五个主题的Python列表。  如果你有一系列文章并提取主题,你还可以使用大型语言模型来帮助你索引到不同的主题。所以,让我使用一个稍微不同的主题列表。比如说我们是一个新闻网站或者什么的,你知道,这些是我们关注的主题。“NASA,地方政府,工程学,员工满意度,联邦政府”。假设你想要弄清楚,给定一篇新闻文章,这些主题中的哪些在那篇新闻文章中被涵盖了。  所以,这是我可以使用的提示。我将要说,确定在最后的主题列表中的每一项是否是下面文本中的一个主题。给出你的答案,对每个主题以0或1的列表形式回答。所以,很好。这是和之前一样的故事文本。所以,这是一个故事。它是关于NASA的。它不是关于地方政府的。它不是关于工程学的。它是关于员工满意度的,也是关于联邦政府的。所以,通过这个,在机器学习中,这有时被称为“零射击学习算法”,因为我们没有给它任何标签过的训练数据,所以那就是零射击。而仅仅通过一个提示,它就能确定哪些主题被涵盖在那篇新闻文章中。  所以,如果你想要生成一个新闻警报,比如说,处理新闻,我真的很喜欢NASA做的很多工作。所以,如果你想要建立一个系统,可以把这个信息放进一个字典,每当有NASA的新闻出现时,打印“警报:新的NASA故事!”,他们可以用这个来非常快速地处理任何文章,弄清楚它是关于什么主题的,如果主题包括NASA,就打印出“警报:新的NASA故事!”。噢,只有一件事。我在这里使用这个主题字典。我在上面使用的这个提示不是很稳健。

如果我想要一个生产系统,我可能会让它以JSON格式输出答案,而不是列表,因为大型语言模型的输出可能会有一点不一致。所以,这实际上是一个非常脆弱的代码片段。但是如果你想,当你看完这个视频后,你可以试试看你能否找出如何修改这个提示,让它以JSON的形式输出,而不是像这样的列表,然后有一个更稳健的方式来判断某篇文章是否是关于NASA的故事。  那么,这就是推理部分。在短短几分钟内,你可以建立多个系统,对之前可能需要一个熟练的机器学习开发者花费几天甚至几周的时间来进行的文本进行推理。

所以,我发现这非常令人兴奋,无论是对于熟练的机器学习开发者,还是对于新接触机器学习的人,你现在都可以使用提示来非常快速地建立并开始对这样的复杂自然语言处理任务进行推理。

在下一个视频中,我们将继续讨论你可以用大型语言模型做的令人兴奋的事情,我们将进入“转换”。如何将一段文本转变为另一段文本,比如将其翻译成另一种语言。让我们继续下一个视频。

Setup

import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

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

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # this is the degree of randomness of the model's output
    )
    return response.choices[0].message["content"]

Product review text(品评论)

lamp_review = """
Needed a nice lamp for my bedroom, and this one had \
additional storage and not too high of a price point. \
Got it fast.  The string to our lamp broke during the \
transit and the company happily sent over a new one. \
Came within a few days as well. It was easy to put \
together.  I had a missing part, so I contacted their \
support and they very quickly got me the missing piece! \
Lumina seems to me to be a great company that cares \
about their customers and products!!
"""

Sentiment (positive/negative)(情绪 正向/负向)

prompt = f"""
What is the sentiment of the following product review, 
which is delimited with triple backticks?

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

prompt = f"""
What is the sentiment of the following product review, 
which is delimited with triple backticks?

Give your answer as a single word, either "positive" \
or "negative".

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

Identify types of emotions(识别情绪类型)

prompt = f"""
Identify a list of emotions that the writer of the \
following review is expressing. Include no more than \
five items in the list. Format your answer as a list of \
lower-case words separated by commas.

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

Identify anger

prompt = f"""
Is the writer of the following review expressing anger?\
The review is delimited with triple backticks. \
Give your answer as either yes or no.

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

Extract product and company name from customer reviews(用户评论中提取公司名称)

prompt = f"""
Identify the following items from the review text: 
- Item purchased by reviewer
- Company that made the item

The review is delimited with triple backticks. \
Format your response as a JSON object with \
"Item" and "Brand" as the keys. 
If the information isn't present, use "unknown" \
as the value.
Make your response as short as possible.
  
Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

Doing multiple tasks at once(一次执行多任务)

prompt = f"""
Identify the following items from the review text: 
- Sentiment (positive or negative)
- Is the reviewer expressing anger? (true or false)
- Item purchased by reviewer
- Company that made the item

The review is delimited with triple backticks. \
Format your response as a JSON object with \
"Sentiment", "Anger", "Item" and "Brand" as the keys.
If the information isn't present, use "unknown" \
as the value.
Make your response as short as possible.
Format the Anger value as a boolean.

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

Inferring topics(题推理)

story = """
In a recent survey conducted by the government, 
public sector employees were asked to rate their level 
of satisfaction with the department they work at. 
The results revealed that NASA was the most popular 
department with a satisfaction rating of 95%.

One NASA employee, John Smith, commented on the findings, 
stating, "I'm not surprised that NASA came out on top. 
It's a great place to work with amazing people and 
incredible opportunities. I'm proud to be a part of 
such an innovative organization."

The results were also welcomed by NASA's management team, 
with Director Tom Johnson stating, "We are thrilled to 
hear that our employees are satisfied with their work at NASA. 
We have a talented and dedicated team who work tirelessly 
to achieve our goals, and it's fantastic to see that their 
hard work is paying off."

The survey also revealed that the 
Social Security Administration had the lowest satisfaction 
rating, with only 45% of employees indicating they were 
satisfied with their job. The government has pledged to 
address the concerns raised by employees in the survey and 
work towards improving job satisfaction across all departments.
"""

Infer 5 topics (推理5个主题)

prompt = f"""
Determine five topics that are being discussed in the \
following text, which is delimited by triple backticks.

Make each item one or two words long. 

Format your response as a list of items separated by commas.

Text sample: '''{story}'''
"""
response = get_completion(prompt)
print(response)

response.split(sep=',')

topic_list = [
    "nasa", "local government", "engineering", 
    "employee satisfaction", "federal government"
]

Make a news alert for certain topics(为特定主题设置新闻提醒

prompt = f"""
Determine whether each item in the following list of \
topics is a topic in the text below, which
is delimited with triple backticks.

Give your answer as list with 0 or 1 for each topic.\

List of topics: {", ".join(topic_list)}

Text sample: '''{story}'''
"""
response = get_completion(prompt)
print(response)


topic_dict = {i.split(': ')[0]: int(i.split(': ')[1]) for i in response.split(sep='\n')}
if topic_dict['nasa'] == 1:
    print("ALERT: New NASA story!")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值