全球速遞!如何用低代碼搭建訓練一個專業知識庫問答GPT機器人

距離上篇文章《低代碼xChatGPT,五步搭建AI聊天機器人》已經過去3個多月,收到了很多小伙伴的關注和反饋,也幫助很多朋友快速低成本搭建了Chat

來源:依然基于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~

標簽:

相關閱讀

六代中醫傳人張喜海:守正中醫創新治骨...

張醫生,我們是專門過來找您看病的張院長,你看看我的病還能治嗎?治骨病,找張喜海醫生 紛雜的診室...

2019-12-17 更新

慶70華誕 迎民族盛會——新階層 新擔...

拼搏砥礪七十載,大展宏圖喜露顏。7月26日,由中華網河南頻道主辦,河南省委統戰部新的社會階層人士統戰工作處...

2019-07-28 更新

河南首家無人機表演編隊亮相 夜空中上...

【導語】河南地圖、少林功夫、司母戊鼎、甲骨文、盧舍那大佛、鯨魚、金字塔、雪花……200架無人機編隊在夜空中...

2019-07-15 更新

全球速遞!如何用低代碼搭建訓練一個專...

距離上篇文章《低代碼xChatGPT,五步搭建AI聊天機器人》已經過去3個多月,收到了很多小伙伴的關注和反饋,也幫...

2023-03-31 更新

全球快報:高級審計師考試《高級審計實務...

高級審計師考試《高級審計實務》復習資料:國庫現金管理 網上課程學習請電話咨詢:400-622-5005!

2023-03-31 更新

焦點關注:高級審計師考試《高級審計實...

高級審計師考試《高級審計實務》復習資料:國庫現金管理的概念 網上課程學習請電話咨詢:400-622-5005!

2023-03-31 更新

當前關注:高級審計師考試《高級審計實...

高級審計師考試《高級審計實務》復習資料:國庫現金管理的職能 網上課程學習請電話咨詢:400-622-5005!

2023-03-31 更新

高級統計師考試《高級統計實務與案例分...

高級統計師考試《高級統計實務與案例分析》備考:數值數據的整理與顯示 網上課程學習請電話咨詢:400-622-5005!

2023-03-31 更新

高級審計師考試《高級審計實務》復習資...

高級審計師考試《高級審計實務》復習資料:國庫現金管理的作用 網上課程學習請電話咨詢:400-622-5005!

2023-03-31 更新

【環球時快訊】什么手機可以拍月亮_蘋果...

1、首先打開蘋果手機的【相機】應用,然后將攝像頭對準月亮,接著長按拍攝圖標上方的變焦按鈕,根據場景大小調整...

2023-03-31 更新

天天熱點評!易建聯在nba哪個隊伍_易建...

1、據統計,易建聯曾在NBA洛杉磯湖人隊、密爾沃基雄鹿隊、新澤西籃網隊、華盛頓奇才隊效力打過球。2、易建聯在...

2023-03-31 更新

世界信息:車輛動力存安全隱患,克萊斯勒...

(一)、2022年1月14日至2022年5月18日期間生產的部分進口2 0T4xeRubicon四門版牧馬人混合動力汽車,共計1596...

2023-03-31 更新

鈉電風起,寧德時代、中科海鈉誰成新一...

在鈉離子電池發布會中,寧德時代研究院副院長黃起森博士表示,目前最具有潛在商業化價值的正極材料有普魯士白...

2023-03-31 更新

環球滾動:頭皮發麻!陵園附近,汽車中控...

網友猜測這名男子駕駛的汽車疑似理想L9汽車,對于該事件,3月29日理想工作人員還真的回應了,工作人員說,出現...

2023-03-31 更新

視點!“豪車黃昏”——正踏足巔峰,也...

可以看出,BBA中的奧迪集團、寶馬集團在2022年均出現了全球銷量下滑的情況,僅有梅賽德斯-奔馳集團的全球銷量...

2023-03-31 更新

全球速遞!體醫科普 | 腰椎間盤比業績...

如今腰椎間盤突出癥的發病率逐年升高,且有年輕化的趨勢。很多年輕人尤其是久坐辦公室的白領可能會相互調侃,...

