FastGPT:给 GPT 插上知识库的翅膀!0基础搭建本地私有知识库,有手就行

写在前面

上一篇,我们部署了接口管理和分发神器-OneAPI,将所有大模型一键封装成OpenAI协议。见:[OneAPI)。

基于此,本篇继续带领大家搭建一个基于本地知识库检索的问答系统。

有同学说 Coze 不也可以实现同样功能么?

是的,不过在 Coze 上,你需要把知识库文件文件上传到 Coze 的服务器。如果对数据安全有要求,那么搭建本地私有的知识库就更有必要了。

而且,就目前的体验而言,相比下面介绍的 FastGPT,Coze 的知识库检索略逊色一些。

FastGPT,给 GPT 插上本地私有知识库的翅膀,让它可以利用你的领域知识回答问题。

有同学问:和 dify 有什么区别?

相比 dify,FastGPT 在知识库召回上更优,而 dify 产品功能更为丰富,适合 demo 搭建。

传送门:https://github.com/labring/FastGPT

1. FastGPT 部署

前几天,我们分别搞了一台本地 Linux 虚拟机和一台云服务器:

  • Windows上安装Linux子系统,搞台虚拟机玩玩
  • 玩转云服务:手把手带你薅一台腾讯云服务器,公网 IP。

接下来,就把 OneAPI 部署在这台云服务器上,如果你用本地 Linux 虚拟机也是没问题的。

因为本项目还依赖其他服务,所以我们采用 docker-compose 的方式来进行部署,简单几步就能搞定,大大降低小白的部署门槛。

不了解 docker 的小伙伴可以看这里:【保姆级教程】Linux系统如何玩转Docker

1.1 下载配置文件

打开一个终端:

mkdir fastgpt
cd fastgpt
curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml

从 docker-compose.yml 中可以看出:FastGPT 用到的大模型需要兼容 OpenAPI 格式。

没关系,因为上一篇我们已经完成了 OneAPI + MySQL 的部署,只需要把 OneAPI 的 base_url 和 API Key 填入 yml 文件如下位置:

fastgpt:container_name: fastgptenvironment:- OPENAI_BASE_URL=http://101.33.210.166:3001/v1- CHAT_API_KEY=sk-xxx

如果没有部署OneAPI,也没关系,这个 docker-compose.yml 文件包含了 OneAPI 的部署,可以先进入下面的1.3 服务启动

等 OneAPI 启动后,参考:oneapi,在 OneAPI 中手动复制令牌,填到上面 CHAT_API_KEY 的位置。

填写完成后,记得重启 FastGPT 容器:docker restart fastapi

1.2 模型配置

知识库的构建,需要使用向量模型将一段文本转换成向量。在 OneAPI 中我们加入的 GLM 渠道,是支持向量模型的。

为此,需要在 config.json 中将用到的对话模型和向量模型加入进来:

  • 对话模型:采用 “glm-4”
"llmModels": [{"model": "glm-4","name": "glm","maxContext": 16000,"avatar": "/imgs/model/openai.svg","maxResponse": 4000,"quoteMaxToken": 13000,"maxTemperature": 1.2,"charsPointsPrice": 0,"censor": false,"vision": false,"datasetProcess": true,"usedInClassify": true,"usedInExtractFields": true,"usedInToolCall": true,"usedInQueryExtension": true,"toolChoice": true,"functionCall": true,"customCQPrompt": "","customExtractPrompt": "","defaultSystemChatPrompt": "","defaultConfig": {}},]
  • 向量模型:采用 “embedding-2”
