ChatGPT 已成为大多数人日常用来自动执行各种任务的不可或缺的工具。如果您使用 ChatGPT 任何时间,您都会意识到它可能会提供错误的答案,并且在某些利基主题上仅限于零上下文。这就提出了我们如何利用 chatGPT 来弥补差距并允许 ChatGPT 拥有更多自定义数据的问题。
丰富的知识分布在我们日常互动的各种平台上,即通过工作中的 Confluence wiki 页面、slack 小组、公司知识库、Reddit、Stack Overflow、书籍、时事通讯和同事共享的 Google 文档。掌握所有这些信息源本身就是一项全职工作。
如果您可以有选择地选择数据源并将该信息轻松地输入到 ChatGPT 与您的数据的对话中,这不是很好吗?
在我们开始讨论如何扩展 ChatGPT 之前,让我们先看看如何手动扩展 ChatGPT 以及存在哪些问题。扩展 ChatGPT 的传统方法是通过即时工程。
由于 ChatGPT 具有上下文感知功能,因此执行起来非常简单。首先,我们需要通过在实际问题之前附加原始文档内容来与 ChatGPT 进行交互。
我将根据以下内容向您提出问题:
- 内容开始 -
您提供 ChatGPT 上下文的非常长的文本
- 内容结束 -
这种方法的问题是模型的背景有限;它只能接受大约 4,097 个 GPT-3 代币。您很快就会遇到这种方法的困境,因为它也是一个相当手动且乏味的过程,始终必须粘贴内容。
想象一下您想要将数百个 PDF 文档注入到 ChatGPT 中。您很快就会遇到付费墙问题。您可能认为 GPT-4 是 GPT-3 的后继者。它于 2023 年 3 月 14 日刚刚推出,可以处理 25,000 个单词——大约是 GPT-3 处理图像的八倍——并且可以处理比 GPT-3.5 更加细致的指令。这仍然存在相同的数据输入限制的基本问题。我们如何绕过其中一些限制?我们可以利用名为 LlamaIndex 的 Python 库。
LlamaIndex,也称为 GPT 索引,是一个提供中央接口以将法学硕士与外部数据连接起来的项目。是的,你没看错。使用 LlamaIndex,我们可以构建如下图所示的内容:
输入 ChatGPT 的自定义数据源
LlamaIndex 将您现有的数据源和类型与可用的数据连接器连接起来,例如(API、PDF、文档、SQL 等)。它使您能够通过为结构化和非结构化数据提供索引来使用 LLM。这些索引通过消除典型的样板文件和痛点来促进上下文学习:以可访问的方式保留上下文以便快速插入。
当上下文太大时,处理提示限制(GPT-3 Davinci 的 4,096 个令牌限制和 GPT-4 的 8,000 个令牌限制)变得更容易访问,并通过为用户提供一种交互方式来解决文本分割问题索引。LlamaInde 还抽象了从文档中提取相关部分并将其输入提示的过程。
在本节中,我们将使用 GPT“text-davinci-003”和 LlamaIndex 根据预先存在的文档创建一个问答聊天机器人。
在我们开始之前,请确保您有权访问以下内容:
为您的Python项目创建一个新文件夹,您可以将其命名为mychatbot,最好使用虚拟环境或conda环境。
我们需要首先安装依赖库。就是这样:
pip 安装 openai
pip 安装 llama-index
pip 安装 google-auth-oauthlib
接下来,我们将在 Python 中导入库并在新文件中设置 OpenAI API 密钥main.py
。
# 导入必要的包
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'] = '设置您的OPEN-AI-API-KEY'
在上面的代码片段中,为了清晰起见,我们显式设置了环境变量,因为 LlamaIndex 包隐式需要访问 OpenAI。在典型的生产环境中,您可以将密钥放入环境变量、保管库或您的基础设施可以访问的任何秘密管理服务中。
让我们构建一个函数来帮助我们对 Google 帐户进行身份验证以发现 Google 文档。
def Authorize_gdocs ():
google_oauth2_scopes = [
"https://www.googleapis.com/auth/documents.readonly"
]
cred = None
if os.path.exists( "token.pickle" ):
with open ( "token.pickle " , 'rb' )作为token:
cred = pickle.load(token)
如果 不是cred或 不是cred.valid:
如果cred和cred.expired和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 )
以 open ( "token.pickle" , 'wb' )作为令牌:
pickle.dump(cred, token)
要启用 Google Docs API 并在 Google Console 中获取凭据,您可以按照以下步骤操作:
您还必须添加测试用户,因为此 Google 应用尚未获得批准。这可以是您自己的电子邮件。
然后,您需要为您的项目设置凭据才能使用 API。为此,请转到左侧菜单中的“凭据”部分,然后单击“创建凭据”。选择“OAuth 客户端 ID”并按照提示设置您的凭据。
设置凭据后,您可以下载 JSON 文件并将其存储在应用程序的根目录中,如下所示:
根目录中包含 google 凭据的示例文件夹结构
设置凭据后,您可以从 Python 项目访问 Google Docs API。
转到您的 Google 文档,打开其中一些文档,然后获取可以在浏览器 URL 栏中看到的唯一 ID,如下所示:
文档ID
复制 gdoc ID 并将其粘贴到下面的代码中。您可以拥有 N 个可以索引的 gdocs,以便 ChatGPT 可以对您的自定义知识库进行上下文访问。我们将使用 LlamaIndex 库中的 GoogleDocsReader 插件来加载您的文档。
# 授权或下载最新凭证的函数
authorize_gdocs()
# 初始化LlamaIndex google doc reader
GoogleDocsReader = download_loader('GoogleDocsReader')
# 我们要索引的google 文档列表
gdoc_ids = ['1ofZ96nWEZYCJsteRfqik_xNQTGFHtnc-7cYrf0dMPKQ']
loader = GoogleDocsReader()
# 加载gdocs 并为其建立索引
文档 = loader.load_data(document_ids=gdoc_ids)
索引 = GPTSimpleVectorIndex(documents)
LlamaIndex 拥有多种数据连接器,涵盖 Notion、Obsidian、Reddit、Slack 等服务。您可以在此处找到可用数据连接器的压缩列表。
如果您希望即时保存和加载索引,可以使用以下函数调用。这将加快从预先保存的索引中获取数据的过程,而不是对外部源进行 API 调用。
# 将索引保存到index.json文件中
index.save_to_disk( 'index.json' )
# 从保存的index.json文件中加载索引 index
= GPTSimpleVectorIndex.load_from_disk( 'index.json' )
查询索引并获取响应可以通过运行下面的代码来实现。代码可以轻松扩展到连接到 UI 的 REST API,您可以在其中通过 GPT 接口与自定义数据源进行交互。
# 查询索引
while True :
prompt = input ( "Typeprompt..." )
response=index.query(prompt)
print (response)
鉴于我们有一份包含我详细信息的 Google 文档,如果您在 Google 上公开搜索,就可以轻松获得这些信息。
我们将首先直接与普通 ChatGPT 交互,看看它会生成什么输出,而无需注入自定义数据源。
这有点令人失望!让我们再试一次。
信息:google_auth_oauthlib.flow:“GET /?state=oz9XY8CE3LaLLsTxIz4sDgrHha4fEJ&code=4/0AWtgzh4LlIfmCMEa0t36dse_xoS0fXFeEWKHFiouzTvz4Qwr7T2Pj6anb-GiZ__Wg-hBBg&scope=https://www.googleapis.com/au th/documents.readonly HTTP/1.1" 200 65
INFO:googleapiclient.discovery_cache:file_cache仅支持 oauth2client<4.0.0
INFO:root:> [build_index_from_documents] LLM 令牌使用总量:0 个令牌
INFO:root:> [build_index_from_documents] 嵌入令牌使用总量:175 个令牌 输入
提示...谁是 timothy mugayi 提示他是媒介
INFO:root:> [查询] LLM 令牌使用总量:300 个令牌
INFO:root:> [查询] 嵌入令牌使用总量:14 个令牌
Timothy Mugayi 是 GRAB 子公司 OVO (PT Visionet Internasional) 的工程经理。他还是 Medium.com 上的一位狂热作家,撰写的技术主题涵盖 Python 和程序员的自由职业。Timothy 从事编码工作已超过15 年,为大型合作构建企业解决方案。在空闲时间,他喜欢指导和指导。
last_token_usage=300
输入提示...
输入提示...鉴于您知道蒂莫西·穆加伊是谁,请写一篇关于他的有趣介绍蒂莫西·穆加伊是一位经验丰富、成就斐然的专业人士,在以下领域
拥有丰富的知识工程、编码和指导。他目前是 GRAB 子公司 OVO 的工程经理,从事编码工作已超过15 年,为大型合作构建企业解决方案。在空闲时间,Timothy 喜欢撰写有关 Python 等技术主题的文章、在medium.com 上为程序员做自由职业以及指导和辅导。凭借令人印象深刻的背景和专业知识,蒂莫西对任何组织来说都是宝贵的资产。
最后令牌使用=330
它现在可以使用新的自定义数据源推断答案,准确地生成以下输出。
我们可以更进一步。
输入提示...为upwork python 项目为timothy mugayi写一封求职信,以构建可访问外部数据源的自定义 ChatGPT 机器人
INFO:root:> [查询] LLM 令牌使用总量:436 个令牌
INFO:root:> [查询] 嵌入令牌使用总量:30 个令牌
亲爱的[招聘经理],
我写信申请Python项目来构建一个可以访问外部数据源的自定义 ChatGPT 机器人。凭借在为大型公司编码和构建企业解决方案方面超过 15 年的经验,我相信自己是该职位的理想人选。
我目前是 GRAB 子公司 OVO (PT Visionet Internasional) 的工程经理。我在Python 方面拥有丰富的经验,并且一直在 Medium.com 上撰写有关 Python 和程序员自由职业的技术主题文章。我也是一位热心的导师和教练,我相信我的经验和技能使我成为这个项目的完美人选。
我有信心能够交付满足项目要求的高质量产品。我还可以进一步讨论该项目并回答您可能有的任何问题。
感谢您的时间和考虑。
此致
蒂莫西·穆加伊
last_token_usage=436
键入提示...
LlamaIndex 将在内部接受您的提示,在索引中搜索相关块,然后将您的提示和相关块传递给 ChatGPT 模型。上述过程演示了 LlamaIndex 和 GPT 回答问题的基本首次使用。然而,您还可以做更多的事情。在配置 LlamaIndex 以利用不同的大语言模型 (LLM)、为各种活动使用不同类型的索引或以编程方式使用新索引更新旧索引时,您只会受到创造力的限制。
以下是显式更改 LLM 模型的示例。这次我们利用了另一个与 LlamaIndex 捆绑在一起的 Python 包,称为 langchain。
from langchain import OpenAI
from llama_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper
...
# 明确定义另一个LLM
llm_predictor = LLMPredictor(llm=OpenAI(温度=0, model_name= "text-davinci-003" ))
# 定义提示配置
# 设置最大值输入大小
max_input_size = 4096
# 设置输出标记数
num_output = 256
# 设置最大块重叠
max_chunk_overlap = 20
Prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
index = GPTSimpleVectorIndex(
文档, 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 模型的一些局限性。
完整源代码可以参考Github代码:https://github.com/timothymugayi/mychatbot
文章转载自betterprogramming,作者Timothy Mugayi
【开源免费】FASTGPT是基于LLM的知识库开源项目,提供开箱即用的数据处理、模型调用等能力。整体功能和“Dify”“RAGFlow”项目类似。很多接入微信,飞书的AI项目都基于该项目二次开发。
项目地址:https://github.com/labring/FastGPT
【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。
项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md
在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0