如何在本地使用AI檢索增強生成(RAG)

PetterLiu發表於2024-10-31

image

在這篇博文中,我們將探討如何使用檢索增強生成(RAG)來構建更有效、更吸引人的對話式人工智慧應用程式。我們將介紹 RAG 的基礎知識及其優勢,並逐步說明如何開發自己的 RAG 機制供本地使用。


什麼是 RAG?


RAG(基於強化的生成)結合了自然語言處理(NLP)領域兩種著名方法的優勢:基於檢索的模型和基於生成的模型。在傳統的基於生成的方法中,人工智慧系統使用預先訓練好的模式和規則從頭開始生成文字。然而,這種方法往往會導致創造力有限、缺乏特定語境知識以及連貫性差等問題。

相比之下,基於檢索的模型則利用預先訓練好的語言模型,從大型語料庫、定製資料集或資料庫中檢索相關資訊。雖然這些模型擅長根據現有文字提供準確的回覆,但它們在處理新穎或模糊的語境時可能會遇到困難。


RAG 與微調 LLM 模型


微調 LLM(大型語言模型)包括針對特定任務調整預訓練。最初,LLM 會在海量資料集上進行訓練,以學習一般語言模式。之後,再針對特定應用(如客戶服務或程式碼生成)在較窄的資料集上進行進一步訓練[1]。

相比之下,RAG(基於強化的生成)在需要 LLM 根據大量更新的特定上下文資料生成響應時非常有用。例如,用資料集或歸檔檔案來豐富 LLM 模型的響應。

RAG 對資源和技術知識的要求極低,因此是一種經濟高效的微調替代方案。只需 10 行 Python 程式碼,您就可以確保您的模型能夠訪問最相關的最新資料。

許多網路和桌面客戶端應用程式,如 Open WebUI 或 AnythingLLM,都已整合了 RAG 功能。但是,對於私營公司來說,要上傳和嵌入資料供其 LLM 模型使用,就必須建立一個定製的 RAG 系統。

在這篇博文中,我將逐步介紹如何使用 Llama3 模型在 Python 中實現 RAG。

RAG 機制可概括如下:

RAGIntro

要構建本地 RAG 系統,您需要以下元件:

原始檔: 原始檔;可以是位於網路上的 .doc、txt 或 pdf 檔案
載入: 載入器,用於載入文件並將其分割成塊
轉換: 轉換: 轉換文件塊以便嵌入。
嵌入模型: 嵌入模型將輸入作為一個塊,並輸出作為向量表示的嵌入。
向量資料庫:用於儲存嵌入的向量資料庫
LLM 模型: 預先訓練的模型,將使用嵌入回答使用者查詢


首先,讓我總結一下接下來要使用的關鍵元件:

LLM 伺服器: Ollama 本地伺服器
LLM 模型: LLama 3 8b
嵌入模型:all-MiniLM-L6-v2
向量資料庫 SQLiteVSS (sqlite3)
框架: LangChain
作業系統:MacOS
程式語言: Python 3.11.3

我將使用的說明和示例可在資源部分中找到。要執行作者的示例,您必須具備良好的 Python 專業知識。在此,我將指導您完成每個必要步驟,以節省時間和精力。

分步指南


如果您對 Python 非常熟悉,可以跳過第 7 步之前的步驟。

步驟 1:下載並安裝 Python
不要使用系統 Python 執行應用程式。使用自制軟體安裝 Python 3

homebrew install python

步驟 2:安裝 pip
python -m ensurepip 或 python3 -m ensurepip


步驟 3:安裝 Jupyter Notebook 和 Lab

python3 -m pip install jupyterlab
python3 -m pip install notebook


步驟 4:執行 Jupyter 實驗室或筆記本
python3 -m jupyterlab


上述命令將啟動一個基於 Web 的介面,使您能夠在指定的 URL http://localhost:8888/lab 上構建、執行和管理 Python 應用程式


步驟 5:安裝 SQLite3
brew install sqlite3


安裝 SQLite3 資料庫後,在 .bashprofile 或 .zshrc 檔案中新增以下幾行:

export PATH="/usr/local/opt/sqlite/bin:$PATH”
export LDFLAGS="-L/usr/local/opt/sqlite/lib”
export CPPFLAGS="-I/usr/local/opt/sqlite/include”
export PYTHON_CONFIGURE_OPTS="--enable-loadable-sqlite-extensions”


重新開啟終端


步驟 6:新增新筆記本
在本地 Jupyter 實驗室中新增一個新的啟動器或筆記本。用以下程式碼新增第一個單元格,該單元格將安裝所有必要的軟體包。

#安裝必要的軟體包
pip install --upgrade langchain
pip install -U langchain-community
pip install -U langchain-huggingface
pip install sentence-transformers
pip install --upgrade --quiet sqlite-vss


第 7 步:匯入所有必要的軟體包

from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import SQLiteVSS
from langchain.document_loaders import TextLoader

從連結中下載文件,並將其放在工作區的某處。


步驟 8:從目錄中載入原始檔

