定制自己的文档问答机器人

news2024/11/16 8:42:04

近期ChatGPT很火爆,功能很强大,其具有强大的逻辑推理能力和数据背景。但是如果我们想要使用ChatGPT聊一些它没有训练过的知识,或者我们自己的一些数据时,由于ChatGPT没有学习过这些知识,所以回答结果不准确。

下文就介绍一种基于llama-index和ChatGPT API实现的基于你自己提供的数据来定制私有对话机器人的方式。

探索方法

1、想要定制基于自己专属数据的机器人,首先想到的是fine-tunes微调的方式。用大量的数据对GPT模型进行微调来实现一个可以理解你提供文档的模型。但是,微调需要花费很多money,而且需要一个有实例的大数据集。也不可能在文件有变化时每次都进行微调。更关键的一点是,微调根本不可能让模型 “知道 “文档中的所有信息,而是要教给模型一种新的技能。因此,微调不是一个好办法。

2、将你的私有文本内容作为prompt的上下文对ChatGPT进行提问。但是openai api存在最大长度的限制,ChatGPT 3.5的最大token数为4096,如果超过长度限制,会直接对文档截断,存在上下文丢失的问题。并且api的调用费用和token长度成正比,tokens数太大,则每次调用的成本也会很高。

既然tokens有限制,那么有没有对文本内容进行预处理的工具呢,使不超过token数限制。llama-index就是一种这种工具,借助llama-index可以从文本中只提取出相关部分,然后将其反馈给prompt。

接下来我将给出一个使用llama-index和ChatGPT API基于自己的数据,实现问答聊天机器人的分步教程。

前期准备:

  • OpenAI API密钥,可以在https://platform.openai.com/account/api-keys查看。如果还没有申请,可以查阅资料申请OpenAI API的密钥。使用OpenAI API密钥可以与openai提供的各种模型进行交互。

  • 一个文档资料数据库。llama-index支持许多不同的数据源,如API、PDF、文档、SQL 、Google Docs等。在本教程中,我们只使用一个简单的文本文件进行演示。

  • 本地的Python环境或在线的Google Colab。本教程中使用本地的Python环境演示。

流程:

安装依赖:

pip install openai
pip install llama-index
from llama_index import SimpleDirectoryReader, GPTListIndex, GPTSimpleVectorIndex, LLMPredictor, PromptHelper,ServiceContext
from langchain import OpenAI 
import gradio as gr 
import sys 
import os 
os.environ["OPENAI_API_KEY"] = 'your openai api key'
data_directory_path = 'your txt data directory path'
index_cache_path = 'your index file path'

#构建索引
def construct_index(directory_path): 
        max_input_size = 4096 
        num_outputs = 2000 
        max_chunk_overlap = 20 
        chunk_size_limit = 500
      
        llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003", max_tokens=num_outputs))
        # 按最大token数500来把原文档切分为多个小的chunk
        service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=chunk_size_limit)
        # 读取directory_path文件夹下的文档
        documents = SimpleDirectoryReader(directory_path).load_data() 
 
        index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)
        # 保存索引
        index.save_to_disk(index_cache_path) 
        return index 
        
def chatbot(input_text): 
        # 加载索引
        index = GPTSimpleVectorIndex.load_from_disk(index_cache_path) 
        response = index.query(input_text, response_mode="compact") 
        return response.response 
        
if __name__ == "__main__":
        #使用gradio创建可交互ui  
        iface = gr.Interface(fn=chatbot, 
                        inputs=gr.inputs.Textbox(lines=7, label="Enter your text"), 
                        outputs="text", 
                        title="Text AI Chatbot") 
        index = construct_index(data_directory_path) 
        iface.launch(share=True)

在construct_index方法中,使用llama_index的相关方法,读取data_directory_path路径下的txt文档,并生成索引文件存储在index_cache_path文件中。当执行此python文件时,会执行construct_index方法,在控制台中输出:

INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens
INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 27740 tokens
Running on local URL:  http://127.0.0.1:7860

可以看到输出原文档有27740 tokens,这也是请求embedding接口的调用成本。此token是llama_index生成的,不会占用ChatGPT api的token。

然后在浏览器中输入控制台输出的url:http://127.0.0.1:7860。会展示gradio框架渲染的ui,如下所示:

633f20d508b7a3fe49ef5f7e5133bc52.png

在左侧输入What did the author do in 9th grade?,在右侧输出如下:

cd4d727bc818b08bbd79c9419afc2923.png

同时控制台输出

INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 563 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 10 tokens

使用OpenAI text-davinci-003模型花费的token为563 tokens。通过这种方法,原来接近28000 token的查询调用成本,被降到了500 tokens左右。

llama-index的工作原理如下:

  • 创建文本块索引

  • 找到最相关的文本块

  • 使用相关的文本块向 GPT-3(或其他openai的模型) 提问

  • 在调用query接口的时候,llama-index默认会构造如下的prompt:

"Context information is below. \n"
    "---------------------\n"
    "{context_str}"
    "\n---------------------\n"
    "Given the context information and not prior knowledge, "
    "answer the question: {query_str}\n"
  • 使用以上prompt请求openai 的模型时,模型根据我们提供的上下文和提出的问题,使用其逻辑推理能力得到我们想要的答案。

扩展:

上文展示了使用llama-index关联txt文本文档,使用ChatGPT模型的推理能力进行问答的方式。我们可以扩展一下其他的使用方式。

llama-index这个库不止能链接txt文本文档,也提供了大量各种类型的 DataConnector,既包括 PDF、ePub 这样的电子书格式,也包括 YouTube、Notion、MongoDB 这样外部的数据源、API 接入的数据,或者是本地数据库的数据。开源库(https://github.com/jerryjliu/llama_index/blob/main/gpt_index/readers/file/base.py)中可以看到内置支持的链接数据类型,也可以在 llamahub.ai (https://llamahub.ai/)看到社区开发出来的读取各种不同数据源格式的 DataConnector。

借助llama-index与pdf文档的链接,我们可以实现类似于chatpdf(https://www.chatpdf.com/ )的功能。也可以使用llama-index的ImageParser识别图片,与ChatGPT交流图片中的内容......。更多的使用场景等待你的发现与扩展。

总结:

在本文中,我们将ChatGPT与llama-index结合起来使用,建立一个文档问题问答的聊天机器人。虽然ChatGPT(和其他LLM)本身就很强大,但如果我们把它与其他工具、数据或流程结合起来,它的力量就会被大大放大。通过本文的介绍,希望你也能够将自己的数据集交给 AI 进行索引,获得一个专属于你自己的 AI机器人。

参考资源

https://github.com/jerryjliu/llama_index

https://zhuanlan.zhihu.com/p/613155165

https://www.wbolt.com/building-a-chatbot-based-on-documents-with-gpt.html

https://time.geekbang.org/column/article/645305

文中使用的文档是llama_index example的文档:https://github.com/jerryjliu/llama_index/blob/c811e2d4775b98f5a7cf82383c876018c4f27ec4/examples/paul_graham_essay/data/paul_graham_essay.txt

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

7aceb666dde7fb7370d769f3ba3233a0.png

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

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

相关文章

十、切分织物起球和非起球区域以便于计算毛球对比度

一、通过训练的模型可以将织物的起球区域进行识别区分 原图: 模型识别: 二、对比度的计算 为了对织物起球等级进行评定,需要这边不同的参数特征来构建模型的评级系统 通过查阅相关文献,确定最终的特征参数为:织物起…

11.面向对象概述,类的创建,对象的创建

一.面向对象程序设计概述 1.知识点面向对象程序设计的目的 (1)从程序设计的角度来看,事物的属性就可以用变量来表示,行为则可以用方法来反映。 (2)客观世界中事物的属性和行为可以进行传递,当…

汇编与内联 x86-64

机器字长 x86是32位系统 64是64位系统 这里的32和64,指的都是机器字长 机器字长是 能直接进行整数/位运算的大小指针的大小(索引内存的范围) 8位机 由于空间大小限制,想要把集成电路做到个人主机里,只能用8位字长的 16位机 8086 IBMP…

如何破除增长的未知性?火山引擎交出了答卷

4月18日,由火山引擎主办的2023春季火山引擎“FORCE原动力”大会在上海召开。本次大会主要围绕云计算和数字化领域,全方位地展示火山引擎在云技术、云服务和云场景方面的最新探索、应用与实践,呈现创新发展的战略蓝图。 曾经,增长是…

Flink高手之路5-Table API SQL

文章目录 Flink 中的Table API & SQL一、Table API & SQL 介绍1. 为什么要Table API和SQL2. Table API & SQL的特点3. Table API& SQL发展历程3.1 架构升级3.2 查询处理器的选择3.3 了解-Blink planner和Flink Planner具体区别如下:3.4 了解-Blink …

神采PromeAI 2.0版本上线,助你释放创作超能力

上个月,我们推出神采PromeAI 1.0版本,让用户可以免费体验AI草图渲染功能。神采作为设计师的提效工具和灵感源泉,深受用户的广大好评。于是,在经过算法优化后,神采PromeAI 2.0版本终于在本周上线了! 我们提供…

【Vulnhub】之Symfonos2

一、 部署方法 在官网上下载靶机ova环境:https://download.vulnhub.com/symfonos/symfonos2.7z使用VMware搭建靶机环境攻击机使用VMware上搭建的kali靶机和攻击机之间使用NAT模式,保证靶机和攻击机放置于同一网段中。 二、 靶机下载安装 靶机下载与安…

ETCD(四)读请求处理过程

客户端通过etcdctl执行get命令 etcdctl get name --endpoints localhost:12379,192.158.00.32:12379client端 首先是client会解析这条命令,包括其中的get API方法,key值,请求server地址。解析完之后etcdctl会创建一个clientv3库对象&#xf…

Ubantu docker学习笔记(七)容器网络

文章目录 一、容器网络管理1.1查看容器网络1.2创建容器网络1.3 删除容器网络1.4 容器网络详细信息1.5 配置容器网络1.6 断开容器网络连接 二、none网络三、host网络四、bridge网络五、container网络六、容器连接外部网络6.1创建Overlay网络6.2创建Macvlan网络 一、容器网络管理…

研0进阶式学习---数据库配置

目录 最开始的问题:不同的连接名下面的数据库信息完全一样尝试新建用户名和密码,以此来建立新的连接 但这样建立的连接下面的数据库仍然是和之前的一模一样尝试改变xampp端口号,以此来建立新的连接 结论MySQL实例的数据库文件是与实例绑定的&…

完美解决丨+# TypeError: ‘dict_keys‘ object does not support indexing

结构 - 标题 - 问题描述 - 代码栗子 - 总结 目录 TypeError: dict_keys object does not support indexing 如何实现&#xff1f; python a {a: 1} b a.keys() c b[0] 异常描述 TypeError Traceback (most recent call last) <ipython-input-9-9dceb06f3f…

信号完整性分析基本概念之Retimer和Redriver

一两句话讲清楚版&#xff1a; Retimer 通过 其 Rx 端 CTLE/DFE (连续时间线性均衡/判断反馈均衡) 、CDR (时钟数据恢复) 及 Tx 端 EQ (均衡)&#xff0c;来够补偿信道损耗&#xff0c;消除信号抖动&#xff0c;提升信号完整性&#xff0c;从而增加传输距离。 Redriver 是放大…

多线程拉取+kafka推送

多线程拉取kafka推送 1 多线程 在本次需求中&#xff0c;多线程部分我主要考虑了一个点&#xff0c;就是线程池的配置如何最优。因为数据量级比较大&#xff0c;所以这个点要着重处理&#xff0c;否则拉取的时间会非常长或者是任务失败会比较频繁&#xff1b; 因为数据的量级…

Spring Security OAuth2.0(一)-----前言-授权码模式及代码实例

什么是 OAuth2 OAuth 是一个开放标准&#xff0c;该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源&#xff08;如头像、照片、视频等&#xff09;&#xff0c;而在这个过程中无需将用户名和密码提供给第三方应用。实现这一功能是通过提供一个令牌&#xff08…

如何治理“网络暴力” 在人类文明不断发展向前的进程中,大数据时代应运而来。数学建模解题步骤,愚见而已,欢迎指错和探讨呀~

题目可见文章&#xff1a;(20条消息) 如何治理“网络暴力” 在人类文明不断发展向前的进程中&#xff0c;大数据时代应运而来。 数学建模&#xff0c;90%成品论文&#xff0c;附附件、原题、代码 注&#xff0c;水平有限&#xff0c;非广告&#xff0c;仅供交流参考&#xff0c…

6、ThingsBoard使用jar包自己构建镜像部署

1、概述 这一节主要讲解你自己使用jar包构建镜像,一般在很多企业中,都是使用Jenkins配置流水线,自动打包,然后拷贝程序在target目录下生成的jar包,然后使用Dockerfile文件进行构建镜像,其实我这一节讲的也是类似,只是不使用Jenkins来实现自动,原理都一样,估计也是很多…

C++ MySQL存储二进制数据、存储照片

版权声明&#xff1a;本文为CSDN博主「intfre」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/nibiru_holmes/article/details/51387047 0x01 首先MySQL支持二进制的类型有Blob: …

Doris-1.2.0升级到Doris-1.2.4

0 背景 在使用doris-1.2.0版本时发现BE节点无故宕机&#xff0c;自己尝试解决无果后再官网寻找解决方案&#xff0c;发现在doris-1.2.0版本中存在这样的隐患bug导致BE节点宕机。 而在咨询社区之后建议对doris进行升级&#xff0c;升级版本doris-1.2.4。该版本是解决1.2.x问题…

Springboot集成neo4j实现知识图谱关系图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、neo4j是什么&#xff1f;二、安装步骤1.启动2.使用2.简单命令 二、使用springboot集成neo4j1.引入依赖2.功能实现3.查询关系节点4. 查询指定评委和指定选手…

基于matlab使用光线追踪自定义 CDL 通道模型

一、前言 此示例演示如何使用光线追踪分析的输出自定义 CDL 通道模型参数。该示例演示如何&#xff1a; 指定发射器和接收器在 3D 环境中的位置。 使用光线追踪来计算通道的几何方面&#xff1a;光线数量、角度、延迟和衰减。 使用光线追踪分析的结果配置 CDL 通道模型。 使用相…