基于 LLaMA 和 LangChain 實踐本地 AI 知識庫

有時候,我難免不由地感慨,真實的人類世界,本就是一個巨大的娛樂圈,即使是在英雄輩出的 IT 行業。數日前,Google 正式對外發布了 Gemini 1.5 Pro,一個建立在 Transformer 和 MoE 架構上的多模態模型。可惜,這個被 Google 寄予厚望的產品并未激起多少水花,因為就在同一天 OpenAI 發布了 Sora,一個支持從文字生成視頻的模型,可謂是一時風光無二。有人說,OpenAI 站在 Google 的肩膀上,用 Google 的技術瘋狂刷屏。此中曲直,遠非我等外人所能預也。我們唯一能確定的事情是,通用人工智能,即:AGI(Artificial General Intelligence)的實現,正在以肉眼可見的速度被縮短,以前在科幻電影中看到的種種場景,或許會比我們想象中來得更快一些。不過,等待 AGI 來臨前的黑夜注定是漫長而孤寂的。在此期間,我們繼續來探索 AI 應用落地的最佳實踐,即:在成功部署本地 AI 大模型后,如何通過外掛知識庫的方式為其 “注入” 新的知識。

從 RAG & GPTs 開始

在上一期博客中,博主曾經有一個困惑,那就是當前階段 AI 應用的最佳實踐到底是什么?站在 2023 年的時間節點上,博主曾經以為未來屬于提示詞工程(Prompt Engineering),而站在 2024 年的時間節點上,博主認為 RAG & GPTs 在實踐方面或許要略勝一籌。在過去的一年里,我們陸陸續續看到像 Prompt Heroes、PromptBase、AI Short…等等這樣的提示詞網站出現,甚至提示詞可以像商品一樣進行交易。與此同時,隨著 OpenAI GPT Store 的發布,我們仿佛可以看到一種 AI 應用商店的雛形。什么是 GPTs 呢?通常是指可以讓使用者量身定做 AI 助理的工具。譬如,它允許用戶上傳資料來豐富 ChatGPT 的知識庫,允許用戶使用個性化的提示詞來指導 ChatGPT 的行為,允許用戶整合各項技能(搜索引擎、Web API、Function Calling)…等等。我們在上一期博客中提到人工智能的 “安卓時刻”,一個重要的契機是目前產生了類似應用商店的 GPT Store,如下圖所示:

在這里插入圖片描述

如果你覺得 OpenAI 的 GPT Store 離我們還稍微有點距離的話,不妨了解一下 FastGPT 這個項目,它以更加直觀的方式展示了一個 GPTs 是如何被創造出來的。如圖所示,博主利用我的博客作為知識庫創建了一個博客助手,而這一切只需要選模型、編寫提示詞、上傳資料三個步驟即可。感興趣的朋友可以從 這里 進行體驗:

在這里插入圖片描述

由此,我們就可以得出一個結論,目前 AI 應用落地主要還是圍繞大模型微調(Fine Tuning)、提示詞工程(Prompt Engineering) 以及知識增強展開,并且 GPTs 里依然有提示詞參與,兩者并不沖突。考慮到,大模型微調這條線存在一定的門檻,我們暫且將其放在一旁。此時,提示詞工程和知識增強就成為了 AI 應用落地的關鍵。知識增強,專業術語為檢索增強生成,即:Retrieval-Augmented GenerationRAG,其基本思路就是將大語言模型和知識庫結合起來,通過外掛知識庫的方式來增強大模型的生成能力。比如微軟的 New Bing 是 GPT-4 + 搜索引擎的方案,而更一般的方案則是 LLM + 向量數據庫的思路,下圖展示了 RAG 運作的基本原理:

在這里插入圖片描述

從這個角度來看,LangChain 及其衍生項目 AutoChain、Embedchain,甚至 FastGPT 等項目解決的本質都是 RAGAgent 的問題。其中,Agent 不在本文的討論范圍內,這里博主不打算詳細展開。接下來的內容,博主會按照這個思路進行闡述,并且以 LangChain 為例來對其中的細節進行說明。

知識庫構建

如你所見,RAG 由 LLM 和 知識庫兩部分組成。首先,我們來構建知識庫,通常,這個過程可以劃分為下面四個步驟,即:載入文檔(Loader)、拆分文本(Splitter)、文本向量化(Embeddings)、向量存儲(VectorStore)。

在這里插入圖片描述

Loader

