找回密码
 立即注册

微信扫码 , 快速开始

如何用自己的知识库培训自己的ChatGPT?

2023-7-18 14:33| 发布者: admin| 查看: 437| 评论: 0|来自: 鹿鸣Lucius

摘要: 虽然ChatGPT和其他LLM非常强大,但扩展LLM模型可以提供更精细的体验,并且打开了构建对话式聊天机器人的可能性,该机器人可用于构建真正的业务用例,例如客户支持辅助或甚至是垃圾邮件分类器。 ... ...
 如何用自己的知识库培训自己的ChatGPT?

如何用自己的知识库培训自己的ChatGPT?

ChatGPT已成为大多数人每天用来自动化各种任务的重要工具。如果您使用ChatGPT有一段时间,您会意识到它可能提供错误答案,并且在某些利基主题上具有有限或零上下文。这引出了一个问题,即我们如何利用chatGPT来弥合差距,使ChatGPT拥有更多的定制数据。

各种知识都分布在我们每天互动的各个平台上,例如通过工作中的协同wiki页面、Slack群组、公司知识库、Reddit、Stack Overflow、书籍、通讯和同事共享的Google文档等。跟进所有这些信息来源本身就是一项全职工作。

如果您可以选择性地选择数据源并轻松地将该信息馈入带有数据的ChatGPT对话中,那不是很好吗?

1. 通过提示工程提供数据

在我们深入探讨如何扩展ChatGPT之前,让我们看一下如何手动扩展ChatGPT以及存在的问题。 扩展ChatGPT的传统方法是通过提示工程。

这很容易做到,因为ChatGPT具有上下文感知能力。首先,我们需要通过将原始文档内容附加到实际问题之前与ChatGPT进行交互。

I will ask you questions based on the following content:

- Start of Content-

Your very long text to give ChatGPT context

- End of Content-

这种方法的问题在于模型具有有限的上下文;GPT-3只能接受大约4,097个标记。使用这种方法很快就会遇到瓶颈,因为每次都必须手动复制粘贴内容,非常繁琐。

想象一下,如果你有数百个PDF文件要注入ChatGPT中,你很快就会遇到付费墙的问题。也许你正在考虑GPT-4是GPT-3的继任者。它于2023年3月14日刚刚推出,并且可以处理25,000个单词——大约是GPT-3处理图像数量的八倍——并且可以处理比GPT-3.5更加微妙的指令。但这仍然存在数据输入限制方面相同根本性问题。那么我们该如何绕过其中一些限制呢?我们可以利用一个名为LlamaIndex 的Python库。

2. 使用 LlamaIndex( GPT Index)扩展 ChatGPT

LlamaIndex ,也称为 GPT Index ,是一个项目,提供了一个中央接口来连接您的LLMs与外部数据。没错,您没有看错!使用 LlamaIndex ,我们可以构建类似以下插图所示:


LlamaIndex将您现有的数据源和类型与可用的数据连接器(例如API、PDF、文档、SQL等)连接起来。它通过为结构化和非结构化数据提供索引,使您能够使用LLMs。这些索引通过消除典型的样板文件和痛点来促进上下文学习:以一种易于访问的方式保留上下文,以便快速插入。

当上下文过大时,处理提示限制——GPT-3 Davinci的4,096个令牌限制和GPT-4的8,000个令牌限制——变得更加容易,并通过为用户提供与索引交互的方式来解决了分割文本问题。LlamaInde还抽象出从文档中提取相关部分并将其馈送到提示中的过程。

如何添加自定义数据源

在本节中,我们将使用GPT“text-davinci-003”和LlamaIndex基于预先存在的文件创建一个Q&A聊天机器人。
先决条件

在开始之前,请确保您可以访问以下内容:


已安装Python≥3.7

OpenAI API密钥,在OpenAI网站上可以找到。您可以使用Gmail帐户进行单点登录。

上传了几个Word文档到您的Google Docs。LlamaIndex支持许多不同的数据源。在本教程中,我们将演示如何使用Google Docs。

工作原理

使用LlamaIndex创建文档数据索引。

使用自然语言搜索索引。

LlamaIndex将检索相关部分并传递给GPT提示符。 LlamaIndex会将您的原始文档数据转换为可查询向量化索引。它将利用此索引根据查询和数据匹配程度找到最相关的部分。然后,信息将被加载到提示符中,并发送给GPT,以便GPT具有必要的背景来回答您的问题。

之后,您可以询问ChatGPT,在上下文中提供反馈。

为Python项目创建一个新文件夹,可以称之为mychatbot,并最好使用虚拟环境或conda环境。


首先需要安装依赖库,请按照以下步骤操作:

pip install openai

pip install llama-index

pip install google-auth-oauthlib

接下来,我们将在Python中导入库,并在一个新的main.py文件中设置您的OpenAI API密钥。

# Import necessary packages

import os

import pickle

from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow

from llama_index import GPTSimpleVectorIndex, download_loader

