介绍
最初,VerifAI是作为一个生物医学生成式搜索开发的,提供有引用和AI验证的答案。这个版本仍然可用,我们现在称之为VerifAI BioMed。
然而,重大的更新是,你现在可以对本地文件进行索引,并将它们转化为你自己的生成式搜索引擎(或某些人基于GenAI所称的生产力引擎)。它也可以作为企业或组织的生成式搜索。我们称这个版本为VerifAI Core,因为它是其他版本的基础。在本文中,我们将探索如何通过几个简单的步骤来部署它并开始使用。由于它是用Python编写的,因此可以在任何操作系统上运行。
架构
描述生成式搜索引擎的最佳方式是将其分解为三个部分(或在我们的情况下是组件):
在VerifAI中,索引可以通过将其索引脚本指向包含PDF、MS Word、PowerPoint、Text或Markdown(.md)等文件的本地文件夹来完成。该脚本会读取并索引这些文件。索引以双模式执行,同时利用词法索引和语义索引。
对于词法索引,VerifAI使用OpenSearch。对于语义索引,它使用配置文件中指定的嵌入模型(支持Hugging Face的模型)对文档的片段进行向量化,然后将这些向量存储在Qdrant中。下图展示了这一过程的可视化表示。
在使用VerifAI回答问题时,方法相对复杂。用户以自然语言编写的问题会首先经过预处理(例如,排除停用词),然后被转换成查询。
对于OpenSearch,仅进行词法处理(例如,排除停用词),并检索出最相关的文档。对于Qdrant,查询会使用与将文档片段嵌入Qdrant时相同的模型转换成嵌入表示。这些嵌入表示随后用于查询Qdrant,基于点积相似度检索出最相似的文档。之所以采用点积,是因为它同时考虑了向量的角度和大小。
最后,需要将两个引擎的结果进行合并。这是通过将每个引擎的检索得分归一化到0到1之间(通过将每个得分除以其各自引擎中的最高得分来实现)来完成的。然后,将对应同一文档的得分相加,并按综合得分降序排序。
利用检索到的文档,构建一个提示。提示中包含指令、顶部文档和用户的问题。这个提示随后被传递给所选的大型语言模型(可以在配置文件中指定,或者,如果没有设置模型,则默认为我们本地部署的微调版Mistral)。最后,应用一个验证模型来确保没有产生幻觉,答案通过图形用户界面呈现给用户。此过程的示意图如下所示。
安装必要的库
要安装VerifAI生成式搜索,你可以首先从GitHub克隆最新的代码库,或者使用可用的发行版之一。
git clone https://github.com/nikolamilosevic86/verifAI.gitclone https://github.com/nikolamilosevic86/verifAI.git
在安装VerifAI Search时,建议先创建一个干净的Python环境。我已经使用Python 3.6进行了测试,但它应该与大多数Python 3版本兼容。然而,Python 3.10及以上版本可能会与某些依赖项存在兼容性问题。
要创建一个Python环境,你可以使用venv库,如下所示:
python -m venv verifai
source verifai/bin/activate
激活环境后,你可以安装所需的库。需求文件位于verifAI/backend目录中。你可以运行以下命令来安装所有依赖项:
pip install -r requirements.txt
系统配置
下一步是配置VerifAI及其与其他工具的交互。这可以通过直接设置环境变量或使用环境文件(首选选项)来完成。
在backend文件夹中提供了一个VerifAI的环境文件示例,文件名为.env.local.example。你可以将此文件重命名为.env,VerifAI后端将自动读取它。文件结构如下:
SECRET_KEY=6293db7b3f4f67439ad61d1b798242b035ee36c4113bf870
ALGORITHM=HS256
DBNAME=verifai_database
USER_DB=myuser
PASSWORD_DB=mypassword
HOST_DB=localhost
OPENSEARCH_IP=localhost
OPENSEARCH_USER=admin
OPENSEARCH_PASSWORD=admin
OPENSEARCH_PORT=9200
OPENSEARCH_USE_SSL=False
QDRANT_IP=localhost
QDRANT_PORT=6333
QDRANT_API=8da7625d78141e19a9bf3d878f4cb333fedb56eed9097904b46ce4c33e1ce085
QDRANT_USE_SSL=False
OPENAI_PATH=<model-deployment-path>
OPENAI_KEY=<model-deployment-key>
OPENAI_DEPLOYMENT_NAME=<name-of-model-deployment>
MAX_CONTEXT_LENGTH=128000
USE_VERIFICATION = True
EMBEDDING_MODEL="sentence-transformers/msmarco-bert-base-dot-v5"
INDEX_NAME_LEXICAL = 'myindex-lexical'
INDEX_NAME_SEMANTIC = "myindex-semantic"
一些变量相当直接。第一个“Secret key”和“Algorithm”用于前端和后端之间的通信。
接下来是配置访问PostgreSQL数据库的变量。它需要数据库名称(DBNAME)、用户名、密码以及数据库所在的主机地址。在我们的案例中,它位于localhost上的docker镜像中。
下一部分是配置OpenSearch的访问。这里有IP(在我们的案例中再次是localhost)、用户名、密码、端口号(默认端口是9200)以及定义是否使用SSL的变量。
类似地,Qdrant也有一个配置部分,只是对于Qdrant,我们使用API密钥,这里需要定义它。
下一部分定义了生成式模型。VerifAI使用OpenAI python库,这已成为行业标准,并允许它使用OpenAI API、Azure API以及通过vLLM、OLlama或Nvidia NIMs的用户部署。用户需要定义接口的路径、API密钥和将使用的模型部署名称。我们很快就会添加支持,让用户可以修改或更改用于生成的提示。如果没有提供接口的路径和密钥,模型将下载我们微调过的带有QLoRA适配器的Mistral 7B模型,并在本地部署它。然而,如果你的GPU RAM或一般RAM不足,这可能会失败或运行得非常缓慢。
你还可以设置“MAX_CONTEXT_LENGTH”,在此情况下,它设置为128,000个标记,因为这是GPT4o的上下文大小。上下文长度变量用于构建上下文。通常,它是通过放入关于如何根据事实、参考来回答问题的指令,然后提供检索到的相关文档和问题来构建的。然而,文档可能很大,并且超过上下文长度。如果发生这种情况,文档将被拆分成块,并且将使用适合上下文大小的前n个块来构建上下文。
下一部分包含用于在Qdrant中嵌入文档的HuggingFace模型名称。最后,有OpenSearch(INDEX_NAME_LEXICAL)和Qdrant(INDEX_NAME_SEMANTIC)中的索引名称。
正如我们之前所说,VerifAI有一个组件,用于验证生成的声明是否基于提供和引用的文档。然而,这个功能可以根据需要开启或关闭,因为对于一些用例来说,这个功能可能不是必需的。通过将“USE_VERIFICATION”设置为False,可以关闭此功能。
安装数据存储
安装的最后一步是运行“install_datastores.py”文件。在运行此文件之前,你需要安装Docker并确保Docker守护进程正在运行。由于此文件读取它正在安装的工具的用户名、密码或API密钥的配置,因此首先需要制作一个配置文件。
这个脚本设置了必要的组件,包括OpenSearch、Qdrant和PostgreSQL,并在PostgreSQL中创建一个数据库。
python install_datastores.py
请注意,此脚本安装Qdrant和OpenSearch时不包含SSL证书,并且以下说明假设不需要SSL。如果你需要在生产环境中使用SSL,则需要手动进行配置。
此外,请注意,我们在这里讨论的是在docker上的本地安装。如果你已经部署了Qdrant和OpenSearch,你只需更新配置文件以指向这些实例。
文件索引
此配置既被索引方法使用,也被后端服务使用。因此,必须在索引之前完成配置。一旦配置完成,你就可以通过让index_files.py指向包含要索引的文件的文件夹来运行索引过程:
python index_files.py <path-to-directory-with-files>
我们在存储库中包含了一个名为test_data的文件夹,其中包含几个测试文件(主要是我的论文和其他过去的著作)。你可以用自己的文件替换这些文件,并运行以下命令:
python index_files.py test_data
这将对该文件夹及其子文件夹中的所有文件进行索引。完成后,可以运行VerifAI的后端和前端服务。
运行生成式搜索
VerifAI的后端可以通过简单地运行以下命令来启动:
python main.py
这将启动一个FastAPI服务作为后端,并将请求传递给OpenSearch和Qdrant以检索给定查询的相关文件,同时用于部署大型语言模型(LLM)以生成答案,并利用本地模型进行声明验证。
前端是一个名为client-gui/verifai-ui的文件夹,使用React.js编写,因此需要本地安装Node.js和npm。然后,你可以通过运行npm install来安装依赖项,并通过运行npm start来启动前端。
cd ..
cd client-gui/verifai-ui
npm install
npm start
最后,整体结构应该大致如下所示: