RAG文档分块新思路:LGMGC如何提升文档分块的语义连贯性?

RAG文档分块新思路:LGMGC如何提升文档分块的语义连贯性?

原创 致Great ChallengeHub 2025年01月23日 23:41 北京

今天给大家分享一篇关于RAG文本切块的论文:

论文题目:Passage Segmentation of Documents for Extractive Question Answering

论文地址:https://arxiv.org/pdf/2501.09940

论文概述

开放域问答(Open-Domain Question Answering, ODQA)任务中,文档分块(chunking)过程中存在的不足。特别是在基于检索增强生成(Retrieval-Augmented Generation, RAG)模型的管道中,文档被分割成独立的块,然后通过检索过程来识别与给定查询相关的块,这些相关块与查询一起被传递给语言模型(LLM)以生成期望的响应。

然而,现有研究往往更多关注于检索和生成组件的改进,而忽视了文档分块和分割的重要性。文档分块的粒度和语义在检索阶段的精确度中起着重要作用,而检索到的块中缺乏上下文信息或包含过多不相关信息可能会阻碍语言模型提取准确关键信息的能力,即使检索器的性能很好。

为了解决这些挑战,论文提出了一个新的框架——Logits-Guided Multi-Granular Chunker(LGMGC),该框架将长文档分割成不同粒度的上下文化、自包含的块。通过实验结果,论文证明了LGMGC不仅能够改善检索步骤,而且在集成到RAG管道中时,相较于现有的分块方法也能取得更好的性能。

相关工作

论文中提到了以下与文档分块(chunking)和检索增强生成(RAG)相关的研究工作:

<
### RAG模型中文档分块方法的实现 在RAG(检索增强生成)模型中,文档分块是一个至关重要的环节,直接影响到后续检索和生成的质量。一种有效的方式是采用主题感知的句子嵌入技术来识别文档中的主题变化,并以此为基础划分文档[^3]。具体而言,这种方法可以通过语义相似度计算,找到文档内部的主题边界,从而确保每个分块都围绕单一主题展开。 此外,在实际应用中还可以结合特定格式的文本特性进行分块操作。例如对于Markdown、LaTeX或编程语言如Python等类型的文档,可以根据其特有的结构化标志符完成分块工作[^4]。像Markdown文件就可以按照标题级别`#`或者列表项`-`作为自然断点;而对于源代码,则可能需要考虑函数定义区域或其他逻辑单元作为切割依据。 为了进一步提升效果并解决传统简单切片方式存在的问题——即忽略上下文关联可能导致信息丢失的情况—研究者们提出了更加精细的技术手段。其中包括但不限于使用SBERT(Sentence-BERT)这样的预训练模型获取高质量的句向量表示之后再配合高级别的平滑与聚类算法执行最终的分割任务[^1]。这种方式不仅保留了原始数据间的内在联系而且还增强了新构建片段之间的独立表达能力,进而促进了整个RAG流程里查询匹配阶段的表现水平以及最后输出内容的相关性和一致性。 以下是基于上述描述的一个简单的伪代码示例展示如何利用这些概念来进行基本的文档分块: ```python from sentence_transformers import SentenceTransformer import numpy as np def chunk_document(document_text, model_name='all-MiniLM-L6-v2', threshold=0.75): """ 将输入的大文档按主题分成多个小段落。 参数: document_text (str): 输入要被分割的完整文档字符串。 model_name (str): 使用的SBERT模型名称,默认为'all-MiniLM-L6-v2'。 threshold (float): 主题转换判定阈值,默认设为0.75。 返回: list[str]: 列表形式存储的小段落集合。 """ # 加载指定的SBERT模型用于生成句子嵌入 sbert_model = SentenceTransformer(model_name) sentences = sent_tokenize(document_text) # 假设有合适的工具能将文本拆分为单个句子 embeddings = sbert_model.encode(sentences, convert_to_tensor=True).cpu().numpy() chunks = [] current_chunk = [sentences[0]] prev_embedding = embeddings[0] for i in range(1, len(sentences)): curr_embedding = embeddings[i] cosine_similarity_value = np.dot(prev_embedding, curr_embedding)/(np.linalg.norm(prev_embedding)*np.linalg.norm(curr_embedding)) if cosine_similarity_value < threshold: chunks.append(' '.join(current_chunk)) current_chunk = [] current_chunk.append(sentences[i]) prev_embedding = curr_embedding if current_chunk: # 添加最后一个chunk chunks.append(' '.join(current_chunk)) return chunks ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值