技术干货

使用Unstructured和Milvus向量化和查询EPUB内容

2024-07-25

By Mostafa Ibrahim

使用Unstructured和Milvus向量化和查询EPUB内容

数字世界充斥着电子书,存储着数个世纪的文学、研究和故事。从乔治·奥威尔的《1984》这样的永恒经典到J.K.罗琳的《哈利·波特》这样的现代畅销书,这些文本蕴含着丰富的语言和文化洞见,反映了多样的社会规范和历史背景。大型语言模型(LLMs)可以从这些丰富的资源库中获得巨大的好处,利用多样化的数据集以精确理解人类语言。通过在电子书上进行训练,LLMs能够获得对写作风格、成语和角色对话的微妙理解,提高它们在摘要和情感分析应用中的适应性。

尽管它们非常强大,LLMs还是遇到了诸如幻觉和缺乏特定领域知识等挑战,这是因为它们依赖于有限的公共数据。为了缓解这些问题,开发人员可以采用检索增强生成(RAG)技术,通过补充LLMs,如法律文件等额外的知识来源来提高准确性。嵌入和相似性检索是RAG过程中的关键阶段,促进了高效的数据转换和检索。

在这篇文章中,我们探讨了使用Milvus和Unstructured框架向量化和检索EPUB数据,为开发人员提供了提高LLM性能的可行见解。

使用Unstructured和Milvus向量化EPUB

Milvus是一个极快的开源向量数据库。它为嵌入相似性搜索和GenAI应用提供动力,并致力于使向量数据库对每个组织都可访问。Milvus可以存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的超过十亿个嵌入向量。

Unstructured框架为向量化EPUB和其他非结构化数据格式(如PDF和PowerPoint)提供了一个结构化管道。它高效地提取和处理文本信息,使其对下游AI应用可读。该框架专门将原始文本转换为捕获数据语义本质的向量。

Unstructured和Milvus如何工作以嵌入和查询EPUB数据?以下是关键步骤:

步骤1:数据提取和预处理:Unstructured使用自然语言处理工具从EPUB文件中提取和预处理文本。它涉及读取原始文件、清理数据并将其结构化为向量化。

步骤2:向量化:该框架利用BERT等深度学习模型的力量将文本转换为表示数据语义含义的数值向量。这些模型将文本转换为密集向量,捕捉到意义中最微妙的细微差别。

步骤3:进入Milvus:一旦您向量化了数据,您可以使用Milvus来存储和检索向量。Milvus支持高速相似性搜索,非常适合大规模应用。

步骤4:索引和搜索:Milvus通过索引优化搜索过程,实现快速准确检索与搜索查询对齐的向量。这一步使在大型数据集中找到相关内容变得更容易。

从EPUB到洞察:向量化之旅

使用Unstructured框架向量化EPUB并将其摄取到您的Milvus数据库实例中是直接的。本节将概述使用这个开源框架从原始EPUB数据到完全向量化格式的步骤。

Unstructured框架如何向量化电子书

这些步骤包括数据分区、清理、分块和嵌入(向量化)。最后,我们将使用Milvus向量数据库进行索引和搜索。

1) 数据分区

首先,我们从安装所需的库开始。下面的Unstructured框架安装适用于纯文本文件。HTML、XML、JSON和电子邮件,不需要任何额外的依赖项。

在我们的情况下,EPUB向量化需要在安装命令中指定epub安装以及库:

根据数据类型格式,可能需要一些额外的依赖项。在EPUB数据向量化的情况下,我们还需要pandoc库。

安装完所有依赖项后,我们可以使用以下代码行对我们的epub文件进行分区。这里的分区函数将原始文档分解为标准、结构化的元素。

2) 数据清理

Unstructured库允许其他必要的功能,例如清理我们的数据。使用Unstructured库的清理过程非常简单。

利用预定义的清理功能,如replace_unique_quotes方法,将â\\x80\\x99表示替换为其人类可读的表示,即撇号(或')。

以下apply函数允许我们将文本清理应用于文档元素,而无需实例化新元素。

上述代码将输入“Philadelphia Eaglesâ\\\\x80\\\\x99 victory”修改为更干净、更易读的“Philadelphia Eagles' victory”。

用户还可以轻松地包含他们的清理函数,用于自定义数据准备任务。在下面的示例中,我们从文本部分中删除引用。

请参阅以下清理文档,了解更多关于Unstructured框架的清理分区的信息。

3) **分块**

分块是指在将文本转换为数值向量之前,将大文本分成更小、更易管理的片段(或块)。

分块是什么意思?

分块在处理像书籍或研究论文这样的长篇文档时至关重要。它通过减少输入到机器学习模型中的数据的大小和复杂性,允许更精确和高效的分析。

为什么分块很重要?

首先,广泛的文本数据可能超过许多模型的输入限制,例如BERT,其限制为512个标记;因此,分块将大文档分解为更小的部分。

此外,分块对所有大小的LLMs都有益,因为较小的块确保每个部分具有连贯的内容,帮助模型更好地理解上下文。

最后,有效的分块通过处理更小的数据部分来防止内存过载。

