RAG PAPTOR 示例代码理解笔记

RAG PAPTOR 示例代码理解笔记

    • 0. 源代码文件
    • 1. 部分代码理解笔记
      • 故事背景
      • 导入工具
      • 固定种子(随机种子)
      • 全局降维函数
      • 局部降维函数
      • 获取最佳聚类数函数
      • GMM聚类函数
      • 执行聚类函数
      • 嵌入函数
      • 嵌入并聚类文本函数
      • 格式化文本函数
      • 嵌入、聚类并总结文本函数
      • 递归嵌入、聚类并总结函数
      • 总结

0. 源代码文件

https://github.com/langchain-ai/langchain/blob/master/cookbook/RAPTOR.ipynb

1. 部分代码理解笔记

我们可以用一个简单的故事和易于理解的语言来解释每一部分。我们假设我们要处理一堆文本(比如一些文章),然后把它们分类成不同的类别,并总结每个类别的内容。

故事背景

假设我们有很多关于不同主题的文章,比如“动物”、“体育”、“科技”等。我们希望自动地把这些文章分成不同的类别,并总结每个类别的主要内容。

导入工具

首先,我们需要一些工具来帮助我们完成这项任务。就像我们要建一座房子需要锤子和钉子一样,我们在代码里导入了一些工具:

from typing import Dict, List, Optional, Tupleimport numpy as np
import pandas as pd
import umap
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from sklearn.mixture import GaussianMixture

这些工具会帮助我们处理数据、做数学计算、生成文本摘要等等。

固定种子(随机种子)

我们设置了一个固定的种子,这样每次运行代码时,结果都是一样的,便于重复和验证。

RANDOM_SEED = 224

全局降维函数

这个函数叫 global_cluster_embeddings,它的作用是把高维的嵌入向量(代表文本的数学表示)降到一个低维空间,方便后续处理。

def global_cluster_embeddings(embeddings: np.ndarray,dim: int,n_neighbors: Optional[int] = None,metric: str = "cosine",
) -> np.ndarray:"""使用UMAP进行全局降维"""if n_neighbors is None:n_neighbors = int((len(embeddings) - 1) ** 0.5)return umap.UMAP(n_neighbors=n_neighbors, n_components=dim, metric=metric).fit_transform(embeddings)

局部降维函数

这个函数叫 local_cluster_embeddings,它和上面的函数类似,但通常在全局降维之后使用,以进一步细化分类。

def local_cluster_embeddings(embeddings: np.ndarray, dim: int, num_neighbors: int = 10, metric: str = "cosine"
) -> np.ndarray:"""使用UMAP进行局部降维"""return umap.UMAP(n_neighbors=num_neighbors, n_components=dim, metric=metric).fit_transform(embeddings)

获取最佳聚类数函数

这个函数叫 get_optimal_clusters,它用来找出最适合的聚类数量(把数据分成几组)。

def get_optimal_clusters(embeddings: np.ndarray, max_clusters: int = 50, random_state: int = RANDOM_SEED
) -> int:"""使用高斯混合模型和贝叶斯信息准则来确定最佳聚类数"""max_clusters = min(max_clusters, len(embeddings))n_clusters = np.arange(1, max_clusters)bics = []for n in n_clusters:gm = GaussianMixture(n_components=n, random_state=random_state)gm.fit(embeddings)bics.append(gm.bic(embeddings))return n_clusters[np.argmin(bics)]

GMM聚类函数

这个函数叫 GMM_cluster,它用高斯混合模型(GMM)对数据进行聚类。

def GMM_cluster(embeddings: np.ndarray, threshold: float, random_state: int = 0):"""使用GMM进行聚类,并基于概率阈值进行分配"""n_clusters = get_optimal_clusters(embeddings)gm = GaussianMixture(n_components=n_clusters, random_state=random_state)gm.fit(embeddings)probs = gm.predict_proba(embeddings)labels = [np.where(prob > threshold)[0] for prob in probs]return labels, n_clusters

执行聚类函数

这个函数叫 perform_clustering,它结合了全局降维、GMM聚类和局部降维聚类的步骤,把所有的文本分成不同的类别。

