這個小專案旨在將 WordPress 部落格條目合併到利用檢索增強生成 (RAG) 技術的知識庫中。
該專案的前提很簡單 - 一系列腳本將透過命令列執行特定操作。每個腳本都是獨立的,這有助於相對簡單地在其自己的上下文中演示每個操作。
預設情況下,包含的腳本使用免費和開源的函式庫和模型,但如果您有存取權限,也可以選擇使用 OpenAI 的 LLM。如果您沒有相容的 GPU,那麼這個範例應該能夠在 CPU 上運行,但 YMMV。
RAG 使用兩個元件:檢索系統和生成語言模型。檢索系統從資料儲存/知識庫(例如,部落格文章的集合)中查詢與查詢相關的文件。然後,檢索到的文件輸入到語言模型中,該模型為使用者產生明智的回應。使用 RAG 的主要好處之一是它允許 AI 系統擴展到訓練資料之外,而無需微調或重新訓練 - 可以在資料儲存中動態新增和更新資料。查詢結果不僅可以包括語言模型提供的文本,還可以包括相關文件或來源的集合。您可以在 IBM 研究部落格上閱讀有關 RAG 的更多資訊。
這是一個相當容易啟動和運行的專案...
首先設定項目的虛擬環境並激活
python3 -m venv virtualenv
source ./virtualenv/bin/activate
您可以使用requirements.txt
檔案安裝該專案的所有相依性。如果這樣做,則無需在本文檔中透過pip
手動安裝其他軟體包。
pip install -r requirements.txt
使用env.example
作為指導創建.env
檔。
cp env.example .env
這對於下載您的 WordPress 資料非常重要。確保將您的 WordPress 使用者名稱、應用程式密碼和部落格網域複製到.env
中。注意:這假設部落格位於根路徑。
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
將 WordPress 內容下載到./data
目錄(目前假設您的部落格位於網域根目錄):
python3 wordpress-dl.py
PGVector 用於在 Postgresql 資料庫中儲存和查詢文字嵌入(向量)。 PGVector 的優點之一是它可以添加到現有的資料庫系統中,並且不需要專有的第三方產品。
對於 pgvector 嵌入支援:
pip install pgvector psycopg2-binary
確保您具有正確的.env
值。雖然預設設定適合本機開發,但如果使用現有的 Postgres 資料庫(即不執行 docker 映像),您可能會遇到不同的情況。在這裡,我們使用 Docker 映像來保持設定簡單,但如果您能夠自行新增和載入 pgvector 擴展,您可以輕鬆使用另一個 PostgreSQL 實例。
要在./postgres
中運行 docker 映像:
docker compose up
執行嵌入腳本以取得 wordpress 下載並將嵌入儲存到 postgres 資料庫。這可能需要一些時間。 _如果要將資料插入資料庫,即擦除並從乾淨的資料開始,請傳遞--embed
CLI 參數:
python3 embed.py --embed
預設情況下,僅插入 1 筆記錄進行測試(即,透過不指定--limit
,然後指定某個整數> 1,它只會為第一筆記錄建立向量嵌入) - 因此您可以更輕鬆地進行測試,而無需花費太多額外的計算時間。
如果您對其他資訊感到好奇,請傳遞--verbose
範例呼叫可能如下所示:
python3 embed.py --verbose --embed --limit 100
....但是適當增加您的 WordPress 部落格的限制大小。如果數字大於條目數也沒有問題 - 它足夠智能,可以匯入最大記錄數。
此存儲庫演示了本地和基於 API 的用例。本地運行模型的好處之一是您的資料保持私密,不會用於訓練其他模型。此外,透過將查詢保留在伺服器或網路本地可以帶來一些效能提升,但在自架系統上不會產生 API 使用成本。另一方面,可能需要使用 API,因為 OpenAI 的上下文視窗比該專案中使用的模型大得多,並且 OpenAI 模型可能非常好。
本機語言模型的使用需要trsnformers
python 套件和 pytorch ( torch
)
pip install transformers torch llama-cpp-python
接下來,下載此離線方法中使用的模型。因為語言模型可能很大(幾個 GB),所以我選擇了一個較小的 Llama 模型來演示。甚至可以使用較小的模型,但通常會受到上下文視窗的限制,這可以得到緩解,但超出了本專案的範圍。本專案使用TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(如果您沒有安裝huggingface-cli
,您可以在此處找到詳細資訊)。
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
此命令會將模型下載到使用者帳戶的快取控制器,並從模型目錄進行符號連結。
下載模型後,您可以運行本地推理,這是預設選項。請參閱下一節「查詢」以取得說明。
使用 OpenAI API 需要安裝
pip install langchain_openai
確保您已將 OpenAI API 金鑰儲存到.env
檔案中。您可以在 OpenAI Platform API 金鑰標籤中進行設定: OPENAI_API_KEY="...
文件(嵌入和檢索,順便說一句)在該項目中具有以下一般結構。
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
結果通常會以元組List
(idx、Document)傳回,因此列舉該清單是適當的:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
用於增強 LLM 回應的最有用的資料將包含在metadata
屬性中,即嵌入期間輸入的資料字典。
從 CLI 執行查詢很簡單。
……本地模型:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
....使用 OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
幾分鐘後,期望看到這樣的反應,
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
在測試資料和模型時,還有一些其他參數可能會有所幫助。運行python3 query.py --help
以取得更多選項。