语言模型一次可以处理的内容是有限制的,所以如果文本特别长的话,我们需要先把它分割成小块,再交给语言模型去处理。使用 LangChain 框架里提供的不同类型的文本分割器,可以方便地把文本分割成小块。
这种文本分割器一般有两个属性,chunkSize 是块的大小,chunkOverlap 是块内容重叠部分的大小。另外文本分割器里面还有两个方法,createDocuments ,这个方法可以把一组文本分割成一些小块,每一小块都会是一个文档。splitDocuments,这个方法可以把一组文档分割成小块的文档。
RecursiveCharacterTextSplitter
RecursiveCharacterTextSplitter 是 LangChain 官方推荐使用的一种文本分割器,在这个 Node.js 程序文件里,先在文件顶部导入一个 fs ,它来自 fs/promises。然后再导入一个 RecursiveCharacterTextSplitter,它来自 langchain/text_splitter
声明一个 text,表示要分割成小块文档的文本,等于 await,用一下 fs.readFile,读取一个文本文件里的文本内容,位置是当前目录 files 里的 vue-book-by-wanghao.txt。
然后声明一个 splitter,表示文本分割器,新建一个 RecursiveCharacterTextSplitter。 下面再声明一个 result,等于 await,用一下这个 splitter.createDocuments 方法,这个方法可以根据一组文本生成一组小块的文档,提供一个数组,里面添加一个 text.toString()。下面在控制台上输出这个 result。
然后在终端,项目所在目录的下面,执行 node index.mjs,你会发现这里输出的东西就是根据一组文本生成的一组小块的文档。
splitDocuments
文本分割器的 splitDocuments 方法可以将一组文档分割成小块的文档。可以这样测试一下,先在这个程序文件的顶部导入 Document,它来自 langchain/document。
声明一个 document,它的值可以新建一个 Document,提供一个对象参数,设置一下 pageContent 属性,值是 text.toString()。
声明一个 result,等于 await,用一下 splitter 上在的 splitDocuments,这个方法接收一组文档,提供一个数组,里面添加一个 document。
在终端,再运行一下应用,这里仍然会输出一组小块的文档,这组文档是使用 RecursiveCharacterTextSplitter 这种文本分割器,根据一组文档生成的小块的文档。