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}
}