os.environ['OPENAI_API_KEY'] = 'SET-YOUR-OPEN-AI-API-KEY’

在上面的代码片段中,我们明确设置环境变量以增加清晰度,因为 LlamaIndex 包隐式地需要访问 OpenAI。在典型的生产环境中,您可以将密钥放入环境变量、保险库或任何基础设施可以访问的机密管理服务中。
让我们构建一个函数来帮助我们对接 Google 帐户以发现 Google 文档。

def authorize_gdocs():

google_oauth2_scopes = [

"googleapis.com/auth/doc"

]

cred = None

if os.path.exists("token.pickle"):

with open("token.pickle", 'rb') as token:

cred = pickle.load(token)

if not cred or not cred.valid:

if cred and cred.expired and cred.refresh_token:

cred.refresh(Request())

else:

flow = InstalledAppFlow.from_client_secrets_file("credentials.json", google_oauth2_scopes)

cred = flow.run_local_server(port=0)

with open("token.pickle", 'wb') as token:

pickle.dump(cred, token)

要启用Google Docs API并在Google控制台中获取凭据,您可以按照以下步骤操作:

1. 前往Google Cloud Console网站(console.cloud.google.com)。

2. 如果尚未创建新项目,请通过单击顶部导航栏中的“选择项目”下拉菜单并选择“新建项目”来创建。按照提示为您的项目命名并选择要关联的组织。

3. 创建完毕后,请从顶部导航栏的下拉菜单中选择该项目。

4. 从左侧菜单中进入“API和服务”部分,并点击页面顶部的“+启用API和服务”按钮。

5. 在搜索框中搜索“Google Docs API”,然后从结果列表中进行选择。

6. 单击“启用”按钮以为您的项目启用API。

7. 点击OAuth同意屏幕菜单,创建一个应用程序名称(例如,“mychatbot”),然后输入支持电子邮件,保存并添加范围。

您还必须添加测试用户,因为这个 Google 应用程序尚未获得批准。这可以是您自己的电子邮件。


然后,您需要为您的项目设置凭据以使用API。为此,请从左侧菜单中进入“凭据”部分,然后单击“创建凭据”。选择“OAuth客户端ID”,并按照提示设置您的凭据。


一旦您的凭据设置完成,您可以下载JSON文件并将其存储在您的应用程序根目录中,如下所示:


一旦您设置好了您的凭据,您就可以从您的Python项目访问Google Docs API。前往您的Google Docs,打开其中几个文档,并获取可以在您浏览器URL栏中看到的唯一ID,如下图所示:


将gdoc ID复制并粘贴到下面的代码中。您可以拥有N个gdocs,可以对其进行索引,以便ChatGPT可以访问您的自定义知识库。我们将使用LlamaIndex库中的GoogleDocsReader插件加载您的文档。

# function to authorize or download latest credentials

authorize_gdocs()

# initialize LlamaIndex google doc reader

GoogleDocsReader = download_loader('GoogleDocsReader')

# list of google docs we want to index

gdoc_ids = ['1ofZ96nWEZYCJsteRfqik_xNQTGFHtnc-7cYrf0dMPKQ']

loader = GoogleDocsReader()

# load gdocs and index them

documents = loader.load_data(document_ids=gdoc_ids)

index = GPTSimpleVectorIndex(documents)

LlamaIndex有各种数据连接器,涵盖了Notion、Obsidian、Reddit、Slack等服务。您可以在此处找到可用数据连接器的全面列表。如果您希望在运行时保存和加载索引,可以使用以下函数调用。这将加快从预先保存的索引获取数据的速度,而不是对外部源进行API调用。

# Save your index to a index.json file

index.save_to_disk('index.json')

# Load the index from your saved index.json file

