分割(与分块)
假设您想总结一篇长文档。您可以将文档分割成较小的文本片段数组(分块),然后遍历每个文本片段进行摘要(拆分),最后再对这些摘要进行总结。
在本教程中,我们将使用"6. Splitting"文件夹中的图表。请点击此处下载documentation-tutorial.rivet-project文件并在Rivet中打开以跟随操作!
分块处理
将文档分割成数组的第一步在Rivet中称为"分块"。Chunk Node接收一个字符串,并将其分割成特定令牌大小的块。
尝试运行教程示例,您会注意到Chunk Node输出包含N个元素。现在,尝试将重叠增加到50%。输出现在可能包含超过N个元素。重叠使每个块与前后块共享部分文本,这有助于处理原本可能被分割到不同块中的句子或观点。
在下面的截图中,您可以看到"3.2 XYZ的责任"同时出现在块0和1中,而"5. 补偿"同时出现在块1和2中。
分割
下一步是遍历数组中的每一段文本。在Rivet中,节点具有"拆分模式",这使它们能够遍历数组。当拆分模式开启时,拆分图标(下方用红圈标出)会显示在节点标题旁边。
尝试运行教程示例,您会注意到Text Node输出一个数组,其中文本块已插入到模板中。
现在,关闭拆分模式并运行图表。请注意,输出是一个单一的字符串,所有分块项都连接在一起("This is chunk 1 2 3 4..." 的出现是因为 index
输入也是一个数组)。这最终将是我们如何将摘要数组转换为单一答案的方式。
分割模式可以通过max和sequential进行配置。Max指定最大迭代次数。尝试将其设置为2,注意剩余项会被忽略。Sequential指定是逐个迭代项目还是并行迭代。
现在,请注意Text Node有三个输入:index
、count
和data
。index
是一个从0到N的顺序数字数组。data
是N个文本块的数组。在分割模式下,这些数组会一起迭代,因此第i个索引会与第i个文本块一起处理。count
输入不是数组,因此在整个过程中将保持不变。
警告:尽量保持输入到拆分节点的数组长度相同。否则,Rivet会回到任何较短数组的开头重新开始(这很可能不是您想要的行为)。
组合
您可以将启用拆分模式的节点连接起来,以转换数组中的每个项目。在教程示例中,请注意中间三个节点(Text、Chat、Text)上的拆分图标。第一个Text节点将每个数据块插入到提示模板中进行摘要生成。接着,Chat节点会单独对每个数据块进行摘要处理。最后,另一个Text节点为摘要添加一些上下文信息。
生成的摘要字符串数组(以及关于摘要来自哪个块的信息)随后会被合并到一个关闭了分割模式的文本节点中。默认情况下,字符串数组输入会通过用换行符连接每个项来"强制"转换为字符串类型。如果你想以不同的方式组合它们,可以考虑使用类似Join Node这样的节点。