距离上篇文章《低代码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构造处理,这两个处理我们都可以使用腾讯云低代码的云函数来实现(当然第一步的预处理也可以在本地电脑完成)
首先,将所需要的预处理的知识库内容放在某个目录下,遍历知识库目录下的所有文档文件(本文文件格式以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的搜索逻辑。
我们在上一步中已经完成了文本数据的向量化存储。接下来,可以基于用户提交的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的搜索部分完成了,到此所有后端接口的核心逻辑也都完成了,可以看到几个关键流程的实现是不是很简单呢。
完成后端代码开发后,接下来就是把相应的运行代码部署到微搭低代码的云函数中,综上可知,主要是两部分的后端代码,一部分文档的向量化并入库(这部分本地Node环境运行亦可),另一部分就是实现搜索词匹配构建prompt后调用GPT接口查询了。
微搭低代码的云函数入口,可以在数据源->APIs->云函数
中找到,如下图所示:
如果第一次使用云函数,需要点击图中链接跳转到云开发云函数中进行云函数的新建,如下图所示:
新建完成后,点击进入云函数详情页,选择”函数代码“Tab,然后在下面的提交方法下拉框中选择”本地上传ZIP包“即可上传前面完成的后端逻辑代码,也可以直接下载 github/lowcode.ai打包后上传。上传成功后,第一次保存别忘了点击”保存并安装依赖“来安装对应的npm包。
在完成云函数新建和代码上传后,回到上一步的微搭数据源APIs界面中刷新页面,即可看到刚刚新建好的云函数openai,选中该云函数,并按要求正确填写对应的出入参结构,测试方法效果并保存后,即可在第一章的前端界面”发送“按钮中绑定调用数据源事件进行调用了。
完成上述后端逻辑以及云函数配置后,可以切到编辑器的页面设计模块,回到第一章的界面设计来进行事件的配置,完成后点击编辑器右上角的“发布”按钮,可以选择发布到你已绑定的小程序,也可以直接发布Web端H5/PC应用。
至此,一个垂直知识库的AI问答机器人应用基本就搭建完成了。
本文中采用的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
可以通过Web端体验作者搭建的Web版文档机器人,同时得益于微搭低代码的一码多端,同步发布了一个小程序版本,大家可以扫码体验。
由于目前自建向量库的性能局限以及有限的预处理文档数据,响应可能比较慢,准确性偶尔也会差强人意,还请各位看官谅解,抽时间再持续优化了,本文还是以技术方案的探讨交流为主。
通过本教程的介绍,你已经基本熟悉了如何使用微搭低代码快速搭建垂直知识库的AI问答机器人了,有任何疑问可以关注「漫话开发者」公众号留言。
用低代码创建一个GPT的聊天应用很简单,实现一个垂直领域的AI问答应用也不难。未来不管被AI替代也好,新的开发者时代来了,先动手试试,make your hands dirty first, enjoy~
标签:
上一篇 : 3月以来共有156只基金新成立 较2月翻倍增长
下一篇 : 最后一页
最新推荐
距离上篇文章《低代码xChatGPT,五步搭建AI聊天机器人》已经过去3个多月,收到了很多小伙伴的关注和反馈...
据Choice数据统计,3月以来共有156只基金新成立(以基金成立日统计),较2月成立基金数量(75只)翻倍增长。...
(郭军陈文)中国南方航空公司(以下简称“南航”)3月31日正式恢复深圳至台北航线。据悉,南航深圳至台北航...
宝马投资百亿扩建在辽宁沈阳的电池生产中心,巴斯夫百亿欧元在广东湛江投资一体化生产基地……中国正在...
庆余年2将回归的角色有哪些?有很人都不太清楚庆余年2将有哪些角色将要回归,下面为大家带来具体内容,...
新华社北京3月31日电(记者潘洁、魏玉坤)国家统计局服务业调查中心、中国物流与采购联合会3月31日发布...
3月31日盘中消息13点34分大华股份002236触及涨停板目前价格2261上涨1002其所属行业计算机设备目前上涨领...
微笑刺客:忘了谁说过没人怕LBJ但西部前七没人想首轮碰他,刺客,湖人,lbj,勒布朗詹姆斯,新奥尔良鹈鹕,伊...
别慌,当下的AI还做不好决策。
1、有,已经杀青了。2、第二部叫做《十三棍僧救唐王》。3、第一部里的六个师兄弟都在,不过都是新角色。...
图为“税费管家”在中国电信海北分公司向企业负责人问需问计。 李涛 摄中新网青海大柴旦3月31日电(索...
马卡:巴萨今年夏窗不打算在右后卫位置上引援,夏窗,马卡,巴萨,马丁内斯,巴塞罗那队
3月30日,由市科协、市教委主办的2023年重庆市院士专家科普校园行活动启动仪式暨首场科普报告会在重庆市...
天文学家近期借助“引力透镜”效应,观察到可能是有史以来最大的一个超大质量黑洞。据法新社报道,这项...
1 微小的刮痕:轻微刮花的漆面损伤部位是在面漆的表层,可以通过打蜡完全修复。用混合剂处理,擦拭方法...
今天,大学路小编为大家带来了校友会最新211和985大学最新排名全国公办三本大学有哪些,希望能帮助到广...
一、黑龙江省哈尔滨市天气预报1、宾县气象台3月30日22时35分发布霾黄色预警信号。2、预计3月30日夜间至4...
1、第一部第三十五话御台场仙子,花仙兽??吸血魔兽用结界包围了整个御台场,然后叫死神兽去抓所有的小朋...
根据《山东省法官检察官遴选和惩戒委员会遴选工作办法(试行)》规定,山东省法官检察官遴选和惩戒委员...
中国青年报客户端北京3月30日电(中青报·中青网见习记者国新冠)路透社3月29日援引沙特阿拉伯国家通讯...
1、《德意志文化(1945~2000年)》一书由〔德〕赫尔曼·格拉瑟所著。2、社会科学文献出版社出版发行。...
中国证券网讯(记者陆海晴)近期,医药板块有所调整,诺德基金基金经理朱明睿表示,今年有望成为医药板块...
原标题:巴西农牧业部部长卡洛斯·法瓦罗:中巴两国贸易往来将更加广阔“我相信巴西与中国的贸易往来将...
固定资产进项税如何做会计分录?借:固定资产应交税费-应交增值税(进项税);初级会计28个会计分录+50个必...
智东西编译|吴菲凝编辑|李水青智东西3月29日消息,本周二,微软在其首届MicrosoftSecure活动中发布了一...
1、用过海明快递单号生成器,还不错,可以生成当天真实单号,在桃保后台可以查询到跟踪信息,这样的软件...
这个春天,曾经刷爆朋友圈的“露营”,似乎没有和花草一起复苏。过去一年,露营地不再只是一个小众的拍...
3月30日电,港股早盘走低,香港恒生指数跌0 69%;恒生科技指数跌1 12%。盘面上,生物科技、软件、信息...
无论全宇元出于什么样的动机爆料和道歉,韩国民众似乎并不买账,认为全宇元只是出于“对父亲的怨恨”。
摘要上海黄金交易所黄金t+d3月30日(周四)早盘盘初下跌0 10%,暂报436 73元 克,今日开盘报437 43元...
为进一步弘扬爱国主义精神,传播爱国爱校思想情感,加强国旗班队伍建设,激励新一届新科国旗班成员传承...
市场录得数宗1亿港元或以上的交易,显示买家对优质资产持续感到兴趣。
资料整理工作计划及目标第1篇20xx年即将过去,回顾过去的一年,我在公司及项目领导的指导和关心下,在同...
3月29日北向资金减持35 63万股青松建化。近5个交易日中,获北向资金减持的有3天,累计净减持81 25万股...
1、我们需要先把姜磨成粉,用姜磨把姜磨成姜。2、然后在过滤后的肉里倒入生姜。3、用勺子挤姜,把姜汁挤...
爹爹网购电动自行车上牌一波三折,民警提醒:市民要通过可靠渠道购买合规产品---近日,年逾七旬的田先生...
1、以下回答为原创一般来说,制作青红丝的原料为桔子皮,采用糖渍的工艺腌制而成,腌制的时候加入不同颜...
如不能正常浏览请选用IE浏览器 天津北方网讯:日前,大港油田旗下页岩油效益开发示范平台——沧东凹...
上证报中国证券网讯3月29日晚间,华龙期货公告,公司2022年实现营收3225 73万元,同比下滑31 12%,归...
一、中国金融期货交易所2年期国债期货成交量华经产业研究院数据显示:2022年中国金融期货交易所2年期国...
中国网地产讯郑州市房协公告对房地产企业实行信用激励措施其中信用等级为AAA级的开发企业列为市重点扶持...
原标题:吉网聚焦|展出标本千余种长春这个展馆免费开放!世间生物,纷繁复杂,丰富精彩。3月29日,长春...
3月29日电,银河电子披露2022年年度报告,报告期内,公司实现营业收入13 11亿元,同比下降8 01%;归属于上市公
极目锐评|男子求职被要求在杭州本地买房,这公司不如直接发套房?---3月27日,杭州市民周先生称应聘销售...
库里39+8莺歌26+8勇士主场逆转鹈鹕,勇士队,麦科勒姆,美国篮球,新奥尔良鹈鹕,斯蒂芬·库里,篮板助攻抢断盖帽
呵呵,第一个问题客户代表通常有两种,一种是代表公司出去跟客户谈业务的,说白一点就是业务员 另一种...
凯投宏观(CapitalEconomics)认为,美元将在未来几周继续走强,但应该会从年中左右开始走低。凯投宏观经济学家
可立克(002782)(002782):开展金融衍生产品交易业务的公告3月29日,可立克公告显示,公司及子公司(指全...
阳春三月,正值春茶上市之际。大山深处的茶产品怎样才能成为乡村振兴的重要力量?长安汽车用跨界的新公...
3月20日至24日,“昭通市2023年美育浸润行动计划研修班”在昆举办。昆明学院音乐舞蹈学院与昭通市教育体...
成都抗疫的外籍志愿者:愿为城市“康复”贡献力量
短讯!同济樱花盛放,来看粉色“云”海 | 花开高校 绝美杨浦
水岸经济、夜经济、数字经济!北京这样让消费“热”起来|时快讯
中国磷化工产业链节能与绿色低碳提升项目在贵阳启动_天天速看料
养殖板块走强,立华股份、圣农发展涨超6%,养殖ETF(159865)涨超1%
全球要闻
全球讯息:一级残疾赔偿金的计算方法_残疾赔偿金的计算方法伤残赔偿系数
环球快播:544起侵权官司葛优几乎全胜:网络热词“葛优躺”不能随便用
全球最新:61岁的梁朝伟,获威尼斯电影节终身成就奖!刘嘉玲发文庆祝
环球头条:大连重工:3月27日融资买入643.58万元,融资融券余额2.29亿元
吴启华风采不减成男神,为魔幻巨作《魔域手游2》发视频以示祝贺
徐静蕾在婆婆面前好卑微,穿得像保姆太朴素,也能走出时髦辣姐范
世界热头条丨美好医疗(301363)3月27日主力资金净卖出23.07万元
世界快讯:职业棒球场采用亚马逊Just Walk Out无摩擦购物
云路股份:公司非晶合金干式变压器已广泛应用于数据中心领域_环球看热讯
每日热文:TES双C西装现身微博之夜,合影胡歌,Rookie直夸:他太帅了
全球视点!古典大师风采依旧!44岁里克尔梅纪念赛再秀优雅摆脱、巧妙直塞
此笔交易没有可用的认证方式或超过限额是怎么回事_此笔交易没有可用的认证方式或超过限额_天天看热讯
环球焦点!镖行天下之前传全集顺序_镖行天下前传全集顺序是怎样的
实时焦点:李大霄喊话:今年大牛市即将启动,明天是三亿散户最佳抄底机会
Copyright © 2015-2022 热讯律师网版权所有 备案号:豫ICP备20005723号-6 联系邮箱:29 59 11 57 8@qq.com