网上看到本地知识库问答机器人的demo(https://blog.csdn.net/weixin_42608414/article/details/129493302),希望自己部署实践一下
实践过程中遇到了很多的工程问题,代码运行过程中出现各种报错,解决问题过程发现网上都能找到解决方案,抱着回馈的心态,同时为了方便后期回溯,在此做一个记录,也为遇到相同问题的小伙伴提供一些参考
本人是移动客户端开发背景,python方面纯属小白,所以很多问题描述可能不是很专业,解决的效率比较低,大家谨慎参考
运行效果:
由于本人购买的是腾讯云轻量应用服务器,地域和可用区是上海,所以如果想要调用openai的api接口,就必须先解决科学上网的问题,这里使用的方案是在CentOS中安装clash客户端,版本是clash-linux-amd64-v1.16.0,下载地址:https://github.com/Dreamacro/clash/releases,下载后完成解压,需要先配置代理
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
然后为clash添加配置:
wget -O /opt/clash/config.yaml “clash的订阅链接” --no-check-certificate
上面这行命令中的“clash的订阅链接”需要找你对应的运营商提供,手机端安装clash app也是使用这个订阅链接进行配置,然后进入到解压后的clash目录执行
./clash-linux-amd64-v1.16.0 -d . (末尾的点号需保留)
想要在后台运行的话可以执行这行命令
nohup ./clash-linux-amd64-v1.16.0 -d . > /dev/null 2>&1 &
如果运行正常的话日志大概会是下面这样:
INFO[0000] Start initial compatible provider 直接连接
INFO[0000] Start initial compatible provider 国外流量
INFO[0000] HTTP proxy listening at: [::]:7890
INFO[0000] RESTful API listening at: [::]:9090
INFO[0000] SOCKS proxy listening at: [::]:7891
INFO[0000] Redirect proxy listening at: [::]:7892
这时可以通过curl来检测本机能否访问openai的接口,通过执行
curl https://api.openai.com/v1/models -H “Authorization: Bearer sk-xxx”(sk-xxx指代你的api_key)
查看返回接口,如果正常返回了模型列表(参考:https://platform.openai.com/docs/api-reference/authentication),则说明链路没有问题
本人使用苹果账号登录,然后在接码平台sms-activate购买了一个美国的物理手机号(虚拟号无法通过认证),最终完成注册,这个网上教程比较多。
最早安装的anaconda版本比较低,对应的python是3.7的版本,直接结果下载的langchain版本很低,Chromadb都还没有支持,于是尝试通过conda更新python版本,执行conda install python==3.10一直提示Solving environment: / 已杀死 ,着实无解,最终索性把anaconda卸载,重装较高的版本:Anaconda3-2023.03-0-Linux-x86_64.sh,下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,即可将Python版本更新至3.10.9
安装Chromadb时先是出现MemoryError,通过指令中添加–no-cache-dir解决,完整指令:
pip install --no-cache-dir chromadb -i https://pypi.doubanio.com/simple
重新执行后安装过程中出现报错:g++: 错误:unrecognized command line option ‘-std=c++14’,参考这篇文章:https://blog.csdn.net/qq_42189083/article/details/109612289中的原因分析部分,需要升级g++版本,最初参考这篇文章尝试了下载源码编译安装的方案,尝试后发现g++编译过程中很容易出现各种报错,无意中发现另外一种解决方案,参考文章:https://blog.csdn.net/hnpylt/article/details/120993703,按照文章中执行
yum install centos-release-scl
后出现报错,无法进行网络连接,参考网上方案为yum设置阿里云镜像源,发现仍然无法连接,找了很久才发现问题,解决方案参考:https://blog.csdn.net/Entity_G/article/details/124734112 ,虽然我遇到的问题现象和文章中不是完全一致,但是最终解决方案都是执行
export http_proxy=’ ’
export https_proxy=’ ’
取消代理配置,然后执行yum install centos-release-scl,一切正常了,通过这个方案顺利完成gcc版本升级,源码编译的方案浪费了很长的时间,这个方案虽然也遇到阻塞,但是阻塞点比较少,升级成功后执行chromadb安装指令,顺利完成安装。
Demo代码调试过程中出现了报错:ModuleNotFoundError: No module named ‘unstructured’,本来ModuleNotFoundError是比较常见的报错,直接安装对应的依赖即可解决,但是鬼使神差拿这段内容在搜索引擎中没有搜出有效的结果,再加上感觉“unstructured”不大像是python模块的名字,所以天真的以为是报错不准确,就往其他方向排查问题了,结果在langchain的官方文档中看到这个:https://js.langchain.com/docs/modules/indexes/document_loaders/examples/file_loaders/unstructured
之后瞬间醒悟,才想起通过pip install unstructured解决报错。
Demo代码调试过程中遇到punkt数据缺失的报错,提示需要在python的环境中执行以下代码
>>> import nltk
>>> nltk.download()
进入python运行代码之后发现一直停留在:[nltk_data] Downloading package punkt to /root/nltk_data…,怀疑是下载速度过慢,参考这篇文章:https://blog.csdn.net/ybdesire/article/details/115742608发现了手动下载数据的方案,为了达到更快的下载速度,nltk_data-gh-pages.zip包的下载链接替换成了码云平台的链接:https://gitee.com/qwererer2/nltk_data/repository/archive/gh-pages.zip,有个注意事项是下载完成之后一定要到tokenizers目录下把punkt.zip文件解压,不然运行还是会报错。