请参阅基准
如何使用
- 确保安装适当的软件包。确保已安装以下内容:ston_transformers tqdm pandas pypdf2 torch asyncio并发re qdrant_client pinecone pycone pymilvus dotenv
- 如果指定,将所有PDF的所有PDF上传到 /数据 /或其他目录。
- 如果您有一个元数据文件以获取有关PDF文件的更多信息,请将其上传到主目录并将其命名为metadata.csv或更改名称。可能需要在Macloader中的get_metadata()中更改代码,以适应您的特定元数据文件。
- .env中的输入连接详细信息。请参阅.env-示例您的.ENV外观。
- 如果您只想将详细信息作为代码中的DB初始化的一部分输入,则可以避免这种情况。
- 创建一个索引Python文件。从这里,我将定义适当的记录。有了所有数据,请注意任何问题。所有日志记录均使用信息,警告,错误和关键命名。
- 创建delete.txt,不要将任何内容放入其中。
- 从项目中导入适当的文件,并使用适当的详细信息初始化它们。所有可用的参数都有充分的文献记载,应通过悬停或单击您的IDE显示。
- 例如:
from Loader import MacLoader和from databases.PineconeDB import PineconeDB
- 执行文件运行后,请查看delete.txt,然后查看哪些文件给PYPDF2读取器提供问题。如果要删除这些文件,请使用utility.delete_bad_pdfs()
- 享受,让我知道如何改善此过程!
关键要点
预处理
llama_index很棒,但是节点上的可靠性是一个真正的障碍。 TextNodes似乎非常有用,但是随之而来的是许多不必要的数据,您可以使用矢量上传,而矢量只会占用存储和性能。仅仅由于这个原因,llama_index不得将其复杂化矢量上传过程。在生产量表数据集中,额外的数据太多了。我也不喜欢有时用它编写代码的烦人,这是许多奇怪的规则和不必要的步骤。如果一切都正确管理,文本诺德斯可以是有价值的强大资产,所有额外的数据都在本地存储,而不是阻碍检索速度或内存。
Langchain为使用更少的规则(虽然取决于上下文)而更轻松地将数据与数据接口。我绝对不认为Langchain已经准备好生产,并且应该使用抓地带。在生产环境中,可以完全控制整个过程。
总的来说,我找不到很容易按照我想要的东西。这是我对我认为这个过程应该如何发展的理解:
在完成此程序时,我意识到这只是上述两个工具的替代品。以上两个工具旨在适用于所有用例,我只是对我的一个特定的编码。
嵌入 /变压器
挑选句子变形金刚并不难。
All-Minilm-V2很好,但是我担心使用大量数据的可伸缩性。不是最精确的,但仍然不错,只是为了生产。
在我的测试中, E5-LARGE-V2在小尺度上的基本数据检索失败。因此,我也不会在更大范围内考虑它。
教师嵌入需要更长的时间,但是它们可能会给更多的数据精度。我尚未正确测试这些。
在速度和性能方面, All-MPNET-V2在最佳状态下,也许不如嵌入教练那样精确,但在生产环境中可能会优选速度和性能。
ADA(OpenAI)嵌入将比典型的本地句子变形金刚贵得多。过去,由于速率限制和其模型施加的其他限制,我遇到了处理大量数据集的问题。在块中发送数据将解决此问题。
- 重要的是要考虑ADA也嵌入1536维度。由于更多维度所需的额外数学,这将导致更高的语义搜索时间。同样,这也将导致更高的精度,但是其他模型也可以在不使用昂贵的外部API的情况下进行高维嵌入。
- 如果使用本地句子变压器是限制或不便,那么这是一个很好的替代品。
最终选择:不确定。在指示或MPNET之间选择之前,我需要先完成预处理
向量数据库
拒绝数据库
- 色度
- 缺乏服务器部署选项。对于小型项目而言,这将永远是我认为的最佳选择。
- PGVECTOR
- 由于某种原因,基准的表现非常差。不过,可能无法代表现实世界的表现。请参阅此处
- 如果PoStreSQL数据库已经计划在使用中,或者对于给定数据是实用的,那么我毫无疑问,PGVECTOR将是最佳选择。但是,我不会单独使用PGVECTOR库,也不会为其使用postresql。
- 松紧带
- 编织
- 我以前曾计划评估这一点,但是在试图在此程序中实施此功能时,与所有其他程序相比,我的难度更大。
- Python客户的文档根本不是很好,这并不难,但缺乏文档令人担忧。
- 我的用例是计划使用托管云,WCS使我感到非常担忧。似乎没有太多安全性,甚至没有2FA。我个人不信任WCS,与其他任何数据库相比,它的UI最差。
- 如果计划在Docker容器中使用,则应重新考虑编织并进行公平射击,但目前我尚未继续对其进行评估。
目前正在调查
整个过程的考虑
- PDF的垃圾很大,大多数装载机都会吃掉。对于从PDF的剥离文本,有很多垃圾,尤其是在使用Langchain或Llama_index的阅读解决方案时。没有控制该过程的控制,这比制作自定义Directory PDF加载程序要困难。
- 我认为几乎任何其他格式都优于PDF,用于从大量数据中读取。编码,垃圾字符和不可读的PDF的毁灭文本和堵塞管道的许多问题。
- 如果需要,可以将文本数据存储在所有矢量数据库中。这将大大简化存储过程。许多矢量数据库都将以元数据的形式允许这一点,但不允许单独存储文本,这可能是一个问题。文本太大,内存密集型也无法存储在内存中,并且可以将元数据存储在磁盘上,但是元数据过滤无法使用。
- 如果矢量数据库无法正确处理此信息,则仅通过上传的向量和ID来简化矢量上传过程。执行语义搜索时,请从关联的ID中搜索本地或NOSQL数据库。