当前位置:   article > 正文

用 ChatGPT 采用自有数据集训练问答机器人

chatgpt 训练自己的数据集

da9a234bca76a93a8d989c46853e982e.gif

前言

最近 LLM 模型很火,chatGPT 涵盖的知识范围之广,令人叹为观止。然而码农肯定不能满足于现有的知识库,要扩展自有数据才能发挥其更大的实用价值。

一般来说,深度学习模型大多采用 finetune 的方式来增加训练数据,但 LLM 模型太大了,训练成本过高。无论是离线或是在线训练样本,短时间只有 OpenAI 可为。随着通用大模型的兴起,另外一种被称为 ”前导词注入“ 的提示工程(prompt)逐渐成熟,也能接入自有数据。

本篇主要采用后面这种方法,将软件开发文档转换为矢量数据,再通过 chatGPT 构建更好的问答交互体验,利用强大的归纳搜索能力,大大提高信息获取效率。

80be107ee64a5a18d3c79ef1d953a6cf.png
文心一言

环境准备

安装 python 3.8

  1. conda create -n chat python=3.8
  2. conda activate chat

配置 jupyter 环境

  1. conda install ipykernel
  2. python -m ipykernel install --user --name chat --display-name "chat"

安装 pytorch

pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
e7512338ea2d30118b40c24d053a7c2c.png

这里注意版本匹配,我笔记本上采用的是 cuda 11.6 的版本。若显卡不够强大的话,也可以安装 cpu 版本。

安装依赖

  1. pip install langchain
  2. pip install unstructured
  3. pip install openai
  4. pip install pybind11
  5. pip install chromadb
  6. pip install Cython
  7. pip3 install "git+https://github.com/philferriere/cocoapi.git#egg=pycocotools&subdirectory=PythonAPI"
  8. pip install unstructured[local-inference]
  9. pip install layoutparser[layoutmodels,tesseract]
  10. pip install pytesseract

安装编译 detectron2

  1. git clone https://github.com/facebookresearch/detectron2.git
  2. python -m pip install -e detectron2
47833ed4f6cb8be5d46e333c5de8e38c.png

由于要在 windows 环境下通过源码编译 detectron2,这里有几个坑要提示一下:

pdf2image 出错
pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?
12de0139f82d0a2a6c594e45f218e237.png
https://github.com/oschwartz10612/poppler-windows/releases/

下载 poppler,并添加环境变量。

pdfminer 与 pdfminer.six 版本冲突
'LTChar' object has no attribute 'graphicstate' Error in a docker container

卸载 pdfminer 和 pdfminer.six 后重新安装即可修复。

a18508e0a3115b43e14e79d7ba3e3704.png
gcc 和 ninja

编译过程中需要配置 gcc,我这里采用的是 MinGW,而 ninja 在windows 下并非可选(否则编译不通过),需放置到 Path 下。(文末有相关文件下载链接)

75172dfc260948d2a7af270b9114304b.png

准备训练数据

将 pdf 文档 放置于 /text 目录下,可放置多个文件,这里使用的是音视频的开发文档 meeting.pdf。

jupyter notebook
28ab4e4e3185c25ab11e43185eb2aef7.png
  1. import os
  2. os.environ['OPENAI_API_KEY'] = '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'

万事俱备,我们来配置一下 OpenAI 的 api key。(这里省略一万步,最近申请 ChatGPT 的难度又提升了不少,看来白嫖党给 OpenAI 的算力压力很大啊~~,plus 又对国内发行的国际信用卡拒绝,总之很烦)

  1. from langchain.document_loaders import UnstructuredPDFLoader
  2. from langchain.indexes import VectorstoreIndexCreator

配置训练采用 gpu 或是 cpu

  1. from detectron2.config import get_cfg
  2. cfg = get_cfg()
  3. cfg.MODEL.DEVICE = 'gpu' #GPU is recommended

将自定义数据导入loader

  1. text_folder = 'text'
  2. loaders = [UnstructuredPDFLoader(os.path.join(text_folder, fn)) for fn in os.listdir(text_folder)]
3794498c60fd6888e05447993468fb77.png

训练数据

文本矢量化,并接入 ChatGPT

index = VectorstoreIndexCreator().from_loaders(loaders)

