品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

如何用低代码搭建训练一个专业知识库问答GPT机器人

2023-03-29 18:29:51 来源:腾讯云
来源:依然基于Stable-Diffusion模型生成

距离上篇文章《低代码xChatGPT,五步搭建AI聊天机器人》已经过去3个多月,收到了很多小伙伴的关注和反馈,也帮助很多朋友快速低成本搭建了ChatGPT聊天应用,未曾想这一段时间GPT热度只增不减,加上最近国内外各种LLM、文生图多模态模型密集发布,开发者们也有了更高的要求。比如如何训练一个自己的GPT应用,如何结合GPT和所在的专业领域知识来搭建AI应用,像心理咨询助手、个人知识库助手等,看目前网上这方面资料还不多,今天我们就来抛个砖试试。


(资料图)

目前的预训练方式主要如下几种:

基于OpenAI的官方LLM模型,进行fine-tune(费用高,耗时长)基于开源的Alpaca.cpp本地模型(目前可在本地消费级显卡跑起来,对自己硬件有信心也可以试试)通过向量数据库上下文关联(轻量级,费用可控,速度快,包括昨天OPENAI官方昨天刚放出来的示例插件chatgpt-retrieval-plugin,也采用的这种方式)

低代码实现的AI问答机器人效果如下:

这次还是用腾讯云微搭低代码作为应用搭建平台,来介绍如何快速搭建一个垂直领域的知识库GPT问答机器人,今天的教程尽量避开了各种黑科技的封装库(没有Langchain/Supabase/PineconeSDK全家桶),尝试从最基本的实现原理来展开介绍,尽量让大家知其所以然。新手开发者也可以试试,与其看各种GPT热闹,不如Make your hands dirty

一、准备工作

在开始搭建垂直知识库的问答机器人前,你需要做以下准备:

微信小程序账号:如果您还没有微信小程序账号,可以在微信公众平台注册(如果没有小程序,也可以发布为移动端H5应用)开通腾讯云微搭低代码:微搭低代码是腾讯云官方推出的一款低代码开发工具,可以直接访问腾讯云微搭官网免费开通注册OpenAI账号:OpenAI账号注册也是免费的,不过OpenAI有地域限制,网上方法很多在此不赘述。注册成功后,可以登录OpenAI的个人中心来获取API KEY一个支持向量匹配的数据库(本文以开源的PostgreSQL为例,你也可以使用Redis,或者NPM的HNSWlib包)

关于向量数据库,目前可选择的方式有好几种,可以使用PostgreSQL安装vector向量扩展,也可以使用Redis的Vector Similarity Search,还可以直接云函数使用HNSWLib库,甚至自行diy一个简单的基于文件系统的余弦相似度向量数据库,文末的 github/lowcode.ai也有简单示例代码,仅做参考交流不建议在生产环境使用。

本教程适用人群和应用类型:

适用人群:有前后端基础的开发者(有一定技术背景的非开发者也可以体验)应用类型:小程序 或 H5应用(基于微搭一码多端特性,可以发布为Web应用,点击原文链接可体验作者基于微搭搭建的文档GPT机器人)

二、搭建聊天机器人界面

如何使用低代码进行界面搭建的详细过程,在之前的文章中《低代码xChatGPT,五步搭建AI聊天机器人》已经有过详细的教程介绍,这里就不再继续展开。

另外,大家也可以使用微搭官方的聊天模板,这样的话界面这一步直接跳过,开箱即用,附微搭低代码GPT聊天应用模板地址

完成界面配置之后,大家重点关注下图中页面设计模块的”发送“按钮的事件配置即可,在后续会提到。

三、配置后端逻辑

与之前机器人的实现直接调用远程API不同,这次由于需要针对专业的领域知识进行预处理以及向量化,重点会涉及3个部分:

读取待训练的文档数据并进行向量化,之后存入向量数据库通过query的向量化结果与数据库向量进行相似度匹配,并返回关联文本结果结合返回的关联文本和query来构建上下文生成prompt

可以通过下图了解向量搜索实现GPT Context的大致原理:

由上图可见,主要是两个处理流程,一个文档数据的向量化预处理,一个是查询时的向量匹配和Context构造处理,这两个处理我们都可以使用腾讯云低代码的云函数来实现(当然第一步的预处理也可以在本地电脑完成)

1. 将知识库文档数据向量化

首先,将所需要的预处理的知识库内容放在某个目录下,遍历知识库目录下的所有文档文件(本文文件格式以markdown为例),将文本分块后结构化存储在本地json文件。

