大语言模型分词的 chunk_size 和 chunk_overlap 说明和验证

文章介绍了大语言模型在处理长文本时的chunk_size和chunk_overlap参数,通过示例展示了不同设置如何影响文本切分,说明了合理设置这两个参数对保证文本连续性和处理效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大语言模型分词的 chunk_size 和 chunk_overlap

1. 什么是 chunk_size 和 chunk_overlap

对于大型语言模型如GPT-3等来说,chunk_size和chunk_overlap通常指的是文本序列的切分参数:

chunk_size: 对输入文本序列进行切分的最大长度。大语言模型一般会限制最大输入序列长度,比如GPT-3的最大输入长度是2048个token。为了处理更长的文本,需要切分成多个chunk,chunk_size控制每个chunk的最大长度。
chunk_overlap: 相邻两个chunk之间的重叠token数量。为了保证文本语义的连贯性,相邻chunk会有一定的重叠。chunk_overlap控制这个重叠区域的大小。
举例来说,如果chunk_size设为1024,chunk_overlap设为128,则对一个长度为2560的文本序列,会切分成3个chunk:

chunk 1: 第1-1024个token
chunk 2: 第897-1920个token (与chunk 1重叠128个)
chunk 3: 第1793-2560个token (与chunk 2重叠128个)
这样的切分方式既满足了最大长度限制,也保证了相邻chunk间语义的衔接。适当的chunk大小和重叠可以提升大语言模型处理长文本的流畅性和连贯性。

2. 实际验证

先创建要给测试文档,命名为 sidamingzhu.txt,里面包括了“三打白骨精”、“桃园结义”、"武松打虎"的故事。


《西游记》中“三打白骨精”的故事原文:

话说唐僧师徒四人西天取经,途经白虎岭。

白虎岭上有个妖怪,名叫白骨精。

白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。

她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。

孙悟空知道白骨精是妖怪,就去阻止她。

白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。

孙悟空不相信,就用金箍棒打死了她。

白骨精死了,但她并没有死透。

她又变幻成一个老妇人,来找唐僧。

孙悟空又去阻止她,又用金箍棒打死了她。

白骨精死了两次,但她还是没有死透。

她又变幻成一个老公公,来找唐僧。

孙悟空又去阻止她,又用金箍棒打死了她。

唐僧见孙悟空三次打死人,就很生气。

他把孙悟空赶回了花果山。

孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。

他找到了白骨精,用金箍棒打死了她。

唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。

《三国演义》中“桃园三结义”的故事原文:

话说宴罢,天色已晚,众人散去。

刘备留下关张二人,以兄事之。

过了几日,谋曰:“吾与二君,虽异姓,然宗室也。

今天下大乱,正要人才。

若能俱发义心,救动仓皇;联合英雄,扶大道。

此吾三人之有也。

”张飞曰:“若要发大义,当如之何?”

刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”

次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:

“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。

此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。

吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。

如背盟约,无妾百福!”

三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。

自此,刘关张三人正式结拜为交心之兄弟。

《水浒传》中“武松打虎”的故事原文:

武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。

武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。

武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”

那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。

武大郎使开戟去迎战。二人战了十余合,打得难解难分。

这虎本是山中猛虫,十分凶悍。

这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。

这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。

打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。

那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。

武大郎顺手又一刀,把它一只后腿也砍断。

示例代码,

# import
from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader

# load the document and split it into chunks
loader = TextLoader(".\sidamingzhu.txt", encoding="utf-8")
documents = loader.load()

设置 chunk_size=100

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
print("len(docs):", len(docs))
for doc in docs:
    print("="*50)
    print(len(doc.page_content),":", doc)

输出结果,

len(docs): 14
==================================================
86 : page_content='《西游记》中“三打白骨精”的故事原文:\n\n话说唐僧师徒四人西天取经,途经白虎岭。\n\n白虎岭上有个妖怪,名叫白骨精。\n\n白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
94 : page_content='她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。\n\n孙悟空知道白骨精是妖怪,就去阻止她。\n\n白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。\n\n孙悟空不相信,就用金箍棒打死了她。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
90 : page_content='白骨精死了,但她并没有死透。\n\n她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
95 : page_content='孙悟空又去阻止她,又用金箍棒打死了她。\n\n唐僧见孙悟空三次打死人,就很生气。\n\n他把孙悟空赶回了花果山。\n\n孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。\n\n他找到了白骨精,用金箍棒打死了她。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
79 : page_content='唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。\n\n《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
89 : page_content='过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。\n\n若能俱发义心,救动仓皇;联合英雄,扶大道。\n\n此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
66 : page_content='刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”\n\n次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
65 : page_content='“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
76 : page_content='吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。\n\n如背盟约,无妾百福!”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
84 : page_content='三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。\n\n自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
88 : page_content='武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。\n\n武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。\n\n武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
71 : page_content='那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。\n\n武大郎使开戟去迎战。二人战了十余合,打得难解难分。\n\n这虎本是山中猛虫,十分凶悍。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
80 : page_content='这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
84 : page_content='打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。\n\n那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。\n\n武大郎顺手又一刀,把它一只后腿也砍断。' metadata={'source': '.\\sidamingzhu.txt'}

设置 chunk_size=200

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
print("len(docs):", len(docs))
for doc in docs:
    print("="*50)
    print(len(doc.page_content),":", doc)

输出结果,

len(docs): 7
==================================================
198 : page_content='《西游记》中“三打白骨精”的故事原文:\n\n话说唐僧师徒四人西天取经,途经白虎岭。\n\n白虎岭上有个妖怪,名叫白骨精。\n\n白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。\n\n她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。\n\n孙悟空知道白骨精是妖怪,就去阻止她。\n\n白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。\n\n孙悟空不相信,就用金箍棒打死了她。\n\n白骨精死了,但她并没有死透。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
197 : page_content='她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n唐僧见孙悟空三次打死人,就很生气。\n\n他把孙悟空赶回了花果山。\n\n孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。\n\n他找到了白骨精,用金箍棒打死了她。\n\n唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
176 : page_content='《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。\n\n过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。\n\n若能俱发义心,救动仓皇;联合英雄,扶大道。\n\n此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”\n\n刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
179 : page_content='次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:\n\n“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。\n\n吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。\n\n如背盟约,无妾百福!”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
174 : page_content='三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。\n\n自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:\n\n武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。\n\n武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。\n\n武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
192 : page_content='那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。\n\n武大郎使开戟去迎战。二人战了十余合,打得难解难分。\n\n这虎本是山中猛虫,十分凶悍。\n\n这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。\n\n打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
45 : page_content='那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。\n\n武大郎顺手又一刀,把它一只后腿也砍断。' metadata={'source': '.\\sidamingzhu.txt'}

设置 chunk_size=300

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
print("len(docs):", len(docs))
for doc in docs:
    print("="*50)
    print(len(doc.page_content),":", doc)

输出结果,

len(docs): 4
==================================================
295 : page_content='《西游记》中“三打白骨精”的故事原文:\n\n话说唐僧师徒四人西天取经,途经白虎岭。\n\n白虎岭上有个妖怪,名叫白骨精。\n\n白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。\n\n她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。\n\n孙悟空知道白骨精是妖怪,就去阻止她。\n\n白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。\n\n孙悟空不相信,就用金箍棒打死了她。\n\n白骨精死了,但她并没有死透。\n\n她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
278 : page_content='唐僧见孙悟空三次打死人,就很生气。\n\n他把孙悟空赶回了花果山。\n\n孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。\n\n他找到了白骨精,用金箍棒打死了她。\n\n唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。\n\n《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。\n\n过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。\n\n若能俱发义心,救动仓皇;联合英雄,扶大道。\n\n此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”\n\n刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
298 : page_content='次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:\n\n“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。\n\n吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。\n\n如背盟约,无妾百福!”\n\n三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。\n\n自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:\n\n武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
296 : page_content='武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。\n\n武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”\n\n那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。\n\n武大郎使开戟去迎战。二人战了十余合,打得难解难分。\n\n这虎本是山中猛虫,十分凶悍。\n\n这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。\n\n打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。\n\n那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。\n\n武大郎顺手又一刀,把它一只后腿也砍断。' metadata={'source': '.\\sidamingzhu.txt'}

保持 chunk_size=300,设置 chunk_overlap=50

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
print("len(docs):", len(docs))
for doc in docs:
    print("="*50)
    print(len(doc.page_content),":", doc)

输出结果,

len(docs): 5
==================================================
295 : page_content='《西游记》中“三打白骨精”的故事原文:\n\n话说唐僧师徒四人西天取经,途经白虎岭。\n\n白虎岭上有个妖怪,名叫白骨精。\n\n白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。\n\n她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。\n\n孙悟空知道白骨精是妖怪,就去阻止她。\n\n白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。\n\n孙悟空不相信,就用金箍棒打死了她。\n\n白骨精死了,但她并没有死透。\n\n她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
285 : page_content='她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n唐僧见孙悟空三次打死人,就很生气。\n\n他把孙悟空赶回了花果山。\n\n孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。\n\n他找到了白骨精,用金箍棒打死了她。\n\n唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。\n\n《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。\n\n过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。\n\n若能俱发义心,救动仓皇;联合英雄,扶大道。\n\n此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
286 : page_content='此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”\n\n刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”\n\n次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:\n\n“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。\n\n吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。\n\n如背盟约,无妾百福!”\n\n三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
295 : page_content='三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。\n\n自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:\n\n武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。\n\n武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。\n\n武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”\n\n那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。\n\n武大郎使开戟去迎战。二人战了十余合,打得难解难分。\n\n这虎本是山中猛虫,十分凶悍。\n\n这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
166 : page_content='这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。\n\n打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。\n\n那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。\n\n武大郎顺手又一刀,把它一只后腿也砍断。' metadata={'source': '.\\sidamingzhu.txt'}

保持 chunk_size=300,设置 chunk_overlap=100

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=100)
docs = text_splitter.split_documents(documents)
print("len(docs):", len(docs))
for doc in docs:
    print("="*50)
    print(len(doc.page_content),":", doc)

输出结果,

len(docs): 6
==================================================
295 : page_content='《西游记》中“三打白骨精”的故事原文:\n\n话说唐僧师徒四人西天取经,途经白虎岭。\n\n白虎岭上有个妖怪,名叫白骨精。\n\n白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。\n\n她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。\n\n孙悟空知道白骨精是妖怪,就去阻止她。\n\n白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。\n\n孙悟空不相信,就用金箍棒打死了她。\n\n白骨精死了,但她并没有死透。\n\n她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
290 : page_content='她又变幻成一个老妇人,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n白骨精死了两次,但她还是没有死透。\n\n她又变幻成一个老公公,来找唐僧。\n\n孙悟空又去阻止她,又用金箍棒打死了她。\n\n唐僧见孙悟空三次打死人,就很生气。\n\n他把孙悟空赶回了花果山。\n\n孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。\n\n他找到了白骨精,用金箍棒打死了她。\n\n唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。\n\n《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。\n\n过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
279 : page_content='《三国演义》中“桃园三结义”的故事原文:\n\n话说宴罢,天色已晚,众人散去。\n\n刘备留下关张二人,以兄事之。\n\n过了几日,谋曰:“吾与二君,虽异姓,然宗室也。\n\n今天下大乱,正要人才。\n\n若能俱发义心,救动仓皇;联合英雄,扶大道。\n\n此吾三人之有也。\n\n”张飞曰:“若要发大义,当如之何?”\n\n刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”\n\n次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:\n\n“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
290 : page_content='“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。\n\n此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。\n\n吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。\n\n如背盟约,无妾百福!”\n\n三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。\n\n自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:\n\n武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。\n\n武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
284 : page_content='自此,刘关张三人正式结拜为交心之兄弟。\n\n《水浒传》中“武松打虎”的故事原文:\n\n武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。\n\n武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。\n\n武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”\n\n那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。\n\n武大郎使开戟去迎战。二人战了十余合,打得难解难分。\n\n这虎本是山中猛虫,十分凶悍。\n\n这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。' metadata={'source': '.\\sidamingzhu.txt'}
==================================================
182 : page_content='这虎本是山中猛虫,十分凶悍。\n\n这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。\n\n打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。\n\n那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。\n\n武大郎顺手又一刀,把它一只后腿也砍断。' metadata={'source': '.\\sidamingzhu.txt'}

完结!

