如何使用自定义知识库构建自定义ChatGPT机器人

news2025/1/18 6:47:42

目录  隐藏 

使用自定义数据源为您的 ChatGPT 机器人提供数据

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

2. 使用 LlamaIndex(GPT 索引)扩展 ChatGPT

如何添加自定义数据源

先决条件

怎么运行的

最后的总结

使用自定义数据源为您的 ChatGPT 机器人提供数据

ChatGPT 已成为许多人日常用来自动执行各种任务的不可或缺的工具。如果您已经使用 ChatGPT 一段时间,您就会意识到它可能会提供错误的答案。这就提出了一个问题,即我们如何利用 chatGPT 来弥合差距并允许 ChatGPT 拥有更多自定义数据。

丰富的知识分布在我们每天接触的各种平台上,即通过工作中的 confluence wiki 页面、Slack组、公司知识库、Reddit、Stack Overflow、书籍、时事通讯和同事共享的 google 文档。跟上所有这些信息源本身就是一项全职工作。

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

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

在我们开始讨论如何扩展 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 库。

2. 使用 LlamaIndex(GPT 索引)扩展 ChatGPT

LlamaIndex,也称为 GPT 索引,是一个提供中央接口以将您的 LLM 与外部数据连接起来的项目。是的,你没有看错。使用 LlamaIndex,我们可以构建如下图所示的内容:

自定义数据源输入 CHATGPT

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

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

如何添加自定义数据源

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

先决条件

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

  • Python ≥ 3.7 安装在你的机器上
  • OpenAI API 密钥,可在OpenAI 网站上找到。您可以使用您的 Gmail 帐户进行单点登录。

  • 一些 Word 文档已上传到您的 Google 文档。LlamaIndex 支持许多不同的数据源。在本教程中,我们将演示 Google Docs。

怎么运行的

  1. 使用 LlamaIndex 创建文档数据索引。
  2. 使用自然语言搜索索引。
  3. 相关片段将由 LlamaIndex 检索并传递给 GPT 提示。LlamaIndex 会将您的原始文档数据转换为查询友好的矢量化索引。它将利用该索引根据查询和数据的匹配程度找到最相关的部分。然后,这些信息将被加载到提示中,提示将被发送到 GPT,以便 GPT 具有必要的背景来回答您的问题。
  4. 之后,您可以根据上下文中的提要询问 ChatGPT。

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

我们需要先安装依赖库。就是这样:

pip install openai 
pip install llama-index 
pip install 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'] = 'SET-YOUR-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' ) 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' )作为令牌:
            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 文件并将其存储在应用程序的根目录中,如下所示:

根目录中带有 GOOGLE 凭据的示例文件夹结构

设置凭据后,您可以从 Python 项目访问 Google Docs API。

转到您的 Google 文档,打开其中的一些文档,并获取可以在浏览器 URL 栏中看到的唯一 ID,如下图所示:

文档编号

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

authorize_gdocs() GoogleDocsReader = download_loader('GoogleDocsReader') gdoc_ids = ['1ofZ96nWEZYCJsteRfqik_xNQTGFHtnc-7cYrf0dMPKQ'] loader = GoogleDocsReader() documents = loader.load_data(document_ids=gdoc_ids) 
index = GPTSimpleVectorIndex(documents)

LlamaIndex 有多种数据连接器,涵盖 Notion、Obsidian、Reddit、Slack 等服务。您可以在此处找到可用数据连接器的压缩列表。

如果您希望即时保存和加载索引,可以使用以下函数调用。这将加快从预先保存的索引中获取的过程,而不是对外部源进行 API 调用。

index.save_to_disk( 'index.json' ) 

= GPTSimpleVectorIndex.load_from_disk( 'index.json' )

查询索引并获得响应可以通过运行下面的代码来实现。代码可以轻松扩展到连接到 UI 的 rest API,您可以在 UI 中通过 GPT 界面与自定义数据源进行交互。

while  True : 
    prompt = input ( "Type prompt..." ) 
    response = index.query(prompt) 
    print (response)

鉴于我们有一个包含我详细信息的 Google 文档,如果您在 google 上公开搜索,这些信息很容易获得。

我们将首先直接与 vanilla 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仅支持 oauth2client<4.0.0 
INFO:root:> [build_index_from_documents] LLM 令牌总使用量:0 个令牌
INFO:root:> [build_index_from_documents] 嵌入令牌总使用量:175 个令牌
类型提示...谁是 timothy mugayi 提示他是媒体上的作者INFO:root:> [query] LLM 令牌总使用量:300 个令牌
INFO:root:> [query] 嵌入令牌总使用量:14 个令牌
Timothy Mugayi 是 GRAB 子公司 OVO (PT Visionet Internasional) 的工程经理。他还是 medium.com 上的一位狂热作家,他撰写的技术主题涵盖 python 和程序员的自由职业。Timothy 从事编码工作超过15 年,为大型合作构建企业解决方案。在空闲时间,他喜欢指导和指导。
last_token_usage=300
键入提示...键入提示...假设您知道timothy mugayi 是谁,请写一篇关于他的有趣介绍Timothy Mugayi 是一位经验丰富且成就卓著的专业人士,在工程、编码和指导。他目前是 GRAB 子公司 OVO 的工程经理,从事编码工作超过15 年,为大型合作构建企业解决方案。在空闲时间,Timothy 喜欢撰写技术主题,例如 Python 和在 medium.com 上为程序员提供自由职业的副业,以及指导和辅导。凭借令人印象深刻的背景和专业知识,Timothy 是任何组织的宝贵资产。
last_token_usage=330

