1. 傳統(tǒng)LLM應(yīng)用的弊端? ? ? ?
????????自O(shè)penAI革命性的ChatGPT發(fā)布以來,在人工智能領(lǐng)域,特別是大型語言模型(Large Language Model,LLM)的能力進(jìn)化速度之快令人驚嘆,大模型浪潮已經(jīng)席卷了幾乎各行業(yè)。通過利用LLM的強(qiáng)大功能來解決復(fù)雜任務(wù)、增強(qiáng)自然語言理解和生成類人文本,從而可能顛覆各個領(lǐng)域。
? ? ? ?但是當(dāng)涉及到專業(yè)場景或行業(yè)細(xì)分領(lǐng)域時,通用的基礎(chǔ)大模型基本無法滿足我們的實際業(yè)務(wù)需求,主要有以下幾方面原因:
- 知識的局限性:模型自身的知識完全源于它的訓(xùn)練數(shù)據(jù),而現(xiàn)有的主流大模型(ChatGPT、文心一言、通義千問)的訓(xùn)練集基本都是構(gòu)建于網(wǎng)絡(luò)公開的數(shù)據(jù),對于一些實時性的、非公開的或離線的數(shù)據(jù)是無法獲取到的,這部分知識也就無從具備。
- 幻覺問題:所有的AI模型的底層原理都是基于數(shù)學(xué)概率,其模型輸出實質(zhì)上是一系列數(shù)值運算,大模型也不例外,所以它有時候會一本正經(jīng)地胡說八道,尤其是在大模型自身不具備某一方面的知識或不擅長的場景。而這種幻覺問題的區(qū)分是比較困難的,因為它要求使用者自身具備相應(yīng)領(lǐng)域的知識。
- 數(shù)據(jù)安全性:對于企業(yè)來說,數(shù)據(jù)安全至關(guān)重要,沒有企業(yè)愿意承擔(dān)數(shù)據(jù)泄露的風(fēng)險,將自身的私域數(shù)據(jù)上傳第三方平臺進(jìn)行訓(xùn)練。這也導(dǎo)致完全依賴通用大模型自身能力的應(yīng)用方案不得不在數(shù)據(jù)安全和效果方面進(jìn)行取舍。既要保證安全,又要借助AI能力,那么最好的方式就是把數(shù)據(jù)全部放在本地,企業(yè)數(shù)據(jù)的業(yè)務(wù)計算全部在本地完成。
????????其實問題還有很多,包括tokens的限制,雖然這個長期來看不是問題,各LLM供應(yīng)商的tokens數(shù)量限制肯定會越來越大。但是,費用也許就是另外一個需要考慮的問題了。
2.??檢索增強(qiáng)生成原理 ? ??
????????檢索增強(qiáng)生成(Retrieval-Augmented Generation,RAG),是一種使用外部知識庫來補(bǔ)充大語言模型的上下文并生成響應(yīng)的技術(shù)。 RAG結(jié)合了LLM中的參數(shù)化知識和非參數(shù)化外部知識,緩解了幻覺問題,通過檢索技術(shù)識別及時的信息,并增強(qiáng)了響應(yīng)的準(zhǔn)確性。 此外,通過引用來源,RAG增加了模型輸出的透明度和用戶信任度。 RAG還可以通過索引相關(guān)文本語料庫進(jìn)行定制以適應(yīng)特定領(lǐng)域。
? ? ? ?RAG的架構(gòu)如圖所示,簡單來講,RAG就是通過檢索獲取相關(guān)的知識并將其融入Prompt,讓大模型能夠參考相應(yīng)的知識從而給出合理回答。因此,可以將RAG的核心理解為“檢索+生成”,前者主要是利用向量數(shù)據(jù)庫的高效存儲和檢索能力,召回目標(biāo)知識;后者則是利用大模型和Prompt工程,將召回的知識合理利用,生成目標(biāo)答案。
? ????? 完整的RAG應(yīng)用流程主要包含數(shù)據(jù)準(zhǔn)備和應(yīng)用兩個階段。
????????數(shù)據(jù)準(zhǔn)備主要是將私域數(shù)據(jù)向量化后構(gòu)建索引并存入數(shù)據(jù)庫的過程。主要包括:數(shù)據(jù)提取、文本分割、向量化、數(shù)據(jù)入庫等環(huán)節(jié)。文本分割主要考慮兩個因素:1)embedding模型的Tokens限制情況;2)語義完整性對整體的檢索效果的影響。向量化是一個將文本數(shù)據(jù)轉(zhuǎn)化為向量矩陣的過程,該過程會直接影響到后續(xù)檢索的效果。數(shù)據(jù)向量化后構(gòu)建索引,并寫入數(shù)據(jù)庫的過程可以概述為數(shù)據(jù)入庫過程。
????????應(yīng)用階段根據(jù)用戶的提問,通過高效的檢索方法,召回與提問最相關(guān)的知識,并融入Prompt;大模型參考當(dāng)前提問和相關(guān)知識,生成相應(yīng)的答案。
????????我們可以化繁為簡。把RAG——Retrieval?Augmented?Generation理解為Retrieval?And? Generation,也就是檢索與生成,在加上一個數(shù)據(jù)向量和索引的工作,我們對RAG就可以總概方式地理解為“索引、檢索和生成”。
????????可以看到,RAG與LLM相結(jié)合,成為現(xiàn)階段自動構(gòu)建私有/本地知識庫的主要手段。
? ? ? ? 構(gòu)建本地知識庫有三個方面,一是LLM,懂得怎么處理自然語言;二是嵌入模型,它的工作就是把復(fù)雜的數(shù)據(jù)簡化,轉(zhuǎn)化成易于處理的格式;最后是向量數(shù)據(jù)庫,專門存儲和管理那些轉(zhuǎn)化后的數(shù)據(jù)。
????????本文介紹利用Ollama和AnythingLLM構(gòu)建自己的本地知識庫。
????????Ollama 是一個專注于本地運行大型語言模型(LLM)的框架,它使得用戶能夠在自己的計算機(jī)上輕松地部署和使用大型語言模型,而無需依賴昂貴的GPU資源。Ollama 提供了一系列的工具和服務(wù),旨在簡化大型語言模型的安裝、配置和使用過程,讓更多人能夠體驗到人工智能的強(qiáng)大能力。Ollama的下載和安裝可以參考我之前寫的另一篇文章(Window 11本地部署 Meta Llama3-8b),這里不再贅述。
1.?AnythingLLM 簡介
????????AnythingLLM 是 Mintplex Labs 開發(fā)的一款可以與任何內(nèi)容聊天的私人ChatGPT,是高效、可定制、開源的企業(yè)級文檔聊天機(jī)器人解決方案。它能夠?qū)⑷魏挝臋n、資源或內(nèi)容片段轉(zhuǎn)化為大語言模型(LLM)在聊天中可以利用的相關(guān)上下文。
????????AnythingLLM 支持多種文檔類型(PDF、TXT、DOCX等),具有對話和查詢兩種聊天模式。
支持多種?LLM、嵌入模型和向量數(shù)據(jù)庫:
????????LLM:包括任何開源的 llama.cpp 兼容模型、OpenAI、Azure OpenAI、Anthropic ClaudeV2、LM Studio 和 LocalAi。
????????嵌入模型:AnythingLLM 原生嵌入器、OpenAI、Azure OpenAI、LM Studio 和 LocalAI。
????????向量數(shù)據(jù)庫:LanceDB(默認(rèn))、Pinecone、Chroma、Weaviate 和 QDrant。
????????AnythingLLM 主要由三部分組成:收集器、前端和服務(wù)器。
- collector:Python 工具,可快速將在線資源或本地文檔轉(zhuǎn)換為 LLM 可用格式。
- frontend:ViteJS + React 前端,用于創(chuàng)建和管理 LLM 可使用的所有內(nèi)容。
- server:NodeJS + Express 服務(wù)器,處理所有向量數(shù)據(jù)庫管理和 LLM 交互。
????????可見,AnythingLLM是一個功能豐富,集成度很高的RAG框架,其在github上的開源項目(anything-llm),已經(jīng)有1萬2千多Star。它不僅僅是一個聊天機(jī)器人,是一個全棧應(yīng)用程序,旨在通過一個精心設(shè)計的用戶界面,為客戶提供與文檔、資源等進(jìn)行智能對話的最簡單方式。該工具的一個獨特之處在于,它可以在后臺簡單地運行,而不需要使用大量的內(nèi)存或資源。
????????AnythingLLM將文檔的容器化作為其基礎(chǔ)。在這種情況下,不同的工作區(qū)可以共享相同的記錄,但不能相互交互,從而允許用戶為不同的用例維護(hù)不同的工作區(qū)。AnythingLLM包括兩種聊天模式:對話模式,其中保留以前的問題;查詢模式,指針對用戶指定的文檔進(jìn)行簡單的問答聊天。此外,對于公開可訪問的文檔,每個聊天響應(yīng)還包括一個引用,鏈接到原始內(nèi)容。
2.?AnythingLLM 安裝
????????AnythingLLM安裝有很多方式,一是到官方網(wǎng)站(Download AnythingLLM for Desktop)下載桌面版,然后雙擊即可。
????????但是,與Docker版本相比,Desktop版本的功能要少很多,所以還是安裝Docker版的吧。
? ? ? ? 首先下拉一個鏡像:
????????按照官方說明,輸入下列命令:?
????????然后就開源打開瀏覽器,輸入網(wǎng)址http://localhost:3001/,顯示Anyting LLM入口。
3.?AnythingLLM 配置
? ? ? ? LLM選擇
????????選擇 Ollama,填入 Ollama 的??端口,然后選擇你下載的模型。
?
????????咦,報錯了!
????????哦,原因是AnythingLLM是運行在Docker容器中的,無法連接本地環(huán)回地址,得用這個地址:?,并選擇LLM(llama3)。
4.?AnythingLLM 測試
Embedding 和向量數(shù)據(jù)庫配置
可以選擇AnythingLLM 自帶的 AnythingLLMEmbedder,以及默認(rèn)使用內(nèi)置的向量數(shù)據(jù)庫 LanceDB。
? ? ? ? 1. 配置worksapce
????????點擊新建文檔庫,填寫名稱testanythingllm。
????????我們將本筆記存儲為簡單的txt文件,作為LLM的外部文檔。點擊按鈕開始添加文檔,并將文檔點擊出現(xiàn)就表示配置已經(jīng)完成。
2. 比較測試
????????回到主頁面,輸入問題“如何基于ollama+anything構(gòu)建知識庫”,結(jié)果見下圖,可以看到結(jié)果基本正確。
????????作為對比,我們看一下,llama3本身的答案:是很通用的答案,與ollama和anythingllm沒有聯(lián)系。
????????我們把llm換成對中文支持比較好的llama2 chinese版,看看這個問題的結(jié)果。
????????可以看到,基于llama2中文版的AnythingLLM結(jié)果還是比較理想的。類似的,后面直接基于llama2的回答結(jié)果就有點“胡思亂語”了。
? ? ? ? 本文首先介紹了LLM在落地應(yīng)用中的不足,引入了RAG這個框架和原理,介紹了RAG在私有知識庫中的重要作用。以O(shè)llama和AnythingLLM為實現(xiàn)手段,構(gòu)建了并測試了本地知識庫。測試結(jié)果表明,有了RAG的加持,LLM的回答結(jié)果更加貼切,有效。
參考文獻(xiàn)
一文搞懂大模型RAG應(yīng)用