由于开发文档非常小(169k),在我的 1060 的显卡上只需要不到1分钟就完成了训练,cpu 会稍微慢些。

86698958bbc010ed7f70c632dfaefa98.png

API 的 使用费用也十分的低廉,免费额度够用100多次。重度使用者,估计要考虑上 plus 版本了。

446cfb471cf52435c77345b60d1bfcee.png

问答效果

0e88ce7025019b982a7e15af2b88e4fa.png

服务器的主入口文件是什么?

  1. query = "服务器的主入口文件是什么?"
  2. index.query(query)

' app.js'

75d16e75513cdd2dcbf9d3e5085d4489.png

这个问题比较简单,能直接在文中找到答案,回答是正确的。

routes/index.js有什么作用?

  1. query = "routes/index.js有什么作用?"
  2. index.query(query)

' routes/index.js is used to define the routes for the application. It is responsible for mapping incoming requests to the appropriate controller functions.'

这个问题显然文档中并没有详细描述,只提到了路由定义文件,这回答大概率是 ChatGPT 做出的补充说明。

介绍一下这个项目?

  1. query = "介绍一下这个项目?"
  2. index.query(query)

' 这个项目包含了一个服务器,一个README.md文件,一个app.js文件,以及double_room,multi_room和live_room三个文件夹,每个文件夹都包含一个index.js文件,以及一些其他的js文件,这些文件用于实现双人房间,多人房间和直播房间的功能,还有一个selfHost的URL,以及一个logic/double_room_mgr.js文件和一个http://localhost:5757/weapp/utils/logfilelist的URL。'

这个属于归纳性问题,显然 ChatGPT 通读了全文后总结的还算不错。

哪个文件处理云通讯相关?

  1. query = "哪个文件处理云通讯相关?"
  2. index.query(query)

' double_room_mgr.js'

cc2332c9aa4b8067d2ab74108d9e6980.png

这个问题 chat老师“翻车”了,可能是提问里的“相关”,在中文的上下文环境中产生了歧义,把下一个模块的文件当做了答案。

如何服务器部署?

  1. query = "如何服务器部署?"
  2. index.query(query)

' The server is configured with upstream app_weapp, a server block listening on port 80, and a server block listening on port 443. The server_name is set to the selfHost URL, and the ssl_certificate and ssl_certificate_key are set to the specified paths. The location block is configured to proxy requests to the upstream app_weapp. The files listed in the context are not related to server deployment.'

对于文档里没有的内容,ChatGPT 就开始放飞了,丫丫了一堆正确的废话。

总体效果还是很惊艳的,远远超出了我的想象,特别是归纳总结能力上。搜索定位功能来说,对于开发文档,我们码农可能习惯用关键字匹配搜索更高效,而在模糊搜索领域,其实才是 chat 老师真正的用武之地。

可以想象一些使用场景,通读个人小说,归纳出人物关系和故事线;文案的风格提取,并应用到自己的产品上;读各种金融研究报告,给出投资建议。。。

「未来需要一个会提问的人,一个足够庞大的基础语言模型,以及一份足够专业的指导文档,垂直领域专家就这么诞生了!」

展望和改进

本篇每次将文本构建成矢量数据将花费很长的时间(特别是采用 CPU 方式的话),若能将这部分工作用向量数据库来完成,速度将提升几个数量级。

鉴于现在 chatGPT 在国内服务的不友善,还是很期待类似百度的“文心一言”,阿里的“通义千问“,包括讯飞的大语言模型尽快成熟起来。后续更改 api 接口可切换不同的服务,未来算力问题若不是瓶颈,甚至于可以考虑自建语言模型来做本地化部署,这对知识图谱类应用会是一个有力的竞争者。

ps:吐槽一下联想的售后,本来题图想用stable diffusion来生成的,结果把我一台3090训练机“从CPU降频故障”修到“主板烧CPU”,也是没谁了...

用文心一言暂时顶一下,效果也还不错,国产大模型加油!

源码下载

2bdc4e097caace8607704b5d791a8247.png

本期相关文件资料,可在公众号“深度觉醒”,后台回复:“chat01”,获取下载链接。

b00a891ebce8cb796a71c70713e5af7e.gif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/260716
推荐阅读
相关标签
  

闽ICP备14008679号