chatgpt数据本地化部署 用 ChatGPT 采用自有数据集训练问答机器人

默认分类1年前 (2023)发布 admin
3,535 0
ChatGPT国内版

前言

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

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

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

文心一言 环境准备 安装 3.8

conda create -n chat python=3.8
conda activate chat

配置 环境

conda install ipykernel
python -m ipykernel install --user --name chat --display-name "chat"

安装

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

这里注意版本匹配,我笔记本上采用的是 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

安装编译

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

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

出错

pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

https://github.com/oschwartz10612/poppler-windows/releases/

下载 ,并添加环境变量。

与 .six 版本冲突

'LTChar' object has no attribute 'graphicstate' Error in a docker container

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

chatgpt数据本地化部署 用 ChatGPT 采用自有数据集训练问答机器人

gcc 和 ninja

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

准备训练数据

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

jupyter notebook

import os
os.environ['OPENAI_API_KEY'] = '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'

万事俱备,我们来配置一下 的 api key。(这里省略一万步,最近申请 的难度又提升了不少,看来白嫖党给 的算力压力很大啊~~,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

将自定义数据导入

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

训练数据

文本矢量化,并接入

index = VectorstoreIndexCreator().from_loaders(loaders)

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

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

问答效果

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

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

' app.js'

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

chatgpt数据本地化部署 用 ChatGPT 采用自有数据集训练问答机器人

/index.js有什么作用?

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

' /index.js is used to the for the . It is for to the .'

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

介绍一下这个项目?

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

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

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

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

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

' .js'

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

如何服务器部署?

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

' The is with , a block on port 80, and a block on port 443. The is set to the URL, and the and are set to the paths. The block is to proxy to the . The files in the are not to .'

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

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

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

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

展望和改进

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

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

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

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

❞ 源码下载

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

© 版权声明
广告也精彩

相关文章

暂无评论

暂无评论...