天天看點

如何用 ChatGPT 建構你的專屬知識問答機器人

作者:閃念基因

緣起

從去年底開始 ChatGPT 火爆出圈,大家都在思考如何利用 ChatGPT 的能力來建構自己的應用,我也在想,如果有一個機器人可以學習一下開源項目文檔中的資訊,那是否就可以作為一個開源項目的問答機器人了呢?

這個想法一直在我腦海裡,直到看到了有人已經進行了實作,也就是 DocsGPT,這個項目開源一個月已經收獲了 3000+ star。

我自己也想試一下,于是按照文檔也部署了自己的一個執行個體,并且添加了一部分項目的文檔進去。大家有興趣的可以通路OSS-GPT 進行嘗試,看看效果如何。

如何用 ChatGPT 建構你的專屬知識問答機器人

DocsGPT 中 OpenDigger 文檔的問答效果。目前支援的項目包括:OpenDigger,OpenYurt,Egg.js,Midway.js,NebulaGraph,OceanBase,OpenSumi 等。

深究

按照 DocsGPT 的 Wiki 訓練了幾個自己熟悉的項目文檔後也發給相應社群的負責人試用了一下,發現效果差強人意,有時候還是比較智障的,于是想深入探索一下背後具體是什麼原理。

ChatGPT 的使用方法

說到具體的實作方法,首先要提到 ChatGPT 是如何使用以及有哪些限制的。

ChatGPT 提供了非常簡單的 API 接口可以用來做聊天任務,底層使用的是 gpt-3.5-turbo 大模型,這個模型使用的訓練資料本身是較老舊的網際網路資訊(截止到 2021.9),是以它并不具有一些較新的資訊,更不要提非公開的資訊了。

是以 ChatGPT 提供了通過 prompts 來進行提示的方法,也就是在發起請求時,可以帶上一段資訊。由于是一個聊天接口,是以可以包含多個聊天的内容。其中包括來自系統的提示:例如用來描述一下 ChatGPT 現在是什麼角色,應該具有什麼樣的語言風格等。另外還可以包含一些使用者的曆史聊天記錄,就像背景知識一類的,都可以作為使用者的輸入帶進去,這樣可以使得 ChatGPT 在本次聊天中具有了領域知識與上下文資訊。通過這種 prompts 的方式,可以對 ChatGPT 有一定的定制能力,并使用其大模型的自然語言能力來組織回答資訊。

以上就是目前 ChatGPT 類領域聊天機器人的基本原理了,除了 DocsGPT,還有最近剛剛開源的項目 document.ai 都使用了類似的方法,這種方法的基本流程是:

  • 将輸入的所有文檔資料進行向量化并存儲起來
  • 當聊天時,在存儲的向量資料中查詢出與目前聊天内容最相近的一部分文檔内容
  • 将上述的文檔内容作為 prompts 的一部分同聊天内容一并發給 ChatGPT 進行問答

這也就完成了對特定領域資訊的注入,如果要達到聊天上下文的效果,還可以把之前的聊天内容也一并帶上,那麼就可以帶有上下文資訊了。

下面是來自 document.ai 項目的流程圖:

如何用 ChatGPT 建構你的專屬知識問答機器人

ChatGPT 的限制

但其實這種基于預檢索和 prompts 的方法限制也在這裡。

因為底層的 ChatGPT 的模型是一個通用模型,而 OpenAI 并沒有開放 gpt-3.5-turbo 模型 fine-tune 能力,這樣意味着我們無法通過 fine-tune 來訓練一個自己的專屬模型,隻能通過 prompts 來做提示。

而 prompts 本身也有一定的限制,ChatGPT 的接口有 4096 的 max_tokens 的限制,而這個限制是指 prompts 加回答的總量,是以我們無法在 prompts 帶過多的資訊,而且如果要帶聊天上下文的資訊的話,預檢索的資料量就會更小一些。這也就限制了 ChatGPT 的精确度。

以下是關于 gpt-3.5-turbo 模型的官網說明,包含了對 token 的限制以及資料集的時間區間:

如何用 ChatGPT 建構你的專屬知識問答機器人

嘗試

于是我在想,是否可以使用能夠 fine-tune 的模型來訓練自己的專屬模型呢?這樣一來對話時将不再需要做背景知識的 prompts,因為背景知識已經被融入了這個專屬模型,最多在多輪聊天中帶上上下文的資訊,可以使回答更智能。

