一、背景
最近人工智能(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的参考步骤如下,如果已经安装,可以跳过这一步。
# 安装 Docker``curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun``systemctl enable --now docker``# 安装 docker-compose```curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose```chmod +x /usr/local/bin/docker-compose``# 验证安装``docker -v``docker-compose -v``# 如失效,自行百度~
2.新建文件夹,下载配置文件和docker-compose.yml文件
mkdir fastgpt``cd fastgpt``curl -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/v1``CHAT_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.key``chmod 600 ./mongodb.key``# 修改密钥权限,部分系统是admin,部分是root``chown 999:root ./mongodb.key
mongo:` `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=true``rs.initiate({` `_id: "rs0",` `members: [` `{ _id: 0, host: "mongo:27017" }` `]``})``# 检查状态。如果提示 rs0 状态,则代表运行成功``rs.status()
四、源码部署
由于FastGPT的源码是支持本地打包并启动的,所以我们在服务器上做下载源码、打包、启动的操作,就也可以远程访问启动后的服务。
打包和启动的命令如下:
npm install -g pnpm``pnpm i``cd projects/app``pnpm install``pnpm 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 builder``COPY . /usr/src/app``WORKDIR /usr/src/app``RUN npm install -g pnpm``RUN pnpm i``ENTRYPOINT ["sh", "-x", "/usr/src/app/_appconfig/start.sh"]
start.sh文件如下:
#!/bin/bash``cd /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需要考虑的就比较多了,这个也是使用源码部署的一个缺点。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。