如果数据量小,分块后的结构化数据也可以直接放在内存中,本地化json主要便于在大量文本预处理时,遇到网络等异常时,能够在断点处重启预处理

关键代码如下:

本教程涉及的完整代码已放到https://github.com/enimo/lowcode.ai中,可按需下载试验,也可直接上传到微搭低代码的云函数中运行)

function splitDocuments(files, chunkSize) {let docSize = chunkSize || 1000;let textString = "";let index = 0;let documents = [];for(let i = 0, len = files.length; i < len; i++) {if(files[i] && files[i].content) {textString = files[i].content;}else {textString = fs.readFileSync(files[i], "utf8");}textString = textString.replace(/\n|\r/g, " ").replace(/<.*?>/g,"")    let start = 0;    while (start < textString.length) {      const end = start + docSize;      const chunk = textString.slice(start, end);      documents.push({ docIndex: index++, fileIndex: files[i].fileIndex, filename: files[i].filename || files[i], content: chunk });      start = end;}  }  fs.writeFileSync("./docstore.json", JSON.stringify(documents));  return documents;}

上述代码用途主要是在得到遍历后的文件路径数组files后,对文件进行切块处理,分块大小可按需调整,一般建议在1000~2000之间(切换主要为兼容GPT API的单次token限制及成本控制)

其次,对分块的文本进行向量化并存入向量数据库,关键代码如下:

async function initVector(sql, docs){    const maxElements = docs.length || 500; // 最多处理500个    for (let j = 0; j < maxElements; j++ ) {        const input = docs[j].content;        const filename = docs[j].filename;        const fileIndex = docs[j].fileIndex        const docIndex = docs[j].docIndex        // 通过根据训练日志返回断点docIndex,调整 docIndex 的值,确保从断点继续向量化        if(docIndex >= 0 &&  docIndex < 1000 ){            log("start embedding fileIndex: ", fileIndex, "docIndex: ", docIndex, "filename:", filename);            const embedding = await embedding(input);            const embeddingArr = "[" + embedding + "]";            const metadata = { filename, "doclength": maxElements, index: j };            const insertRet = await sql`              INSERT INTO documents ( content, appcode, metadata, embedding )              VALUES              ( ${input}, "wedadoc",  ${metadata}, ${embeddingArr} )`            await delay(1000); // 如果embedding API并发请求限制,可设置随机数sleep        }        else {          continue;        }    }    return true;}

上述文本向量化的存储过程中,涉及到调用OpenAI的embedding模型进行向量转化,这里使用text-embedding-ada-002模型(这个文本向量化过程也可以不使用OpenAI的官方模型,有部分开源模型可代替)

async function embedding (text) {    const raw_text = text.replace(/\n|\r/g, " ");    const embeddingResponse = await fetch(        OPENAI_URL + "/v1/embeddings",        {          method: "POST",          headers: {            "Authorization": `Bearer ${OPENAI_API_KEY}`,            "Content-Type": "application/json"          },          body: JSON.stringify({            input: raw_text,            model: "text-embedding-ada-002"          })        }    );    const embeddingData = await embeddingResponse.json();        const [{ embedding }] = embeddingData.data;    log({embedding});    return embedding;}

以上,一个文档知识库的向量化预处理就基本完成了,接下来看看怎么实现基于query的搜索逻辑。

2. 实现query的向量化搜索

我们在上一步中已经完成了文本数据的向量化存储。接下来,可以基于用户提交的query来进行相似度搜索,关键代码如下:

async function searchKnn(question, k, sql){    const embedding = await embedding(question);    const embeddingArr = "[" + embedding + "]";    const result = await sql`SELECT * FROM match_documents(${embeddingArr},"wedadoc", 0.1, ${k})`    return result;}

上述代码将query同样转化为向量后,再去上一步向量化后的数据库中进行相似搜索,得到最终与query最匹配的上下文,其中有一个预定义的SQL函数match_documents,主要用作文本向量的匹配搜索,具体会在后面介绍,在 github/lowcode.ai中也有详细的定义和说明。

最后,我们工具拿到的搜索返回值,来构造GPT 3.5接口的prompt上下文,关键代码如下:

async function getChatGPT (query, documents){    let contextText = "";    if (documents) {        for (let i = 0; i < documents.length; i++) {            const document = documents[i];            const content = document.content;              const url = encodeURI(document.metadata["filename"]);            contextText += `${content.trim()}\n SOURCE: ${url}\n---\n`;        }    }    const systemContent = `You are a helpful assistant. When given CONTEXT you answer questions using only that information,and you always format your output in markdown. `;    const userMessage = `CONTEXT:      ${contextText}      USER QUESTION:       ${query}`;    const messages = [        {          role: "system",          content: systemContent        },        {          role: "user",          content: userMessage        }    ];      const chatResponse = await fetch(        OPENAI_URL + "/v1/chat/completions",        {            method: "POST",            headers: {                "Authorization": `Bearer ${OPENAI_API_KEY}`,                "Content-Type": "application/json"            },            body: JSON.stringify({                "model": "gpt-3.5-turbo",                 "messages": messages,                "temperature": 0.3,                 "max_tokens": 2000,            })        }    );    return await chatResponse.json();}

上述代码中核心是上下文的构造,由于GPT3.5之后的接口,支持指定role,可以将相关系统角色的prompt放在了systemContent中,至于/v1/chat/completions接口入参说明由于之前的文章中有过介绍,这里也不赘述,有任何疑问大家也可以到「漫话开发者」公众号留言询问。

以上,query的搜索部分完成了,到此所有后端接口的核心逻辑也都完成了,可以看到几个关键流程的实现是不是很简单呢。

3. 将所涉及代码部署到微搭低代码的云函数中

完成后端代码开发后,接下来就是把相应的运行代码部署到微搭低代码的云函数中,综上可知,主要是两部分的后端代码,一部分文档的向量化并入库(这部分本地Node环境运行亦可),另一部分就是实现搜索词匹配构建prompt后调用GPT接口查询了。

微搭低代码的云函数入口,可以在数据源->APIs->云函数中找到,如下图所示:

如果第一次使用云函数,需要点击图中链接跳转到云开发云函数中进行云函数的新建,如下图所示:

新建完成后,点击进入云函数详情页,选择”函数代码“Tab,然后在下面的提交方法下拉框中选择”本地上传ZIP包“即可上传前面完成的后端逻辑代码,也可以直接下载 github/lowcode.ai打包后上传。上传成功后,第一次保存别忘了点击”保存并安装依赖“来安装对应的npm包。

在完成云函数新建和代码上传后,回到上一步的微搭数据源APIs界面中刷新页面,即可看到刚刚新建好的云函数openai,选中该云函数,并按要求正确填写对应的出入参结构,测试方法效果并保存后,即可在第一章的前端界面”发送“按钮中绑定调用数据源事件进行调用了。

4. 完成开发联调,发布应用

完成上述后端逻辑以及云函数配置后,可以切到编辑器的页面设计模块,回到第一章的界面设计来进行事件的配置,完成后点击编辑器右上角的“发布”按钮,可以选择发布到你已绑定的小程序,也可以直接发布Web端H5/PC应用。

至此,一个垂直知识库的AI问答机器人应用基本就搭建完成了。

四、附录说明

1 数据库PostgreSQL的初始化

本文中采用的PostgreSQL作为向量数据库,其中涉及到的建表结构定义参考如下:

create table documents (  id bigserial primary key,  content text, -- corresponds to Document.pageContent  metadata json, -- corresponds to Document.metadata  embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed);

涉及的SQL函数match_documents的定义参考如下,其中query_embedding表示query关键词的向量值,similarity_threshold表示相似度,一般情况下要求不低于0.1,数值越低相似度也越低,match_count表示匹配后的返回条数,一般情况下2条左右,取决于前文的分块chunk定义大小。

create or replace function match_documents (  query_embedding vector(1536),  similarity_threshold float,  match_count int)returns table (  id bigint,  content text,  metadata json,  similarity float)language plpgsqlas $$begin  return query  select    documents.id,    documents.content,    documents.metadata,    1 - (documents.embedding <=> query_embedding) as similarity  from documents  where 1 - (documents.embedding <=> query_embedding) > similarity_threshold    order by documents.embedding <=> query_embedding  limit match_count;end;$$;

所有上述的内容数据库SQL schema以及部分训练备用文本数据都已经放到github,大家可以关注定期更新,按需采用: github/lowcode.ai

2 体验试用

可以通过Web端体验作者搭建的Web版文档机器人,同时得益于微搭低代码的一码多端,同步发布了一个小程序版本,大家可以扫码体验。

低代码文档AI小程序

由于目前自建向量库的性能局限以及有限的预处理文档数据,响应可能比较慢,准确性偶尔也会差强人意,还请各位看官谅解,抽时间再持续优化了,本文还是以技术方案的探讨交流为主。

3 最后

通过本教程的介绍,你已经基本熟悉了如何使用微搭低代码快速搭建垂直知识库的AI问答机器人了,有任何疑问可以留言。

用低代码创建一个GPT的聊天应用很简单,实现一个垂直领域的AI问答应用也不难。未来不管被AI替代也好,新的开发者时代来了,先动手试试,make your hands dirty first, enjoy~

标签:

(责任编辑:)

相关文章

如何用低代码搭建训练一个专业知识库问答GPT机器人

​距离上篇文章《低代码xChatGPT,五步搭建AI聊天机器人》已经过去3个多月,收到了很多小伙伴的关注和反馈,也帮助很多朋友快速低成本搭建了Chat

2023-03-29 18:29:51

教大家360游戏大厅怎么签到的办法 每日热文

​最近发现很多网友们对于360游戏大厅怎么签到问题都非常关注,而我们现在的生活基本上也都离不开手机,想要了解最新的信息也都

2023-03-29 18:01:39

天天热资讯!万顺叫车app怎么付款 万顺叫车app先乘后付的功能开通教程

​万顺叫车app怎么付款万顺叫车app先乘后付的功能开通教程,

2023-03-29 16:55:09

货拉拉递表港交所,Keep再战IPO

​文 福布斯中国28日晚间,重量级独角兽货拉拉和Keep向港交所递交招股书。其中,Keep更新了自己的招股书数据,第三次冲

2023-03-29 16:12:25

国信招商银行财报点评:看好大财富管理业务复苏

​招商银行此前已披露业绩快报,2022年实现营收3448亿元,归母净利润1380亿元,同比分别增长4 08%和15 08%。  零售客群基础进一步夯实,大财

2023-03-29 15:07:21

世界快资讯丨增添生机 沈海高速厦门段中分带种上三角梅

​挖土、刨坑、栽培……养护工人手脚麻利,有条不紊地将一盆盆三角梅搬放到高速公路中分带。昨日,记者从厦门高速管理公司了解到,沈海高速厦...

2023-03-29 14:07:20

世界即时:货拉拉冲刺港交所,2022年首次实现盈利

​拉拉科技(英文名:Lalatech,以下简称“货拉拉”)于2023年3月28日正式向港交所递交招股说明书,拟主板挂牌上市,高盛、美银和摩根大通担任联

2023-03-29 13:05:58

世界热门:2023年夜市摆摊卖小吃挣钱吗?10大暴利低成本小吃推荐!

​近日,义乌95后夫妻夜市摆摊日入9000元引发热议,网友质疑让查税,后当事人回应纯属偶然,而夜市摆摊赚钱的比比皆是,多数以小吃、手工艺品等

2023-03-29 12:33:37

农发行屏山县支行:积极开展“3·15”消费者权益保护教育宣传周活动

​为践行社会责任担当,提升金融消费者权益保护宣传工作质量,推动金融行业健康发展,营造和谐、诚信的市场环境,近日,农发行屏山县支行开展金

2023-03-29 11:19:15

世界今日讯!欧盟批准谷歌收购克罗地亚数学应用PhotoMath 拍照即可答题

​这项交易不会减少“在线家庭作业和学习辅助工具”市场的竞争。

2023-03-29 10:23:40

世界新资讯:三角插怎么做成爱心_三角插怎么做

​1、首先,把纸沿宽度对折。2、然后把纸沿着两条长边的中点线对折,压平。3、将纸翻过来,沿着对角线将下面的两个小方块折叠起

2023-03-29 09:52:55

福州食安监管新增硬核能力 AI巡检后厨发现问题马上推送_全球观天下

​福州市市场监管局“市场监管e治理”新增硬核能力,为食安监管注入“数字能量”,保障市民舌尖上的安全。

2023-03-29 09:00:27

即时焦点:欧洲媒体:研究发现,单身男性碳足迹比单身女性高16%

​【环球时报综合报道】据欧洲新闻电视台27日报道,法国法兰西银行的一项研究发现,单身男性的碳足迹高于女性

2023-03-29 06:50:57

环球看点!中科创达(300496):3月28日北向资金减持60.91万股

​3月28日北向资金减持60 91万股中科创达。近5个交易日中,获北向资金增持的有3天,累计净增持6 35万股。近20个交易日中,获北向资金减持的有10

2023-03-29 04:55:42

全球热讯:抖音新产品“青桃”上线,优爱腾、B站听到了追兵的脚步

​2023年3月28日刊|总第3189期对于未来,我们唯一所知的就是它将与现在不一样。真可谓“悄悄地进村,打枪的不要”。近日,抖音(北京微播视界科

2023-03-29 00:09:20

不甘落后于微软(MSFT.US)!谷歌(GOOG.US)与AI初创公司Replit达成合作 将结合AI与编码软件|今头条

​谷歌与人工智能初创公司Replit达成了合作伙伴关系,将其人工智能语言模型与Replit帮助计算机程序员编写代码的软件Ghostwriter结合起来。

2023-03-28 21:57:40

威海临港区建设局开展房地产市场秩序督导检查工作

​为进一步规范威海临港区商品房销售行为,加强商品房销售现场的信息公示管理,净化房地产市场环境,近日,临港区建设局围绕群众在房产交易过程

2023-03-28 20:45:35

别克君威的空间大吗 有什么优点?

​在同级别中,君威的空间应该算中等水平,不说特别大,但也绝对不小,后排完全够用,很宽裕。因为车身流线的设计,后车顶会低矮一

2023-03-28 19:12:08

世界热文:巨量加油站:各市州文旅局与全国头部达人一起点亮如意甘肃!

​巨量加油站:各市州文旅局与全国头部达人一起点亮如意甘肃!

2023-03-28 18:19:43

全球新消息丨【寻味中华】虫与叶的“邂逅” 台湾东方美人茶香两岸

​中新社北京3月28日电题:虫与叶的“邂逅”台湾东方美人茶香两岸作者陈建新路梅杨程晨在台湾新竹县峨眉乡,有一间由传统制茶厂改造而成的茶...

2023-03-28 17:34:03

专业律师,哪些是敲诈勒索罪未遂? 世界播资讯

​行为人使用了威胁或要挟手段,非法取得了他人的财物,就构成了敲诈勒索罪的既遂。如果行为人仅仅使用了威胁或要挟手段,被害人并未产生恐惧情

2023-03-28 17:04:02

世界播报:嫁豪门却背一身债,落魄时唯有佘诗曼接济,今42岁再成豪门太太

​ 明星们的私生活总是被网友们时刻的关注着,毕竟作为公众人物肯定一言一行都要引起注意,香港演员早期时候几乎都是美女,他们没有过多的通过技

2023-03-28 16:00:17

【全球新要闻】a开头的单词小学_a开头的单词

​1、A1 ability能力,才能2 absent不在的,缺席的3 accent口音4 accident

2023-03-28 15:02:07

德意志银行,会是下一个瑞信吗?

​我们正在迎来有史以来最动荡的市场时期,范围最广的银行业危机。随着瑞信被UBS强行并入,现在金融市场的焦点就放在了欧洲最大的系统风险银行:

2023-03-28 13:02:17

拒绝娱乐至死!《蛋仔派对》风靡年轻群体,自制地图成知识充电桩_快看点

​对当下的年轻人来说,他们正处在一个互联网信息爆炸的时代,除了书本,这个社会中有太多各种形式的知识和信息等待着大家去挖掘。而得益于移动

2023-03-28 12:04:30

青矩技术北交所IPO发行价34.75元/股,拟募资3.19亿元

​青矩技术以工程造价咨询为核心主营业务,以工程设计、工程招标代理、工程监理及项目管理等其他工程咨询为重要辅助业务。

2023-03-28 10:57:11

中国式家长清华_中国式家长秦屿路聊聊老师

​1、首先我们点击打开游戏,可以看到我玩的是新版本的女儿版。看公告可以知道,这个版本的二胎肯定是女儿。2、我们点击开始游戏

2023-03-28 09:39:24

全球播报:东方通信:3月27日融资买入2512.54万元,融资融券余额3.69亿元

​3月27日,东方通信(600776)融资买入2512 54万元,融资偿还2917 12万元,融资净卖出404 59万元,融资余额3 63亿元,近20个交易日中有11个交易

2023-03-28 08:22:09

德媒:赫拉芬贝赫不满出场时间,若无转机今夏可能转投利物浦

​德媒《sport1》消息,拜仁中场赫拉芬贝赫对于俱乐部换帅一事感到高兴,因为他对自己的出场时间非常不满。20岁的赫拉芬贝赫在去年以1850万欧元

2023-03-28 06:27:54

当前速递!如何快速实现一个定时器

​定时器(Timer)是一种在业务开发中常用的组件,主要用在执行延时通知任务上。本文以笔者在微信工作中的实践作为基础,介绍如何使用平时部门最

2023-03-28 02:13:00