Local GenAI Search 是基於 Llama3 模型的本地生成搜尋引擎,可在 32GB 筆記型電腦或電腦(使用具有 32BG RAM 的 MacBookPro M2 開發)上本地運行。
該專案的主要目標是讓使用者詢問有關本地文件內容的問題,並引用隨後可以打開的相關文件以簡潔的方式回答這些問題。
該引擎使用 MS MARCO 嵌入進行語義搜索,並將頂級文件傳遞給 Llama 3 模型。
預設情況下,它會使用 NVIDIA API,並使用 70B 參數 Llama 3 模型。但是,如果您使用了所有 NVIDIA API 積分或不想使用 API 來搜尋本機文檔,它也可以使用 8B 參數模型在本地運行。
為了執行本地生成 AI 搜尋(假設您有足夠的字串機器來運行 Llama3),您需要下載儲存庫:
git clone https://github.com/nikolamilosevic86/local-gen-search.git
您需要安裝所有要求:
pip install -r requirements.txt
您需要建立一個名為environment_var.py
的文件,並將您的 HuggingFace API 金鑰放在那裡。該文件應如下所示:
import os
hf_token = "hf_you_api_key"
nvidia_key = "nvapi-your_nvidia_nim_api_key"
HuggingFace 的 API 金鑰可以在https://huggingface.co/settings/tokens
中檢索。為了運行生成組件,您需要在https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct
請求存取 Llama3 模型
Nvidia NIM API 端點的 API 金鑰可在https://build.nvidia.com/explore/discover
檢索
下一步是為包含您要搜尋的文件的資料夾及其子資料夾建立索引。您可以使用index.py
檔案來完成此操作。跑步
python index.py path/to/folder
例如,您可以使用提供的 TestFolder 來運行它:
python index.py TestFolder
這將在本地創建一個 qdrant 客戶端索引,並索引該資料夾及其子資料夾中擴展名為.pdf
、 .txt
、 .docx
、 .pptx
的所有文件
下一步是運行生成搜尋服務。為此,您可以運行:
python uvicorn_start.py
這將啟動一個本機伺服器,您可以使用郵遞員查詢該伺服器,或發送 POST 請求。載入模型(包括從 Huggingface 下載,可能需要幾分鐘,尤其是第一次)。有兩個接口:
http://127.0.0.1:8000/search
http://127.0.0.1:8000/ask_localai
兩個介面都需要以下格式的主體:
{"query":"What are knowledge graphs?"}
Accept 和 Content-Type 的標頭設定為application/json
。
這是一個程式碼範例:
import requests
import json
url = "http://127.0.0.1:8000/ask_localai"
payload = json . dumps ({
"query" : "What are knowledge graphs?"
})
headers = {
'Accept' : 'application/json' ,
'Content-Type' : 'application/json'
}
response = requests . request ( "POST" , url , headers = headers , data = payload )
print ( response . text )
最後,可以透過以下方式啟動streamlit使用者介面:
streamlit run user_interface.py
現在,您可以使用使用者介面並提出問題,這些問題將根據您的檔案系統上的檔案得到回答。
如果您想了解有關此工具開發的更多詳細信息,您可以閱讀如何使用 Llama 3 為本地文件構建生成搜尋引擎|走向數據科學
另外,您還可以檢查以下論文:
@article{kovsprdic2024verif,
title={Verif.ai: Towards an Open-Source Scientific Generative Question-Answering System with Referenced and Verifiable Answers},
author={Ko{v{s}}prdi{'c}, Milo{v{s}} and Ljaji{'c}, Adela and Ba{v{s}}aragin, Bojana and Medvecki, Darija and Milo{v{s}}evi{'c}, Nikola},
journal={arXiv preprint arXiv:2402.18589},
year={2024}
}