它现在可以使用新的自定义数据源推断答案,准确地生成以下输出。

我们可以更进一步。

输入提示...为timothy mugayi写一封求职信,用于一个 upwork python 项目,以构建一个可以访问外部数据源的自定义 ChatGPT 机器人
INFO:root:> [query] LLM 令牌总使用量:436 个令牌
INFO:root:> [查询] 嵌入令牌总使用量:30 个令牌亲爱的 [招聘经理],我写信申请Python项目,以构建一个可以访问外部数据源的自定义 ChatGPT 机器人。凭借超过 15 年的编码和为大型公司构建企业解决方案的经验,我相信我是这个职位的理想人选。我目前是 GRAB 子公司 OVO (PT Visionet Internasional) 的工程经理。我在Python 方面拥有丰富的经验,并且一直在 medium.com 上为程序员撰写涵盖 Python 和自由职业方面的技术主题。我也是一位热心的导师和教练,我相信我的经验和技能使我成为这个项目的完美人选。我有信心可以交付满足项目要求的高质量产品。我也可以进一步讨论该项目并回答您的任何问题。感谢您的时间和考虑。此致,
Timothy Mugayi 
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_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name= "text-davinci-003" )) max_input_size = 4096 # 设置输出
num_output 
= 256 
max_chunk_overlap =     20

如果您想密切关注您的 OpenAI 免费或付费积分,您可以导航到 OpenAI仪表板并检查剩余的积分。

创建索引、插入索引和查询索引都将使用令牌。因此,在构建自定义机器人时确保输出令牌使用情况以用于跟踪目的始终很重要。

last_token_usage = index.llm_predictor.last_token_usage

打印

( f"last_token_usage= {last_token_usage} " )

最后的总结

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

点击阅读 如何使用自定义知识库构建自定义ChatGPT机器人 原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rt-thread启动流程

资料下载 RT-Thread Simulator 例程 操作流程 将上面的仿真例程下载并解压&#xff0c;通过MDK打开&#xff0c;编译&#xff0c;调试&#xff0c;并打开串口点击运行&#xff0c;就可以看到如下输出了&#xff1a; 添加自己的 thread&#xff1a;在main()函数中添加即可&am…

[Java基础]基本概念(上)(标识符,关键字,基本数据类型)

hello 大家好&#xff0c;计算机语言各有不同&#xff0c;但本质上都是操作内存和计算。这章的内容是介绍Java中的基本概念展开&#xff0c;包括&#xff1a;标识符&#xff0c;关键字&#xff0c;Java基本数据类型&#xff0c;运算符&#xff0c;表达式和语句&#xff0c;分支…

前端架构师-week6-require源码解析

require 源码解析——彻底搞懂 npm 模块加载原理 require 的使用场景 加载模块类型 加载内置模块&#xff1a;require(fs)加载 node_modules 模块&#xff1a;require(ejs)加载本地模块&#xff1a;require(./utils)支持文件类型 加载 .js 文件加载 .mjs 文件加载 .json 文件…

AI女友同时和1000人谈恋爱,狂赚500万

AI女友&#xff0c;预计暴赚4亿 要说当下什么最火&#xff0c;AI首当其冲无可置疑。00后网络红人红卡琳玛乔丽&#xff08;Caryn Marjorie&#xff09;最近与Forever Voices公司合作&#xff0c;通过视频训练等方式打造出个人形象、声音和性格的AI虚拟女友&#xff0c;就像在和…

Redis高可用--持久化

在Web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准实在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提提供正常服务&a…

大疆无人机 MobileSDK(遥控器/手机端)开发 v4版<3>

导读 第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。 航线规划 1)航线打点 点击 按钮进行打点,在地图中手动选择点位选择完成后点击**[完成]**按钮,即可完成航线打点…

新展预告 | YT U LOVE——许峰个展即将亮相!

深圳东方美术馆荣幸地宣布&#xff0c;将于5月20日呈现艺术家许峰在鹏城的首次个展“YT U LOVE”&#xff0c;展出艺术家从2020年至2023年创作的油画、纸本及雕塑40余件作品。此次展览以“YT U LOVE”为题&#xff0c;恰逢兔年&#xff0c;yutu在中国意指玉兔&#xff0c;前后两…

美创科技首家互联网医院数据安全建设案例实践

互联网医院作为医疗服务模式创新发展的新产物&#xff0c;在各项配套政策支持下快速发展。然而&#xff0c;蓬勃之势下&#xff0c;无数双“暗夜之手”也在蠢蠢欲动&#xff0c;试图从中渔利&#xff0c;关乎患者隐私、种类繁多的医疗数据迎来愈加严峻的安全挑战。 某市中心医院…

