使用 FastGPT 构建高质量 AI 知识库

news2024/10/2 20:31:56

作者:余金隆。FastGPT 项目作者,Sealos 项目前端负责人,前 Shopee 前端开发工程师

FastGPT 项目地址:https://github.com/labring/FastGPT/

引言

自从去年 12 月 ChatGPT 发布以来,带动了一轮新的交互应用革命。尤其在 GPT-3.5 接口全面开放后,大量的 LLM 应用如雨后春笋般涌现。然而,由于 GPT 的可控性、随机性和合规性等问题,很多应用场景都没法落地。

起源

3 月份,我在 Twitter 上刷到一个老哥使用 GPT 训练他自己的博客记录,成本极低(相比于 Fine-tuning)。他提供了一个完整的流程图:

向量搜索 GPT 流程图

看到这个推文后,我灵机一动,应用场景就十分清晰了。直接上手开干,不到一个月的时间,我在原有的助手管理基础上,为 FastGPT 加入了向量搜索功能。于是就有了最早的一期视频:https://www.bilibili.com/video/BV1Wo4y1p7i1/

初步发展

三个月过去了,FastGPT 依然延续着早期的思路去完善和扩展。目前,其在向量搜索 + LLM 线性问答方面的功能基本已完成。然而,我们始终没有发布关于如何构建知识库的教程。因此,我们打算在 V4 版本开发过程中,写一篇文章来介绍《如何在 FastGPT 上构建高质量知识库》。

FastGPT 的知识库逻辑

在正式开始构建知识库之前,我们需要了解 FastGPT 的知识库检索机制。首先,我们需要了解几个基本概念:

基础概念

  1. 向量:将人类的语言(文字、图片、视频等)转换为计算机可识别的语言(数组)。
  2. 向量相似度:计算两个向量之间的相似度,表示两种语言的相似程度。
  3. 语言大模型的特性:上下文理解、总结和推理。

这三个概念结合起来,就构成了 "向量搜索 + 大模型 = 知识库问答" 的公式。以下是 FastGPT V3 中知识库问答功能的完整逻辑:

向量搜索 GPT 流程图

FastGPT 与大多数其他知识库问答产品不同的地方在于,它采用了 QA 问答对进行存储,而不仅是 chunk(文本分块)处理。这样做是为了减少向量化内容的长度,使向量能更好地表达文本的含义,从而提高搜索的精度。

此外 FastGPT 还提供了搜索测试和对话测试两种途径对数据进行调整,从而方便用户调整自己的数据。

根据上述流程和方式,我们以构建一个 FastGPT 常见问题机器人为例,展示如何构建一个高质量的 AI 知识库。

FastGPT 仓库地址:https://github.com/labring/FastGPT

创建知识库应用

首先,我们创建一个 FastGPT 常见问题知识库。

创建知识库应用

基础知识获取

我们先直接把 FastGPT GitHub 仓库上一些已有文档,进行 QA 拆分,从而获取一些 FastGPT 的基础知识。下面以 README 为例。

QA 拆分示意图

示例

QA 修正

我们从 README 中获取了 11 组数据,整体质量还是不错的,图片和链接都提取出来了。然而,最后一个知识点出现了一些截断,我们需要手动修正一下。

此外,我们注意到第一列第三个知识点,该知识点介绍了 FastGPT 的一些资源链接,但 QA 拆分将答案放在了 A 中。然而,用户的问题通常不会直接问“有哪些链接”,他们更可能会问:“部署教程”,“问题文档”等。因此,我们需要对此知识点进行简单处理,如下图所示:

手动修改知识库数据

接下来,我们可以创建一个应用,看看效果如何。首先创建一个应用,并在知识库中关联相关的知识库。另外,还需要在配置页面的提示词中,告诉 GPT:“知识库的范围”。

应用创建

README QA 拆分后效果

导入社区常见问题

接着,我们把 FastGPT 常见问题的文档导入。由于之前的整理不到位,我们只能手动录入对应的问答。

手动录入知识库结果

导入结果如上图。可以看到,我们均采用的是问答对的格式,而不是粗略的直接导入。目的就是为了模拟用户问题,进一步的提高向量搜索的匹配效果。可以为同一个问题设置多种问法,效果更佳。

FastGPT 还提供了 OpenAPI 功能,你可以在本地对特殊格式的文件进行处理后,再上传到 FastGPT,具体可以参考:FastGPT Api Docs