index = GPTSimpleVectorIndex.load_from_disk('index.json’)

通过运行以下代码,可以查询索引并获得响应。该代码可以轻松扩展为与 UI 连接的 REST API,您可以通过 GPT 接口与自定义数据源进行交互。

# Querying the index

while True:

prompt = input("Type prompt...")

response = index.query(prompt)

print(response)

假设我们有一份关于我的 Google 文档,其中包含的信息可以通过公开搜索谷歌获得。


我们将首先直接与原始的ChatGPT进行交互,以查看它在不注入自定义数据源的情况下生成的输出。


那有点令人失望!让我们再试一次。

INFO:google_auth_oauthlib.flow:"GET /?state=oz9XY8CE3LaLLsTxIz4sDgrHha4fEJ&code=4/0AWtgzh4LlIfmCMEa0t36dse_xoS0fXFeEWKHFiouzTvz4Qwr7T2Pj6anb-GiZ__Wg-hBBg&scope=https://www.googleapis.com/auth/documents.readonly HTTP/1.1" 200 65

INFO:googleapiclient.discovery_cache:file_cache is only supported with oauth2client<4.0.0

INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens

INFO:root:> [build_index_from_documents] Total embedding token usage: 175 tokens

Type prompt...who is timothy mugayi hint he is a writer on medium

INFO:root:> [query] Total LLM token usage: 300 tokens

INFO:root:> [query] Total embedding token usage: 14 tokens

Timothy Mugayi is an Engineering Manager at OVO (PT Visionet Internasional), a subsidiary of GRAB. He is also an avid writer on medium.com who writes on technical topics covering python and freelancing side hustling for programmers. Timothy has been coding for over 15 years, building enterprise solutions for large cooperations. During his free time, he enjoys mentoring and coaching.

last_token_usage=300

Type prompt...
Type prompt...Given you know who timothy mugayi is write an interesting introduction about him

Timothy Mugayi is an experienced and accomplished professional with a wealth of knowledge in engineering, coding, and mentoring. He is currently an Engineering Manager at OVO, a subsidiary of GRAB, and has been coding for over 15 years, building enterprise solutions for large cooperations. In his free time, Timothy enjoys writing on technical topics such as Python and freelancing side hustling for programmers on medium.com, as well as mentoring and coaching. With his impressive background and expertise, Timothy is a valuable asset to any organization.

last_token_usage=330

它现在可以使用新的自定义数据源推断答案,准确地产生以下输出。我们可以进一步发展。

Type prompt...Write a cover letter for timothy mugayi for an upwork python project to build a custom ChatGPT bot with access to external data sources

INFO:root:> [query] Total LLM token usage: 436 tokens

INFO:root:> [query] Total embedding token usage: 30 tokens

Dear [Hiring Manager],

I am writing to apply for the Python project to build a custom ChatGPT bot with access to external data sources. With over 15 years of experience in coding and building enterprise solutions for large corporations, I am confident that I am the ideal candidate for this position.

I am currently an Engineering Manager at OVO (PT Visionet Internasional), a subsidiary of GRAB. I have extensive experience in Python and have been writing on technical topics covering Python and freelancing side hustling for programmers on medium.com. I am also an avid mentor and coach, and I believe that my experience and skillset make me the perfect candidate for this project.

I am confident that I can deliver a high-quality product that meets the requirements of the project. I am also available to discuss the project further and answer any questions you may have.

Thank you for your time and consideration.

Sincerely,

Timothy Mugayi

last_token_usage=436

Type prompt…

LlamaIndex将内部接受您的提示,搜索索引以获取相关块,然后将您的提示和相关块传递给ChatGPT模型。上述程序演示了使用LlamaIndex和GPT回答问题的基本第一步。然而,您可以做更多的事情。当配置LlamaIndex以利用不同的大型语言模型(LLM),为各种活动使用不同类型的索引,或以编程方式更新旧索引时,您的创造力是唯一的限制。以下是明确更改LLM模型的示例。这次我们利用LlamaIndex捆绑的另一个Python包,称为langchain。

from langchain import OpenAI

from llama_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper...

# define anoter LLM explicitly

llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003"))

# define prompt configuraiton

# set maximum input size

max_input_size = 4096

# set number of output tokens

num_output = 256

# set maximum chunk overlap

max_chunk_overlap = 20

prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)

index = GPTSimpleVectorIndex(

documents, llm_predictor=llm_predictor, prompt_helper=prompt_helper

)

如果您想跟踪您的OpenAI免费或付费信用,您可以导航到OpenAI仪表板并检查剩余的信用额度。创建索引,插入索引和查询索引都会使用令牌。因此,在构建自定义机器人时,始终重要的是确保输出令牌使用情况以进行跟踪。

last_token_usage = index.llm_predictor.last_token_usage

print(f"last_token_usage={last_token_usage}”)

最终结论

ChatGPT结合LlamaIndex可以帮助构建一个定制的ChatGPT聊天机器人,该机器人可以根据自己的文档来源推断知识。虽然ChatGPT和其他LLM非常强大,但扩展LLM模型可以提供更精细的体验,并且打开了构建对话式聊天机器人的可能性,该机器人可用于构建真正的业务用例,例如客户支持辅助或甚至是垃圾邮件分类器。鉴于我们可以提供实时数据,我们可以评估ChatGPT模型训练到一定期限的一些限制。

【文章来源】ChatGPT探索者 特别声明:以上内容(如有图片或视频亦包括在内)来自网络,已备注来源;本平台仅提供信息和存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by user of ASKAI, which is a social media platform focused on technology of CHATGPT and only provides information storage services.


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|手机版|小黑屋|博士驿站:连接全球智慧,共创博士人才生态圈 ( 浙ICP备2023018861号-3 )平台提供新鲜、免费、开放、共享的科技前沿资讯、博士人才招聘信息和科技成果交流空间。 平台特别声明:线上内容(如有图片或视频亦包括在内)来自网络或会员发布,均已备注来源;本站资讯仅提供信息和存储服务。Notice: The content above (including the pictures and videos if any) is uploaded and posted by user , which is a social media platform and only provides information storage services.

GMT+8, 2024-9-12 04:47

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部