世界快播:如何用低代码搭建训练一个专业知识库问答GPT机器人
距离上篇文章《低代码xChatGPT,五步搭建AI聊天机器人》已经过去3个多月,收到了很多小伙伴的关注和反馈,也帮助很多朋友快速低成本搭建了ChatGPT聊天应用,未曾想这一段时间GPT热度只增不减,加上最近国内外各种LLM、文生图多模态模型密集发布,开发者们也有了更高的要求。比如如何训练一个自己的GPT应用,如何结合GPT和所在的专业领域知识来搭建AI应用,像心理咨询助手、个人知识库助手等,看目前网上这方面资料还不多,今天我们就来抛个砖试试。
目前的预训练方式主要如下几种:
(资料图片仅供参考)
低代码实现的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版文档机器人,同时得益于微搭低代码的一码多端,同步发布了一个小程序版本,大家可以扫码体验。
由于目前自建向量库的性能局限以及有限的预处理文档数据,响应可能比较慢,准确性偶尔也会差强人意,还请各位看官谅解,抽时间再持续优化了,本文还是以技术方案的探讨交流为主。
3 最后
通过本教程的介绍,你已经基本熟悉了如何使用微搭低代码快速搭建垂直知识库的AI问答机器人了,有任何疑问可以留言。
用低代码创建一个GPT的聊天应用很简单,实现一个垂直领域的AI问答应用也不难。未来不管被AI替代也好,新的开发者时代来了,先动手试试,make your hands dirty first, enjoy~
标签:
推荐文章
- 蓄势聚力,共启美好|6月17-19日,CHCC2023第24届全国医院建设大会邀您共赴成都!
- CHCC2023邀请函 | 6月17-19日,第24届全国医院建设大会,相约成都,共创美好医院
- 山特全方位电源解决方案,护航生物制药行业“成长生命线”
- 工业级无人机亮相第七届深圳国际无人机展览会
- 研究人员最新发现 单个细胞可同时处理成百上千个信号
- 陆军第73集团军某旅 创新升级模拟训练器材
- 长期暴露在光照下性能退化 科学家发现钙钛矿太阳能电池最大缺陷
- 宁夏启动双百科技支撑行动 构建高水平产业创新体系
- 陆军炮兵防空兵学院 毕业学员综合战术演习现地备课工作圆满完成
- 国内首颗以茶叶冠名遥感卫星 安溪铁观音一号发射成功
- 区域特色产业转型升级 四川屏山以“3+”模式推进科技创新工作
- 激发创新动能促进产业发展 无锡滨湖走出产业转型“绿色”路
- 绥化全域低风险!黑龙江绥化北林区一地调整为低风险
- 走访抗美援朝纪念馆:长津湖的寒冷,与战斗一样残酷
- 节后第一天北京白天晴或多云利于出行 夜间起秋雨或再上线
- 走近网瘾少年们:他们沉迷网络的病根何在?
- “双减”后首个长假:亲子游、研学游需求集中释放
- 获2021年诺奖的蛋白,结构由中国学者率先解析
- 他从一窍不通的“门外汉”,到重装空投“兵专家”
- 升旗、巡岛、护航标、写日志,他们一生守护一座岛
- 中国故事丨“沉浸式”盘点今年的教育好声音!
- 农业农村部:确保秋粮丰收到手、明年夏季粮油播种
- “双减”出台两个月,组合拳如何直击减负难点?
- 《山海情》里“凌教授”的巨菌草丰收啦
- 且看新疆展新颜
- 天山脚下,触摸丝路发展新脉动
- 160万骑手疑似“被个体户”?平台不能当甩手掌柜
- 网游新政下,未成年人防沉迷的“主战场”在哪?
- “辱华车贴”商家及客服被行拘,处罚要不放过每一环
- 沙害是自然界的恶魔,而他是荒沙碱滩的征服者
- 面对婚姻,“互联网世代”的年轻人在忧虑什么?
- IP类城市缘何吸引力强?玩法创新带动游客年轻化
- 国庆主题花坛持续展摆至重阳节
- 都市小资还是潮流乐享?花草茶市场呈爆发性增长
- 从1.3万元降到700元,起诉书揭秘心脏支架“玄机”
- 北京国庆7天接待游客超861万人次 冬奥线路受青睐
- 陈毅元帅长子忆父亲叮嘱:你们自己学习要好,就可以做很多事儿
- 报告显示:这个国庆假期,粤川浙桂赣旅游热度最高
- 中国科技人才大数据:广东总量第一,“北上”这类人才多
- 嘉陵江出现有记录以来最强秋汛
- 全国模范法官周淑琴:为乡村群众点燃法治明灯
- 线上教学模式被盯上,网络付费刷课形成灰色产业链
- 云南保山:170公里边境线,4000余人日夜值守
- 警方查处故宫周边各类违法人员12人
- 农业农村部:确保秋粮丰收到手、明年夏季粮油播种
- 受南海热带低压影响 海南海口三港预计停运将持续到10日白天
- 多地网友投诉遭遇旅游消费骗局,呼吁有关部门严查乱象
- 神经科学“罗塞塔石碑”来了:迄今为止最完整的大脑细胞图谱
- 汾河新绛段发生决口
- 陕西支援14省份采暖季保供用煤3900万吨
- 这场红色故事“云比拼”,穿越时空为我们指引方向
- 受琼州海峡封航影响 10月7日、8日进出海南岛旅客列车停运
- 辽宁省工信厅发布10月8日电力缺口橙色预警
- 广州10月8日至20日对所有从省外来(返)穗人员实施核酸检测
- 假期怎么过得这么快?国庆5.15亿人次出游,你咋过的?
- 国庆假期全国道路交通总体安全平稳有序
- 哈尔滨市南岗区爱达88小区将调整为低风险地区
- 新疆霍尔果斯市2例无症状感染者新冠病毒均为德尔塔变异株
- 百闻不如一见——北京大学留学生参访新疆
- 看,生机勃勃的中国
- 国庆假期中国预计发送旅客4.03亿人次
- 新疆兵团可克达拉市:195名密接者已全部隔离医学观察
- 山西平遥消防4天29次救援:拖着腿走路也要完成任务
- 国庆假期北京接待游客861.1万人次
- 冷空气自西向东影响中国大部地区 气温将下降4℃至6℃
- 新疆哈密市巴里坤县发生4.3级地震 震源深度9千米
- 国庆假期中国国内旅游出游5.15亿人次
- 公安部交管局:国庆假期日均出动警力18万余人次,5位交警辅警牺牲
- 受南海热带低压影响广东将暂别高温天气
- “数说”杭州无障碍改造:触摸城市“爱的厚度”
- 新疆霍尔果斯无症状感染者新冠病毒属德尔塔变异株 未发现高度同源的基因组序列
- 新疆伊犁州:妥善做好滞留旅客安置返回工作
- 国庆假期广西累计接待游客逾3611万人次 实现旅游消费272.41亿元
- 2021年MAGIC3上海市青少年三对三超级篮球赛落幕
- 新疆兵团第四师可克达拉市1名无症状感染者为餐饮从业人员
- 哥伦比亚遇上广州:洋茶人“云上”喫茶 传播中国茶“味道”
- 厦门同安区四区域调整为低风险 全市无中高风险地区
- 直径2米“面气球”亮相 山西首届“寿阳味道”美食大赛启幕
- 世界第一埋深高速公路隧道大峡谷隧道出口端斜井掘进完成
- 浙南沿海村村发展有妙招 搭乘共富快车打造“海上花园”
- 新疆霍尔果斯两例无症状感染者新冠病毒均属德尔塔变异株
- 南沙港铁路国庆假期不停工 力争今年年底开通
- 添加陌生人为好友 内蒙古两女子被骗126万
- 中国国庆假期出行热:数字改变“关键小事”
- 水能载物亦能“生金” 浙江遂昌山村以水为媒奔共富
- 铁路人国庆雨中巡查排险记:一身雨衣、一把铁锹保安全畅通
- 铁路迎返程高峰 西安局集团公司加开79趟高铁列车
- 受热带低压影响 琼州海峡北岸等待过海车辆排长龙
- 哈尔滨市学校有序恢复线下教学
- 哈尔滨一地风险等级调整为低风险
- 从进“培训班”到看《长津湖》
- 安徽黄山国庆假期迎客12万余人 旅游市场稳步复苏
- 山西解除持续近90小时的暴雨四级应急响应
- 科学拦峰错峰削峰 嘉陵江洪水过境重庆中心城区“有惊无险”
X 关闭
资讯
X 关闭
行业动态
-
世界快播:如何用低代码搭建训练一个专业知识库问答GPT机器人
- 世界快播:如何用低代码搭建训练一个专业知识库问答GPT机器人
- 百诚医药跌5.12% 2021年上市即巅峰超募12亿
- 【环球热闻】中国地震台网正式测定:广东佛山市三水区发生3.4级地震
- 女子讳疾忌医,9年前的乳腺小肿块疯长到20斤险丧命
- 高氏三代人接力守护千年砖塔
- 黄金交易提醒:小心了!金价可能还要跌!美债收益率已发出警告
- 全球动态:郑州房协出台房企信用激励措施 优先推荐AAA房企参与保障房建设
- 文旅部印发意见推动在线旅游市场高质量发展:环球快讯
- 2023联赛准入名单:中超无昆山广州城 深圳广州队在列
- 今日讯!文化新观察|读懂新一年度全国十大考古新发现