2023-03-31 更新

每日快播:汽車流通協會組織座談 車廠...

e公司訊,中國汽車流通協會于3月30日下午,組織召開部分汽車主機廠參加的國六B切換情況座談會。會上獲悉,國六...

2023-03-31 更新

如何寫項目方案_項目方案怎么寫

1、現代農業示范項目實施方案一、項目概況(一)項目名稱。2、(二)項目建設地點及選擇依據。3、(三)項目建...

2023-03-31 更新

環球熱頭條丨順發恒業:2022年度凈利潤...

順發恒業(SZ000631,收盤價:3 38元)3月30日晚間發布年度業績報告稱,2022年營業收入約3 07億元,同比增加12...

2023-03-31 更新

文質彬彬是什么生肖圖片_文質彬彬是什么...

1、鼠,從子丑寅 的性質來看, "子 "一陽始生,鋼強弱者,與人往來,自然文質彬彬有禮,由于它的所處環境影...

2023-03-30 更新

中通快遞什么時候成立_中通成立房地產公司

1、快遞行業在現在是非常火爆的,人們在網上購物的方式越來越多,所以所需要的快遞也越來越多,現在我們所熟知...

2023-03-30 更新

上汽大眾新款途岳售15.86萬起 全新1.5T...

新款途岳還是保持了家族化的設計語言,前臉采用了貫穿式LED燈帶的設計,下部分則采用了大量的鍍鉻飾條裝飾再搭...

2023-03-30 更新

短訊!長城汽車2022年營收1373億元 研...

未來,長城汽車將把握長期趨勢,堅持長期主義,以科技激發創變內力,加大科技研發投入,持續推動智能新能源技...

2023-03-30 更新

全球快報:「AI」在長春 滿電出發 廣汽...

2023年3月30日廣汽埃安長春超順體驗中心隆重開業!永成汽車集團董事長劉雪雁女士、永成集團各汽車品牌總經理、...

2023-03-30 更新

95號汽油或將重回7元時代,燃油車您準備...

截止到3月27日,95號汽油已經累計下調425元 噸,折合為0 33~0 36元 升,截止到3月底,將會迎來第三次下調...

2023-03-30 更新

華大基因:增收不增利,2022年歸母凈利8...

華大基因3月30日發布2022年年度報告,2022年實現營業收入70 46億元,同比增長4 41%;歸母凈利潤8 03億

2023-03-30 更新

世界快看:國家醫保局:10家藥店違法違...

中新經緯3月30日電國家醫保局網站30日公布2023年第二期曝光典型案件,10家藥店違法違規使用醫保基金被查處。國家醫

2023-03-30 更新

成都凱賓科技發展有限公司_成都凱賓酒店

1、根據百度地圖查詢結果顯示,目前從成都雙流機場去往凱賓酒店香檳店,圖上直線距離約15公里。2、首選地鐵出...

2023-03-30 更新

全球看點:網站備案號查詢網址_網站備案...

1、怎么查詢我的購房合同已經備案?2、  查詢方法:3、  網上查詢:點擊省市鏈接進入各地房產管理局網站進...

2023-03-30 更新

“為了幫助別人嘛,這么做不丟人!”

“撿瓶子干啥?”“賣了捐款!”范木蘭以“希阿芝”名義捐款的收據。曹建雄攝16年,

2023-03-30 更新

天天速遞!迪士尼可以帶食品_迪士尼游客...

1、最近幾天上海迪士尼的事情又出現了新進展,6日,上海迪士尼松口,允許游客自帶食物入園。2、但是呢,是除去...

2023-03-30 更新

七十二小時打一字謎底答案_七十二小時打...

1、七十二小時打一字的謎底是:晶。2、七十二小時是三天(三日)。3、晶字扣三日(三天)。4、七十二小時即三...

2023-03-30 更新

訊息:馬斯克成推特粉絲最多的用戶,正...

鞭牛士3月30日消息,馬斯克已經正式超過美國前總統BarackObama,成為推特上粉絲最多的用戶,截至發稿,馬斯克...

2023-03-30 更新

新聞頻道

社會

財經頻道