这个项目是一个基于openAI的中文知识库问答系统,可以用于智能客服等场景
智能客服等要求根据特定文件的中文对话系统
- docs
- md
- csv
- 前后端分离,前端为
小程序
,后端采用fastapi
- 由于小程序不支持
event-stream
,本项目基于websocket
实现流式传输的效果,适用更多场景 - 基于openAI的ChatModel
(gpt-3.5-turbo)
- 支持多个api_key动态更换api_key
- 基于
chroma
存储向量数据和进行相似度检索,默认的检索方式是余弦搜索 - 支持
openAI
代理 -
实现api_key状态管理,可查询用量余额,基于openAI账号的api_key管理 - 运维复杂度低,只需要引入
redis
数据库,即可快速构建 - 智能问答推荐,实现更加精准的答复
- 使用M3e-base中文嵌入模型,召回文档能力更强
- 一键
Docker
部署 - 智能缓存,问题重复下,无需走openAI接口,实现快速响应
由于官方的余额查询相关接口鉴权方法更换,现已去除接口动态管理功能
需要修改env_template
为.env
文件,具体参数说明如下:
- OPENAI_API_BASE:openAI代理地址设置,例如:
https://xxxxx.com/v1
,如果无需使用代理,请留空即可,默认会走官方接口 - EXPIRE_DAYS:所有api_key在redis中的可留存时间,例如:
60
(默认单位为天数
) - REDIS_HOST:redis主机地址,例如
127.0.0.1
- REDIS_PORT:redis端口号,例如:
6379
- REDIS_PASSWORD:redis密码,没有密码则为空即可
- REDIS_DB:redis数据库,例如:
0
- 安装必备模块
pip install -r requirements.txt
- 安装项目依赖的模型,如果速度慢可以自行下载该模型,在此项目根目录下命名为
m3e-base
,存放模型数据
git lfs install
git clone https://huggingface.co/moka-ai/m3e-base
- fastapi使用的是
uvicorn
,本项目app.py
直接运行即可
python3 main.py
- 下载本项目代码
git clone https://github.com/kjhuanhao/Chinese-Knowledge-Base-QA.git
- 安装项目依赖的模型,如果速度慢可以自行下载该模型,在此项目根目录下命名为
m3e-base
,存放模型数据
git lfs install
git clone https://huggingface.co/moka-ai/m3e-base
- 构建镜像
自行修改
<>
中的内容
docker build -t <your_images_tag> Chinese-Knowledge-Base-QA/
- 运行容器
自行修改
<>
中的内容
mkdir db
docker run -id -p 13010:8000 --name <your_container_name> -v $PWD/db:/chineseQA/db <your_images_tag>
在使用之前需要初始化你的文件,在初始化过程中,会获取相关的embeddings然后存储到本地的chroma向量数据库,会创建一个db文件夹存储向量数据,用于后续的相关问答操作
由于向量化需要时间,此接口速度会较慢,暂时未做边界处理,当然可以打包db文件夹,替换服务器内的db文件夹,这样就不需要初始化了
POST /initialize
content-type: application/json
{
"filename": "we",
"file_type": "csv"
}
成功示例
{
"code": 200,
"data": "初始化成功",
}
失败示例
{
"code": 500,
"data": "初始化失败",
}
目前仅支持单文件上传,上传后会存储在项目data目录下
POST /upload_file
content-type: multipart/form-data
成功示例
{
"code": 200,
"data": "上传成功"
}
接口只接受普通文本,返回也是文本,问答接口无上下文,默认的gpt等待时间为30s,如果超过30s未响应socket会断开连接,在后端响应完信息后会主动断开socket连接
GET /ask
Upgrade: websocket
Connection: Upgrade
POST /api_key/add
content-type: application/json
{
"api_key": [
{
"your_email1":"your_api_key"
},
{
"your_email2":"your_api_key2"
}
]
}
成功示例
{
"code": 200,
"data": [
{
"your_email1":"your_api_key"
},
{
"your_email2":"your_api_key2"
}
]
}
GET /api_key/get_all_api_keys
成功示例
{
"code": 200,
"data": [
{
"email": "dk@xx.com",
"api_key": "sk-"
},
{
"email": "A@xx.com",
"api_key": "sk-"
},
{
"email": "Fe@xx.com",
"api_key": "sk-"
},
{
"email": "S@xx.com",
"api_key": "sk-"
},
{
"email": "C@xx.com",
"api_key": "sk-"
}
]
}