链载Ai

标题: RAG文本切分的五个层次1:字符切分基础(实战) [打印本页]

作者: 链载Ai    时间: 1 小时前
标题: RAG文本切分的五个层次1:字符切分基础(实战)
在大模型应用中,时常会出现由于知识库参考内容过多或者长期记忆的内容过长,导致输入模型的成本过高或者超出模型的承载长度。该怎么办呢?
提高语言模型应用程序性能的最有效策略之一是将大数据分成较小的部分。后面的一系列分享将介绍文本切分的一些概念、方法和实战;会涉及很多内容,但如果你能坚持到最后,保证你会对分块理论有一个扎实的掌握。

我们将文本切分定义为五个层级:

本篇文章将介绍字符切分的概念和实现。虽然简单,但有助于我们理解一些参数和整体概念。

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内容按35个字符被切分成多个片段了:
text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=0,separator='',strip_whitespace=False)print(text_splitter.split_text(text))

加入overlap
通过加入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中的应用。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5