<think>嗯,用户的问题是关于如何调整RecursiveCharacterTextSplitter,使其使用中文字符而不是token来计数。他们提到是否需要使用jieba分词。首先,我需要确认RecursiveCharacterTextSplitter的工作原理。这个文本分割器通常是基于字符进行分块,尤其是对于像中文这样的语言,因为每个汉字通常被视为一个字符。不过用户可能担心的是,默认的分割方式是否考虑了中文的特殊结构,比如词语而不是单个字符。 用户的问题中提到“使用字符而不是token计数”,所以可能需要明确默认情况下是否已经是按字符处理。比如在英文中,可能会按空格分隔单词,而中文没有空格,所以默认可能按字符分割。但用户可能希望按词语分割,所以才会提到jieba分词。这时候需要区分字符词语的区别。 接下来,我需要考虑RecursiveCharacterTextSplitter的参数。chunk_size是每个文本块的大小,chunk_overlap是块之间的重叠部分。默认情况下,可能按字符数来计算,所以如果用户想确保按字符而不是token(比如像OpenAI的token),可能需要确认代码中的计数方式。不过对于中文来说,通常一个汉字就是一个字符,所以可能不需要调整。 但用户可能混淆了token的概念,因为在NLP中,token可以是词语或子词。例如,像BERT这样的模型会使用WordPiece分词,而GPT系列可能使用不同的方式。但在这个文本分割器的上下文中,可能只是简单地按字符数计算,而不是使用任何分词器。所以如果用户想按词语分割,可能需要自定义的分词方法,比如使用jieba来分割词语,然后按词语数来分块,或者计算字符数时考虑词语边界。 这时候,可能需要修改length_function参数,默认是计算字符数,如果用户想按词语数来分块,就需要用jieba分词后的词语数量。但用户的问题明确说“用字符而不是token计数”,所以可能他们希望确保分割是基于字符而非任何分词后的token。因此,可能不需要使用jieba,只需要确认chunk_size是按字符数设置即可。 不过用户可能有特殊需求,比如虽然按字符分块,但希望分块时不切断词语,这时候就需要在分割符里加入词语边界,但这比较复杂。或者用户可能误解了默认行为,以为需要分词来处理。因此,需要澄清:默认情况下是否已经按字符处理,不需要调整,而如果用户想按词语分割,才需要用到jieba。 所以正确的回答应该是,默认RecursiveCharacterTextSplitter使用字符数统计,对于中文来说,每个汉字作为一个字符,因此chunk_size=400就是400个汉字。不需要额外使用分词工具,除非用户希望按词语分块,这时需要自定义length_functionsplitter,结合jieba分词。</think>在中文环境下使用 `RecursiveCharacterTextSplitter` 时,若需直接以**字符数量**(而非 token 数量)作为分块依据,无需额外依赖分词工具(如 jieba),但需注意以下调整逻辑: --- ### 1. **默认行为的理解** - **字符计数原理**:该工具默认以字符(包括汉字、标点、空格等)为单位计算文本长度。例如 `chunk_size=400` 表示每段文本包含约 400 个字符(每个汉字计为 1 字符)。 - **分割逻辑**:优先按换行符、句号等自然分隔符切分,若无法满足 `chunk_size` 要求,则逐级降级分隔符(如逗号、分号等)递归切分。 --- ### 2. **直接适配中文的调整方法** 若需确保严格按字符数分块(忽略分词效果),可直接使用默认配置: ```python text_splitter = RecursiveCharacterTextSplitter( chunk_size=400, # 每段约400字符 chunk_overlap=50 # 段间重叠50字符(避免切断语义) ) ``` --- ### 3. **为何无需 jieba 分词?** - **目标差异**:分词工具(如 jieba)旨在识别词语边界,而 `RecursiveCharacterTextSplitter` 的目标是按字符数分块,两者目标不同。 - **性能损耗**:引入分词会增加计算开销,且可能因分词错误导致非预期的分块结果。 --- ### 4. **若需结合语义分块(高级用法)** 若希望分块时尽量保留词语完整性(需权衡字符数与语义),可自定义分步逻辑: 1. **使用 jieba 分词**:将文本拆分为词语列表。 2. **按词语合并**:根据词语长度累加,控制总字符数不超过 `chunk_size`。 3. **自定义分割器**:需重写 `length_function` `split_text` 方法。 示例代码片段: ```python from langchain.text_splitter import RecursiveCharacterTextSplitter import jieba def chinese_text_length(text: str) -> int: return len(text) # 直接返回字符数(若需按词语计数可改为 len(jieba.lcut(text))) text_splitter = RecursiveCharacterTextSplitter( chunk_size=400, chunk_overlap=50, length_function=chinese_text_length, # 自定义长度计算 separators=["\n\n", "\n", "。", "!", "?", ";", "…", ",", "、", ""] # 中文友好分隔符 ) ``` --- ### 5. **关键注意事项** - **标点与空格**:中文标点占 1 字符,需计入 `chunk_size`。 - **重叠策略**:`chunk_overlap` 应小于 `chunk_size`,避免无限循环。 - **长无标点文本**:若文本缺乏自然分隔符(如古文),需调整 `separators` 参数。 通过上述方法,既可保持轻量化的字符计数分块,也可灵活扩展结合语义的分词逻辑。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值