# 使用 LangChain 文字載入器載入文件
loader = TextLoader(“PATH_TO_THE_FILE/stateoftheunion2023.txt”)
documents = loader.load()


步驟 9:將文件分割成塊

# 將文件分割成塊
text_splitter = CharacterTextSplitter (chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
texts = [doc.page_content for doc in docs] (文件中的文件的頁面內容


在這裡,你可以將語塊列印到控制檯,以確保解析了文件。

print (texts)


步驟 10: 嵌入語塊
# 使用句子轉換器軟體包和 all-MiniLM-L6-v2 嵌入模型 embedding_function = SentenceTransformerEmbeddings(model_name=“all-MiniLM-L6-v2”)


步驟 11:將嵌入模型載入到 SQLite3 資料庫中
# 將文字嵌入載入到 SQLiteVSS 中名為 state_union 的表中
db = SQLiteVSS.from_texts(
texts = texts、
embedding = embedding_function、
table = “state_union”、
db_file = “/tmp/vss.db” )
)

步驟 12(可選): 查詢資料庫並研究嵌入情況
使用 DBeaver 或 Visual Studio Code 查詢本地 SQLite3 資料庫。本地資料庫的資料庫檔案是“/tmp/vss.db”

RAGIntroDB

步驟 13:查詢語義(相似性)搜尋

# First, we will do a simple retrieval using similarity search
# Query
question = "What did the president say about Nancy Pelosi?"
data = db.similarity_search(question)
# print results
print(data[0].page_content)

結果應該與下面類似:
State of The Union 2023: Biden's Full Speech
Mr. Speaker. Madam Vice President. Our First Lady and Second Gentleman.
Members of Congress and the Cabinet. Leaders of our military.
Mr. Chief Justice, Associate Justices, and retired Justices of the Supreme Court.
And you, my fellow Americans.
I start tonight by congratulating the members of the 118th Congress and the new Speaker of the House, Kevin McCarthy.
Mr. Speaker, I look forward to working together.
I also want to congratulate the new leader of the House Democrats and the first Black House Minority Leader in history, Hakeem Jeffries.
Congratulations to the longest serving Senate Leader in history, Mitch McConnell.
And congratulations to Chuck Schumer for another term as Senate Majority Leader, this time with an even bigger majority.
And I want to give special recognition to someone who I think will be considered the greatest Speaker in the history of this country, Nancy Pelosi.

步驟 14:執行本地 Ollama 伺服器

ollama run llama3

步驟 15:匯入 LangChain LLM 軟體包並連線到本地伺服器

# LLM
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
    model = "llama3",
    verbose = True,
    callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]),
)

步驟 16:使用 LangChain 提示提問

# QA chain
from langchain.chains import RetrievalQA
from langchain import hub
# LangChain Hub is a repository of LangChain prompts shared by the community
QA_CHAIN_PROMPT = hub.pull("rlm/rag-prompt-llama")
qa_chain = RetrievalQA.from_chain_type(
    llm,
    # we create a retriever to interact with the db using an augmented context
    retriever = db.as_retriever(), 
    chain_type_kwargs = {"prompt": QA_CHAIN_PROMPT},
)

步驟 17:列印結果
result = qa_chain({"query": question})
這將列印查詢結果。查詢結果應如下所示:
The president referred to Nancy Pelosi as "someone who I think will be considered the greatest Speaker in the history of this country."


請注意,根據本地計算機資源的情況,可能需要幾分鐘才能做出響應。
在這種情況下,LLM 會根據嵌入生成一個簡明的查詢答案。在語義相似性搜尋過程中,我們向向量資料庫發出查詢,該資料庫會返回答案的相似性得分。


總結

本文介紹瞭如何使用檢索增強生成(RAG)技術來構建更有效的對話式人工智慧應用程式。RAG結合了基於檢索和基於生成的模型的優勢,透過檢索相關資訊來增強生成的文字。與微調大型語言模型(LLM)相比,RAG在處理需要大量特定上下文資料的任務時更為有效,且資源和技術知識要求低,是一種經濟高效的微調替代方案。本文提供了一個分步指南,如何使用Llama3模型和Python實現RAG。關鍵元件包括原始檔、載入器、轉換器、嵌入模型、向量資料庫和LLM模型。還介紹了使用的工具和環境,包括Ollama本地伺服器、LLama 3 8b模型、all-MiniLM-L6-v2嵌入模型、SQLiteVSS資料庫、LangChain框架、MacOS作業系統和Python 3.11.3程式語言。指南詳細說明了如何安裝Python、Jupyter Notebook、SQLite3,以及如何匯入必要的軟體包。接著,作者指導讀者如何載入原始檔、分割文件、嵌入語塊,並使用SQLite3資料庫儲存嵌入的向量。此外,還介紹瞭如何進行語義搜尋查詢,以及如何執行本地Ollama伺服器和使用LangChain提示提問。

最後,本文展示瞭如何使用LangChain的RetrievalQA鏈來生成基於嵌入的查詢答案,並列印結果。整個過程需要一定的Python專業知識,提供了詳細的步驟來幫助讀者節省時間和精力。



今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管理,資訊保安,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變

如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。 該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。

相關文章