一、背景
最近人工智能(AI)非常热门,许多内部系统都希望能够利用GPT实现一些基础知识的问答和分析功能。
但是往往是需要"喂"给GPT很多内容。举个简单的例子,例如我如果直接问GPT我们公司里面接口自动化相关的接入问题咨询可以找谁,它是没有办法直接回答的,我们必须先给它前置的知识。
但是GPT对于上下文的Token总量也会有一定的限制,且不好维护。
利用RAG(Retrieval-Augmented Generation)模型,将知识录入到知识库中,然后根据问题的相似度检索出最相似的答案,是目前一个比较流行的方案。
RAG的工作流程通常包括以下几个步骤:
检索阶段:给定一个输入查询,系统首先从一个大型文档库中检索出与查询相关的文档或片段。这一阶段通常使用信息检索技术,如向量检索等。生成阶段:在检索到相关文档后,生成模型会利用这些文档的信息来生成最终的回答或文本。这一阶段的目标是将检索到的信息与输入查询结合起来,生成更为准确和上下文相关的输出。RAG的优势在于它能够利用知识库的信息,从而在生成文本时提供更丰富的背景知识,尤其在面对复杂问题或需要特定知识的任务时,表现得尤为出色。这种方法在问答系统、对话生成和文本摘要等任务中得到了广泛应用。
目前市面上有很多开源版本的工具可以支持在本地部署使用,而且后续还可以根据需要自定义内容,非常方便。
我们质量效能组目前主要使用的是FastGPT,下面我将以FastGPT为例介绍本地搭建的步骤。
二、平台介绍
目前市面上RAG(补充知识)的产品还是比较多的,总体功能也比较类似,基础功能都大差不差。我们内部的同学也试用了一段时间dify。
FastGPT可以设置开场白、标注预期回答、提供比较多的参数调整回答,功能更为全面,知识库检索效果相对比较好。
FastGPT 是一个基于大语言模型的知识库问答系统。它可以:
通过导入文档或已有问答对进行训练。自动数据预处理,提供手动输入、直接分段、CSV等多种数据导入途径,其中"直接分段"支持通过PDF、WORD、Markdown和CSV文档内容作为上下文。FastGPT会自动对文本数据进行预处理、向量化和QA分割,节省手动训练时间,提升效能。api集成,支持外部平台调用openApi实现问答。源码地址:
https://github.com/labring/FastGPT系统部署可以分成两种 :
基于源码的部署,优点是能修改源码,可以自定义添加一些的功能,例如我们在自己搭建的平台上增加了内部文档扫描录入的功能。基于docker镜像部署,优点是部署简单。三、镜像部署
镜像部署是使用docker-compose实现,在docker-compose中配置FastGPT服务和它所有依赖的服务,通过 docker-compose up -d 一键启动。
1.安装docker和docker-compose的参考步骤如下,如果已经安装,可以跳过这一步。
# 安装 Dockercurl -fsSL https://get.docker.com | bash -s docker --mirror Aliyunsystemctl enable --now docker# 安装 docker-composecurl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose# 验证安装docker -vdocker-compose -v# 如失效,自行百度~2.新建文件夹,下载配置文件和docker-compose.yml文件
mkdir fastgptcd fastgptcurl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json # pgvector 版本curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml在docker-compose.yml文件中,可以看到部署FastGPT 实际会部署多个服务,包括postgrepsql和mongo等。
其中,postgrepsql用于存储向量数据,而mongo用于存储一些业务数据。
计算机并不像人一样能够直接理解文字。人们发明了一种叫做"向量",向量可以简单地理解成一组数字的列表。
通过数学的方法,我们可以用向量之间的距离来判断它们之间的相似程度。这就好像我们在图书馆里找书一样,我们可以根据书的内容找到相似的书。
使用数据库工具连接并打开postgrepsql数据库,可以看到FastGPT将问题转换成向量的格式。用于问题的检索。
在这个docker-compose.yml配置文件中我们需要修改OPENAIBASEURL和CHATAPIKEY参数。对于镜像相关内容不太熟悉的同学,建议保持其他默认设置即可。
OPENAIBASEURL和CHATAPIKEY的格式参考如下,OPENAIBASEURL的地址后面都会跟着一个v1:
OPENAI_BASE_URL=https://oneapi.qunhequnhe.com/v1CHAT_API_KEY=sk-FuotRXTXUm145tQaC97bxxx12c4eFfA77f175bF7E921F1注意 :如果已经有现成的postgrepsql或mongo等服务,理论上也可以使用自己的。
比如你已经有现成的mongo服务,在docker-compose.yml中可以移除docker-compose.yml文件中关于mongo服务的部分,记得顺便移除其他服务启动的时候对该mongo的dependson,然后将MONGODBURI中配置现有mongo的地址。但是不太建议这要做,因为FastGPT会依赖数据库的一些特性,自己的mongo、postgresql数据库很有可能是不支持的,比如postgresql是需要支持向量的。
我还发现一个比较坑的点,最新版默认启动的配置里面是有带sand-box的,目前我没有发现它的必要性,反而启动了sand-box,导致了地址冲突,监控平台无法监控到我们这台机器了,删除后解决。
修改完docker-compose.yml 配置后,执行 docker-compose up -d 就可以启动。如果需要终止就执行 docker-compose down。
正常如果启动没有问题,可以通过 ip:3000(默认端口)访问服务,默认登录用户名为root , 密码1234。
如果无法访问,大概率是数据库启动出错了,可以试试用数据库连接工具连接试试, 也有可能是防火墙的问题,配置下就行。
如果mongo连不上,大概率mongo没有启起来,需要修改docker-compose.yml关于mongo的部分。
openssl rand -base64 756 > ./mongodb.keychmod 600 ./mongodb.key# 修改密钥权限,部分系统是admin,部分是rootchown 999:root ./mongodb.keymongo: image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 container_name: mongo restart: always ports: - 27017:27017 networks: - fastgpt command: mongod --keyFile /data/mongodb.key --replSet rs0 environment: - MONGO_INITDB_ROOT_USERNAME=myusername - MONGO_INITDB_ROOT_PASSWORD=mypassword volumes: - ./mongo/data:/data/db - ./mongodb.key:/data/mongodb.key# 查看 mongo 容器是否正常运行docker ps# 进入容器docker exec -it mongo bash # 连接数据库(这里要填Mongo的用户名和密码)mongo -u myusername -p mypassword --authenticationDatabase admin # 初始化副本集。如果需要外网访问,mongo:27017 。如果需要外网访问,需要增加Mongo连接参数:directConnection=truers.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo:27017" } ]})# 检查状态。如果提示 rs0 状态,则代表运行成功rs.status()四、源码部署
由于FastGPT的源码是支持本地打包并启动的,所以我们在服务器上做下载源码、打包、启动的操作,就也可以远程访问启动后的服务。
打包和启动的命令如下:
npm install -g pnpmpnpm icd projects/apppnpm installpnpm start打包启动前,我们需要在 projects/app 下找到.env.template文件,新建一个.env.local 同路径下 ,将 .env.template的配置,复制到.env.local 中,修改配置MONGODBURI(mongodb的地址)、PGURL(postgresql的地址)、OPENAIBASEURL(openApi的地址)、CHATAPIKEY(openApi的key)
有时候我们希望使用源码部署,但是有没有现成的Mongo和postgresql。
我们可以先使用上面docker镜像部署的方式,先把这两个数据库部署了,在 .env.local文件中配置这两个数据库的连接地址。然后打包并启动。
我们公司的部署平台是moon,moon的部署流程是先下载源码,然后读取源码根目录下的appconfig的文件夹下的buildDockerfile文件执行,生成一个K8s pod。
因此我们在源码的根目录新建一个appconfig文件夹,然后新建一个buildDockerfile文件:
FROM node:18.15-alpine AS builderCOPY . /usr/src/appWORKDIR /usr/src/appRUN npm install -g pnpmRUN pnpm iENTRYPOINT ["sh", "-x", "/usr/src/app/_appconfig/start.sh"]start.sh文件如下:
#!/bin/bashcd /usr/src/app/projects/app;pnpm install;pnpm start镜像的node版本建议最好能大于18 , 不然可能会报错。
五、OpenApi外部使用
登录后,申请一个token:
代码示例:
POST http://10.1.9.40:3000/api/v1/chat/completions{ "chatId": "abcd", "stream": false, "detail": false, "messages": [ { "content": "澳门面积多大", "role": "user" } ]}chatId 如果是非null , 同一个,就会看上下文stream 字段表示是否返回的时候是一个一个字返回detail 表示是否展示详情注意:需要加一个header ,value 是我们上面申请到的值。
下图可以看出,确实是能带上上下文的。
六、总结
1、FastGPT平台的搭建,如果大部分都使用默认的配置,还是比较简单的,官方的文档写的也比较详细。
我的踩坑原因主要来自于不使用默认的配置,例如使用自己的数据库、修改默认的端口这些。导致多花了不少的时间。平台的维护成本不高,需要维护的主要是mongo和postgresql数据库,mongo存储了所有的业务数据,例如账户密码,应用信息,调用记录等等。postgresql存储的是知识库信息。之前想使用自己的数据库的原因是怕docker创建的数据库数据的丢失,目前我们知识库已经录入了5w多条知识,已经有不少组使用知识库加OpenApi的方式,在做一些小助手问答,因此我后续还需要考虑数据备份防丢失的问题。2、FastGpt 从我们部署到现在也已经快一年的时间,有很多功能都做了升级,并且postgresql的向量库的版本也做了升级,效果应该会相较于目前我们部署的版本会有比较多的提升,计划近期排期对我们平台做一个升级。
3、对于通过镜像部署的FastGpt,升级是比较简单的,按照官方文档的教程,只需要按照顺序一个版本一个版本升级即可。但是使用源码部署的FastGpt需要考虑的就比较多了,这个也是使用源码部署的一个缺点。
作者:许秀
来源-微信公众号:酷家乐技术质量
出处:https://mp.weixin.qq.com/s/f05J7uaTFQ1RNqs5yDlrQg