知识库微调和参数调整

FastGPT 提供了搜索测试和对话测试两个功能,我们可以通过这两个功能来进行知识库微调和参数调整。

我们建议你提前收集一些用户问题进行测试,根据预期效果进行跳转。可以先进行搜索测试调整,判断知识点是否合理。

搜索测试

通过搜索测试,我们可以输入问题,查看返回的知识库数据,来测试知识库的查询效果。下面是搜索测试的界面:

搜索测试界面

我们可以看到,系统返回了与之相关的问答数据。

你可能会遇到下面这种情况,由于“知识库”这个关键词导致一些无关内容的相似度也被搜索进去,此时就需要给第四条记录也增加一个“知识库”关键词,从而去提高它的相似度。

提示词设置

提示词的作用是引导模型对话的方向。在设置提示词时,遵守 2 个原则:

  1. 告诉 GPT 回答什么方面内容。
  2. 给知识库一个基本描述,从而让 GPT 更好的判断用户的问题是否属于知识库范围。

提示词设置

更好的限定模型聊天范围

首先,你可以通过调整知识库搜索时的相似度和最大搜索数量,实现从知识库层面限制聊天范围。通常我们可以设置相似度为 0.82,并设置空搜索回复内容。这意味着,如果用户的问题无法在知识库中匹配时,会直接回复预设的内容。

搜索参数设置

空搜索控制效果

由于 OpenAI 向量模型并不是针对中文,所以当问题中有一些知识库内容的关键词时,相似度 会较高,此时无法从知识库层面进行限定。需要通过限定词进行调整,例如:

我的问题如果不是关于 FastGPT 的,请直接回复:“我不确定”。你仅需要回答知识库中的内容,不在其中的内容,不需要回答。

效果如下:

限定词效果

当然,GPT-3.5 在一定情况下依然是不可控的。

通过对话调整知识库

与搜索测试类似,你可以直接在对话页里,点击“引用”,来随时修改知识库内容。

查看答案引用

结语

  1. 向量搜索是一种可以比较文本相似度的技术。
  2. 大模型具有总结和推理能力,可以从给定的文本中回答问题。
  3. 最有效的知识库构建方式是 QA 和手动构建。
  4. Q 的长度不宜过长。
  5. 需要调整提示词,来引导模型回答知识库内容。
  6. 可以通过调整搜索相似度、最大搜索数量和限定词来控制模型回复的范围。

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

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

相关文章

【分布式系统】聊聊系统监控

对于分布式系统来说,出现故障的是常有的事情,如何在短时间内找到故障的原因,排除故障是非常重要的,而监控系统是就像系统的眼睛可以通过分析相关数据,进一步管理和运维整个分布式系统。 监控系统的的基本功能包含 全…

Java02-迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类

目录 什么是遍历? 一、Collection集合的遍历方式 1.迭代器遍历 方法 流程 案例 2. foreach(增强for循环)遍历 案例 3.Lamdba表达式遍历 案例 二、数据结构 数据结构介绍 常见数据结构 栈(Stack) 队列&a…

移远通信携手产业合作伙伴率先完成RedCap端网兼容性现网测试

近日,移远通信与中国联通携手,基于搭载高通骁龙X35平台的移远RedCap模组RG255C-CN,在上海嘉定率先完成3.5GHz、2.1GHz、900MHz 中国联通5G全频段 RedCap端网兼容性现网测试,为5G RedCap商用部署奠定了坚实基础。 本次5G RedCap外场…

【Python:参数解析器argparse】对命令行参数进行解析

常用的流程如下: 1、先创建一个解析器: parser argparse.ArgumentParser(description"...")2、为解析器增加参数,包括name、默认值、帮助信息等 parser.add_argument(name "", default ..., help ...)name前面可以…

CS5366+VL171母座正反插HDMI(CS5466也可搭配)国产芯片TYPEC方案设计 ASL电路原理图 集睿致远+威锋设计

VL171是威锋芯片,可搭配ASL集睿致远CS5366设计TypeC母座正反插转HDMI高清投屏方案,CS5366是2lane 芯片,支持4K60HZ,是CS5266的升级版,CS5366设计拓展坞方案可以替代CS5266携带快充100W的PD和US,多口HUB也不在话下,而画面的刷新率和…

在IDEA同一个窗口中同时打开多个独立项目

