本地知識庫優(yōu)化,讓 AI 回答更精準
大家在使用百度和谷歌搜索引擎的時候,搜索出來的內(nèi)容第一頁都是強相關(guān)的(廣告不算),越往后內(nèi)容可能越偏離。
這是因為搜索引擎會根據(jù)相似度&相關(guān)度進行綜合排列后,按照從高到低的順序進行返回,這就會導致越靠后就離搜索內(nèi)容越偏移。
而由于文字是有多種類型,并且擁有成千上萬種組合方式,因此在轉(zhuǎn)成向量進行相似度匹配時,很難保障其精確性。在向量方案構(gòu)建的知識庫中,通常使用 topk 召回的方式,也就是查找前 k 個最相似的內(nèi)容,丟給大模型去做更進一步的語義判斷、邏輯推理和歸納總結(jié),從而實現(xiàn)知識庫問答。因此,在知識庫問答中,向量搜索的環(huán)節(jié)是最為重要的。
影響向量搜索精度的因素非常多,主要包括:向量模型的質(zhì)量、數(shù)據(jù)的質(zhì)量(長度,完整性,多樣性)、檢索器的精度(速度與精度之間的取舍)。與數(shù)據(jù)質(zhì)量對應(yīng)的就是檢索詞的質(zhì)量。
基于 FastGPT 項目,我們來挨個進行講解。從索引階段(數(shù)據(jù)導入)和召回階段(數(shù)據(jù)搜索)兩個方面進行優(yōu)化。
一、索引階段
索引階段主要是兩種方式,一種是分段導入,一種是 QA 導入。
1、分段導入
直接分段會利用句子分詞器對文本進行一定長度拆分,大家可以看到我在導入??個人經(jīng)歷?
?后會被切割成好幾段內(nèi)容。
由于上下文長度是有限制的,所以在導入過長數(shù)據(jù)時會被自動切割成好幾份,切割后就可能會出現(xiàn)連貫語義數(shù)據(jù)被切割。
- 提示詞工程(Prompt Engineering):借助提示詞工程理解數(shù)據(jù)內(nèi)容,只能相對保證連貫語義內(nèi)容不會被切割。
- 手動切割:既然內(nèi)容太多,我們就可以自己手動切割,按照 Markdown 結(jié)構(gòu)化格式進行拆分,大語言模型讀取時很容易就能夠識別出來。
手動切割比起利用提示詞工程自動切割好處就在于:我們更加了解內(nèi)容,可以將內(nèi)容按照模塊進行準確分割,保證知識庫數(shù)據(jù)的完整性。
手動切割前:
大家好,我是知白。一個專注于輸出 AI+ 編程內(nèi)容的大廠資深程序員,全國最大付費社群 AI 破局初創(chuàng)合伙人,關(guān)注我一起進步......后續(xù)省略1000字
手動切割后:
# 知白
## 個人信息
大家好,我是知白。一個專注于輸出 AI+ 編程內(nèi)容的大廠資深程序員,全國最大付費社群 AI 破局初創(chuàng)合伙人,關(guān)注我一起進步......
## 工作經(jīng)歷
進入到工作后,第一個項目是做一個物業(yè)系統(tǒng),是一家國企外包出來的千萬項目......
由我們自己將數(shù)據(jù)切割好,并明確告訴模型每個模塊對應(yīng)的內(nèi)容,這樣檢索起來效率和準確度都會更好。
2、QA 方式
QA 指的是 Question(問題) 和 Answer(答案),我們直接將數(shù)據(jù)拆分成問題-答案的方式來進行導入。
但仍然需要使用到句子分詞器對文本進行拆分,但長度比直接分段大很多。在導入后,會先調(diào)用大模型對分段進行學習,并給出一些問題和答案,最終問題和答案會一起被存儲到 Q 中。
導入數(shù)據(jù)格式為:
Q1:問題
A1:答案
Q2:問題
A2:答案
......
數(shù)據(jù)借助 AI 做拆分,讓 AI 返回這樣的數(shù)據(jù)格式給我們。
二、召回階段
在做數(shù)據(jù)檢索和生成回答時,就有很多配置可以調(diào)整。
1、溫度&回復上限
可以看到溫度的兩頭分別是嚴謹和發(fā)散,具體含義如下:
- 嚴謹:生成的內(nèi)容要求精確,降低廢話和錯誤信息,適用于學術(shù)、醫(yī)學、報告解讀等場景
- 發(fā)散:生成的內(nèi)容會具有創(chuàng)造性,AI 會根據(jù)已有信息編造內(nèi)容,適用于小說、創(chuàng)意生成等場景
而回復上限控制 AI 回復的最大 Tokens,較小的值可以一定程度上減少 AI 的廢話,但也可能導致 AI 回復不完整。
2、相似度
學名稱為距離,兩個向量之間距離,可以認為是兩個向量的相似度,又可以映射成文本之間的相似度。
在進行內(nèi)容檢索時,會將所有檢索生成的信息與輸入內(nèi)容匹配,從而生成相似度。
需要注意的是,不同的向量模型之間的相似度是不能比較的,因為他們的距離值計算出來差距很大。例如,openai 的 embedding 模型,通常 0.8 以上的才是較為準確的內(nèi)容,而 M3E 模型則是 0.35。
這里相似度配置調(diào)整,就是可以直接將低于這個相似度的內(nèi)容剔除掉,從而保證結(jié)果的準確性。
3、單次搜索數(shù)量
每次觸發(fā)搜索模塊時,最多取 n 條作為最終引用,又稱 topN。需要注意的是,取了 n 條引用不代表對話模型都可以使用,還會受對話模型最大 Tokens 的影響。
通過控制每次結(jié)果的搜索個數(shù),從而只將高相似度內(nèi)容同步給 ChatGPT 從而提升準確性,同時還能節(jié)約 Token 數(shù)。但是可能出現(xiàn)內(nèi)容回答不完整的情況,需要按需調(diào)整。
4、提示詞調(diào)整
當然通過調(diào)整提示詞也能夠提升準確性,我們可以在提示詞中嚴格規(guī)則限定,從而保證輸出結(jié)果。
例如我們可以這樣約束模型:
你的背景知識:
"""
{{quote}}
"""
對話要求:
1. 背景知識是最新的,其中 instruction 是相關(guān)介紹,output 是預期回答或補充。
2. 使用背景知識回答問題。
3. 背景知識無法回答問題時,你可以禮貌的的回答用戶問題。
我的問題是:"{{question}}"
三、總結(jié)
對于原始數(shù)據(jù)的清洗也是非常重要,去除數(shù)據(jù)中的臟亂差等現(xiàn)象,從而保證數(shù)據(jù)的可用性和準確度。這部分工作我們也可以借助 AI 來完成,幫我們找出其中的??臟數(shù)據(jù)?
?。
參考文章:FastGPT 官網(wǎng)(https://doc.fastgpt.in/docs)
本文轉(zhuǎn)載自 ??AI探索者知白??,作者: 知白
