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

81e2c4e45d8d527fb2e28ec77c325756.gif

前言

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

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

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

001d2eda24d93527cbaebbea4533dbc3.png
文心一言

环境准备

安装 python 3.8

conda create -n chat python=3.8
conda activate chat

配置 jupyter 环境

conda install ipykernel
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
76c1fb0c8134633e6d440789b9b21d86.png

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

安装依赖

pip install langchain
pip install unstructured
pip install openai
pip install pybind11
pip install chromadb
pip install Cython
pip3 install "git+https://github.com/philferriere/cocoapi.git#egg=pycocotools&subdirectory=PythonAPI"
pip install unstructured[local-inference]
pip install layoutparser[layoutmodels,tesseract]
pip install pytesseract

安装编译 detectron2

git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2
37632f07afcf6b8697ebb619d428bb31.png

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

pdf2image 出错
pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?
dd189c7183e158f8e0944cdb16d93caf.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 后重新安装即可修复。

329d98228d58ba9e7053d440cd8b7a14.png
gcc 和 ninja

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

b0db95aaa87a114a0e9c78aec612eb00.png

准备训练数据

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

jupyter notebook
8a2278429b950a52cc991c1a57f4c225.png
import os
os.environ['OPENAI_API_KEY'] = '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'

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

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

配置训练采用 gpu 或是 cpu

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

将自定义数据导入loader

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

训练数据

文本矢量化,并接入 ChatGPT

index = VectorstoreIndexCreator().from_loaders(loaders)

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

5eb0c300f256fc5abc1899752f3f05bd.png

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

f66f425ad2be609735a226f50c8e1c19.png

问答效果

0d72eb3020f13d986ce1afc7ec24b99c.png

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

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

' app.js'

9a2556f638fbafaa4b870c5478e8163a.png

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

routes/index.js有什么作用?

query = "routes/index.js有什么作用?"
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 做出的补充说明。

介绍一下这个项目?

query = "介绍一下这个项目?"
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 通读了全文后总结的还算不错。

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

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

' double_room_mgr.js'

e91afafbc087a197bc397e5f772c4108.png

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

如何服务器部署?

query = "如何服务器部署?"
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”,也是没谁了...

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

源码下载

ea8c13fbe164dd0d72cfdfd3732e2622.png

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

f543a9848923722e47610de0a85bf96f.gif

猜你喜欢

转载自blog.csdn.net/weixin_47479625/article/details/130037383
今日推荐