面向开发者的LLM入门教程-基于字符分割: 基于字符分割 如何进行文本分割,往往与我们的任务类型息息相关。当我们拆分代码时,这种相关性变得尤为突出。因此,我们引入……
哈喽!伙伴们,我是小智,你们的AI向导。欢迎来到每日的AI学习时间。今天,我们将一起深入AI的奇妙世界,探索“面向开发者的LLM入门教程-基于字符分割”,并学会本篇文章中所讲的全部知识点。还是那句话“不必远征未知,只需唤醒你的潜能!”跟着小智的步伐,我们终将学有所成,学以致用,并发现自身的更多可能性。话不多说,现在就让我们开始这场激发潜能的AI学习之旅吧。
面向开发者的LLM入门教程-基于字符分割:
基于字符分割
如何进行文本分割,往往与我们的任务类型息息相关。当我们拆分代码时,这种相关性变得尤为突出。因此,我们引入了一个语言文本分割器,其中包含各种为 Python、Ruby、C 等不同编程语言设计的分隔符。在对这些文档进行分割时,必须充分考虑各种编程语言之间的差异。
我们将从基于字符的分割开始探索,借助 LangChain 提供的 RecursiveCharacterTextSplitter 和CharacterTextSplitter 工具来实现此目标。
CharacterTextSplitter 是字符文本分割,分隔符的参数是单个的字符串;
RecursiveCharacterTextSplitter 是递归字符文本分割,将按不同的字符递归地分割(按照这个优先级[“nn”, “n”, ” “, “”]),这样就能尽量把所有和语义相关的内容尽可能长时间地保留在同一位置。因此, RecursiveCharacterTextSplitter 比 CharacterTextSplitter 对文档切割得更加碎片化
RecursiveCharacterTextSplitter 需要关注的是如下4个参数:
· separators – 分隔符字符串数组
· chunk_size – 每个文档的字符数量限制
· chunk_overlap – 两份文档重叠区域的长度
· length_function – 长度计算函数
1.短句分割
# 导入文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter,
CharacterTextSplitterchunk_size = 20 #设置块大小
chunk_overlap = 10 #设置块重叠大小# 初始化递归字符文本分割器
r_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)# 初始化字符文本分割器
c_splitter = CharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)
接下来我们对比展示两个字符文本分割器的效果。
text = “在AI的研究中,由于大模型规模非常大,模型参数很多,在大模型上跑完来验证参数好不好训练时间
成本很高,所以一般会在小模型上做消融实验来验证哪些改进是有效的再去大模型上做实验。” #测试文本
r_splitter.split_text(text)
[‘在AI的研究中,由于大模型规模非常大,模’,
‘大模型规模非常大,模型参数很多,在大模型’,
‘型参数很多,在大模型上跑完来验证参数好不’,
‘上跑完来验证参数好不好训练时间成本很高,’,
‘好训练时间成本很高,所以一般会在小模型上’,
‘所以一般会在小模型上做消融实验来验证哪些’,
‘做消融实验来验证哪些改进是有效的再去大模’,
‘改进是有效的再去大模型上做实验。’]
可以看到,分割结果中,第二块是从“大模型规模非常大,模”开始的,刚好是我们设定的块重叠大小
#字符文本分割器
c_splitter.split_text(text)
[‘在AI的研究中,由于大模型规模非常大,模型参数很多,在大模型上跑完来验证参数好不好训练时间成本很
高,所以一般会在小模型上做消融实验来验证哪些改进是有效的再去大模型上做实验。’]
可以看到字符分割器没有分割这个文本,因为字符文本分割器默认以换行符为分隔符,因此需要设置“,”为分隔符。
# 设置空格分隔符
c_splitter = CharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
separator=’,’
)
c_splitter.split_text(text)
Created a chunk of size 23, which is longer than the specified 20
[‘在AI的研究中,由于大模型规模非常大’,
‘由于大模型规模非常大,模型参数很多’,
‘在大模型上跑完来验证参数好不好训练时间成本很高’,
‘所以一般会在小模型上做消融实验来验证哪些改进是有效的再去大模型上做实验。’]
设置“,”为分隔符后,分割效果与递归字符文本分割器类似。
可以看到出现了提示”Created a chunk of size 23, which is longer than the specified 20″,意思是“创建了一个长度为23的块,这比指定的20要长。”。这是因为 CharacterTextSplitter 优先使用我们自定义的分隔符进行分割,所以在长度上会有较小的差距
2.长文本分割
接下来,我们来尝试对长文本进行分割。
# 中文版
some_text = “””在编写文档时,作者将使用文档结构对内容进行分组。
这可以向读者传达哪些想法是相关的。 例如,密切相关的想法
是在句子中。 类似的想法在段落中。 段落构成文档。 nn
段落通常用一个或两个回车符分隔。
回车符是您在该字符串中看到的嵌入的“反斜杠 n”。
句子末尾有一个句号,但也有一个空格。
并且单词之间用空格分隔”””print(len(some_text))
177
我们使用以上长文本作为示例。
c_splitter = CharacterTextSplitter(
chunk_size=80,
chunk_overlap=0,
separator=’ ‘
)
”’
对于递归字符分割器,依次传入分隔符列表,分别是双换行符、单换行符、空格、空字符
因此在分割文本时,首先会采用双分换行符进行分割,同时依次使用其他分隔符进行分割”’
r_splitter = RecursiveCharacterTextSplitter(
chunk_size=80,
chunk_overlap=0,
separators=[“nn”, “n”, ” “, “”]
)
字符分割器结果:
c_splitter.split_text(some_text)
[‘在编写文档时,作者将使用文档结构对内容进行分组。 这可以向读者传达哪些想法是相关的。 例如,密切
相关的想法 是在句子中。 类似的想法在段落中。 段落构成文档。’,
‘段落通常用一个或两个回车符分隔。 回车符是您在该字符串中看到的嵌入的“反斜杠 n”。 句子末尾有一个
句号,但也有一个空格。 并且单词之间用空格分隔’]
递归字符分割器效果:
r_splitter.split_text(some_text)
[‘在编写文档时,作者将使用文档结构对内容进行分组。 这可以向读者传达哪些想法是相关的。 例如,
密切相关的想法 是在句子中。 类似的想法在段落中。’,
‘段落构成文档。’,
‘段落通常用一个或两个回车符分隔。 回车符是您在该字符串中看到的嵌入的“反斜杠 n”。 句子
末尾有一个句号,但也有一个空格。’,
‘并且单词之间用空格分隔’]
如果需要按照句子进行分隔,则还要用正则表达式添加一个句号分隔符
r_splitter = RecursiveCharacterTextSplitter(
chunk_size=30,
chunk_overlap=0,
separators=[“nn”, “n”, “(?<=。 )", " ", ""] ) r_splitter.split_text(some_text)
[‘在编写文档时,作者将使用文档结构对内容进行分组。’,
‘这可以向读者传达哪些想法是相关的。’,
‘例如,密切相关的想法 是在句子中。’,
‘类似的想法在段落中。 段落构成文档。’,
‘段落通常用一个或两个回车符分隔。’,
‘回车符是您在该字符串中看到的嵌入的“反斜杠 n”。’,
‘句子末尾有一个句号,但也有一个空格。’,
‘并且单词之间用空格分隔’]
这就是递归字符文本分割器名字中“递归”的含义,总的来说,我们更建议在通用文本中使用递归字符文本分割器
嘿,伙伴们,今天我们的AI探索之旅已经圆满结束。关于“面向开发者的LLM入门教程-基于字符分割”的内容已经分享给大家了。感谢你们的陪伴,希望这次旅程让你对AI能够更了解、更喜欢。谨记,精准提问是解锁AI潜能的钥匙哦!如果有小伙伴想要了解学习更多的AI知识,请关注我们的官网“AI智研社”,保证让你收获满满呦!
还没有评论呢,快来抢沙发~