|
在大模型应用中,时常会出现由于知识库参考内容过多或者长期记忆的内容过长,导致输入模型的成本过高或者超出模型的承载长度。该怎么办呢?提高语言模型应用程序性能的最有效策略之一是将大数据分成较小的部分。后面的一系列分享将介绍文本切分的一些概念、方法和实战;会涉及很多内容,但如果你能坚持到最后,保证你会对分块理论有一个扎实的掌握。 我们将文本切分定义为五个层级: Level 1:Character Splitting-简单的字符长度切分 Level 2:Recursive Character Text Splitting-通过分隔符切分,然后递归合并 Level 3 ocument Specific Splitting- 针对不同文档格式切分(PDF, Python, Markdown) Level 4:Semantic Splitting-语义切分 Level 5:Agentic Splitting-使用代理实现自动切分
本篇文章将介绍字符切分的概念和实现。虽然简单,但有助于我们理解一些参数和整体概念。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 4px solid rgb(248, 57, 41);">字符切分概念字符分割是分割文本的最基本形式。它是简单地将文本分成n个字符大小的块的过程,而不考虑其内容或形式。 不建议在任何应用程序中使用这种方法,但它是我们理解基础知识的一个很好的起点。 优点:简单容易 缺点:非常死板,没有考虑到文本的结构
两个小概念: Chunk Size(块大小)-块中包含的字符数量。50、100、10万等等。 Chunk Overlap(块重叠)-为了避免重要信息被切开成多个部分,希望有连续块重叠,overlap就是重叠块的大小。 下面看个例子,来看看字符切分逻辑:
text="2024年一季度公司实现营业收入24.56亿元(-12.60%),实现归母净利润19.54亿元(-3.70%),扣非后归母净利润19.37亿元(+2.38%),基本每股收益0.12元,(-3.36%)。"
chunks=[]chunk_size = 35
for i in range(0, len(text), chunk_size):chunk=text[i:i+chunk_size]#每隔35是一个块chunks.append(chunk)print(chunks)

在实际工程使用中,我们都不是孤立的切分文本,而是对文档进行切分,下面我们使用langchain和llama_index来演示这个过程。
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 4px solid rgb(248, 57, 41);">LangChain实现ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;">导入模块:fromlangchain.text_splitterimportCharacterTextSplitter text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=0,separator='',strip_whitespace=False)print(text_splitter.split_text(text))  通过加入overlap,我们可以发现下面的:%),实现,母净利润1 在两个片段中出现了。text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=5,separator='',strip_whitespace=False)st=text_splitter.split_text(text)pprint(st) 
加入separator 先利用separator将文档切分成小块,再使用长度对小块进行切割: text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=0,separator=',',strip_whitespace=False)print(text_splitter.split_text(text))  ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 4px solid rgb(248, 57, 41);">LLama-Index实现ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);text-align: left;">加载依赖模块fromllama_index.core.text_splitterimportSentenceSplitterfromllama_index.coreimportSimpleDirectoryReader 构建切分器 splitter=SentenceSplitter(chunk_size=200,chunk_overlap=15,) 加载文档 documents=SimpleDirectoryReader(input_files=["./test.txt"]).load_data() 切分文档 nodes=splitter.get_nodes_from_documents(documents) 
nodes里面不仅包含了切分的文本信息,也包含了很多额外的相关内容。可以去探索...
至此,你已经学会了字符切分的全部概念和实战,让我们下篇继续吧。
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);margin-bottom: 0px;">如果对内容有什么疑问和建议可以私信和留言,也可以添加我加入大模型交流群,一起讨论大模型在创作、RAG和agent中的应用。 |