def perform_clustering(embeddings: np.ndarray,dim: int,threshold: float,
) -> List[np.ndarray]:"""对嵌入向量进行全局降维、GMM聚类和局部降维聚类"""if len(embeddings) <= dim + 1:return [np.array([0]) for _ in range(len(embeddings))]reduced_embeddings_global = global_cluster_embeddings(embeddings, dim)global_clusters, n_global_clusters = GMM_cluster(reduced_embeddings_global, threshold)all_local_clusters = [np.array([]) for _ in range(len(embeddings))]total_clusters = 0for i in range(n_global_clusters):global_cluster_embeddings_ = embeddings[np.array([i in gc for gc in global_clusters])]if len(global_cluster_embeddings_) == 0:continueif len(global_cluster_embeddings_) <= dim + 1:local_clusters = [np.array([0]) for _ in global_cluster_embeddings_]n_local_clusters = 1else:reduced_embeddings_local = local_cluster_embeddings(global_cluster_embeddings_, dim)local_clusters, n_local_clusters = GMM_cluster(reduced_embeddings_local, threshold)for j in range(n_local_clusters):local_cluster_embeddings_ = global_cluster_embeddings_[np.array([j in lc for lc in local_clusters])]indices = np.where((embeddings == local_cluster_embeddings_[:, None]).all(-1))[1]for idx in indices:all_local_clusters[idx] = np.append(all_local_clusters[idx], j + total_clusters)total_clusters += n_local_clustersreturn all_local_clusters

嵌入函数

这个函数叫 embed,它把文本转成嵌入向量。

def embed(texts):"""为文本生成嵌入向量"""text_embeddings = embd.embed_documents(texts)text_embeddings_np = np.array(text_embeddings)return text_embeddings_np

嵌入并聚类文本函数

这个函数叫 embed_cluster_texts,它先嵌入文本,再进行聚类,并把结果存到一个数据框里。

def embed_cluster_texts(texts):"""嵌入文本并聚类,返回包含文本、嵌入向量和聚类标签的数据框"""text_embeddings_np = embed(texts)cluster_labels = perform_clustering(text_embeddings_np, 10, 0.1)df = pd.DataFrame()df["text"] = textsdf["embd"] = list(text_embeddings_np)df["cluster"] = cluster_labelsreturn df

格式化文本函数

这个函数叫 fmt_txt,它把数据框里的文本格式化成一个字符串。

def fmt_txt(df: pd.DataFrame) -> str:"""格式化文本"""unique_txt = df["text"].tolist()return "--- --- \n --- --- ".join(unique_txt)

嵌入、聚类并总结文本函数

这个函数叫 embed_cluster_summarize_texts,它嵌入、聚类并总结文本,返回两个数据框,一个包含文本及其聚类标签,另一个包含每个聚类的总结。

def embed_cluster_summarize_texts(texts: List[str], level: int
) -> Tuple[pd.DataFrame, pd.DataFrame]:"""嵌入、聚类并总结文本"""df_clusters = embed_cluster_texts(texts)expanded_list = []for index, row in df_clusters.iterrows():for cluster in row["cluster"]:expanded_list.append({"text": row["text"], "embd": row["embd"], "cluster": cluster})expanded_df = pd.DataFrame(expanded_list)all_clusters = expanded_df["cluster"].unique()template = """Here is a sub-set of LangChain Expression Language doc. LangChain Expression Language provides a way to compose chain in LangChain.Give a detailed summary of the documentation provided.Documentation:{context}"""prompt = ChatPromptTemplate.from_template(template)chain = prompt | model | StrOutputParser()summaries = []for i in all_clusters:df_cluster = expanded_df[expanded_df["cluster"] == i]formatted_txt = fmt_txt(df_cluster)summaries.append(chain.invoke({"context": formatted_txt}))df_summary = pd.DataFrame({"summaries": summaries,"level": [level] * len(summaries),"cluster": list(all_clusters),})return df_clusters, df_summary

递归嵌入、聚类并总结函数

这个函数叫 `recursive_embed_cluster_summar

ize`,它递归地进行嵌入、聚类并总结,直到达到指定的层级或聚类数变为1。

def recursive_embed_cluster_summarize(texts: List[str], level: int = 1, n_levels: int = 3
) -> Dict[int, Tuple[pd.DataFrame, pd.DataFrame]]:"""递归嵌入、聚类并总结文本"""results = {}df_clusters, df_summary = embed_cluster_summarize_texts(texts, level)results[level] = (df_clusters, df_summary)unique_clusters = df_summary["cluster"].nunique()if level < n_levels and unique_clusters > 1:new_texts = df_summary["summaries"].tolist()next_level_results = recursive_embed_cluster_summarize(new_texts, level + 1, n_levels)results.update(next_level_results)return results

总结