你會注意到,博主在文章中加粗顯示了這四個步驟的英文描述,事實上,這代表了 LangChain 中的一部分概念,以 Loader 為例,它負責從各種文檔中載入內容,下面展示了從文本文件、PDF 文件以及網頁中載入內容:

from langchain_community.document_loaders import DirectoryLoader, TextLoader, PyPDFLoader, WebBaseLoader# TextLoader
# 指定編碼
loader = TextLoader("./input/金庸武俠小說全集/射雕英雄傳.txt", encoding="utf-8")
loader.load()
# 自動推斷
# python -m pip install chardet
loader = TextLoader("./input/金庸武俠小說全集/射雕英雄傳.txt", autodetect_encoding=True)
loader.load()# PyPDFLoader
# python -m pip install pypdf
loader = PyPDFLoader("./input/文學作品/追風箏的人.pdf")
loader.load()# WebBaseLoader
# python -m pip install beautifulsoup4
loader = WebBaseLoader(web_paths=('https://blog.yuanpei.me',), bs_kwargs={})
loader.load()

當然,現實中通常會有很多文檔,此時,我們可以使用 DirectoryLoader 來一次性載入多個文檔:

from langchain_community.document_loaders import DirectoryLoaderloader = DirectoryLoader("./posts/", glob="*.md", loader_kwargs={}, show_progress=True, silent_errors=True)

默認情況下,DirectoryLoad

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動作生成學習筆記

目錄 ReMoDiffus 檢索和擴散 文字生運動 action生運動 ReMoDiffus 檢索和擴散 ICCV 2023 | 重塑人體動作生成,融合擴散模型與檢索策略的新范式ReMoDiffuse來了,根據文本生成動作 有例子和模型&

CSS 顯示隱藏動畫(動畫失效問題)

就像這個動畫一樣的效果&#xff0c;div 先是隱藏的&#xff0c;點擊按鈕后顯示并且有動畫效果&#xff0c;隱藏的時候同樣。 <button class"btn" id"btn">點擊</button><div class"box" id"box"></div><s…

一些常用到的git命令

git stash -a //緩存所有文件 git checkout -b dev origin/dev //切換到dev分支上,接著跟遠程的origin地址上的dev分支關聯起來 //推送本地分支到遠程倉庫 git push origin localbranchname:remotebrancname git revert onefile //https://www.freecodecamp.org/news/git-re…

S2---FPGA-A7板級原理圖硬件實戰

視頻鏈接 FPGA-A7板級系統硬件實戰01_嗶哩嗶哩_bilibili FPGA-A7板級原理圖硬件實戰 基于XC7A100TFGG484的FPGA硬件設計流程圖 A7核心板&#xff0c;是基于XILINX公司的ARTIX-7系列100T的XC7A100T,2FGG484I這款芯片開發的高性能核心板&#xff0c;具有高速&#xff0c;高帶寬&a…

HashMap在多線程下形成環的死鎖詳解

1. HashMap的工作原理 HashMap是Java中基于哈希表的Map接口的非同步實現。它存儲鍵值對&#xff0c;并允許使用null鍵和null值。HashMap通過使用鍵對象的hashCode()方法來決定鍵值對的存儲位置。 2. 多線程環境下的問題 在多線程環境下&#xff0c;如果多個線程同時對HashMap進…

Android 簽名機制

V1是內部文件單個簽 但是增加apk文件目錄下面隨意增加文件并不會有影響,它只關心meta-info文件 mf匯總清單的各個文件sha256 V2 整個APK文件,按文件進行hash 那么便不能隨便在這里面增加文件了,增加了簽名分塊&#xff08;不然簽名信息存哪里&#xff09;這里涉及一個文件概念 …

如何修煉成“神醫”——《OceanBase診斷系列》之一

本系列是基于OcenaBase 開發工程師在工作中的一些診斷經驗&#xff0c;也歡迎大家分享相關經驗。 1. 關于神醫的故事 扁鵲&#xff0c;中國古代第一個被正史記載的醫生&#xff0c;他的成才之路非常傳奇。年輕時&#xff0c;扁鵲是一家客棧的主管。有一位名叫長桑君的客人來到…

性能優化篇(二) 靜態合批步驟與所有注意事項\游戲運行時使用代碼啟動靜態合批

