【用于生成AI应用的向量搜索】第5步 实施RAG AI应用程序 〜 创建知识库
首先
Apache Cassandra和DataStax Astra DB作为向量数据库的背景
基於2022年AI生成技術的蓬勃發展,DataStax工程師提出了對Apache Cassandra的擴展建議,增加了向量搜索功能,並且現在可以在DataStax的Cassandra托管服務Astra DB中使用。本文系列將根據DataStax發布的白皮書內容,作為與這一趨勢相關的一部分。
引用来源和日语版
這個系列文章的原始資料可以在以下地方獲得。
在博客文章中,我们更注重易读性而不是忠实的翻译,并进行了部分省略。
如果您希望获取没有省略的日文版白皮书,请联系info-jp@datastax.com,我们将提供给您。
用RAG AI应用程序来实现〜创建知识库。
我们介绍了使用检索增强生成(RAG)构建生成AI应用程序的基本流程(图3)和架构图(图3.1)。在这里,让我们进一步详细了解它们。
要构建RAG系统,需要以下两个工作流程。
-
- ナレッジベースの作成
- 生成プロセスの実行
我们将分别讨论以下事项。
创建知识库
首先,我们来看RAG应用程序访问的知识库构建,该知识库由嵌入数据组成。这个工作流程包含多个步骤,其概述如图4所示。
将数据集转化为向量存储的工作流程(Workflow)。
1. 专有数据的识别
首先,根据构建的应用程序的不同,初始步骤会有所不同。首先,需要考虑应用程序可能使用的数据集,这时需要考虑数据源提供了哪些具体信息?是否有可以用于嵌入的公开数据集?
在公开数据集中可能包含比建立LLM模型时使用的数据集更新的数据,因此可以考虑使用这些新数据集。例如,最近的新闻文章或最新的开发者文档等。
2. 选择嵌入模型
在选择嵌入模型时,用于知识库的嵌入模型和用于生成最终回答文本的LLM中采用的嵌入模型不必相同。而且,并不需要从同一供应商(或开源模型提供者)选择用于知识库的嵌入模型和LLM。然而,重要的是在构建知识库的数据集和该数据集的查询都使用相同的嵌入模型。
3. 数据设计
在设计数据集时,仅仅利用矢量数据本身是不足够的,还需包含与矢量数据相关的数据。这种需求有些原因。
首先,在向量搜索中获取匹配的前几个结果后,将它们对应的文本数据(在进行嵌入之前的文本)作为LLM的输入提示传递给模型。同时还会将这些嵌入之前的文本与向量数据(嵌入后的数据)一起保存。
嵌入是通常对被称为“块”的文本文档的分割部分进行的。根据用例和数据集的类型,保存每个块以及文档的全部内容可能是有效的。这个决定需要对数据集本身有一定的了解。如果文档非常长,并且涵盖了许多主题,使用块的文本可能更合理,因为每个块可能与不同的查询相关联。然而,如果文档是关于特定主题的,使用完整的文档可能包含对LLM有益的详细信息。
作为其他类型的元数据考虑的有价值的内容,其中包括用于唯一标识数据的ID。在确定源文件是否需要更新嵌入数据时,可以使用文档ID。
此外,添加可通过筛选器选择要执行向量搜索的数据集子集的元数据也可能非常有用。作为一个简单的例子,可以利用各种数据源的类别信息,如“产品文件”或“内部Wiki”。例如,由于内部Wiki可能包含不希望与特定用户共享的数据,因此可以利用此类别信息在搜索结果中排除该源。
4. 创建和保存嵌入数据。
接下来,我们将考虑使用嵌入模型生成向量的过程。
这个过程的第一步是文本的分块化。这是一个确定将文本分割为较短字符串的方法的过程。这主要是出于以下两个原因进行的。
首先,由于嵌入模型对可接受的文本量存在限制。
此外,对于判断是否要进行分块处理,需要考虑模型的限制以及数据源和应用程序两个方面。如果应用程序需要将整个文档返回给用户,合理的做法是尽可能使用更大的分块,只要模型允许。或者,与整个文档相比,只涉及几个句子的较短分块更有可能涉及某个主题的事实或想法,在某些应用程序(如问答系统)中更为适用。
既然确定了对于块的长度的处理方法,接下来需要制定关于块化的策略。这里有许多种方法可供选择。
最简单的方法是将文本分割为等长的块。在这种情况下,由于块可能会在解释重要事实的过程中分割单词或句子,因此允许块之间有重叠有助于更准确地抓住文档中的概念。
作为更高级且广泛使用的策略,基于语言结构的分块化是一种选择。例如,可以根据文档的章节、段落或句子边界进行分块化。一旦创建了文档的分块集,将每个分块的向量与之前定义的相关元数据一起存储在数据存储中。
达特斯数据星座数据库
AstraDB 是 DataStax 的 Apache Cassandra 托管服务,具备向量搜索功能,是处理大型向量数据集的优秀选择。此外,AstraDB 的向量搜索功能是分布式数据库 Apache Cassandra 的扩展,具有高可用性和灵活可扩展性,因此除了向量外,还可以轻松存储与该向量相关的元数据,具有通过元数据操作的优势,不仅仅局限于向量搜索。这种可靠性和可扩展性的大规模数据使用以及作为数据库的通用性是 AstraDB 具有的与简单的向量数据库不同的优点。
5. 更新嵌入数据
当企业所持有的数据会随着时间的推移而发生变化。为了避免错觉,一旦有新的数据源可用,更新嵌入数据就显得至关重要。
当数据源发生变化的情况下,可能是因为有新的文档可用,或者过去已编码的内容被更新。
在更新现有文档的嵌入数据时,企业需要注意到对于所持有的数据对象可能有多个嵌入数据注册的情况。如果数据源是文本,则这取决于整个文本的长度和所选的切块策略。在更新嵌入数据时,需要注意替换来自该文档派生的所有嵌入数据。
另外,要记住,并不是所有嵌入模型的转换逻辑都是确定性的是有益的。不同的模型在对相同文本进行编码时可能会得到不同的结果。虽然所得到的向量通常会相似,但在替换现有嵌入数据为新的嵌入数据时,使用嵌入向量的原始值来确定应替换的特定现有嵌入数据并不是一个明智的选择。相反,可以考虑使用唯一的标识符。