核心模块(Modules)
数据连接(DataConnection)
文档转换器(DocumentTransformers)
语义分块器(SemanticChunker)

语义分块

根据语义相似性对文本进行分割。

来自Greg Kamradt精彩的笔记本: 5_Levels_Of_Text_Splitting (opens in a new tab)

所有的功劳都归于他。

在高层次上,这将文本分成句子,然后将句子分成一组3个句子,然后合并在嵌入空间中相似的句子。

安装依赖

!pip install --quiet langchain_experimental langchain_openai

加载示例数据

# 这是一个长文档,我们可以将其分割。
with open("../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()

创建文本分割器

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
text_splitter = SemanticChunker(OpenAIEmbeddings())

分割文本

docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
女士们和先生们,副总统女士,我们的夫人和二位绅士。国会和内阁的成员。最高法院的大法官们。我亲爱的美国同胞们。去年,COVID-19让我们分离。今年,我们终于再次相聚。今晚,我们作为民主、共和和独立党派相见。但最重要的是,作为美国人。我们有责任对美国人民、对宪法、对彼此保持坚定的决心,自由将永远战胜暴政。六天前,俄罗斯的弗拉基米尔·普京试图撼动自由世界的基础,他以为可以让自由世界屈服于他的威胁方式。但他严重错误估计了形势。他以为他可以卷入乌克兰,而世界将会屈服。相反,他遇到了一堵他从未想象过的坚固墙。他见到了乌克兰人民。从泽连斯基总统到每一个乌克兰人,他们的无畏、勇气和决心激励着世界。公民团体用身体阻挡坦克。从学生到退休人员,从教师变成士兵,捍卫他们的家园。正如泽连斯基总统在他在欧洲议会的演讲中所说的,“光明将战胜黑暗。”乌克兰驻美国大使今晚在这里。让我们在这个议院里每个人都发出乌克兰和世界都能明确的信号。如果你可以,请站起来,向全世界展示,是的,我们美利坚合众国与乌克兰人民站在一起。在我们的历史中,我们已经了解到这个教训,当独裁者不为他们的侵略付出代价时,他们会造成更多的混乱。他们不断进展。

断点

这个分块器通过确定何时在句子之间“断开”。这是通过查找任意两个句子之间的嵌入之间的差异来实现的。当差异超过某个阈值时,它们就会被分割。

有几种方法可以确定阈值是多少。

百分位数

默认的分割方法是基于百分位数。在这种方法中,计算所有句子之间的差异,然后任何大于X百分位数的差异都会被分割。

text_splitter = SemanticChunker(
    OpenAIEmbeddings(), breakpoint_threshold_type="percentile"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
女士们和先生们,副总统女士,我们的夫人和二位绅士。国会和内阁的成员。最高法院的大法官们。我亲爱的美国同胞们。去年,COVID-19让我们分离。今年,我们终于再次相聚。今晚,我们作为民主、共和和独立党派相见。但最重要的是,作为美国人。我们有责任对美国人民、对宪法、对彼此保持坚定的决心,自由将永远战胜暴政。六天前,俄罗斯的弗拉基米尔·普京试图撼动自由世界的基础,他以为可以让自由世界屈服于他的威胁方式。但他严重错误估计了形势。他以为他可以卷入乌克兰,而世界将会屈服。相反,他遇到了一堵他从未想象过的坚固墙。他见到了乌克兰人民。从泽连斯基总统到每一个乌克兰人,他们的无畏、勇气和决心激励着世界。公民团体用身体阻挡坦克。从学生到退休人员,从教师变成士兵,捍卫他们的家园。正如泽连斯基总统在他在欧洲议会的演讲中所说的,“光明将战胜黑暗。”乌克兰驻美国大使今晚在这里。让我们在这个议院里每个人都发出乌克兰和世界都能明确的信号。如果你可以,请站起来,向全世界展示,是的,我们美利坚合众国与乌克兰人民站在一起。在我们的历史中,我们已经了解到这个教训,当独裁者不为他们的侵略付出代价时,他们会造成更多的混乱。他们不断进展。
print(len(docs))
26

标准差

在这种方法中,任何超过X个标准差的差异都会被分割。

text_splitter = SemanticChunker(
    OpenAIEmbeddings(), breakpoint_threshold_type="standard_deviation"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
女士们和先生们,副总统女士,我们的夫人和二位绅士。国会和内阁的成员。最高法院的大法官们。我亲爱的美国同胞们。去年,COVID-19让我们分离。今年,我们终于再次相聚。今晚,我们作为民主、共和和独立党派相见。但最重要的是,作为美国人。我们有责任对美国人民、对宪法、对彼此保持坚定的决心,自由将永远战胜暴政。六天前,俄罗斯的弗拉基米尔·普京试图撼动自由世界的基础,他以为可以让自由世界屈服于他的威胁方式。但他严重错误估计了形势。他以为他可以卷入乌克兰,而世界将会屈服。相反,他遇到了一堵他从未想象过的坚固墙。他见到了乌克兰人民。从泽连斯基总统到每一个乌克兰人,他们的无畏、勇气和决心激励着世界。公民团体用身体阻挡坦克。从学生到退休人员,从教师变成士兵,捍卫他们的家园。正如泽连斯基总统在他在欧洲议会的演讲中所说的,“光明将战胜黑暗。”乌克兰驻美国大使今晚在这里。让我们在这个议院里每个人都发出乌克兰和世界都能明确的信号。如果你可以,请站起来,向全世界展示,是的,我们美利坚合众国与乌克兰人民站在一起。在我们的历史中,我们已经了解到这个教训,当独裁者不为他们的侵略付出代价时,他们会造成更多的混乱。他们不断进展。
print(len(docs))
4

四分位数

在这种方法中,使用四分位距来分割块。

text_splitter = SemanticChunker(
    OpenAIEmbeddings(), breakpoint_threshold_type="interquartile"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
女士们和先生们,副总统女士,我们的夫人和二位绅士。国会和内阁的成员。最高法院的大法官们。我亲爱的美国同胞们。去年,COVID-19让我们分离。今年,我们终于再次相聚。今晚,我们作为民主、共和和独立党派相见。但最重要的是,作为美国人。我们有责任对美国人民、对宪法、对彼此保持坚定的决心,自由将永远战胜暴政。六天前,俄罗斯的弗拉基米尔·普京试图撼动自由世界的基础,他以为可以让自由世界屈服于他的威胁方式。但他严重错误估计了形势。他以为他可以卷入乌克兰,而世界将会屈服。相反,他遇到了一堵他从未想象过的坚固墙。他见到了乌克兰人民。从泽连斯基总统到每一个乌克兰人,他们的无畏、勇气和决心激励着世界。公民团体用身体阻挡坦克。从学生到退休人员,从教师变成士兵,捍卫他们的家园。正如泽连斯基总统在他在欧洲议会的演讲中所说的,“光明将战胜黑暗。”乌克兰驻美国大使今晚在这里。让我们在这个议院里每个人都发出乌克兰和世界都能明确的信号。如果你可以,请站起来,向全世界展示,是的,我们美利坚合众国与乌克兰人民站在一起。在我们的历史中,我们已经了解到这个教训,当独裁者不为他们的侵略付出代价时,他们会造成更多的混乱。他们不断进展。
print(len(docs))
25