"vectorModels": [{"model": "embedding-2", // 模型名(与OneAPI对应)"name": "Embedding-1", // 模型展示名"avatar": "/imgs/model/openai.svg", // logo"charsPointsPrice": 0, // n积分/1k token"defaultToken": 700, // 默认文本分割时候的 token"maxToken": 3000, // 最大 token"weight": 100, // 优先训练权重"defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)"dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)"queryConfig": {} // 参训时的额外参数}]

1.3 服务启动

如果服务器是国内的 IP,建议将 docker-compose.yml 文件中的镜像都改为阿里云的镜像。

配置好 docker-compose.yml 文件后,采取如下命令一键启动:

sudo docker-compose up -d

看到下图,说明正在拉取镜像:

打开宝塔面板,可以看到服务已经在运行中:

1.4 启动失败解决

如果某个容器启动失败,可以采用如下命令重启:

docker restart oneapi
docker restart fastapi

如果还是不行,把 docker 重启试试:

sudo systemctl restart docker

可能有的小伙伴之前在服务器上安装过 MySQL,3306端口被占用,导致这里的 MySQL 容器启动失败。因此,可以终止已安装的 mysql 服务,再重新执行 sudo docker-compose up -d

# 下面命令关闭服务是不行的,会自动重启。所以,进程依然存在,端口依然占用
systemctl status mysqld
systemctl stop mysqld
# 应采用如下命令:查看进程并关闭
pidof mysqld
kill pid

2. FastGPT 应用

2.1 登录 FastGPT

在 docker-compose.yml 配置文件中找到 FastGPT 的端口号:3000。

浏览器中打开:http://IP:Port,例如:http://101.33.210.xxx:3000/。

如果上述地址打不开,需要到服务器中把 3000/3001/3306 端口的防火墙打开。如果你用的是腾讯云服务器,具体操作见:玩转云服务:手把手带你薅一台腾讯云服务器。

防火墙打开后,上述地址就可以访问了,初始账号名 root,密码 1234:

2.2 新建知识库

我们需要先把知识库准备好,便于后续调用。

左侧菜单栏选择知识库,右上角新建:

进来后,点击下面的配置,将索引模型改为 Embedding-1,因为这个才是我们在1.2 模型配置部分加入的向量模型,而 Embedding-2 对应的是默认 GPT 的 "text-embedding-ada-002"模型。配置修改完成,记得保存。

然后上传文件,这里为了跑通测试流程,我选择了文本格式,并简单填写了一些内容:

等待处理,最后文本状态是“已就绪”就是 OK 了。

最后,我们来测试一下,看能否检索到对应内容:

Ok,知识库搭建完毕!

2.3 新建应用

登录 FastGPT 后,先新建一个简易应用:

进入应用后,AI 模型:需要选择刚才放到 config.json 中的 glm 模型。

然后,把刚刚建立的知识库,关联进来。

配置完成后,我们在右侧调试一下。比如我问他 “猴哥是谁”,他会先从知识库中检索到相关信息再回答我:

如果调试没问题了,再点击右上角 发布。成功后,你就拥有一个本地私有知识库增强的 LLM 了。

2.4. API 调用

为了在应用中能够调用刚发布的机器人,我们还需要一个兼容 OpenAI 格式的 API。

别急,FastGPT 也帮你搞定了!

如下图,在刚才发布的应用中间,点击 发布渠道-> API 访问,右侧点击新建,将密钥保存下来,这就是 api_key。

base_url 在哪?红色方框处自取👇

有了 api_key 和 base_url,API 调用就很容易了,关注我的老朋友可能已经非常熟悉以下测试代码(记得 base_url 后面加上/v1):

from openai import OpenAImodel_dict = {'fastgpt': {'api_key': 'fastgpt-xxx','base_url': 'http://101.33.210.xxx:3000/api/v1','model_name': 'glm-4'}
}class LLM_API:def __init__(self, api_key, base_url, model):self.client =  OpenAI(api_key=api_key,base_url=base_url,)self.model = modeldef __call__(self, messages, temperature=0.7):completion = self.client.chat.completions.create(model=self.model,messages=messages,temperature=temperature,)return completion.choices[-1].message.contentif __name__ == '__main__':model = 'fastgpt'llm = LLM_API(model_dict[model]['api_key'], model_dict[model]['base_url'], model_dict[model]['model_name'])user_question = "猴哥是谁"messages = [{"role": "user", "content": user_question},]print(llm(messages))

还记得么?上一篇中,我们采用 chatgpt-on-wechat 搭建了一个微信机器人。

如果把上述 api_key 和 base_url 放到 chatgpt-on-wechat 的配置文件 config.json 中,不就相当于让我们的微信机器人也拥有了基于私有知识库回答问题的能力?

感兴趣的小伙伴赶紧试试吧~

写在最后

如果说,OneAPI 帮你一键封装好所有 LLM 的调用接口,实现 LLM 自由~

那么,FastGPT 则为你的 LLM 插上了知识库的翅膀,实现私有知识库自由~

祝大家借助 OneAPI+FastAPI 玩转大模型,开发出更多 AI 创意应用。

如果本文对你有帮助,欢迎点赞收藏备用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

一、功能实现 1.电脑通过串口发送数据:0F 2.点亮4个LED 二、注意事项 1.发送和接受数据的文本模式 2.串口要对应 3.注意串口的波特率要和程序中的波特率保持一致 4.有无校验位和停止位 三、如何使用串口波特率计算器 1.以本程序为例 2.生成代码如下 void Uar…

[论文笔记]涨点近5%! 以内容中心的检索增强生成可扩展的级联框架:Pistis-RAG

引言 今天带来一篇较新RAG的论文笔记:Pistis-RAG: A Scalable Cascading Framework Towards Content-Centric Retrieval-Augmented Generation。 在希腊神话中,Pistis象征着诚信、信任和可靠性。受到这些原则的启发,Pistis-RAG是一个可扩展…

windows远程桌面到 Linux系统(Ubuntu:22.04)—— 安装xrdp软件

1、在Linux系统上安装xrdp软件 sudo apt update sudo apt install xrdp2、安装完成后,需要开启xrdp服务 sudo systemctl start xrdp sudo systemctl enable xrdp打印返回 Synchronizing state of xrdp.service with SysV service script with /lib/systemd/system…

一键叫车|开发打车小程序,随时随地便利出行!

随着移动互联网的普及,人们出行的方式也在不断发生变化。对于出行多样化和便捷化的需求,一款打车小程序可以方便人们的出行,提高出行效率和便捷性。打车小程序能够根据用户的出行需求为其打造个性化的出行方案,从而让用户的出行生…

【DevOps】在云原生时代的角色与重要性探索

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

【高中数学/指数、对数】已知9^m=10,a=10^m-11,b=8^m-9,则ab两数和0的大小关系是?(2022年全国统考高考真题)

【问题】 已知9^m10,a10^m-11,b8^m-9,则() A.a>0>b B.a>b>0 C.b>a>0 D.b>0>a 【解答】 首先注意到10^log10_11-110,8^log8_9-90, 问题就转化为log8_9,log9_10,log10_11谁大谁小的问题, 再进一步…

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时,尤其是在国内环境下,由于网络原因,从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度,我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…

MES系统在装备制造行业核心应用场景介绍

MES软件在企业中有着广泛的应用场景,主要包括生产计划排程、生产过程监控、质量管理、设备管理、库存管理、数据分析等领域。 通过实时监控生产过程、收集数据、进行分析,MES软件可以帮助企业实现生产过程可视化、透明化,提高生产效率&#…

一二三应用开发平台应用开发示例(7)——文档功能实现示例

概述 在完成文件夹配置工作后,接下来配置文档管理系统最核心的管理对象“文档”。 依旧是使用平台低代码配置工作来配置,配置流程跟文件夹的配置是相同的,以下简要说明,重点是新涉及到的功能或注意点。 创建实体 配置模型属性 …

Databricks 收购 Tabular 的意义:数据开放框架的胜利

Databricks 宣布收购 Tabular,这是一个由 Apache Iceberg 的原始创建者开发的数据平台,在数据分析行业引发了涟漪。此次收购凸显了开放框架在数据领域日益增长的重要性,预示着数据管理、分析和 AI/ML 计划领域的创新、协作和可访问性的新时代…

数据库的学习(6)

题目: 数据准备创建两张表:部门(dept)和员工(emp),并插入数据,代码如下create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20)comment部门名称 ); insert into dept (dept_name) values(销售部),(财…

音视频入门基础:H.264专题(11)——计算视频分辨率的公式

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频分辨率: 在vlc中也可以获取到视频分辨率(vlc底层也使用了FFmpeg进行解码): 所以FFmpeg和vlc是怎样获取到H.264编码的视频的分辨率呢?它们其实是通过SPS中的属性…

深入理解Java并发、线程与等待通知机制

目录 一、基础概念 进程和线程 进程 线程 Java 线程的无处不在 进程间的通信 进程间通信有几种方式? CPU 核心数和线程数的关系 上下文切换(Context switch) 并行和并发 二、认识 Java 里的线程 Java 程序天生就是多线程的 线程…

一套基于 Ant Design 和 Blazor 的开源企业级组件库

前言 今天大姚给大家分享一套基于Ant Design和Blazor的开源(MIT License)、免费的企业级组件库(喜欢Ant Design风格的同学推荐使用):Ant Design Blazor。 项目特性 提炼自企业级中后台产品的交互语言和视觉风格。 开…

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理:深入文件读写操作、缓冲流、序列化 在Java编程中,I/O流是处理输入输出操作的基础,特别是在文件读写、网络通信等领域。本文将在前文的基础上,进一步探讨缓冲流、序列化以及NIO(New I/O)在…

大数据开发者如何快速熟悉新公司业务

作为一名大数据开发工程师,进入一家新公司后快速熟悉业务是至关重要的。 目录 1. 了解产品形态故事1:电商平台的数据分析故事2:金融科技的风控系统故事3:社交媒体的推荐算法 2. 了解业务流程故事1:物流配送系统的优化故事2:医疗保险的理赔流程故事3:银行的贷款审批流程 3. 走…

通过 tomcat 让手机访问到电脑写的 html 网页

之前实现的 html 小项目只能在自己的电脑上展示,如果要在其他电脑或者在手机上就看不到网页了 想要在手机上访问自己写的网页,我们可以借助 tomcat 首先我们可以从官网下载 tomcat 官网链接:apache官网 我们拉到最底部,找到 a…

科普文:Java对象在堆中的内存结构

概叙 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等。 对象内存构成# Java 中通过 new 关键字创建一个类的实例对象,对象存于内存的…

7.10日学习打卡----初学Redis(五)

7.10日学习打卡 目录: 7.10日学习打卡一. redis功能流水线pipeline什么是流水线?pipeline实现使用pipeline 发布与订阅Redis的发布与订阅发布订阅命令行实现 慢查询Redis命令执行的整个过程如何进行配置实践建议 二 . redis的持久化机制RDB持久化机制触发…

Golang | Leetcode Golang题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…