前言
最近 LLM 模型很火,chatGPT 涵蓋的知識(shí)范圍之廣,令人嘆為觀止。然而碼農(nóng)肯定不能滿足于現(xiàn)有的知識(shí)庫,要擴(kuò)展自有數(shù)據(jù)才能發(fā)揮其更大的實(shí)用價(jià)值。
一般來說,深度學(xué)習(xí)模型大多采用 finetune 的方式來增加訓(xùn)練數(shù)據(jù),但 LLM 模型太大了,訓(xùn)練成本過高。無論是離線或是在線訓(xùn)練樣本,短時(shí)間只有 OpenAI 可為。隨著通用大模型的興起,另外一種被稱為 ”前導(dǎo)詞注入“ 的提示工程(prompt)逐漸成熟,也能接入自有數(shù)據(jù)。
本篇主要采用后面這種方法,將軟件開發(fā)文檔轉(zhuǎn)換為矢量數(shù)據(jù),再通過 chatGPT 構(gòu)建更好的問答交互體驗(yàn),利用強(qiáng)大的歸納搜索能力,大大提高信息獲取效率。

環(huán)境準(zhǔn)備
安裝 python 3.8
conda create -n chat python=3.8
conda activate chat
配置 jupyter 環(huán)境
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

這里注意版本匹配,我筆記本上采用的是 cuda 11.6 的版本。若顯卡不夠強(qiáng)大的話,也可以安裝 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

由于要在 windows 環(huán)境下通過源碼編譯 detectron2,這里有幾個(gè)坑要提示一下:
pdf2image 出錯(cuò)
pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

https://github.com/oschwartz10612/poppler-windows/releases/
下載 poppler,并添加環(huán)境變量。
pdfminer 與 pdfminer.six 版本沖突
'LTChar' object has no attribute 'graphicstate' Error in a docker container
卸載 pdfminer 和 pdfminer.six 后重新安裝即可修復(fù)。

gcc 和 ninja
編譯過程中需要配置 gcc,我這里采用的是 MinGW,而 ninja 在windows 下并非可選(否則編譯不通過),需放置到 Path 下。(文末有相關(guān)文件下載鏈接)

準(zhǔn)備訓(xùn)練數(shù)據(jù)
將 pdf 文檔 放置于 /text 目錄下,可放置多個(gè)文件,這里使用的是音視頻的開發(fā)文檔 meeting.pdf。
jupyter notebook

import os
os.environ['OPENAI_API_KEY'] = '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'
萬事俱備,我們來配置一下 OpenAI 的 api key。(這里省略一萬步,最近申請 ChatGPT 的難度又提升了不少,看來白嫖黨給 OpenAI 的算力壓力很大啊~~,plus 又對國內(nèi)發(fā)行的國際信用卡拒絕,總之很煩)
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.indexes import VectorstoreIndexCreator
配置訓(xùn)練采用 gpu 或是 cpu
from detectron2.config import get_cfg
cfg = get_cfg()
cfg.MODEL.DEVICE = 'gpu' #GPU is recommended
將自定義數(shù)據(jù)導(dǎo)入loader
text_folder = 'text'
loaders = [UnstructuredPDFLoader(os.path.join(text_folder, fn)) for fn in os.listdir(text_folder)]

訓(xùn)練數(shù)據(jù)
文本矢量化,并接入 ChatGPT
index = VectorstoreIndexCreator().from_loaders(loaders)
由于開發(fā)文檔非常?。?69k),在我的 1060 的顯卡上只需要不到1分鐘就完成了訓(xùn)練,cpu 會(huì)稍微慢些。

API 的 使用費(fèi)用也十分的低廉,免費(fèi)額度夠用100多次。重度使用者,估計(jì)要考慮上 plus 版本了。

問答效果

服務(wù)器的主入口文件是什么?
query = "服務(wù)器的主入口文件是什么?"
index.query(query)
' app.js'

