RAG基础:基于markdown_split的Markdown文本分割实战
一、要求实现如下功能功能headers_to_split_on支出混合的拆块支持 chunk_size、chunk_overlap支持 chunk 元数据markdown 中的代码不拆分支持strip_headers 参数设置二、题解思路解析实现思路1. 分层处理策略 - 第一层使用 MarkdownHeaderTextSplitter 按标题级别分割文本保留标题结构- 第二层对非代码块内容使用 RecursiveCharacterTextSplitter 进行语义分割- 特殊处理识别并完整保留代码块不进行拆分2. 核心功能实现 - 标题分割 通过 headers_to_split_on 参数定义要分割的标题级别- 混合拆块 结合标题分割和字符分割支持 chunk_size 和 chunk_overlap 参数- 元数据保留 在分割过程中传递和保留文档元数据- 代码块保护 通过检测代码块标记确保代码块完整性3. 技术要点 - 使用状态机识别代码块的开始和结束- 对普通文本和代码块采用不同的处理策略- 保留原始文档的元数据信息- 支持自定义标题级别和分割参数代码from langchain_text_splitters import MarkdownHeaderTextSplitter,RecursiveCharacterTextSplitter def markdown_split( markdown_text, # 输入的Markdown文本 headers_to_split_onNone, # 要分割的标题级别 chunk_size500, # 单个块最大字符数 chunk_overlap100, # 相邻块重叠字符数 code_block_handlingTrue # 是否保留代码块完整性 ): Markdown文本分割函数 Args: markdown_text: 输入的Markdown文本 headers_to_split_on: 要分割的标题级别格式为[(\#\, \一级标题\), (\##\, \二级标题\)] chunk_size: 单个块最大字符数 chunk_overlap: 相邻块重叠字符数 code_block_handling: 是否保留代码块完整性 Returns: 分割后的Document对象列表 # 默认标题级别 if headers_to_split_on is None: headers_to_split_on [ (#, 一级标题), (##, 二级标题), (###, 三级标题), ] # 1. 使用MarkdownHeaderTextSplitter按标题分割 markdown_splitter MarkdownHeaderTextSplitter( headers_to_split_onheaders_to_split_on, strip_headersFalse, return_each_lineFalse ) # 执行标题分割 header_split_docs markdown_splitter.split_text(markdown_text) # 2. 初始化递归字符分割器用于二次分割长内容 text_splitter RecursiveCharacterTextSplitter( chunk_sizechunk_size, chunk_overlapchunk_overlap, separators[\n\n, \n, 。, , , , , ], length_functionlen, is_separator_regexFalse ) # 3. 处理每个标题分割后的部分 final_docs [] for doc in header_split_docs: content doc.page_content metadata doc.metadata.copy() # 如果需要保留代码块完整性 if code_block_handling and in content: # 分割代码块和普通文本 parts [] # current_part in_code_block False for line in content.split(\n): if line.startswith(): if in_code_block: # 代码块结束 current_part line \n parts.append((current_part, True)) # True表示是代码块 current_part in_code_block False else: # 代码块开始 if current_part: parts.append((current_part, False)) # False表示普通文本 current_part line \n in_code_block True else: current_part line \n # 处理最后一个部分 if current_part: parts.append((current_part, False)) # 对普通文本进行分割保留代码块完整 for part, is_code in parts: if is_code: # 代码块直接添加不分割 final_docs.append(type(doc)(page_contentpart, metadatametadata)) else: # 普通文本使用递归分割器 sub_docs text_splitter.create_documents([part]) for sub_doc in sub_docs: # 保留原始元数据 sub_doc.metadata metadata.copy() final_docs.append(sub_doc) else: # 不需要保留代码块完整性直接使用递归分割器 sub_docs text_splitter.create_documents([content]) for sub_doc in sub_docs: # 保留原始元数据 sub_doc.metadata metadata.copy() final_docs.append(sub_doc) return final_docs with open(测试数据.md,r,encodingutf-8)as f: test_markdownf.read() # 执行分割 result_docs markdown_split( test_markdown, chunk_size200, chunk_overlap50 ) # 输出结果 print( markdown_split 分割结果 ) for i, doc in enumerate(result_docs, 1): print(f\n块 {i}:) print(f字符数: {len(doc.page_content)}) print(f元数据: {doc.metadata}) print(f内容:\n{doc.page_content}) print(- * 80)运行结果数据样例已上传。

相关新闻

python数据分析

python数据分析

Python数据分析是一个系统性的技术领域,涉及数据获取、清洗、处理、可视化到建模的完整流程。以下是核心知识体系和实践指南: 一、Python数据分析技术栈 核心库与工具 库名称 主要用途 学习重点 NumPy​ 数值计算基础,多维数组操作 数…

2026/7/3 15:22:18 阅读更多 →
实力强的广州太赫兹足疗仪哪个机构好

实力强的广州太赫兹足疗仪哪个机构好

随着全民养生意识升级,兼具科技感与实用性的太赫兹足疗仪成为家庭养生与健康服务机构的热门选择。广州作为国内健康电子产业核心聚集地,汇聚了众多具备研发与生产实力的机构,但市场鱼龙混杂,选择技术硬、服务全、合规性强的机构成…

2026/7/3 5:49:58 阅读更多 →
iPhone 12 深度解析:配色外观|核心参数|MagSafe/充电续航|维修手册要点|二手验机避坑清单(图文版)

iPhone 12 深度解析:配色外观|核心参数|MagSafe/充电续航|维修手册要点|二手验机避坑清单(图文版)

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…

2026/7/3 15:22:22 阅读更多 →

最新新闻

STM32F765ZI与DRV8213的智能散热系统设计

STM32F765ZI与DRV8213的智能散热系统设计

1. 项目背景与核心需求解析 在汽车电子和工业控制领域,嵌入式系统的散热管理一直是个棘手问题。随着处理器性能提升和空间限制加剧,传统被动散热方案已无法满足需求。我最近参与的某车载信息娱乐系统项目就遇到了这个难题——当STM32F765ZI全速运行且环境…

2026/7/3 23:06:12 阅读更多 →
小红书内容采集与批量下载神器:XHS-Downloader完整使用指南

小红书内容采集与批量下载神器:XHS-Downloader完整使用指南

小红书内容采集与批量下载神器:XHS-Downloader完整使用指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…

2026/7/3 23:06:12 阅读更多 →
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐

告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐

引言 随着卡点剪辑的普及,通用型 BGM 同质化问题日益凸显,数据显示 2026 年头部热门卡点音乐的重复使用率高达 68%,大量卡点视频因配乐撞车导致用户审美疲劳。对于追求创意与辨识度的创作者而言,挖掘小众优质卡点音乐资源成为突破…

2026/7/3 23:06:12 阅读更多 →
【Bug已解决】This model‘s maximum context length is X tokens. However, you requested Y tokens 解决方案

【Bug已解决】This model‘s maximum context length is X tokens. However, you requested Y tokens 解决方案

【Bug已解决】This models maximum context length is X tokens. However, you requested Y tokens 解决方案 1. 问题描述 在自己搭建 Agent Harness、调用大模型 API 时,随着对话轮次增多、工具调用结果不断累积,很多人会在某一次请求突然收到这样的报错…

2026/7/3 23:02:10 阅读更多 →
STM32L031K6与MC74HC165A的GPIO扩展方案详解

STM32L031K6与MC74HC165A的GPIO扩展方案详解

1. 为什么需要MC74HC165A与STM32L031K6的组合?在工业控制和嵌入式系统中,我们经常遇到一个经典矛盾:主控芯片的GPIO引脚数量有限,但外部设备需要监测或控制的信号却越来越多。传统解决方案要么使用更昂贵的多引脚MCU,要…

2026/7/3 23:00:09 阅读更多 →
深度解密猫抓Cat-Catch:浏览器资源嗅探的架构密码与效率革命

深度解密猫抓Cat-Catch:浏览器资源嗅探的架构密码与效率革命

深度解密猫抓Cat-Catch:浏览器资源嗅探的架构密码与效率革命 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在浏览器扩展的生态丛林中…

2026/7/3 23:00:09 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