为了账号安全,请及时绑定邮箱和手机立即绑定

新的分块方法用于RAG系统

增强的文档拆分

由AI生成的图像

将大型文档分割成较小的部分是影响检索增强生成(RAG)系统性能的一个重要但关键因素。开发RAG系统的框架通常提供多种选择。在本文中,我想介绍一种新选项,该选项尝试在分割文档时利用句子嵌入来识别主题的变化,从而在这些点进行分割。这为RAG系统中的嵌入步骤奠定了基础,即可以为编码特定主题而非多个主题混合的文本部分找到向量。我们在主题建模的背景下提出过这种方法,但它也适用于RAG系统。

RAG系统

一个基于检索增强生成(RAG)系统是一种结合了基于检索和基于生成的方法的机器学习模型,以提高其输出的质量和相关性。它首先根据输入查询从大型数据集中检索相关文档或信息。然后,它使用生成模型(如基于Transformer的语言模型)利用检索到的信息生成连贯且符合上下文的响应或内容。这种混合方法增强了模型提供准确且信息丰富的响应的能力,特别是在复杂或知识密集型任务中。

其他拆分选项

在我们更详细地探讨该过程之前,我想先介绍一些其他的文档分割标准选项。我将使用广泛使用的Langchain框架来展示示例。

LangChainLangChain的产品套件支持开发者在其开发旅程的每一步。www.langchain.com

LangChain 是一个强大的框架,旨在协助各种自然语言处理(NLP)任务,主要侧重于应用大型语言模型。其中一个核心功能是文档拆分,它使用户能够将大型文档拆分成更小、更易管理的片段。以下是 LangChain 中文档拆分的关键功能和示例:

LangChain 中文档拆分的关键特性
  1. 递归字符文本分割器:此方法通过递归地根据字符分割文本,确保每个片段的长度不超过指定长度。这对于具有自然段落或句子分隔符的文档特别有用。
  2. 分词分割器:此方法使用分词来分割文档。当与具有分词限制的语言模型一起使用时,它可以确保每个片段符合模型的约束条件。
  3. 句子分割器:此方法在句子边界处分割文档。它非常适合保持文本的上下文完整性,因为句子通常代表完整的思路。
  4. 正则表达式分割器:此方法使用正则表达式定义自定义分割点。它提供了最高的灵活性,允许用户根据特定用例的模式来分割文档。
  5. Markdown 分割器:此方法专为 Markdown 文档设计。它根据 Markdown 特定的元素(如标题、列表和代码块)来分割文本。
LangChain 中的文档拆分示例
1. 递归字符文本分割器
    from langchain.text_splitter import RecursiveCharacterTextSplitter  

    text = "您的长文档文本在这里..."  
    splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)  
    chunks = splitter.split_text(text)  
    for chunk in chunks:  
        print(chunk)
2. TokenSplitter
    from langchain.text_splitter import TokenSplitter  

    text = "您的长文档文本在这里..."  
    splitter = TokenSplitter(max_tokens=512)  
    chunks = splitter.split_text(text)  
    for chunk in chunks:  
        print(chunk)
3. 句子分割器
    from langchain.text_splitter import SentenceSplitter  

    text = "您的长文档文本在这里..."  
    splitter = SentenceSplitter(max_length=5)  
    chunks = splitter.split_text(text)  
    for chunk in chunks:  
        print(chunk)
4. 正则表达式分割器
    from langchain.text_splitter import RegexSplitter  

    text = "您的长文档文本在这里..."  
    splitter = RegexSplitter(pattern=r'\n\n+')  
    chunks = splitter.split_text(text)  
    for chunk in chunks:  
        print(chunk)
5. Markdown 分割器
    from langchain.text_splitter import MarkdownSplitter  

    text = "您的长 Markdown 文档在这里..."  
    splitter = MarkdownSplitter()  
    chunks = splitter.split_text(text)  
    for chunk in chunks:  
        print(chunk)
一个新方法的介绍

在数字内容分析中,将大规模文档分割成连贯的主题部分是一个重要的挑战。传统的方法,如上述描述的方法,常常无法准确地检测出主题转换的微妙节点。在2024年人工智能、计算机、数据科学与应用国际会议(ACDSA 2024)上发表的一篇论文中,我们提出了一种创新的方法来解决这一问题。

核心挑战

大型文档,如学术论文、长篇报告和详细文章,内容复杂,包含多个主题。传统的分段技术,从简单的基于规则的方法到高级的机器学习算法,都难以准确识别主题转换的点。这些方法常常会错过细微的主题转换,或者错误地识别它们,导致片段化或重叠的部分。