劳有所学|文献可视化分析工具CiteSpace、vosviewer使用指南

【基于Citespace和vosviewer文献计量学相关论文 】 专题一&#xff1a;文献计量学方法与应用 1 文献计量学方法基本介绍 2 与其他综述方法区别联系 3 各学科领域应用趋势近况 4 主流分析软件优缺点对比 5 经典高分10SCI思路复盘 6 软件安装与Java环境配置 专题二&#…

理解PMP的顺序

PMP&#xff0c;大量考的是“下一步”、“本应该”的顺序逻辑。在学习的时候&#xff0c;我们需要把整本书十个知识领域&#xff0c;穿起来形成一个线性的结构。 在整理的过程中&#xff0c;很多人都会认为&#xff0c;线性结构&#xff0c;应该是这样的&#xff1a; 每个过程…

安卓播放H264/H265实时流(安卓实时预览H264/H265 安卓实时预览AVC/HEVC)

实际项目中经常遇到两种场景&#xff0c;第一种从无人机拿H264/H265码流转GB28181等协议&#xff0c;转协议的同时可能还需要实时预览无人机画面; 第二种是安卓接USB外置摄像头, 由于USB2.0传输带宽有限&#xff0c;对于高分辨率图像, 带宽无法满足YUV图像的传输, 摄像头只好先…

数据的比较

前言 在学习Java过程中&#xff0c;数据的比较是必学的。 对于不同的数据有不同的比较方式。 目录 前言 一、算术比较器 二、equals() 三、Comparable接口 四、Comparator接口 结语 一、算术比较器 算数比较器有&#xff1a;、>、<、>、<、! 但是算数比较器…

win下C++部署深度学习模型之clion配置pytorch+opencv教程记录

win下clion配置pytorch和OpenCV 一、clion配置vs编译器以及测试二、clion配置pytorch2.1、下载libtorch2. 2、环境变量配置2.3、cmakelist.txt编写2.4、main函数测试运行 三、clion配置opencv3.1、源码下载3.2、编译3.3、环境变量配置3.4、cmakelist.txt编写3.5 main函数测试运…

揭 秘~月薪2-3万的程序员一天到底是怎么度过的?

程序员的高薪资&#xff0c;一直是大家热衷讨论的话题&#xff0c;几乎每隔一段时间就会在社交平台被网友们热议一番。 比如这条“月薪2万到3万的程序员的一天是怎么样度过的&#xff1f;”的帖子就一直排在知乎前列。 作为薪资可观的岗位&#xff0c;大家都非常好奇&#xff…

【Fiddler移动端抓包】~抓包不是偷窥,Fiddler教你看透移动应用背后的秘密~

目录 引言 抓包 什么是抓包 哪些场景下需要抓包 Fiddler Fiddler抓包原理 安装 Fiddler移动端抓包 第一步&#xff1a;允许远程计算机连接 第二步&#xff0c;设置手机网络代理 第三步&#xff0c;允许捕获HTTPS连接 第四步&#xff0c;手机安装证书 结语 引言 当…

探寻生机 | 数说故事助力微播易第七届风向大会,研判新风向,洞察新趋势

“过去一年&#xff0c;有的人用ChatGPT谁出具的北京烤鸭图片最准确搞怪&#xff0c;有的人却已经利用虚拟主播单场带货百万&#xff1b;有的人正在被AIGC淘汰&#xff0c;有的人却通过人机协作实现20秒制作100张创意图&#xff1b;有的百万粉丝接不到广告&#xff0c;有的仅靠…

使用python实现微博评论分词与关键词提取(从MySQL数据库中读取数据)

一、实验环境 &#xff08;1&#xff09;Windows 操作系统&#xff1b; &#xff08;2&#xff09;PyCharm 2019.1。 &#xff08;3&#xff09;数据库用户名为 root&#xff0c;密码为 123456. (4) 学校机房电脑&#xff0c;带有mysql 二、获取数据库信息 &#xff08;1&a…

【Linux从入门到精通】进程的基本概念

我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后&#xff0c; 本篇文章会对进程进行深入讲解。同时会讲解PCB&#xff08;进程控制块&#xff09;。希望本篇文章内容会对你有所帮助。 文章目录 一、再次理解操作系统 1、1 操作系统的作用 1、2 操作系统的管理 二、进程基本…

【Linux】12. 模拟实现shell

回顾 在之前的学习过程中&#xff0c;我们掌握了进程的相关概念&#xff0c;冯诺依曼体系结构&#xff0c;进程地址空间概念&#xff0c;进程状态&#xff0c;进程控制&#xff0c;进程退出&#xff0c;进程替换…等等一系列的基础知识&#xff0c;这些基础知识让我们清楚的知…

Qt6之字符串类内存分配新变化——16的次方增加

qt提供了比标准c string更强大&#xff0c;更丰富&#xff0c;更实用的字符串类QString&#xff0c;它的主要功能22个已经在之前逐一分析过&#xff0c;感兴趣的可前往以下链接查看&#xff0c;本文主要重点分析下qt在字符串类上面做的优化&#xff0c;主要是两个方面&#xff…