天天看点

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

作者:RolloTomasi

#ai# #chat GPT#

你是否在使用ChatGPT来学习一个主题?

如果是的话,那么很好。但是你可以做得更好。

今天的任务:使用 #LangChainAI# 和 #streamlit# 创建一个智能学习伙伴。

让我为你展示如何做到(包含代码)

场景:准备考试

使用自己的学习材料获取练习题和答案!

关于解决方案一个抽象的概述:

  • 提取PDF中的文本
  • 生成问题
  • 生成答案

这是一个简单的应用程序。

现在是代码时间:

1.1 从PDF加载数据

LangChain提供了开箱即用的文档加载器,用于从各种文档类型中提取数据。

我们将使用PyPDFLoader从PDF中提取学习材料并将数据存储在变量中。

现在您需要拆分文本

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

我们将以两种不同的方式拆分数据:

较大的块用于问题生成

较小的块用于问题回答

但首先,让我们谈谈token。

Tokens

大型语言模型(LLM)通过将常规句子转化为数值表示来理解单词。

一个句子被分成tokens。

一个token对应于约4个字符的文本。

因此,100个token ~= 75个单词

拆分文本有两个原因:

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

1. 当前的模型具有有限的token输入容量。

2. 每个token的处理都有一定的成本。

1.2 为问题生成拆分文本

我们希望LLM具有尽可能多的上下文意识,并且尽可能少地执行操作。

您可以通过增加chunk(文本块)的大小来实现这一点。

使用GPT-3.5-Turbo-16k模型,您可以使这些chunk相当大(16k个令牌)

当我们加载数据时,它会自动按页面分割所有文本,这使得直接创建这些大的chunk变得具有挑战性。

一个简单的预处理步骤来帮助。

通过执行代码,所有文本将被合并到一个变量中。

现在让我们拆分文本

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

首先,我们将设置chunk_size=10,000和chunk_overlap=200来初始化文本拆分器。

chunk_size是一个块中可以包含的最大令牌数

chunk_overlap是每个块发生的重叠量。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

1.3 为问题回答拆分文本

在第3步中,我们将使用Retrieval Question Answer Chain来回答我们生成的问题。

为了降本增效,我们将文本拆分成较小的块。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

2. 生成问题

现在,是时候让模型基于我们的学习材料生成练习题了。

我们首先需要设置大型语言模型

2.1:初始化LLM

我们将使用OpenAI的GPT-3.5-turbo-16k模型。

temperature是一个影响LLM响应创造性的参数:

  • 较高的temperature(例如1.0):生成更多多样但潜在的无意义输出。
  • 较低的temperature(例如0.2):产生更加集中和可预测的响应。

我们希望我们的问题在创意方面既有创造性又与学习材料相关。

因此,我们将temperature设置为0.4。

请随意尝试不同的值,找到最适合您偏好的值。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

2.2:问题生成的总结链

总结涉及创建文档的简洁摘要并提取核心信息。

然而,在我们的情况下,我们不会使用该链来创建摘要,而是用于创建问题。

我们需要自定义的提示

2.2.1:提示

“精炼”总结链使用了两个提示:

第一个提示用于第一块文本的问题生成。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

第二个提示用于所有后续文本块的问题生成(在精炼过程中)。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

2.2.2:初始化总结链。

您需要做5件事:

  1. LLM
  2. 链类型
  3. 问题提示
  4. 精炼提示
  5. 详细信息(可选)
硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

步骤2.3:生成问题

现在是令人兴奋的部分:

运行链来生成问题!

运行链后,“questions”变量将保存基于学习材料生成的问题。

现在

让我们回答这些问题

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

3:生成答案

既然我们有了问题,现在是使用大型语言模型根据学习材料中的信息来回答问题的时候了。

为了实现这一目标,我们将使用“检索问题回答链”。

我们需要三个组件

  • 检索器:该组件使用矢量数据库进行语义相似性搜索。
  • 大型语言模型:这几乎与我们在第2.1步中初始化的模型相同,我们将用它来生成答案。
  • 问题:我们在上一步生成的问题。

3.1:设置矢量数据库

矢量数据库本质上是一组矢量,其中每个矢量代表文本的数值表示,称为embedding。

embedding封装了文本的语义含义。

让我们来设置它

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

要设置Chroma矢量数据库,您需要两个组件:

embeddings:学习材料的数值表示,将由OpenAI生成。

文档:需要嵌入的文档。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

3.2:初始化大型语言模型

初始化大型语言模型(LLM),与我们在第2.1步中所做的类似。

我们将对temperature设置进行微小调整。

较低的temperature降低了模型“产生过度联想”的可能性。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

3.3:将问题拆分为列表

我们将从第2.3步生成的问题进行转换。

它们目前存储为字符串。

该函数将把问题字符串拆分成一个列表。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

3.4:初始化检索QA链

现在我们可以初始化检索QA链以生成答案。

通过初始化RetrievalQA链,我们现在准备好运行它并生成问题的答案了。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

3.5:运行链

我们将在生成的问题列表上运行链。

我们还将将问题及其对应的答案保存到一个简单的文本文件中。

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

4:完成

现在,您已成功生成并保存了问题和答案!

您可以在文本文件中查看内容,并将其用作学习资源或其他您可能考虑的用途。

额外的一步

硬核:手作ChatGPT驱动的AI智能学习伙伴(含代码)

好了以上就是今天关于如何"玩AI"的内容,如果有其他与AI有关的有趣的好玩的内容,也欢迎大家分享给我。