本项目将Havenask与大模型结合,Havenask作为向量数据库,实现基于文档的问答系统。可以使用ChatGPT服务,也可以全部基于开源方案(ChatGLM-6b)实现本地的私有部署。
流程图如下:
更简单的使用Havenask的方式是在阿里云OpenSearch上创建实例,详情请参考OpenSearch+大模型方案。
如果需要本地部署Havenask,可以按下列步骤进行。
- CPU 16核, 64G内存
- GPU需要16G显存
- 需要安装docker环境
如果需要在docker容器中使用GPU
- docker版本大于等于19.03
- 在宿主机上安装
- 在
docker/create_container.sh
脚本中,docker run命令增加参数--gpus all
- 克隆havenask仓库
git clone https://github.com/alibaba/havenask.git
- 创建容器
cd ~/havenask/docker
./create_container.sh havenask registry.cn-hangzhou.aliyuncs.com/havenask/ha3_runtime:latest
- 登陆容器
./havenask/sshme
详情请参考havenask
使用conda管理python环境。下载linux环境的Anaconda
,按提示步骤完成安装。
bash Anaconda3-2023.03-1-Linux-x86_64.sh
安装完conda后, 执行下面的命令创建并激活python环境
source ~/.bashrc
conda create --name havenask_llm python=3.10
conda activate havenask_llm
安装python依赖
cd ~/havenask/llm # 当前目录为/home/$USER
pip install -r requirements.txt
在 .env
文件中配置大模型相关信息
- 使用ChatGPT
LLM_NAME=OpenAI
OPENAI_API_KEY=***
OPENAI_API_BASE=***
OPENAI_EMBEDDING_ENGINE=text-embedding-ada-002
OPENAI_CHAT_ENGINE=gpt-3.5-turbo
VECTOR_STORE=Havenask
HA_QRS_ADDRESS=127.0.0.1:45800
HA_TABLE_NAME=llm
- 使用微软azure OpenAI
LLM_NAME=OpenAI
OPENAI_API_KEY=***
OPENAI_API_BASE=***
OPENAI_API_VERSION=2023-03-15-preview
OPENAI_API_TYPE=azure
# 填写azure中OpenAI模型的deployment
OPENAI_EMBEDDING_ENGINE=embedding_deployment_id
OPENAI_CHAT_ENGINE=chat_deployment_id
VECTOR_STORE=Havenask
# Havenask信息
HA_QRS_ADDRESS=127.0.0.1:45800
HA_TABLE_NAME=llm
- 使用ChatGLM-6b
LLM_NAME=ChatGLM
VECTOR_STORE=Havenask
HA_QRS_ADDRESS=127.0.0.1:45800
HA_TABLE_NAME=llm
# 模型服务地址, 可选
#CHATGLM_SERVER_ENDPOINT=http://127.0.0.1:8001/
#EMBEDDING_SERVER_ENDPOINT=http://127.0.0.1:8008/
# 开源模型名称,如果服务地址为空,则本地加载模型
EMBEDDING_MODEL=GanymedeNil/text2vec-large-chinese
CHATGLM_MODEL=THUDM/chatglm-6b
使用embed_files.py脚本对数据文件进行处理,目前支持.md
和.pdf
格式的文件。处理完成后会生成一个Havenask引擎格式的数据文件。
例如处理Havenask wiki数据,忽略.git
和english
目录下的文件。
git clone https://github.com/alibaba/havenask.wiki.git
python -m script.embed_files -f havenask.wiki -o ./llm.data -i .git,english
- -f选项指定需要构建的文档目录
如果从Huggingface
自动下载模型失败,参考从本地加载模型,手动下载模型。
将上一步生成的数据文件llm.data
拷贝到/ha3_install/example/data/llm.data
,启动havenask服务,case脚本会将数据写入引擎。根据需要可以修改端口号,并将.env
中配置的QRS端口一并修改。
cp ./llm.data /ha3_install/example/data/llm.data
/ha3_install/example/common/case.py run --case llm
- Havenask服务目前需要python2.7启动任务
cd ~/havenask/llm
python api_demo.py
测试请求
curl -H "Content-Type: application/json" http://127.0.0.1:8000/chat -d '{"query": "havenask是什么"}'
输出:
{
"success":true,
"result":"havenask 是一个分布式数据库管理系统,由阿里巴巴开发。它支持 SQL 查询语句,并提供了内置的 UDF(User Defined Function)功能,允许客户以插件形式开发自己的 UDF。havenask 可以用于存储、处理和分析大规模数据,具有高可用性、可扩展性和高性能的特点。havenask 可以通过分布式运维工具进行部署,支持在物理机上拉起分布式集群,也可以在云平台上使用云原生架构进行部署。",
"history":[
[
"已知信息:\n Content: NAME> havenask/ha3_runtime:latest\n```\n\n* 登陆容器\n```\n./<CONTAINER_NAME>/sshme\n```\n\n* 运行测试 \n启动运行时容器后,构建测试数据索引以及查询引擎的方法见example\n\n## 集群模式\n集群模式需要通过Havenask的分布式运维工具部署,详细信息请参考Havenask分布式运维工具\n# 编译代码\n\n## 编译环境\n* 请确保编译的机器内存在15G以上,mac编译时需调整Docker容器资源上限(包括CPU、Memory、Swap等),具体路径:Docker Desktop->setting->Resources。\n* 请确保cpu位8core以上,不然编译比较慢。\n\n## 获取开发镜像\n\n```\ndocker pull havenask/ha3_dev:latest\n```\n## 下载代码\n```\ncd ~\ngit clone [email protected]:alibaba/havenask.git\n```\n\n## 启动容器\n```\ncd ~/havenask/docker\n./\nContent: ### 简介\n\nhavenask SQL支持在查询语句中使用内置的UDF(User Defined Function),也允许客户以插件形式开发自己的UDF。\nContent: # 介绍\nHavenask PE tools,简称hape,是havenask的简易分布式运维工具。用户可以利用hape在单台或者多台物理机上拉起分布式havenask集群,并进行基础的运维操作。\n\n# 名词解释\n* domain\n * 一个havenask集群被称为一个domain,一个hape工具可以管理多个domain\n* config\n * hape config:关于havenask集群部署计划的配置文件,一个domain有一个hape config\n * biz config:havenask引擎本身加载的配置,分为离线配置offline config和在线配置online config\n* hape cmd\n * hape命令行工具,负责向domain daemon提交用户请求\n* hape domain daemon\n * 每当用户使用hape cmd创建一个domain,hape cmd都会在所在机器后台启动一个domain daemon进程用于专门管理该domain。所有hape cmd命令都会在后台被domain daemon异步处理\n* hape worker & worker daemon\n * hape worker\n \n\n 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说不知道,不允许在答案中添加编造成分,答案请使用中文。\n 问题是:havenask是什么",
"havenask 是一个分布式数据库管理系统,由阿里巴巴开发。它支持 SQL 查询语句,并提供了内置的 UDF(User Defined Function)功能,允许客户以插件形式开发自己的 UDF。havenask 可以用于存储、处理和分析大规模数据,具有高可用性、可扩展性和高性能的特点。havenask 可以通过分布式运维工具进行部署,支持在物理机上拉起分布式集群,也可以在云平台上使用云原生架构进行部署。"
]
],
"source":["快速开始.md","UDF.md","Havenask分布式运维工具.md"],
"finished":true
}
cd ~/havenask/llm
python cli_demo.py
输入exit退出,输入clear会清空history,输入其他内容进行问答。
cd ~/havenask/llm
python web_demo.py
ChatGLM-6b部署所需要的资源可以参考官方文档
如果本地机器资源不足,可以选择远程部署模型,如在带GPU的ECS上。部署脚本参考deploy_embedding.py和deploy_chatglm.py。脚本会从huggingface
自动下载模型文件。部署脚本依赖torch
和transformers
。
- 部署向量化模型
python script/deploy_embedding.py
默认端口8001
- 部署ChatGLM-6b
python script/deploy_chatglm.py
默认端口8008
- 修改
.env
中的服务地址
CHATGLM_SERVER_ENDPOINT=http://{ip}:8001/
EMBEDDING_SERVER_ENDPOINT=http://{ip}:8008/
本项目默认使用大模型ChatGLM6b与向量化模型GanymedeNil/text2vec-large-chinese
更换模型需要修改.env
文件中的模型名称,并在llm_adapter中增加加载新模型的adapter,可以参考local_chatglm.py,远程部署参考deploy_chatglm.py。
因为不同的文本向量化模型生成的embedding维度不同,因此需要修改havenask配置中的维度信息,修改以下文件中dimension
的值:
/ha3_install/example/cases/llm/in0_schema.json
代码会使用transformers
自动从huggingface下载模型。如果网络环境比较差,下载模型很慢或者经常超时。可以手动下载模型到本地目录,然后从本地加载模型。
- 安装 Git LFS
- 从Huggingface下载模型至本地:
cd ~/havenask
git clone https://huggingface.co/THUDM/chatglm-6b
git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese
- 将
.env
中的模型名称换成本地的绝对路径
,如:
EMBEDDING_MODEL=/home/{USER}/havenask/text2vec-large-chinese
CHATGLM_MODEL=/home/{USER}/havenask/chatglm-6b
将USER替换成实际的用户名称,这里需要模型目录的绝对路径。
默认的切片方式为按token数加overlap的方式进行切片,参考sentence_spliter.py实现新的切片方式
本解决方案中的“开源向量模型”、“大模型(如chatgpt)”等来自第三方(合称“第三方模型”)。阿里巴巴无法保证第三方模型合规、准确,也不对第三方模型本身、及您使用第三方模型的行为和结果等承担任何责任。请您在访问和使用前慎重考虑。
此外我们也提醒您,第三方模型附有“开源许可证”、“License”等协议,您应当仔细阅读并严格遵守这些协议的约定。