这段代码的总体思路是:

  1. 把文本转成嵌入向量。
  2. 对嵌入向量进行全局降维。
  3. 使用GMM模型对降维后的嵌入向量进行聚类。
  4. 对每个全局聚类的结果进行进一步的局部降维和聚类。
  5. 对每个聚类的文本进行总结。
  6. 如果还有更多层级,递归地对每个总结进行嵌入、聚类和总结,直到达到指定的层数或聚类数变为1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业&#xff0c;八大员证的持有者是广受尊重的专业人士。然而&#xff0c;要成为一名合格的八大员&#xff0c;首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片&#xff0c;以确保个人信息准确无误。那么&#xff0c;你是否清楚报名时照片的要求以…

Linux笔记--权限与属性命令、查找指令、压缩命令、网络指令

权限 使用ls指令查看详细信息时 rwx分别代表读写执行三种权限&#xff0c;book代表book用户&#xff0c;对于权限来说三种权限分别代表二进制一位&#xff0c;即同时拥有rwx就是111&#xff0c;此时这个文件权限为775 改变权限为rw-rwxr-w指令 book100ask:~/Desktop$ chmod …

Vue I18n国际化插件

Vue I18n国际化插件 安装目录结构及文件内容./locales/lang/zh.js./locales/lang/en.js./locales/index.js main.js引入页面具体使用及语言切换&#xff08;Vue3&#xff09;刷新保存原语言&#xff0c;App.vue添加路由守卫注意点 中文文档&#xff1a; https://kazupon.githu…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…

代码随想录算法训练营第六天| 242.有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 |1. 两数之和

242.有效的字母异位词 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;学透哈希表&#xff0c;数组使用有技巧&#xff01;Leetcode&#xff1a;242.有效的字母异位词_哔哩哔哩_bilibili 1. 对每一个字符串用一个字典统计每个字母出现的次数&#xff0c;最后比较两个字典…

【微信小程序开发实战项目】——如何去申请腾讯地图账号和在微信公众平台,配置request路径和添加地图插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#x…

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

Flutter系列:关于ensureInitialized()

Flutter系列 关于ensureInitialized() - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28…

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

C#.Net筑基-类型系统①基础

C#.Net的BCL提供了丰富的类型&#xff0c;最基础的是值类型、引用类型&#xff0c;而他们的共同&#xff08;隐私&#xff09;祖先是 System.Object&#xff08;万物之源&#xff09;&#xff0c;所以任何类型都可以转换为Object。 01、数据类型汇总 C#.NET 类型结构总结如下图…

vue 之 h() 函数

目录 前言 h() 函数是什么 h() 函数参数 h() 函数基本使用 h() 函数创建 vnodes h() 函数 API 前言 vue在绝大多数情况下都推荐使用模板来编写html结构,但是对于一些复杂场景下需要完全的JS编程能力&#xff0c;这个时候我们就可以使用渲染函数 &#xff0c;它比模板更接…

【区分vue2和vue3下的element UI ColorPicker 颜色选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

Element UI 是为 Vue 2 设计的&#xff0c;而 Element Plus 是 Element UI 的 Vue 3 版本。由于这两个库是为不同的 Vue 版本设计的&#xff0c;因此它们的组件&#xff08;包括 ColorPicker 颜色选择器&#xff09;的 API 和使用方式可能有所不同。 Vue 2 Element UI ColorP…

项目采购管理

目录 1.概述 2.三个子过程 2.1.规划采购管理 2.2.实施采购 2.3.控制采购 2.4.归属过程组 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 需求识别和分析 3.2.2. 制定采购计划 3.2.3. 发布采购请求 3.2.4. 供应商评估与选择 3.2.5. 合同签订 3.2.6. 采购…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

代码随想录算法训练营第38天 [ 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯]

代码随想录算法训练营第38天 [ 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯] 动态规划做题顺序 1.明确dp数组的含义 2.递推公式 3.dp数组的初始化 4.确认遍历的顺序 5.举例看看递推公式满不满足 一、509. 斐波那契数 链接: 代码随想录. 思路&#xff1a;经典dp数组 做…

The Google File System 论文阅读

2003年USENIX&#xff0c;出自谷歌&#xff0c;开启分布式大数据时代的三篇论文之一 总体设计 假设 硬件损坏是常态&#xff0c;而非意外。例如磁盘损坏&#xff0c;断电&#xff0c;断网。所以持续的监控&#xff0c;错误诊断&#xff0c;错误恢复要纳入系统设计之中文件很…

【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux

前言 在私域知识问答和企业知识工程领域&#xff0c;结合Retrieval-Augmented Generation&#xff08;RAG&#xff09;模型和大型语言模型&#xff08;LLM&#xff09;已成为主流方法。然而&#xff0c;企业中存在着大量的PDF文件&#xff0c;PDF解析的低准确性显著影响了基于…