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

article/2025/11/10 15:35:10

近期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 = 500llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003", max_tokens=num_outputs))# 按最大token数500来把原文档切分为多个小的chunkservice_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://chatgpt.dhexx.cn/article/cuQQkODy.shtml

相关文章

SAP宣布推出商业AI:在第四次工业革命时代行稳致远

6月14日,SAP在中国最大规模的顶级盛会——2023 SAP中国峰会召开。1个月前,SAP刚在美国奥兰多召开了它的全球顶级蓝宝石峰会(SAPPHIRE NOW)。这次,一位中国的老朋友将SAPPHIRE 上最受关注的发布——商业AI(S…

GPT-4要革程序员的命?智能开发的理想与现实 | 爱分析调研

“生成式人工智能(AIGC)将在三年内终结编程。” ——Matt Welsh,前哈佛大学计算机科学教授、Google 工程主管 GPT-4 也许还不完美,但智能开发时代真的来了 美国时间3月14日,OpenAI 正式发布 GPT-4,在 Chat…

中国四大银行正在大规模内测数字货币APP|可凭手机号完成转账

数字货币由央行牵头进行,各家银行此前数月正在就落地场景等进行测试。目前,部分大行内部员工已经开始使用,用于转账、缴费等场景。 “数字货币”在我国落地的脚步声越来越近。 数位国有大行人士表示,正在深圳等地大规模测试数字钱…

模仿中国银行APP

模仿中国银行APP 1. 描述 实现了登录、初始化数据库、取款、存款、查询、改密、转账等功能 使用 LitePal 轻量型数据库 2. 部分效果图展示 | 在这里插入图片描述 | 3. 初始化信息 第几初始化数据库,生成3个账户信息,如下,可用LitePa…

一些好书推荐给大家

推荐一:《荆棘鸟》 作者:[澳]考琳麦卡洛 有一个传说,关于一只鸟,它一生只唱歌一次,比地球上任何其他生物都更甜美。从它离开巢穴开始,它就开始寻找那棵荆棘树,直到找到它想要的东西才肯罢休。…

能帮你提高社交能力的好书推荐

人际交往和社交首先是要有高情商,从这方面来讲我觉得最经典的人际交往书籍应该是《情商必读12篇》。这本书真的是低情商人士和不擅社交者的大救星,即有理论知识又十分实战,再怎么夸它都不为过。 要想在人际交往方面游刃有余,最重要…

好书推荐—《改变千万人生的励志经典》

好书推荐——《改变千万人生的励志经典 》 作  者: 李津 编译出 版 社: 海南出版时间: 2007-11-1编辑推荐如果你有志于成功的话,你就不可以忽略这些经典之作;如果你想做个卓然超群的大人物,你就必须掌握和…

1月好书推荐-8本值得读的好书,让你受益终生

当我们第一遍读一本好书的时候,我们仿佛觉得找到了一个朋友;当我们再一次读这本书的时候,仿佛又和老朋友重逢。——伏尔泰 2018年一下就过去了,是不是后悔没有做一些有意义的事情,比如没有多读几本好书? 2…

二次元界福音:MakeGirlsMoe创建动漫人物

开源的动漫角色图片生成工具,支持:选择发色、发型、眼睛、皮肤、微笑、风格等等特征生成二次元图片。可自定义生成可爱的二次元头像,二次元界福音。 GitHub网址:https://github.com/makegirlsmoe/makegirlsmoe_web 在线体验&…

二次元PHP随机api接口源码,随机二次元图片API接口php源码

Loading... 调用接口随机输出二次元图片的接口源码,有能力的站长可以修改源码达到不同接口输出不同种类的图片。部分站长认为网站软件色调太单一,显得乏味,于是就诞生了本接口,可以作为网站背景、网站修饰图片、APP图片等用途&…

Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色渲染。之前说过,最基本的卡通渲染,包含了色阶化光影和描边二个元素。所以这里先来说一下色阶化光影的多种做法对比。 一、光照模型和色阶化的说明 从上一篇文章里…

二次元单页导航 HTML模板源码

介绍: 我从玖梦博客搬砖下载的,源码有个小问题 缺一个" 我已经修复了,链接什么的我懒得改了,直接原图上来 随机背景图,感觉还可以,如果不喜欢可以在自己修改 网盘下载地址: http://kekew…

二次元的登录界面

今天还是继续坚持写博客,然后今天给大家带来比较具有二次元风格的登录界面,也只是用html和css来写的,大家可以来看看! 个人名片: 😊作者简介:一名大一在校生,web前端开发专业 &…

Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色材质的制作。这次是讲头部的做法。 1、脸部 之前在分析资源的时候,其实已经发现了这个模型的脸部法线有问题,导致在做光照模型的时候,脸部很奇怪。 把f…

二次元HTML导航页网站源码

简介: 二次元HTML导航页网站源码,非常好看的一款单页源码,感兴趣的同学可以看看! 网盘下载地址: http://kekewl.org/p6BqAjZzdqL0 图片:

【有手就会系列】四步通过文字生成二次元小姐姐图片

首先fork项目,启动环境选择16G的A100显卡,直接点击运行加载模型,接着就到了生成小姐姐的时候啦 你需要设置想生成的小姐姐的描述,由于模型是通过英文训练的,所以建议中文翻译成英文输入,填入你想要的描述 不…

wordpress二次元主题

几款开源的wordpress二次元主题,演示地址可到Github查看。 boxmoe Github:https://github.com/baomihuahua/boxmoe-dove- Kratos Github:https://github.com/seatonjiang/kratos Sakura Github:https://github.com/mashiroz…

记一次添加桌面二次元人物的经历

VScode的一个自定义背景插件 事情是这样的: 前两天上课的时候,看到老师VScode背景有个二次元人物: 作为一名二刺猿爱好者,当然要想搞一个,于是找到插件: 肯定不能满足于这默认背景的吧,于是找…

二次元动漫人物脚部的画法

“脚”画不好的原因是,长度和粗细的比例平衡。相反,如何知道了平衡的方法的话,那么人的身体一定可以画好。这次就对于脚的画法进行详细的讲解吧~ 为了画好漫画,人物的脚部往往都是不能避免的部位。虽然脸和上半身可以画得很好&am…