文章说明 本文主要说明如何在Intellij Idea中同时打开多个独立的Maven项目。 我在使用idea的时候,由于自己负责了很多项目,经常要在不通的代码之间切换来切换去。然后搜索代码的时候也只能搜到当前打开的这个项目。因为这个原因,一些小项目…

利用prophet实现时间序列数据结果预测及对预测数据进行年度趋势和月度值分解

第一部分:prophet的介绍 选取一段chatgpt对该插件的解释,如下: Prophet(预言家)是由Facebook开发的开源时间序列分析工具,旨在提供一个简单而强大的框架,用于预测时间序列数据。Prophet的设计目…

使用中间人攻击的arp欺骗教程

文章目录 前言一、查看网络接口配置第 1 步:从受害者处获取 IP 配置第 2 步:在 Linux 中打开数据包转发第 3 步:使用 arpspoof 将包重定向到您的计算机步骤4:拦截来自路由器的包裹步骤5:从目标的浏览器历史记录中嗅探图…

LeetCode 热题 100 JavaScript--102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root [1…

Java 线程基础

volatile happens-before原则 1、单一线程原则 在一个线程内,在程序前面的操作线性发生于后面的操作 2、管程锁定原则 一个unlock操作先行发生于后面对同一个锁的lock操作 3、volatile变量原则 对一个volatile变量的写操作先行发生于后面对变量的读操作 4、线…

资深测试经验总结,APP测试-关键点整理,少走3年的弯路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 APP测试它的关键点…

LeetCode--HOT100题(16)

目录 题目描述:238. 除自身以外数组的乘积(中等)题目接口解题思路代码 PS: 题目描述:238. 除自身以外数组的乘积(中等) 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等…

el-table那些事

el-table那些事 获取el-table所有勾选的行数据 用于记录工作和日常学习遇到的坑,需求。 vue3element-plusts 获取el-table所有勾选的行数据 1、需要先声明一个ref变量,并赋值给el-table 2、通过el-table提供的getSelectionRows()函数获取选中的"行…

嵌入式系统:连接数字世界的未来

嵌入式设备是专用微型计算机,由硬件、系统级软件和应用软件三个层次组成。硬件包括处理器、存储和各种I/O接口。系统级软件涵盖操作系统和各种I/O子系统。应用软件包括基于不同操作系统的开发。 几乎所有带数字接口的设备都使用嵌入式系统,从大型飞机到…

媒介易讲解体育冠军助力品牌解锁市场营销新玩法

在当今竞争激烈的市场中,品牌推广成为企业取得商业成功的重要一环。然而,随着传统市场推广方式的日益饱和,企业急需创新的市场营销策略来吸引消费者的关注和认可。在这样的背景下,体育冠军助力品牌成为了一种备受瞩目的市场营销新…

MongoDB文档-进阶使用-MongoDB索引-createindex()与dropindex()-在MongoDB中使用正则表达式来查找

阿丹: 之前研究了MongoDB的基础增删改查。在学会基础的数据库增删改查肯定是不够的。这个时候就涉及到了数据库搜索的时候的效率。需要提高数据的搜索效率。 MongoDB索引 在所以数据库中如果没有数据索引的时候。如果需要查找到一些数据。都会去主动扫描所有可能存…

无涯教程-Perl - 面向对象

Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对象Perl的基本概念。 定义类 在Perl中定义一个类非常简单。类以最简单的形式对应于Perl软件包。要在Perl中创建一个类,我们首先构建一个包。 Perl软件包在Perl程序中提供了一个单…

Java-day05(面向对象-1)

面向对象 面向对象与面向过程的区别: 面向过程,强调功能行为;面向对象,强调功能的对象。 Java类及类成员 类:对一类事物描述,是抽象的,概念上的定义对象:实际存在的该类事物的每…

(自控原理)线性系统的频域分析法

目录 一、频率特性 1、频率特性的基本概念 2、频率特性的几何表示方法 二、典型环节与开环系统的频率特性 1、典型环节 2、开环对数的频率特性曲线 三、稳定裕度 1、相角裕度 2、幅值裕度 一、频率特性 1、频率特性的基本概念 2、频率特性的几何表示方法 二、典型环节…

<van-empty description=““ /> 滚动条bug

使用 <van-empty description"" /> 时&#xff0c;图片出现了个滚动条&#xff0c;图片可以上下滑动。 代码如下&#xff1a; <block wx:if"{{courseList.length < 0}}"><van-empty description"" /> </block> <…