由于 gpt-3.5-turbo 模型并不提供 fine-tune 能力,我們可以選用 GPT-3 的模型,如 text-davinci-003 來做 fine-tune。就像 OpenAI 在官網首頁和文檔中介紹的,這兩個模型在表現上是非常接近的,但 gpt-3.5-turbo 模型的成本是 davinci 模型的 10%,是以推薦大家使用前者。

那麼接下來的問題是我們如何使用自己的文檔資料來訓練一個專屬模型呢?因為 davinci 模型的 fine-tune 方法是需要輸入一組 prompt 和 completion 的文本對,prompt 可以是一個問題或句子填空,而 completion 就是對問題的回答或者補充填空。是以我們需要将項目文檔轉換成類似的形式。

此時我們又可以回到 ChatGPT 了,因為它有非常好的閱讀了解能力,對于這類文本任務的處理效果很好。于是我們可以先把自己的文檔拆分成一段一段的資訊,然後喂給 ChatGPT 讓它把這些資訊轉換成一個個的事實問答對,并以 JSON 形式傳回回來。當所有文檔都拆分好以後就變成了一大批的基于該項目事實資訊的 prompts 資料。

之後将這些 prompts 資料發送給 OpenAI 的接口基于 davinci 的基礎模型訓練一個專屬模型,等模型訓練好以後就可以來嘗試和自己的專屬模型聊天啦。

使用 Sealos 的官方文檔中的 89 個 Markdown 檔案得到了 1502 個問答對,其中的一些 prompts 示例如下,看起來還是非常不錯的:

如何用 ChatGPT 建構你的專屬知識問答機器人

對比

成本

其實最大的對比還是成本的對比,ChatGPT 由于沒有 fine-tune,是以成本就隻有每次問答的成本,但由于大部分時候需要帶大量的 prompts,其實隐性的成本是挺高的,我們經常可以看到一個簡短的問題會帶有上千個字元的 prompts。

而 davinci 的 fine-tune 模型的訓練成本是較高的,Sealos 文檔的訓練一共向專屬模型中輸入了 25 萬多個 token,訓練時間 1 個小時左右,成本 8 美元。但一旦獲得專屬模型後,後續的聊天中就不再需要做預檢索和背景知識的 prompts 了,可以直接進行關于該領域的知識問答。不僅 token 消耗會變小,而且速度也會更快。

Sealos 4.0 文檔的專屬模型是 davinci:ft-personal:sealos-doc-2023-03-11-13-00-02 ,有興趣的同學可以試試,我不确定是否是所有人都可以使用的。

效果

這裡我比較了一下 DocsGPT 和簡單的 fine-tune 模型在 OpenDigger 下的效果。

如何用 ChatGPT 建構你的專屬知識問答機器人
如何用 ChatGPT 建構你的專屬知識問答機器人

第一張是 DocsGPT 的效果,第二張是 davinci fine-tune 模型的效果。可以看到兩個表現都還不錯,但也存在明顯的差異:基于 ChatGPT 的結果看起來更好一些,因為它具有更好的語言能力,甚至會做一些延伸和擴充,雖然有些是錯誤的。而專屬模型的回答更加簡潔,而且與 prompts 有較大的關系,是以對細節的掌握更多一些。

由于專屬模型的回答與 prompts 的品質非常相關,是以更好的訓練資料一定會讓其表現更好。目前隻是使用了最簡單的 ChatGPT,而且給到的任務可能不足夠好,是以結果還有提升的空間。但可以看到 ChatGPT 對于文本的了解還是很強的,尤其是對于一些結構化的文本,例如對表格的了解是很強的。如果進一步優化第一步構造 prompts 資料的邏輯,再加上一些人工的調整和修正,效果應該會更好。

未來

其實基于大模型的可能性真的非常多,有想象力的話可做的事情太多了,例如将自己的思想和部落格作為輸入,可以訓練出一個包含自己想法的模型,然後給他一個定位是模仿人進行交流,那麼就可以得到一個你的虛拟人了,很多情況下,對于領域 KOL,完全可以通過這種方式和粉絲互動,粉絲可以直接針對他的思想來進行提問和交流。

而對于不善寫作的人,可以把自己的想法按照簡單的問答對的形式輸出來訓練自己的專屬機器人,再配合大模型本身的語言和邏輯能力幫助自己撰寫包含自己思想的文章,應該也是非常不錯的思路。

對于一個以前從來沒自己做過機器學習訓練的入門者,最近幾天還是非常津津有味的做了一些嘗試,而且效果還是比較驚豔的,也歡迎有興趣做 prompts engineering 的同學一起交流心得。

作者:Frank

出處:https://blog.frankzhao.cn/build_gpt_bot_for_doc/

繼續閱讀