RAG的实现:从SEC报告的指定章节提取的文本,构建一个RAG(检索式增强生成)查询链
- 检查缓存目录:通过检查缓存目录中是否存在向量存储库,优化了方法的执行效率,避免了重复构建向量存储库的过程。
- 提取和处理章节文本:从指定章节提取文本,并将其分割成更小的块,以便后续的向量化和存储。
- 构建向量存储库:使用提取的文本块构建新的向量存储库,并将其持久化存储,供以后快速访问。
- 创建检索器:通过向量存储库创建检索器,使得RAG模型能够高效地检索相关上下文。
- 加载RAG模型的问题提示:使用预定义的提示模板,确保生成的回答具有高质量和一致性。
- 配置RAG查询链:通过链式配置,将检索、生成和解析过程整合在一起,形成一个完整的RAG查询链。
从指定章节提取文本并分割成更小的文本块时,使用了rag
1.
-
检查文本参数:检查传入的
text
参数是否为空。如果为空,抛出ValueError
。 -
初始化文本分割器:使用
RecursiveCharacterTextSplitter
初始化文本分割器,指定块大小为chunk_size_tok
,块之间没有重叠。 -
分割文本:
- 使用文本分割器将文本分割成多个块。
- 检查分割后的文本块是否为空。如果为空或没有生成任何块,抛出
ValueError
。
-
递归嵌入、聚类和总结:
- 调用
recursive_embed_cluster_summarize
方法对文本块进行递归嵌入、聚类和总结。 - 检查结果是否为空。如果为空,抛出
ValueError
。
- 调用
-
存储所有文本块
-
处理每个递归级别的结果:
- 遍历所有递归级别的结果。
- 检查每个级别的结果格式是否正确。如果格式不正确,抛出
ValueError
。 - 提取当前级别的总结,并将其添加到
all_texts
列表中。
-
返回所有文本块:返回经过处理后的所有文本块。
- 递归嵌入:将文本块转换为嵌入向量。
- 聚类:将嵌入向量分组为多个聚类。
- 总结:对每个聚类生成总结文本。
- 这些操作会在每个递归级别中进行,直到达到最大递归深度或生成的唯一聚类数量为1。
2. recursive_embed_cluster_summarize函数用于递归地对文本进行嵌入、聚类和总结,直到达到指定的递归级别或唯一聚类数量变为 1。
创建一个空字典 results
,用于存储每个递归级别的结果。
调用embed_cluster_summarize_texts方法,对当前级别的文本进行嵌入、聚类和总结。然后递归调用,用两个方法分别对文本进行嵌入和聚类。聚类先用全局,再用局部。
全局降维 (global_cluster_embeddings
)
-
定义:
- 目的:通过 UMAP(Uniform Manifold Approximation and Projection)算法将输入的嵌入数据降低到一个较低维度,通常是为了减少数据的复杂性和噪音,同时保留尽可能多的信息。
- 参数:主要参数包括目标维度
dim
、邻居数量n_neighbors
和距离度量metric
。 - 实现:使用
global_cluster_embeddings
函数对整个数据集进行降维,其中n_neighbors
参数默认根据数据集大小自动确定。
-
适用场景:
- 整体数据理解:适用于希望在全局范围内理解数据结构和模式的应用。例如,在聚类之前进行全局降维可以减少噪音和冗余信息,从而提升后续聚类算法的效果。
局部降维 (local_cluster_embeddings
)
-
定义:
- 目的:在进行全局聚类之后,再次使用 UMAP 算法将数据降维到目标维度,但此时主要关注的是每个数据点周围的局部结构。
- 参数:除了
embeddings
、dim
和metric
外,主要区别在于num_neighbors
参数,该参数指定了每个点考虑的邻居数量,通常比全局降维时的邻居数量更小。
-
适用场景:
- 局部结构分析:适用于在全局聚类之后,希望更深入地理解局部结构和相似性的应用。例如,在全局降维后,可以通过局部降维更精确地观察数据点在局部邻域中的分布和聚类情况,进一步分析数据的细节和内在关系。
区别总结
- 范围:全局降维涵盖整个数据集,旨在减少数据集的复杂性。
- 关注点:局部降维侧重于局部数据点的结构和相似性。
- 参数差异:局部降维可能会使用不同的邻居数量参数,以便更好地捕捉局部的数据结构。
- 应用:全局降维通常在数据预处理阶段使用,而局部降维则在数据理解和后续分析阶段使用,以更深入地探索数据的特定区域和关系。
逐级进行嵌入、聚类和总结之后构建新的向量存储库,创建检索器,加载问题提示,返回配置好的RAG链