1 背景
1.1 微調 vs. 知識庫
由于大模型在垂直行業(yè)領(lǐng)域的問(wèn)答效果仍有待提升,因此,領(lǐng)域知識的注入成為了最直接的解決方案之一。知識注入方法可以分為領(lǐng)域微調(Fine-tuning)和外掛知識庫(Knowledge Base)兩種。
1. 領(lǐng)域微調
微調是通過(guò)少量特定用例的增量數據對基礎模型進(jìn)行進(jìn)一步訓練,改變其神經(jīng)網(wǎng)絡(luò )中的參數權重。微調適用于任務(wù)或域定義明確,且有足夠的標記數據的場(chǎng)景,比如風(fēng)格微調。目前常用的微調方法包括Freeze,P-tuning和LoRA,相關(guān)細節會(huì )在下期文章中詳細介紹。
然而,微調方法的不足之處在于:
▪ 高質(zhì)量訓練數據集的構建,微調訓練所需的算力以及微調模型定期更新等開(kāi)銷(xiāo)都不容小覷
▪ 試錯成本較高,特定領(lǐng)域數據一般難以覆蓋模型已學(xué)到的參數,且可能會(huì )導致模型其他下游任務(wù)的表現下降
2. 外掛知識庫
外掛知識庫的本質(zhì)在于不修改基座模型參數,通過(guò)提示詞工程(Prompt Engineering)將特定知識作為prompt中的context,即召回相關(guān)性最高的幾個(gè)文檔,讓模型分析這些蘊含知識后,并返回答案。知識庫適合要求輸出明確且精度高的任務(wù)。
相對于微調,知識庫的優(yōu)勢在于:
▪ 回答精確度更高,基于相關(guān)文檔中的最相關(guān)特定段落進(jìn)行語(yǔ)義搜索能消除查詢(xún)歧義以生成更精確的答案
▪ 適應性更強,用戶(hù)可以通過(guò)輕松更新信息源來(lái)調整和適配新的領(lǐng)域
但大模型上下文窗口長(cháng)度的限制和Prompt的構造等因素帶來(lái)的潛在精度下降也需要納入知識庫構建的考量。
為了打造特定領(lǐng)域(Domain-specific Knowledge)的知識問(wèn)答系統,我們需要借助提供了外掛知識庫的搜索方案LangChain框架。
1.2 LangChain模塊
LangChain是一個(gè)由語(yǔ)言模型驅動(dòng)的用于開(kāi)發(fā)應用程序的框架。
LangChain主要的兩個(gè)能力是:
a. Data-aware:將不同數據源接入到語(yǔ)言模型中
b. Agentic:允許語(yǔ)言模型和LangChain環(huán)境交互
LangChain的核心模塊包括Models,Prompts,Chains,Indexes,Agents等 [1]。對于每一個(gè)模塊,LangChain都提供了標準化的可拓展接口。
圖1:LangChain部分模塊 [2]
除了用LLM Wrapper可以接入眾多的大模型(如 OpenAI、Cohere、Hugging Face),LangChain同時(shí)也通過(guò)VectorStore Wrapper接口集成了主流的向量數據庫(如 Milvus、Pinecone、Chroma等)來(lái)優(yōu)化語(yǔ)義搜索。LangChain能接入的數據類(lèi)型涵蓋了文本、PPT、圖片、HTML、Pdf等非結構化文件。相較于傳統數據庫的精確搜索,即完全匹配,向量數據庫使用最鄰近(Approximate Nearest Neighbor,ANN)算法和相似度度量(如余弦相似度,內積等)來(lái)找到和查詢(xún)問(wèn)題最相似的向量。基于本地知識庫問(wèn)答的大致流程如下:
這里以Milvus數據庫和ChatGPT作為示例:
圖2:LangChian + Milvus + ChatGPT pipeline [3]
2 實(shí)戰
目前,我們已經(jīng)拆解完了LangChain+LLM文檔問(wèn)答的大致鏈路,接下來(lái)我們正式進(jìn)入實(shí)戰環(huán)節。
2.1 環(huán)境搭建
a. 安裝LangChain
確保Python 版本≥ 3.8.1 且<4.0。
b. 部署LLama 2
關(guān)于Llama 2模型的部署,詳情可參見(jiàn)
i. 上期文章“大模型技術(shù)實(shí)踐(二)|關(guān)于Llama 2你需要知道的那些事兒”:https://mp.weixin.qq.com/s/9WISpAN91duVYVwfkZQaDw
ii. UCloud官方的“LLaMA2 模型快速部署”文檔:https://docs.ucloud.cn/gpu/practice/LLaMA2?id=llama2-模型快速部署
c. 下載Embedding 模型
這里我們選擇text2vec-large-chinese [4]這個(gè)Embedding模型,下載地址為:https://huggingface.co/GanymedeNil/text2vec-large-chinese
對于中文的場(chǎng)景,也有其他優(yōu)秀的開(kāi)源模型可供選擇,如m3e和bge等[5]。
d. 下載數據集
心靈雞湯文本數據集:https://huggingface.co/datasets/soulteary/warm-chicken-soup/
這個(gè)數據集是從Google網(wǎng)頁(yè)上爬取的一些心靈雞湯引用短文,共包含631條文本
2.2 文檔解析
a. 加載數據集
LangChain對于不同格式的數據源內置了不同的解析腳本,最終這些數據都將轉換為純txt文本格式,以實(shí)現文本標準化。
b. 文本切分
文本切分中的chunk_size指定了切分后的文本塊的字數,chunk_overlap指定了切分文本塊之間的重疊字數。由于雞湯引用文本總長(cháng)度較短,且文本內部語(yǔ)義關(guān)聯(lián)度高,所以這里的chunk_size設置為50,chunk_overlap設置為20。
c. 文本嵌入和向量庫
文本切分后,我們需要將文本進(jìn)行向量化表示,將其映射為低維稠密的向量并存儲到然向量數據庫中。向量數據庫選用了無(wú)需注冊的FAISS。
2.3 加載模型
2.4 語(yǔ)義檢索
接下來(lái),我就能根據構建好的向量數據庫召回對應文本片段。
a. 向量化召回
FAISS默認使用L2(歐式距離),召回的文檔按照相似度結果從大到小排序。
b. 設置提示詞模板
以下是Llama 2默認的提示詞模板
我們可以參考上面的模板,根據場(chǎng)景定制化自己的模板來(lái)拼接query和召回結果
2.5 推理示例
我們對LLM的參數進(jìn)行設置,例如最大令牌(max_new_tokens)、最高k值(top_k)、溫度(temperature)和重復懲罰(repetition_penalty)等等。最后,將prompt喂給模型。
3 外掛知識庫的問(wèn)題和優(yōu)化
3.1 LLM+Embedding-Search的局限
外掛知識庫將用戶(hù)問(wèn)題和本地知識向量化,比較兩者的向量相似度(Vector Similarity)進(jìn)行召回。然而,這種全量的Embedding-Search在面對多知識點(diǎn)聚合處理的場(chǎng)景下,存在召回精度低的問(wèn)題。因為知識庫的構建是對單個(gè)知識點(diǎn)進(jìn)行索引,而非對不同知識點(diǎn)的排列組合分別索引。
為了避免召回遺漏,直觀(guān)的處理方法包括降低相似度閾值(similarity score threshold)和增加召回數量(top_k),但這不免會(huì )引入無(wú)關(guān)的知識點(diǎn)噪聲且增加和LLM交互的token開(kāi)銷(xiāo)。
3.2 效果優(yōu)化方向
3.2.1 意圖識別和召回優(yōu)化
提升問(wèn)答系統的精度可以從意圖識別和召回優(yōu)化兩個(gè)角度考慮,且兩者都可以用關(guān)鍵詞表示,即從直接將用戶(hù)query和知識點(diǎn)進(jìn)行embedding轉變?yōu)閷烧咛崛£P(guān)鍵詞后再進(jìn)行匹配。意圖識別可以通過(guò)關(guān)鍵詞提取(Information Extraction, IE)和槽位填充(Slot Filling,SF)實(shí)現。:
1. 關(guān)鍵詞提取
a. 面向query——槽位填充
利用LLM思維鏈(Chain-of-Thought,COT)的提示能力來(lái)引導用戶(hù)多輪對話(huà)并進(jìn)行信息總結。針對我們的心靈療愈機器人的場(chǎng)景,比如用戶(hù)查詢(xún)心靈雞湯的句子,那么就要求用戶(hù)的提供年齡段,情緒問(wèn)題和情感需求等信息。語(yǔ)義槽格式如下:
b. 面向知識點(diǎn)——索引入口
對于知識點(diǎn)可以從以下兩個(gè)方面考慮:
i. 對相同知識點(diǎn)建立多級索引,有助于實(shí)現對維度查詢(xún)。比如對一位奧運冠軍的姓名,競賽項目,年齡,獲獎時(shí)間等分別建立索引。
ii. 將知識庫轉化為以關(guān)系三元組為核心的知識圖譜。三元組的抽取除了傳統的命名實(shí)體識別(NER)等方法,也可以通過(guò)prompt讓大模型來(lái)進(jìn)行抽取。
基于關(guān)鍵詞的embedding入庫和搜索流程如下:
2. 多路召回
類(lèi)似于Bert時(shí)代的垂直領(lǐng)域問(wèn)答系統,我們可以將語(yǔ)義檢索和傳統的Elasticsearch(ES)關(guān)鍵詞搜索并行,對兩者進(jìn)行加權打分投票來(lái)獲取最終的top_k。
目前類(lèi)似于以上優(yōu)化思路已經(jīng)落地的有“錄問(wèn)”法律大模型 [6],其基座模型為Baichuan-7B。錄問(wèn)知識增強的完整鏈路如圖3。值得注意的是,錄問(wèn)在知識庫中對每一個(gè)知識點(diǎn)是以 [key, value] pair 形式存儲的。key是知識點(diǎn)的內容簡(jiǎn)介,用于檢索;value是知識點(diǎn)的具體內容,用于模型輸入。實(shí)現細節請參照其Hugging Face倉庫。
圖3:“錄問(wèn)”知識增強鏈路
3.2.2 其他優(yōu)化方向
除了Embedding部分,“LangChain+LLM”(圖2)鏈路內的其他組件也有進(jìn)一步優(yōu)化的空間:
1. 知識庫細化
當用戶(hù)手動(dòng)選擇分區后,分區檢索可以明顯提高召回的精度。
圖4:“錄問(wèn)”的交互界面
2. 文本切分方式
由于文本重疊(overlap)的大小沒(méi)有統一標準,如何保證語(yǔ)義完整和連貫都需要不斷測試。
3. 提示詞的質(zhì)量
在提示詞模板的設計上要增加明確約束條件的指令,減少大模型出現幻覺(jué)現象的幾率。
4. 大模型的選型
選擇基座模型還是微調后的模型,以及對中文的支持程度的需求都需要結合下游場(chǎng)景進(jìn)行判別。
本期文章帶你基于“LangChain+LLM”框架快速搭建了知識增強后的問(wèn)答機器人--心靈療愈師,并探討了提升模型的內容理解和執行能力的潛在優(yōu)化方向。下期文章我們將深入解讀目前主流的大模型微調技術(shù),敬請期待~
4 參考文獻
[1] LangChain Docs: https://python.langchain.com/docs/modules/
[2] Revolutionizing NLP: Building Advanced Applications with LangChain and LLMs: https://www.linkedin.com/pulse/revolutionizing-nlp-building-advanced-applications-chandan/
[3] Zilliz gitee: https://zilliz.gitee.io/welcome/
[4] GanymedeNil/text2vec-large-chinese: https://huggingface.co/GanymedeNil/text2vec-large-chinese
[5] MTEB Leaderboard: https://huggingface.co/spaces/mteb/leaderboard
[6] 錄問(wèn) (wisdomInterrogatory) github: https://github.com/zhihaiLLM/wisdomInterrogatory