我们的方法利用句子嵌入的力量来增强分段过程。通过使用Sentence-BERT(SBERT)生成句子的嵌入,该方法定量地测量它们的相似性。随着话题的转换,这些嵌入在向量空间中反映了变化,表明潜在的话题转换。

查看方法的每一步:
1. 使用句子嵌入

生成嵌入:

  • 该方法采用Sentence-BERT (SBERT) 为单个句子生成嵌入。SBERT 为句子创建密集的向量表示,包含其语义内容。
  • 然后比较这些嵌入以识别连续句子之间的连贯性。

相似度计算:

  • 使用余弦相似度或其他距离度量(如曼哈顿距离或欧几里得距离)来衡量句子之间的相似性。
  • 概念是同一主题内的句子将具有相似的嵌入,而来自不同问题的句子则会显示出相似度下降。
2. 计算Gap分数

定义参数 n:

  • 设置了一个参数 n,指定要比较的句子数量。例如,如果 n=2,则比较两个连续的句子与下一个句子对。
  • 选择 n 的值会影响比较中考虑的上下文长度,平衡了捕捉详细过渡与计算效率的需求。

计算余弦相似度:

  • 对文档中的每个位置,算法提取当前位置前后n句句子。
  • 然后计算这些序列的嵌入之间的余弦相似度,称为“gap scores”。
  • 这些gap scores被存储在一个列表中以供进一步处理。

  • 示例的Gap Scores / 图片由作者提供
3. 平滑算法

处理噪声:

  • 原始的Gap分数可能会因为文本中的细微差异而显得嘈杂。为了对抗这一点,应用了一个平滑算法。
  • 平滑过程涉及在一个由参数k定义的窗口内平均Gap分数。

选择窗口大小 k:

  • 窗口大小 k 决定了平滑的程度。较大的 k 值会导致更多的平滑,减少噪声但可能会错过细微的过渡。较小的 k 值保留更多细节,但可能会引入噪声。
  • 平滑后的间隙分数提供了主题过渡发生位置的更明确指示。

示例平滑后的 Gap Scores / 图片由作者提供

4. 边界检测

识别局部最小值:

  • 平滑后的Gap分数被分析以识别局部最小值和潜在的主题转换点。
  • 每个局部最小值的深度分数通过将局部最小值与之前和之后的值之间的差值相加来计算。

设置阈值 c:

  • 阈值参数 c 用于确定显著边界。较高的 c 值会导致较少但更重要的分段,而较低的 c 值会导致更多但更小的分段。
  • 超过平均深度得分 c 倍标准差的边界被视为有效的分段点。

示例分割 / 图像由作者提供

5. 段落聚类

处理重复主题:

  • 更长的文档可能在不同的地方重复类似的主题。为了解决这个问题,算法会将内容相似的段落进行分组。
  • 这包括将段落转换为嵌入,并使用聚类技术合并相似的段落。

减少冗余:

  • 聚类有助于通过确保每个主题的独特表示来减少冗余,从而增强分段的整体连贯性和准确性。
算法伪代码

计算Gap分数:

Gap 分数平滑:

边界检测:

  • 每个局部最小值都会计算深度分数。
  • 使用参数 c 进行阈值处理,以确定显著的分割点。
基于未来方向的展望

该研究概述了几个进一步研究的领域以增强此方法:

  • 自动参数优化: 使用机器学习技术动态调整参数。
  • 更广泛的大型数据集试验: 在多样化的大型数据集上测试该方法。
  • 实时分割: 探索动态文档的实时应用。
  • 模型改进: 集成更新的Transformer模型。
  • 多语言分割: 使用多语言SBERT将该方法应用于不同语言。
  • 分层分割: 研究多级分割以进行详细的文档分析。
  • 用户界面开发: 创建交互式工具以更轻松地调整分割结果。
  • 自然语言处理任务集成: 将算法与其他自然语言处理任务结合。
结论

我们的方法提出了一种复杂的文档分割方法,结合了传统原则和前沿的句子嵌入技术。通过利用Sentence-BERT和先进的平滑及聚类技术,该过程为大型文档的准确主题建模提供了一个稳健且高效的解决方案。

论文 : https://ieeexplore.ieee.org/document/10467643

访问 DataDrivenInvestor.com

订阅 DDIntel 此处

特色文章:

新加坡:揭开无限可能与全球联系的织锦 | DataDrivenInvestor 踏上迁往新加坡的旅程,开启了一个充满无限可能和活力文化的世界……www.datadriveninvestor.com
介绍新加坡基金平台 | DataDrivenInvestor 加速基金的设立、启动和运营效率

加入我们的创作者生态系统 here

DDI 官方 Telegram 频道: https://t.me/+tafUp6ecEys4YjQ1

关注我们:LinkedInTwitterYouTube,和 Facebook

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消