田园课堂私有化知识库搭建流程与总结
引言
在当今数字化时代,知识管理与智能交互对于教育领域的创新发展至关重要。FastGPT作为一款高效的AI流程构建可视化开源工具,为田园课堂实现私有化知识库的快速搭建提供了有力支持。本文将详细阐述使用FastGPT搭建田园课堂私有化知识库的流程,并分享相关经验总结。
同时,我们引入laf这一开源云开发平台。它提供了云函数、云数据库、云存储等一系列开箱即用的应用资源,使开发者能够专注于业务逻辑的开发,无需在服务器配置等繁琐事务上耗费精力,从而快速将创意转化为实际应用。
特别说明:本文重点聚焦于利用FastGPT的“高级编排”功能构建专属AI助理。对于FastGPT的部署、oneAPI工具部署、知识库的创建以及自然语言大模型的选择等内容,将不再详细阐述。如需了解这些方面的信息,可参考上一篇文章:私有化知识库本地部署打造专属ai助理(FastGpt本地部署全过程及相关模型部署训练) 。
搭建使用工具及模型
模型选用
- GLM-3-turbo:作为强大的LLM大模型,主要负责自然语言处理任务,能够理解和生成高质量的文本回复,为AI对话提供核心的语言处理能力。
- m3e-large:该模型作为数据索引向量模型,在知识库的检索过程中发挥关键作用,能够高效地对文本数据进行向量化处理,以便快速准确地找到与用户问题相关的知识内容 。
云函数插件扩展
通过laf构建云函数,为个人助理功能的拓展提供了便利。例如,通过爬虫技术接入bing搜索,极大地丰富了AI获取信息的渠道,提升了其回答问题的全面性和准确性。
高级编排工具
- 问题分类:能够对用户输入的问题进行智能分类,依据分类结果执行不同的后续操作。尽管在某些模糊场景下,分类效果可能不尽如人意,但在整体流程中,它为后续的针对性处理奠定了基础。
- 工具调用:工具的范畴广泛,既可以是系统内部的模块,如AI对话、知识库搜索、HTTP模块等,也可以是外部插件。通过灵活调用这些工具,LLM能够实现动态决策,告别固定流程的束缚,更好地适应多样化的用户需求。
- 知识库搜索:支持从一个或多个使用相同向量模型的知识库中进行向量搜索,确保能够精准定位到与问题匹配的知识内容,为准确回答用户问题提供有力支撑。
- 判断器:可对任意变量进行
IF
条件判断。当满足设定条件时,执行IF
分支;若不满足,则执行ELSE
分支。这种灵活的判断机制,使得整个流程能够根据不同的情况进行智能化的流程走向选择。 - 获取当前时间(内置插件):能够获取当前用户所在时区的准确时间,为涉及时间相关的问题提供精准解答。
- 文本内容提取:可以根据文本的具体内容,提取出关键信息(如搜索关键字),帮助后续的搜索和处理流程更加精准高效。
- 文本加工(内置插件):对输入文本进行预设的固定加工处理。入参仅支持字符串和数字格式,并以变量形式应用在文本编辑区域,以满足特定的文本处理需求。
- HTTP请求(接入网络):该模块类似于Postman和ApiFox等工具,能够向指定地址发送
HTTP
请求,实现与外部网络资源的交互,为获取更多信息提供途径。 - AI对话:负责与用户进行自然流畅的对话交互,利用LLM模型生成合理的回复内容。
搭建流程
创建知识库
在创建知识库时,建议优先使用docx、csv或txt格式的文件。由于ppt等包含图片的文件在内容索引方面表现欠佳,可能无法达到预期的检索效果。若存在ppt、pptx等文件,可借助wps将其转换为docx文件后再进行导入。
创建应用
模型类型说明
- 简易模板:直接运用LLM自然语言处理模型,类似于市面上常见的通义千问、文心一言等,缺乏额外的处理逻辑,适用于简单的语言交互场景。
- 对话引导 + 变量:此模板通常用于在对话起始阶段,引导使用者输入或选择一些数据,并将这些数据存储下来,以便后续流程使用。例如在搭建角色扮演AI、小说生成AI时,可用于在开头收集性别、姓名等信息 。
- 知识库 + 对话引导:能够搭建较为基础的AI,对于需求相对简单的AI助理场景基本能够满足。不过,其缺点在于每次消息交互都需要进行知识库搜索,可能会在一定程度上影响效率。
- 问题分类 + 知识库:每次接收到信息后,首先对问题进行分类,然后依据分类结果有选择地执行后续的交互逻辑。本次搭建私有化知识库,便是以此模板为基础展开。
创建完成的基础模板如下:
编排问题分类
针对可能被询问的各类问题,进行分类编排,并设置当前模型的背景知识以及聊天记录。
具体设置说明
- 聊天记录设置:除身份询问相关的聊天记录设置为3(数值过大可能导致身份信息泄露,过小则关联度不足)外,其他均设置为25,这样的设置有助于提升消息之间的关联度。
- 分类流向:分类1和分类2接入知识库搜索,同时接入网络请求;分类3(时间相关)接入工具调用;分类4和分类6共同接入一个AI对话;分类5(询问身份)单独接入一个AI对话。
分类逻辑阐述
- 分类1和2接入知识库搜索:这两类问题获取的对话内容需要优先从知识库中寻找答案。如此分类便于后续对流程和知识库进行维护、扩展与修改。同时接入网络请求,以便在知识库无法提供满意答案时,从网络获取更多信息。
- 分类3(时间)单独分类:鉴于各类LLM大模型在时间回答上容易出现错误,接入工具调用能够确保时间信息的准确性。
- 分类4和6接入AI对话:该AI用于在前面的AI或其他分类已经做出正确回答的基础上,进行补充回答。这样不仅可以提升问题回答的关联信息丰富度,还能避免AI模型因过度请求而造成资源浪费。
- 分类5(询问身份)单独接入AI对话:通过这种方式,能够有效避免在询问身份等敏感信息时出现错误回答。
分类1和2接入知识库搜索
- 知识库搜索优化:对知识库搜索进行了问题优化设置,将问题最低相关度设定为0.82。该数值代表询问问题与知识库中问题及内容的相关程度,0.82这一数值较为适中,能够在一定程度上避免回复错误答案。
- 判断器设置:通过判断器判断该问题在知识库中是否存在,若结果为null,则表示在知识库中完全不存在相关内容。
知识库存在类似问题的处理流程
当知识库中存在与用户问题类似的问题时,执行以下流程:
知识库不存在相关问题的处理流程
- 提取问题关键词进行网络搜索:由AI大模型负责提取问题关键词。为防止关键词提取失败的情况发生,加入判断器对提取结果进行判断。若提取成功,则直接使用提取的关键词进行搜索;若提取失败,则依据用户的原始问题进行bing搜索。
- Laf部署书写bing爬虫:具体部署书写流程可参考官方文档:laf 概览 | Laf 开发文档 。以下是实现代码:
import cloud from '@lafjs/cloud'
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
export default async function (keyword) {
const url = `https://cn.bing.com/search?q=${keyword.query.keyword}`
let data = ""
const res = await fetch(url, {
method: 'POST',
headers: {
'Cookie': "MUIDB=04572BEF4814644E033F3F9049A8650D" // 可通过浏览器开发者工具进行查看你的用户MUIDB
}
})
const html = await res.text()
const dom = new JSDOM(html).window.document;
// 获取搜索结果
const searchInfo = dom.querySelector("#b_results")
// 获取答案元素
const answer = searchInfo.querySelector(".b_ans")
if (answer) {
data += answer.textContent.replace(/[a-zA-Z]/g, "") + "\n"
}
// 获取相关答案元素
const algo = searchInfo.querySelectorAll(".b_algo")
algo.forEach(item => {
const an = item.querySelector("p")
if (!an) return
// 去除网页2020年11月21日
const b = an.textContent.replace(/网页.*年.*月.*日/g, "").replace("·", "").replace("网页", "")
data += b + "\n"
})
return {code : 0, data: data}
}
- 接入http请求bing爬虫:通过以下设置,将bing爬虫功能接入到整体流程中。
- 爬虫结果进行文本加工对话:对爬虫获取的结果进行文本加工处理,使其更符合对话输出的要求。
- 完整流程图:上分支为
IF
逻辑,下分支为ELSE
逻辑。
分类3时间处理流程
对于分类3(时间相关问题),设置如下流程:
分类4和6AI对话设置
针对分类4和6,接入AI对话模块,具体设置如下:
分类5询问身份AI对话设置
对于分类5(询问身份相关问题),单独接入AI对话,并进行如下设置:
通过以上详细的流程步骤,我们成功利用FastGPT搭建了田园课堂的私有化知识库,并借助laf平台实现了功能的扩展与优化,为田园课堂的智能化知识管理与交互提供了有力的技术支持。