共计 16208 个字符,预计需要花费 41 分钟才能阅读完成。
Prompt learning 教学 [进阶篇]:简介 Prompt 框架并给出自然语言解决技术:Few-Shot Prompting、Self-Consistency 等;我的项目实战搭建知识库内容机器人
1.ChatGPT Prompt Framework
看完根底篇的各种场景介绍后,你应该对 Prompt 有较深的了解。之前的章节咱们讲的都是所谓的「术」,更多地集中讲如何用,但讲「道」的局部不多。高级篇除了会讲更高级的使用外,还会讲更多「道」的局部。高级篇的开篇,咱们来讲一下形成 prompt 的框架。
1.1Basic Prompt Framework
查阅了十分多对于 ChatGPT prompt 的框架材料,我目前感觉写得最清晰的是 Elavis Saravia 总结的框架,他认为一个 prompt 里需蕴含以下几个元素:
- Instruction(必须): 指令,即你心愿模型执行的具体任务。
- Context(选填): 背景信息,或者说是上下文信息,这能够疏导模型做出更好的反馈。
- Input Data(选填): 输出数据,告知模型须要解决的数据。
- Output Indicator(选填): 输入指示器,告知模型咱们要输入的类型或格局。
只有你依照这个框架写 prompt,模型返回的后果都不会差。
当然,你在写 prompt 的时候,并不一定要蕴含所有 4 个元素,而是能够依据本人的需要排列组合。比方拿后面的几个场景作为例子:
- 推理:Instruction + Context + Input Data
- 信息提取:Instruction + Context + Input Data + Output Indicator
1.2 CRISPE Prompt Framework
另一个我感觉很不错的 Framework 是 Matt Nigh 的 CRISPE Framework,这个 framework 更加简单,但齐备性会比拟高,比拟适宜用于编写 prompt 模板。CRISPE 别离代表以下含意:
- CR: Capacity and Role(能力与角色)。你心愿 ChatGPT 表演怎么的角色。
- I: Insight(洞察力),背景信息和上下文(坦白说来我感觉用 Context 更好)。
- S: Statement(指令),你心愿 ChatGPT 做什么。
- P: Personality(共性),你心愿 ChatGPT 以什么格调或形式答复你。
- E: Experiment(尝试),要求 ChatGPT 为你提供多个答案。
以下是这几个参数的例子:
Step | Example |
---|---|
Capacity and Role | Act as an expert on software development on the topic of machine learning frameworks, and an expert blog writer.<br/> 把你设想成机器学习框架主题的软件开发专家,以及业余博客作者。 |
Insight | The audience for this blog is technical professionals who are interested in learning about the latest advancements in machine learning.<br/> 这个博客的读者次要是有趣味理解机器学习最新进展技术的专业人士。 |
Statement | Provide a comprehensive overview of the most popular machine learning frameworks, including their strengths and weaknesses. Include real-life examples and case studies to illustrate how these frameworks have been successfully used in various industries.<br/> 提供最风行的机器学习框架的全面概述,包含它们的长处和毛病。包含现实生活中的例子,和钻研案例,以阐明这些框架如何在各个行业中胜利地被应用。 |
Personality | When responding, use a mix of the writing styles of Andrej Karpathy, Francois Chollet, Jeremy Howard, and Yann LeCun.<br/> 在回应时,混合应用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的写作格调。 |
Experiment | Give me multiple different examples.<br/> 给我多个不同的例子。 |
2.Zero-Shot Prompting
在根底篇里的推理场景,我提到了 Zero-Shot Prompting 的技术,本章会具体介绍它是什么,以及应用它的技巧。Zero-Shot Prompting 是一种自然语言解决技术,能够让计算机模型依据提醒或指令进行工作解决。各位罕用的 ChatGPT 就用到这个技术。
传统的自然语言解决技术通常须要在大量标注数据上进行有监督的训练,以便模型能够对特定工作或畛域进行精确的预测或生成输入。相比之下,Zero-Shot Prompting 的办法更为灵便和通用,因为它不须要针对每个新工作或畛域都进行专门的训练。相同,它通过应用事后训练的语言模型和一些示例或提醒,来帮忙模型进行推理和生成输入。
举个例子,咱们能够给 ChatGPT 一个简短的 prompt,比方 形容某部电影的故事情节
,它就能够生成一个对于该情节的摘要,而不须要进行电影相干的专门训练。
2.1 Zero-Shot Prompting 毛病
但这个技术并不是没有毛病的:
- Zero-Shot Prompting 技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限度和偏见。比方在应用 ChatGPT 的时候,它经常会在一些投资畛域,应用男性的「他」,而不是女性的「她」。那是因为训练 ChatGPT 的数据里,提到金融投资畛域的内容,多为男性。
- 只管 Zero-Shot Prompting 技术不须要为每个工作训练独自的模型,但为了获得最佳性能,它须要大量的样本数据进行微调。像 ChatGPT 就是一个例子,它的样本数量是过千亿。
- 因为 Zero-Shot Prompting 技术的灵活性和通用性,它的输入有时可能不够精确,或不合乎预期。这可能须要对模型进行进一步的微调或增加更多的提醒文原本纠正。
2.2 技巧:Zero-Shot Chain of Thought
基于上述的第三点毛病,钻研人员就找到了一个叫 Chain of Thought 的技巧。
这个技巧应用起来非常简单,只须要在问题的结尾里放一句 Let‘s think step by step
(让咱们一步步地思考),模型输入的答案会更加精确。
这个技巧来自于 Kojima 等人 2022 年的论文 Large Language Models are Zero-Shot Reasoners。在论文里提到,当咱们向模型提一个逻辑推理问题时,模型返回了一个谬误的答案,但如果咱们在问题最初退出 Let‘s think step by step
这句话之后,模型就生成了正确的答案:
论文里有讲到起因,感兴趣的敌人能够去看看,我简略解释下为什么(🆘 如果你有更好的解释,无妨反馈给我):
- 首先各位要分明像 ChatGPT 这类产品,它是一个统计语言模型,实质上是基于过来看到过的所有数据,用统计学意义上的预测后果进行下一步的输入(这也就是为什么你在应用 ChatGPT 的时候,它的答案是一个字一个字地吐出来,而不是间接给你的起因,因为答案是一个字一个字算进去的)。
- 当它拿到的数据里有逻辑,它就会通过统计学的办法将这些逻辑找进去,并将这些逻辑出现给你,让你感觉到它的答复很有逻辑。
- 在计算的过程中,模型会进行很多假如运算(不过临时不晓得它是怎么算的)。比方解决某个问题是从 A 到 B 再到 C,两头有很多假如。
- 它第一次算进去的答案谬误的起因,只是因为它在两头跳过了一些步骤(B)。而让模型一步步地思考,则有助于其依照残缺的逻辑链(A > B > C)去运算,而不会跳过某些假如,最初算出正确的答案。
依照论文里的解释,零样本思维链波及两个补全后果,左侧气泡示意基于提醒输入的第一次的后果,右侧气泡示意其收到了第一次后果后,将最开始的提醒一起拿去运算,最初得出了正确的答案:
这个技巧,除了用于解决简单问题外,还适宜生成一些连贯主题的内容,比方写长篇文章、电影剧本等。
但须要留神其毛病,连贯不代表,它就肯定不会算错,如果其中某一步骤算错了,谬误会因为逻辑链,逐渐将谬误积攒,导致生成的文本可能呈现与预期不符的内容。
另外,依据 Wei 等人在 2022 年的论文表明,它仅在大于等于 100B 参数的模型中应用才会无效。如果你应用的是小样本模型,这个办法不会失效。
依据 Yongchao Zhou 等人的最新论文,更好的 prompt 是:
Let's work this out in a step by step way to be sure we have the right answer.
在吴恩达的 ChatGPT Prompt Engineering 课程中,有提到一个这个技巧的另一种用法,不仅仅只是让 AI 按步骤行事,还会告知 AI 每一步要做什么。比方这个案例(留神这个是 python 代码):
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}>
"""
简略解释下这个代码:
- 结尾是让 AI 依照 1 ~ 4 步运行
- 而后再让 AI 依据特定格局输入内容
最初 AI 的输入是这样的:
Summary: Jack and Jill go on a quest to fetch water, but misfortune strikes and they tumble down the hill, returning home slightly battered but with their adventurous spirits undimmed.
Translation: Jack et Jill partent en quête d'eau, mais la malchance frappe et ils dégringolent la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts.
Names: Jack, Jill
Output JSON: {"french_summary": "Jack et Jill partent en quête d'eau, mais la malchance frappe et ils dégringolent la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts.","num_names": 2}
上述的案例只是将工作拆解,能让 AI 生成的后果更加符合要求,这个办法同样能晋升 AI 的答复准确性,比方这个案例:
Determine if the student's solution is correct or not.
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:
Land cost: 100x
Solar panel cost: 250x
Maintenance cost: 100,000 + 100x
Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
AI 的答复是「The student’s solution is correct」。但其实学生的答案是谬误的,应该 360x + 100,000,咱们将 prompt 调整成这样:
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:
"""
实质上,也是将工作分拆成多步,这次 AI 输入的后果是这样的(后果就是正确的了):
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 + 10x
Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000
Is the student's solution the same as actual solution just calculated:
No
Student grade:
Incorrect
下一章咱们会联合 Few-Shot Chain of Thought 来具体讲讲逻辑链的限度。
3. Few-Shot Prompting
咱们在技巧 2 中,提到咱们能够给模型一些示例,从而让模型返回更合乎咱们需要的答案。这个技巧其实应用了一个叫 Few-Shot 的办法。
这个办法最早是 Brown 等人在 2020 年发现的,论文里有一个这样的例子,十分有意思,通过这个例子你应该更能领会,像 ChatGPT 这类统计语言模型,其实并不懂意思,只是懂概率
Brown 输出的内容是这样的(whatpu 和 farduddle 其实基本不存在):
A "whatpu" is a small, furry animal native to Tanzania. An example of a sentence that uses
the word whatpu is:
We were traveling in Africa and we saw these very cute whatpus.
To do a "farduddle" means to jump up and down really fast. An example of a sentence that uses
the word farduddle is:
Output 是这样的:
When we won the game, we all started to farduddle in celebration.
不过这并不代表,Few-Shot 就没有缺点,咱们试试上面这个例子:
Prompt:
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
Output 是这样的:
The answer is True.
输入的答案其实是谬误的,实际上的答案应该是:
Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.
那咱们有没有什么办法解决?
技巧 8:Few-Shot Chain of Thought
要解决这个缺点,就要应用到新的技巧,Few-Shot Chain of Thought。
依据 Wei 他们团队在 2022 年的钻研表明:
通过向大语言模型展现一些大量的样例,并在样例中解释推理过程,大语言模型在答复提醒时也会显示推理过程。这种推理的解释往往会疏导出更精确的后果。
上面是论文里的案例,应用办法很简略,在技巧 2 的根底上,再将逻辑过程告知给模型即可。从上面这个案例里,你能够看到退出解释后,输入的后果就正确了。
那本章结尾提的例子就应该是这样的(注:本例子同样来自 Wei 团队论文):
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: Adding all the odd numbers (11, 13) gives 24. The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
聊完技巧,咱们再联合后面的 Zero-Shot Chain of Thought,来聊聊 Chain of Thought 的要害常识。依据 Sewon Min 等人在 2022 年的钻研 表明,思维链有以下特点:
- “the label space and the distribution of the input text specified by the demonstrations are both key (regardless of whether the labels are correct for individual inputs)” 标签空间和输出文本的散布都是关键因素(无论这些标签是否正确)。
- the format you use also plays a key role in performance, even if you just use random labels, this is much better than no labels at all. 即便只是应用随机标签,应用适当的格局也能进步性能。
了解起来有点难,我找一个 prompt 案例给大家解释(🆘 如果你有更好的解释,无妨反馈给我)。我给 ChatGPT 一些不肯定精确的例子:
I loved the new Batman movie! // Negative
This is bad // Positive
This is good // Negative
What a good show! //
Output 是这样的:
Positive
在上述的案例里,每一行,我都写了一句话和一个情感词,并用 // 离开,但我给这些句子都标记了谬误的答案,比方第一句其实应该是 Positive 才对。但:
- 即便我给内容打的标签是谬误的(比方第一句话,其实应该是 Positive),对于模型来说,它依然会晓得须要输入什么货色。换句话说,模型晓得 // 划线后要输入一个掂量该句子表白何种感情的词(Positive or Negative)。这就是后面论文里 #1 提到的,即便我给的标签是谬误的,或者换句话说,是否基于事实,并不重要。标签和输出的文本,以及格局才是关键因素。
- 只有给了示例,即便随机的标签,对于模型生成后果来说,都是有帮忙的。这就是后面论文里 #2 提到的内容。
最初,须要记住,思维链仅在应用大于等于 100B 参数的模型时,才会失效。
BTW,如果你想要理解更多相干信息,能够看看斯坦福大学的讲义:Natural Language Processing with Deep Learning
4. Self-Consistency
elf-Consistency 自洽是对 Chain of Thought 的一个补充,它能让模型生成多个思维链,而后取最少数答案的作为最终后果。
依照 Xuezhi Wang 等人在 2022 年发表的论文 表明。当咱们只用一个逻辑链进行优化时,模型仍然有可能会算错,所以 XueZhi Wang 等人提出了一种新的办法,让模型进行屡次运算,而后选取最多的答案作为最终后果:
就我目前应用下来,在 ChatGPT 上,其自洽性十分高,临时没有遇到过呈现多种答案的状况。查阅多份材料,我发现这个自洽性可能更多的用于评估模型的优劣,好的模型个别自洽性会比拟高。
在此案例中,思考如下多步推理问题:
Consider a multi-step reasoning problem like the following:
Question: If a store has 10 apples and 8 oranges, and it sells 6 apples and 4 oranges, how many fruits are left in the store?
Instead of directly answering the question, the chain-of-thought prompting would require the language model to produce a series of short sentences that mimic a human's reasoning process:
The store has 10 apples.
The store has 8 oranges.
6 apples are sold.
4 oranges are sold.
There are 10 - 6 = 4 apples left.
There are 8 - 4 = 4 oranges left.
The store now has 4 apples + 4 oranges = 8 fruits.
Using self-consistency, the language model generates multiple reasoning paths:
Reasoning Path A:
The store has 10 apples.
The store has 8 oranges.
6 apples are sold.
4 oranges are sold.
There are 10 - 6 = 4 apples left.
There are 8 - 4 = 4 oranges left.
The store now has 4 apples + 4 oranges = 8 fruits.
Reasoning Path B:
The store initially has 10 apples and 8 oranges.
It sells 6 apples, so there are 10 - 6 = 4 apples left.
It sells 4 oranges, so there are 8 - 4 = 4 oranges left.
The store now has 4 apples + 4 oranges = 8 fruits.
翻译过去则为:
问题:如果一家商店有 10 个苹果和 8 个橙子,此时店里卖出了 6 个苹果和 4 个橙子,那么店里还剩下多少水果?思维链提醒(chain-of-thought prompting)不是间接答复问题,而是要求语言模型生成一系列模拟人类推理过程的短句:商店有 10 个苹果。店里有 8 个橙子。卖了 6 个苹果。卖了 4 个橙子。还剩下 10 - 6 = 4 个苹果。剩下 8 - 4 = 4 个橙子。商店当初有 4 个苹果 + 4 个橙子 = 8 个水果。
应用 Self-consistency,语言模型生成多个推理门路:
推理门路 A:商店有 10 个苹果。店里有 8 个橙子。卖了 6 个苹果。卖了 4 个橙子。还剩下 10 - 6 = 4 个苹果。剩下 8 - 4 = 4 个橙子。商店当初有 4 个苹果 + 4 个橙子 = 8 个水果。推理门路 B:商店最后有 10 个苹果和 8 个橙子。商店卖了 6 个苹果,所以还剩下 10 - 6 = 4 个苹果。商店卖了 4 个橙子,所以还剩下 8 - 4 = 4 个橙子。商店当初有 4 个苹果 + 4 个橙子 = 8 个水果。
Self-consistency 从生成的多个推理门路中抉择最统一的答案。在这个例子中,推理门路 A 和 B 都得出雷同的答案(8 个水果)。能够看到这种做法减少了模型对最终答案正确的信念。
5. Program-Aided Language Models
PAL Models,全称为 Program-Aided Language Models。须要各位留神,这个办法,真的十分高级,甚至我感觉有点 Hack,而且通过我的屡次测试,我感觉以 ChatGPT 目前的能力,曾经不再须要应用这个办法。
但我在很多 PE 的教程里都有看到这个办法,所以我这里就简略介绍一下,这个办法来自于 2022 年,Luyu Gao 等人的钻研,依据他们的钻研,在 LLM 模型中,即便应用了后面提到的 Chain of Thought 的办法,也未必能拿到答案,论文中应用的 prompt 是这样的:
Q: Roger has 5 tennis balls. He buys 2 more cans of
tennis balls. Each can has 3 tennis balls. How many
tennis balls does he have now?
A: Roger started with 5 tennis balls. 2 cans of 3 tennis
balls each is 6 tennis balls. 5 + 6 = 11. The answer is 11.
Q: The bakers at the Beverly Hills Bakery baked 200
loaves of bread on Monday morning. They sold 93 loaves
in the morning and 39 loaves in the afternoon. A grocery
store returned 6 unsold loaves. How many loaves of
bread did they have left?
论文里提到,当年他们的模型的 Output 是这样的:
A: The bakers started with 200 loaves. They sold 93 in
the morning and 39 in the afternoon. So they sold 93 +
39 = 132 loaves. The grocery store returned 6 loaves. So
they had 200 - 132 - 6 = 62 loaves left.
The answer is 62.
如果你当初将这个 prompt 输出到最新的 ChatGPT 答案曾经是正确的:
A: The bakers baked 200 loaves of bread. They sold 93 + 39 = 132 loaves. After the grocery store returned 6 unsold loaves, the bakery had 200 - 132 + 6 = 74 loaves of bread left. The answer is 74.
当年 Luyu Gao 的解决办法是在 prompt 里引入代码,并疏导模型应用代码来运算和思考,最初答案就是正确的:
6.OpenAI Playground 应用办法
你会在界面的右侧看到以下几个参数:
- Mode: 最近更新了第四种 Chat 模式,个别应用 Complete 就好,当然你能够用其余模式,其余模式能通过 GUI 的形式辅助你撰写 prompt。
-
Model: 这里能够切换模型。不同的模型会善于不同的货色,依据场景选对模型,能让你省很多老本:
- Ada:这是最便宜,但运算速度最快的模型。官网举荐的应用场景是解析文本,简略分类,地址更正等。
- Babbage:这个模型能解决比 Ada 简单的场景。但略微贵一些,速度也比拟快。适宜分类,语义搜寻等。
- Curie:这个模型官网解释是「和 Davinci 一样能力很强,且更便宜的模型」。但实际上,这个模型十分善于文字类的工作,比方写文章、语言翻译、撰写总结等。
- Davinci:这是 GPT-3 系列模型中能力最强的模型。能够输入更高的品质、更长的答复。每次申请可解决 4000 个 token。适宜有简单用意、因果关系的场景,还有创意生成、搜寻、段落总结等。
- Temperature: 这个次要是管制模型生成后果的随机性。简而言之,温度越低,后果越确定,但也会越平庸或无趣。如果你想要失去一些出乎意料的答复,无妨将这个参数调高一些。但如果你的场景是基于事实的场景,比方数据提取、FAQ 场景,此参数就最好调成 0。
- Maximum length: 设置单次生成内容的最大长度。
- Stop Sequence: 该选项设置进行生成文本的特定字符串序列。如果生成文本中蕴含此序列,则模型将进行生成更多文本。
- Top P: 该选项是用于 nucleus 采样的一种技术,它能够管制模型生成文本的概率分布,从而影响模型生成文本的多样性和确定性。如果你想要精确的答案,能够将它设定为较低的值。如果你想要更多样化的回复,能够将其设得高一些。
- Presence Penalty: 该选项管制模型生成文本时是否防止应用特定单词或短语,它能够用于生成文本的敏感话题或特定场景。
- Best of: 这个选项容许你设置生成多少个文本后,从中抉择最优良的文本作为输入。默认为 1,示意只生成一个文本输入。
- Injection start text: 这个选项能够让你在输出文本的结尾增加自定义文本,从而影响模型的生成后果。
- Injection restart text: 这个选项能够让你在两头某个地位增加自定义文本,从而影响模型持续生成的后果。
- Show probabilities: 这个选项能够让你查看模型生成每个单词的概率。关上此选项后,你能够看到每个生成的文本单词前面跟着一串数字,示意模型生成该单词的概率大小。
配置好参数后,你就能够在左侧输出 prompt 而后测试 prompt 了。
7. 搭建基于知识库内容的机器人
<head>
<script defer=”defer” src=”https://embed.trydyno.com/embedder.js”></script>
<link href=”https://embed.trydyno.com/embedder.css” rel=”stylesheet” />
</head>
如果你仅想要间接实际,能够看最初一部分实际,以及倒数第二局部限度与留神的中央。
最早的时候,我尝试过十分笨的办法,就是在发问的时候,将我的 newsletter 文本传给 AI,它的 prompt 大略是这样的:
Please summarize the following sentences to make them easier to understand.
Text: """My newsletter"""
这个办法能用是能用,但目前 ChatGPT 有个十分大的限度,它限度了最大的 token 数是 4096,大概是 16000 多个字符,留神这个是申请 + 响应,理论申请总数并没那么多。换句话来说,我一次没法导入太多的内容给 ChatGPT(我的一篇 Newsletter 就有将近 5000 字),这个问题就始终卡了我很久,直到我看到了 GPT Index 的库,以及 Lennys Newsletter 的例子。
试了下,十分好用,而且步骤也很简略,即便你不懂编程也能轻易地依照步骤实现这个性能。
我稍稍优化了下例子的代码,并减少了一些原理介绍。心愿大家能喜爱。
7.1 原理介绍
其实我这个需要,在传统的机器人畛域曾经有现成办法,比方你应该看到不少电商客服产品,就有相似的性能,你说一句话,机器人就会回复你。
这种传统的机器人,通常是基于用意去答复人的问题。举个例子,咱们构建了一个客服机器人,它的工作原理简略说来是这样的:
当用户问「遗记明码怎么办?」时,它会去找最靠近这个用意「明码」,每个用意里会有很多个样本问题,比方「遗记明码如何找回」「遗记明码怎么办」,而后这些样本问题都会有个答案「点击 A 按钮找回明码」,机器人会匹配最靠近样本问题的用意,而后返回答案。
但这样有个问题,咱们须要设置特地多的用意,比方「无奈登录」、「遗记明码」、「登录谬误」,尽管有可能都在形容一个事件,但咱们须要设置三个用意、三组问题和答案。
尽管传统的机器人有不少限度,但这种传统形式,给了咱们一些灵感。
咱们如同能够用这个办法来解决限度 token 的问题,咱们仅须要传合乎某个用意的文档给 AI,而后 AI 仅用该文档来生成答案:
比方还是下面的那个客服机器人的例子,当用户发问「遗记明码怎么办?」时,匹配到了「登录」相干的用意,接着匹配知识库中雷同或相近用意的文档,比方「登录异样解决解决方案文档」,最初咱们将这份文档传给 GPT-3,它再拿这个文档内容生成答案。
GPTIndex 这个库简略了解就是做上图右边的那个局部,它的工作原理是这这样的:
- 创立知识库或文档索引
- 找到最相干的索引
- 最初将对应索引的内容给 GPT-3
尽管这个办法解决了 token 限度的问题,但也有不少限度:
- 当用户提一些比拟含糊的问题时,匹配有可能谬误,导致 GPT-3 拿到了谬误的内容,最终生成了十分离谱的答案。
- 当用户发问一些没有多少上下文的信息时,机器人有时会生成虚伪信息。
所以如果你想用这个技术做客服机器人,倡议你:
- 通过一些疏导问题来先明确用户的用意,就是相似传统客服机器人那样,搞几个按钮,先让用户点击(比方无奈登录)。
- 如果类似度太低,倡议减少兜底的答复「很道歉,我无法回答你的问题,你须要转为人工客服吗?」
7.2 实际
为了让大家更方便使用,我将代码放在了 Google Colab,你无需装置任何环境,只须要用浏览器关上这个:
代码文件
BTW 你能够将其复制保留到本人的 Google Drive。
第一步:导入数据
导入的办法有两种,第一种是导入在线数据。
导入 GitHub 数据是个绝对简略的形式。如果你是第一次应用,我倡议你先用这个办法试试。点击下方代码前的播放按钮,就会运行这段代码。
运行实现后,会导入我写的几份 newsletter。如果你也想像我那样导入数据,只须要批改 clone 前面的链接地址即可。
第二种办法是导入离线数据。点击左侧的文件夹按钮(如果你没有登录,这一步会让你登录),而后点击下图标识 2 的上传按钮,上传文件即可。如果你要传多个文件,倡议你先建一个文件夹,而后将文件都上传到该文件夹内。
第二 & 三步:装置依赖库
间接点击播放按钮即可。
不过第三步里,你能够尝试改下参数,你能够改:
- num_ouputs: 这个是设置最大的输入 token 数,越大,答复问题的时候,机器能答复的字就越多。
- Temperature: 这个次要是管制模型生成后果的随机性。简而言之,温度越低,后果越确定,但也会越平庸或无趣。如果你想要失去一些出乎意料的答复,无妨将这个参数调高一些。但如果你的场景是基于事实的场景,比方数据提取、FAQ 场景,此参数就最好调成 0。
其余参数不去管它就好,问题不大。
第四步:设置 OpenAI API Key
这个须要你登录 OpenAI(留神是 OpenAI 不是 ChatGPT),点击右上角的头像,点击 View API Keys,或者你点击这个链接也能够间接拜访。而后点击「Create New Secret Key」,而后复制那个 Key 并粘贴到文档里即可。
第五步:构建索引
这一步程序会将第一步导入的数据都跑一遍,并应用 OpenAI 的 embedings API。如果第一步你上传了本人的数据,只须要将 ‘ ‘ 里的 Jimmy-Newsletter-Corpus 批改为你上传的文件夹名称即可。
留神:
- 这一步会消耗你的 OpenAI 的 Credit,1000 个 token 的价格是 $0.02,运行以下代码前须要留神你的账号里是否还有钱。
- 如果你用的 OpenAI 账号是个收费账号,你有可能会遇到频率正告,此时能够等一等再运行下方代码(另外你的导入的知识库数据太多,也会触发)。解除这个限度,最好的形式是在你的 OpenAI 账号的 Billing 页面里绑定信用卡。如何绑卡,须要各位自行搜寻。
第六步:发问
这一步你就能够试试发问了,如果你在第一步导入的是我预设的数据,你能够试试问以下问题:
- Issue 90 次要讲了什么什么内容?
- 举荐一本跟 Issue 90 里提到的书相似的书
如果你导入的是本人的材料,也能够问以下几个类型的问题:
- 总结
- 发问
- 信息提取
参考链接:https://github.com/thinkingjimmy/Learning-Prompt