靜態合批步驟: 1.開啟Project Settings —>Player–>Other Setting里勾選Static Batching選項(一般情況下unity都是默認勾選狀態) 2.勾選需要合批的靜態物體上的Batching Static項,勾選后此物體下的所有子物體都默認參與靜態合批(勾選后物體不能進行移動/旋轉/縮放操作,…

02-設計概述

上一篇&#xff1a;01-導言 本章重點討論 JNI 中的主要設計問題。本節中的大多數設計問題都與本地方法有關。調用 API 的設計將在第 5 章&#xff1a;調用 API 中介紹。 2.1 JNI 接口函數和指針 本地代碼通過調用 JNI 函數來訪問 Java 虛擬機功能。JNI 函數可通過接口指針使用…

LeetCode383. 贖金信(C++)

LeetCode383. 贖金信 題目鏈接代碼 題目鏈接 https://leetcode.cn/problems/ransom-note/description/ 代碼 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int record[26] {0};if(ransomNote.size() > magazine.size()) return fa…

多層感知器(神經網絡)與激活函數

單個神經元&#xff08;二分類&#xff09; 多個神經元&#xff08;多分類&#xff09; 多層感知器 多層感知器&#xff0c;他是一種深度學習模型&#xff0c;通過多層神經元的連接和激活來解決非線性問題。 激活函數 激活函數的種類包括relu&#xff0c;sigmoid和tanh等 …

批量檢測微信小程序是否封禁接口源碼

<?php // 要檢測的 appid 列表 $appids array(appid1, appid2, appid3); // 使用實際的 appid // 循環調用接口檢測小程序狀態 foreach ($appids as $appid) { $url https://yan.changxunwangluo.cn/xcx/check_mini_program.php?appid . urlencode($appid); $…

敏捷開發模型:一種靈活、協作和持續的軟件開發方法

敏捷開發模型&#xff1a;一種靈活、協作和持續的軟件開發方法 引言 在軟件開發領域&#xff0c;隨著市場需求的不斷變化和技術的迅速發展&#xff0c;傳統的瀑布模型逐漸暴露出其局限性。為了應對這些挑戰&#xff0c;敏捷開發模型應運而生。敏捷開發模型強調靈活、協作和持…

【ArcPy】簡化ArcGISPro默認Python環境體量

參考文獻 安裝 ArcPy—ArcGIS Pro | 文檔

找工作筆記

記錄利用訊飛星火 問題1&#xff1a;作為一名無線通信工程師&#xff0c;找到適合自己的工作需要一系列的準備和策略。以下是一些建議&#xff0c;幫助你找到理想的職位&#xff1a; 1. **更新簡歷和在線資料**&#xff1a;---重要&#xff0c; - 確保你的簡歷是最新的&am…

[數據集][目標檢測]雞蛋破蛋數據集VOC+YOLO格式792張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;792 標注數量(xml文件個數)&#xff1a;792 標注數量(txt文件個數)&#xff1a;792 標注類別…

LVGL 的事件響應, 按鍵

在LVGL中&#xff0c;所有控件都能夠響應事件&#xff0c;但并非所有控件默認都會有預設的事件響應行為。LVGL的設計允許用戶為任何控件添加事件處理函數&#xff0c;以響應各種用戶交互&#xff0c;例如點擊、長按、拖動等。這意味著&#xff0c;雖然控件本身具備響應事件的能…

同源不同頁面之間的通信,SharedWorker使用

同源不同頁面之間的通信&#xff0c;SharedWorker使用 描述實現結果 描述 同源不同頁面之間的通信&#xff0c;使用SharedWorker&#xff0c;或者使用全局方法通信&#xff0c;這里使用SharedWorker來實現 mdn地址&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/A…

JAVA學習-類和接口.類和面向對象

一、Java中的類和接口是面向對象編程的重要概念。 1. 類是一種模板或藍圖&#xff0c;用于創建具有相同屬性和行為的對象。類定義了對象的屬性&#xff08;成員變量&#xff09;和行為&#xff08;方法&#xff09;。在程序中&#xff0c;可以通過實例化類來創建對象&#xff…

Odoo邁入開源第一低代碼開發平臺的重要里程碑

Odoo17的正式發布已經過去好幾個月了&#xff0c;通過一段時間的運用&#xff0c;最大的感觸就是&#xff0c;Odoo會成為企業管理軟件低代碼開發平臺的重要一員&#xff0c;而V17則會成為這個過程中具有里程碑意義的版本。 時隔四個月&#xff0c;讓我們回頭來看看Odoo17帶來的…