ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

如何根据语义切割rag?

如何根据语义切割rag? 根据语义切割文本Semantic Chunking语义切割的核心目标是让每个切片本身是一个完整的语义单元而不是机械地按字符数截断。一、为什么不能简单按字符切割切割方式示例问题固定长度切割500字符“公司的休假政策包括…中间切断…年假需要提前申请”关键信息被切断检索时只能拿到半个句子按句子切割以句号、问号分隔句子太短可能丢失上下文长段落仍可能被切断语义切割的目标切出来的每个块内部主题连贯、语义完整。二、常用的语义切割方法方法1基于句子边界 段落边界最基础优先保持段落完整再在句子边界处切割。# 伪代码示例defchunk_by_paragraph_and_sentence(text,max_chunk_size512):paragraphstext.split(\n\n)# 先按段落分割chunks[]current_chunk[]forparainparagraphs:iflen(current_chunk)len(para)max_chunk_size:current_chunk.append(para)else:# 超过长度按句子切割当前段落sentencessplit_sentences(para)forsentinsentences:iflen(current_chunk)len(sent)max_chunk_size:current_chunk.append(sent)else:chunks.append( .join(current_chunk))current_chunk[sent]returnchunks方法2基于嵌入向量的语义相似度推荐原理计算相邻句子/段落的向量相似度在相似度“陡降”的位置切割。# 流程1.将文本按句子分割S[s1,s2,s3,...,sn]2.用 Embedding 模型计算每个句子的向量E[e1,e2,...,en]3.计算相邻句子的余弦相似度sim[i]cosine(ei,e_{i1})4.找到相似度局部极小值语义转折点在此处切割示例一段文字从“介绍产品功能”突然跳到“售后政策”相似度会显著下降就在此处切割。方法3基于 LLM 的智能分块最准确但成本高用大模型直接标注语义边界Prompt: 请将以下文本按语义单元分割每个单元表达一个完整的意思。 用 split 标记分割位置。 文本公司实行弹性工作制核心工作时间10-16点。此外年假政策为每年15天入职即享。LLM 输出公司实行弹性工作制核心工作时间10-16点。split年假政策为每年15天入职即享。方法4基于文档结构Markdown/HTML/PDF利用文档自带的结构化信息文档类型语义边界标识Markdown#标题、##二级标题、---分隔线HTMLh1、h2、section、pPDF标题字体大小、页眉页脚变化、目录层级代码函数定义、类定义、注释块# Markdown 示例defchunk_by_heading(markdown_text):# 按 # 标题分割保持每个章节完整sectionsre.split(r\n(#{1,6}\s.)\n,markdown_text)# 每个 section 作为独立块三、进阶重叠切割Overlap Chunking为了避免关键信息刚好落在切割边界上让相邻块有部分重叠。块1: [句子1, 句子2, 句子3, 句子4] 块2: [句子3, 句子4, 句子5, 句子6] # 重叠2个句子 块3: [句子5, 句子6, 句子7, 句子8]好处检索时即使问题需要跨边界的信息也能命中其中一个包含完整上下文的块。四、实际代码示例使用 LangChainLangChain 内置了多种语义分割器fromlangchain.text_splitterimport(RecursiveCharacterTextSplitter,# 递归字符分割基础SemanticChunker,# 语义分割MarkdownHeaderTextSplitter,# Markdown 标题分割)# 1. 语义分割基于嵌入相似度text_splitterSemanticChunker(embeddingsyour_embedding_model,breakpoint_threshold_typepercentile,# 相似度低于百分位数时切割buffer_size1,# 考虑前后各1个句子的上下文)chunkstext_splitter.split_text(your_document)# 2. 带重叠的递归分割最常用text_splitterRecursiveCharacterTextSplitter(chunk_size500,# 每块最大字符数chunk_overlap50,# 重叠50字符separators[\n\n,\n,。,,,, ,],# 优先在段落、句子边界切割)五、选择建议场景推荐方法原因通用文档PDF/Word递归分割 重叠平衡简单性和效果Markdown/技术文档按标题分割尊重文档结构语义自然长对话/聊天记录按说话人 时间窗口保持对话上下文代码库按函数/类分割函数是天然语义单元高质量 RAG 系统语义分割 重叠 父子文档最优检索效果六、一个完整的语义切割示例原始文本公司的休假政策包括带薪年假、病假和事假。年假根据工龄计算1-5年工龄10天5年以上15天。病假需提供医生证明。另外公司的加班政策规定工作日加班按1.5倍工资计算。周末加班可申请调休或2倍工资。节假日加班为3倍工资。普通按500字符切割假设总600字块1: [前500字] → 在周末加班可申请调休或2倍工资中间切断 块2: [后100字] → 。节假日加班为3倍工资。不完整语义切割块1: 公司的休假政策包括带薪年假、病假和事假。年假根据工龄计算1-5年工龄10天5年以上15天。病假需提供医生证明。 块2: 公司的加班政策规定工作日加班按1.5倍工资计算。周末加班可申请调休或2倍工资。节假日加班为3倍工资。两个块各自主题完整休假 vs 加班检索时更容易精准命中。
返回列表