這個(gè)問題比較簡單,能直接在文中找到答案,回答是正確的。
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.'
這個(gè)問題顯然文檔中并沒有詳細(xì)描述,只提到了路由定義文件,這回答大概率是 ChatGPT 做出的補(bǔ)充說明。
介紹一下這個(gè)項(xiàng)目?
query = "介紹一下這個(gè)項(xiàng)目?"
index.query(query)
' 這個(gè)項(xiàng)目包含了一個(gè)服務(wù)器,一個(gè)README.md文件,一個(gè)app.js文件,以及double_room,multi_room和live_room三個(gè)文件夾,每個(gè)文件夾都包含一個(gè)index.js文件,以及一些其他的js文件,這些文件用于實(shí)現(xiàn)雙人房間,多人房間和直播房間的功能,還有一個(gè)selfHost的URL,以及一個(gè)logic/double_room_mgr.js文件和一個(gè)http://localhost:5757/weapp/utils/logfilelist的URL。'
這個(gè)屬于歸納性問題,顯然 ChatGPT 通讀了全文后總結(jié)的還算不錯(cuò)。
哪個(gè)文件處理云通訊相關(guān)?
query = "哪個(gè)文件處理云通訊相關(guān)?"
index.query(query)
' double_room_mgr.js'

這個(gè)問題 chat老師“翻車”了,可能是提問里的“相關(guān)”,在中文的上下文環(huán)境中產(chǎn)生了歧義,把下一個(gè)模塊的文件當(dāng)做了答案。
如何服務(wù)器部署?
query = "如何服務(wù)器部署?"
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.'
對于文檔里沒有的內(nèi)容,ChatGPT 就開始放飛了,丫丫了一堆正確的廢話。
總體效果還是很驚艷的,遠(yuǎn)遠(yuǎn)超出了我的想象,特別是歸納總結(jié)能力上。搜索定位功能來說,對于開發(fā)文檔,我們碼農(nóng)可能習(xí)慣用關(guān)鍵字匹配搜索更高效,而在模糊搜索領(lǐng)域,其實(shí)才是 chat 老師真正的用武之地。
可以想象一些使用場景,通讀個(gè)人小說,歸納出人物關(guān)系和故事線;文案的風(fēng)格提取,并應(yīng)用到自己的產(chǎn)品上;讀各種金融研究報(bào)告,給出投資建議。。。
「未來需要一個(gè)會(huì)提問的人,一個(gè)足夠龐大的基礎(chǔ)語言模型,以及一份足夠?qū)I(yè)的指導(dǎo)文檔,垂直領(lǐng)域?qū)<揖瓦@么誕生了!」
展望和改進(jìn)
本篇每次將文本構(gòu)建成矢量數(shù)據(jù)將花費(fèi)很長的時(shí)間(特別是采用 CPU 方式的話),若能將這部分工作用向量數(shù)據(jù)庫來完成,速度將提升幾個(gè)數(shù)量級(jí)。
鑒于現(xiàn)在 chatGPT 在國內(nèi)服務(wù)的不友善,還是很期待類似百度的“文心一言”,阿里的“通義千問“,包括訊飛的大語言模型盡快成熟起來。后續(xù)更改 api 接口可切換不同的服務(wù),未來算力問題若不是瓶頸,甚至于可以考慮自建語言模型來做本地化部署,這對知識(shí)圖譜類應(yīng)用會(huì)是一個(gè)有力的競爭者。
?ps:吐槽一下聯(lián)想的售后,本來題圖想用stable diffusion來生成的,結(jié)果把我一臺(tái)3090訓(xùn)練機(jī)“從CPU降頻故障”修到“主板燒CPU”,也是沒誰了...
用文心一言暫時(shí)頂一下,效果也還不錯(cuò),國產(chǎn)大模型加油!
?
源碼下載

本期相關(guān)文件資料,可在公眾號(hào)“深度覺醒”,后臺(tái)回復(fù):“chat01”,獲取下載鏈接。文章來源:http://www.zghlxwxcb.cn/news/detail-440065.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-440065.html
到了這里,關(guān)于用 ChatGPT 采用自有數(shù)據(jù)集訓(xùn)練問答機(jī)器人的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!