区分分块和分区过程至关重要。分块在文档元素上操作,与先前的分区不同。虽然可以与分区同时执行分块,但将这些步骤分开可以提高清晰度和可定制性。通过将分块视为分区后的独立阶段,开发人员可以更好地了解和更全面地控制数据转换过程。

Unstructured框架提供了多种分块选项:

- **max_characters: int (默认=500) -** 块的最大硬限制大小。没有块会超过这个字符数。

- **new_after_n_chars: int (默认=max_characters)** - 块的“软”最大大小。超过这个字符数的块将不会被扩展,即使下一个元素适合不超出指定的最大限制。

- **overlap: int (默认=0) -** 仅在使用文本分割将过大的块拆分时,包括前面块末尾的这些字符作为下一个的前缀。

- **overlap_all: bool (默认=False) -** 也适用于“正常”块之间的重叠,而不仅仅是在文本分割拆分过大元素时。由于常规块是从具有清晰语义边界的整个元素形成的,此选项可能会“污染”常规块。您必须根据您的用例决定此选项是否正确。

此外,Unstructured框架将分块策略分为两种主要方法:

- 基本分块策略结合顺序元素,尽可能填充每个块,同时尊重指定的max_characters(硬最大值)和new_after_n_chars(软最大值)选项值。

- 按标题分块策略还保留部分,并可选地保留页面边界。这里的“保留”意味着单个块永远不会包含出现在两个不同部分中的文本。当开始一个新部分时,现有的块将关闭,并开始一个新的块,即使下一个元素适合前面的块。

如下所示,选择一个或另一个,导入您喜欢的函数并在分区数据上执行所选的分块类型。

4) **嵌入(向量化)**

嵌入是关键且最后的步骤,将单词、短语或整个文本转换为数值向量。这个过程允许计算模型有效地理解和处理人类语言。

在这一步中,我们将文本表示为数字,嵌入将文本信息映射到固定大小的数值向量。

5 使用Milvus存储、索引和查询

a) 设置Milvus

我们将从Docker Hub仓库获取最新的Milvus Docker镜像并运行Milvus容器。

接下来,我们将使用以下命令安装PyMilvus库。

最后,我们将连接到运行在19530端口的Milvus实例。

b) 定义我们的向量数据库模式并创建新集合

从早期步骤中安装的“pymilvus”库中导入必要的模块和类。

接下来,我们将为我们的集合模式定义字段。为了简单起见,我们将只创建两个字段。首先,一个名为“id”的字段,数据类型为INT64(64位整数),将其标记为主键。第二个字段将是“embedding”,数据类型为FLOAT_VECTOR,维度为768。这个字段将存储向量嵌入。

然后,我们将使用定义的字段创建我们的CollectionSchema,并提供描述(“EPUB Embeddings”)。这个模式定义了集合的结构。

c) 将我们的向量化数据插入我们的集合

我们将从使用我们的OpenAI凭证初始化OpenAI编码器开始。

添加一个示例文本元素列表(将这些字段替换为您的EPUB元素)。

在这一步中,我们将嵌入我们选定的元素。请注意,这一步与上面遵循的步骤相同。

嵌入(向量化)步骤。

接下来,我们将提取新生成的嵌入并为每个元素生成一个ID。

为了确保您拥有相同数量的ID和嵌入,您可以在将数据插入Milvus之前添加断言检查。

这个检查将帮助您及早发现任何差异,并防止插入过程中出现问题。

接下来,我们将使用以下结构准备我们的插入数据。

最后,我们将嵌入的数据插入我们的Milvus向量数据库。

d) 创建索引

在下面的index_params中,“metric_type”被赋予值“L2”,指定用于相似性搜索的距离度量是L2(欧几里得距离)。

“index_type,”被赋予值“IVF_FLAT,”指定要使用的索引类型。IVF_FLAT(倒排文件与平坦)是Milvus支持的一种索引方法。它适用于大规模相似性搜索。

同时,“params”: {"nlist": 128}定义了索引的额外参数。“nlist”是索引中使用的聚类(或倒排列表)的数量。较大的“nlist”值可以提高搜索精度,但需要更多的内存和计算资源。

然后我们将加载我们刚刚创建的集合。

e) 查询(搜索相似向量)

首先,我们将定义一个搜索查询来在向量数据库中进行搜索。下面的query_vector将包括768个随机浮点数的列表,这些数在0和1之间。

接下来,我们将使用给定的查询向量执行相似性搜索。

结论

向量嵌入是像电子书这样的非结构化数据的数值表示,使机器能够有效地理解和分析这些数据。它们在推荐系统、AI聊天机器人和各种GenAI应用中发挥着关键作用,促进个性化体验和富有洞察力的互动。在这篇博客中,我们深入探讨了向量化和相似性搜索在构建这类应用中的重要性。

我们还讨论了如何利用Unstructured框架的力量,将EPUB内容无缝转换为向量嵌入,以及Milvus向量数据库来存储和检索最相关的结果。通过提供一个全面的逐步指南,我们为读者提供了知识和工具,以便在他们的应用中无缝地实施这些操作。

  • Mostafa Ibrahim

    Mostafa Ibrahim

    Freelance Technical Writer

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud