04_RAGTool_MarkItDown_Pipeline.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 代码示例 04: RAGTool的MarkItDown处理管道
  5. 展示Any格式→Markdown→分块→向量化的完整流程
  6. """
  7. import os
  8. import time
  9. import tempfile
  10. from hello_agents.tools import RAGTool
  11. from dotenv import load_dotenv
  12. load_dotenv()
  13. class MarkItDownPipelineDemo:
  14. """MarkItDown处理管道演示类"""
  15. def __init__(self):
  16. self.rag_tool = RAGTool(
  17. knowledge_base_path="./demo_rag_kb",
  18. rag_namespace="markitdown_demo"
  19. )
  20. self.temp_dir = tempfile.mkdtemp()
  21. def create_sample_documents(self):
  22. """创建多格式示例文档"""
  23. print("📄 创建多格式示例文档")
  24. print("=" * 50)
  25. # 创建Markdown文档
  26. markdown_content = """# Python编程指南
  27. ## 基础语法
  28. Python是一种解释型、高级编程语言。
  29. ### 变量和数据类型
  30. - 整数:`42`
  31. - 字符串:`"Hello World"`
  32. - 列表:`[1, 2, 3]`
  33. ### 函数定义
  34. ```python
  35. def greet(name):
  36. return f"Hello, {name}!"
  37. ```
  38. ## 面向对象编程
  39. Python支持面向对象编程范式。
  40. ### 类定义
  41. ```python
  42. class Person:
  43. def __init__(self, name):
  44. self.name = name
  45. def say_hello(self):
  46. return f"Hello, I'm {self.name}"
  47. ```
  48. """
  49. # 创建HTML文档
  50. html_content = """<!DOCTYPE html>
  51. <html>
  52. <head>
  53. <title>Web开发基础</title>
  54. </head>
  55. <body>
  56. <h1>HTML基础</h1>
  57. <p>HTML是超文本标记语言,用于创建网页结构。</p>
  58. <h2>常用标签</h2>
  59. <ul>
  60. <li>h1-h6: 标题标签</li>
  61. <li>p: 段落标签</li>
  62. <li>div: 容器标签</li>
  63. <li>span: 行内标签</li>
  64. </ul>
  65. <h2>CSS样式</h2>
  66. <p>CSS用于控制网页的样式和布局。</p>
  67. <code>
  68. body { font-family: Arial, sans-serif; }
  69. .container { max-width: 1200px; margin: 0 auto; }
  70. </code>
  71. </body>
  72. </html>"""
  73. # 创建JSON文档
  74. json_content = """{
  75. "project": "HelloAgents",
  76. "version": "1.0.0",
  77. "description": "AI Agent开发框架",
  78. "features": [
  79. "记忆系统",
  80. "RAG检索",
  81. "工具集成",
  82. "多模态支持"
  83. ],
  84. "components": {
  85. "memory": {
  86. "types": ["working", "episodic", "semantic", "perceptual"],
  87. "storage": ["SQLite", "Qdrant", "Neo4j"]
  88. },
  89. "rag": {
  90. "formats": ["PDF", "Word", "Excel", "HTML", "Markdown"],
  91. "pipeline": ["MarkItDown", "Chunking", "Embedding", "Storage"]
  92. }
  93. }
  94. }"""
  95. # 创建CSV文档
  96. csv_content = """名称,类型,重要性,描述
  97. 工作记忆,临时存储,0.7,存储当前会话的临时信息
  98. 情景记忆,事件记录,0.8,记录具体的事件和经历
  99. 语义记忆,知识存储,0.9,存储概念性知识和规则
  100. 感知记忆,多模态,0.6,处理图像音频等感知数据
  101. 向量检索,技术组件,0.8,基于语义相似度的检索
  102. 知识图谱,技术组件,0.9,实体关系的结构化表示"""
  103. # 保存文档到临时目录
  104. documents = {
  105. "python_guide.md": markdown_content,
  106. "web_basics.html": html_content,
  107. "project_info.json": json_content,
  108. "memory_types.csv": csv_content
  109. }
  110. file_paths = {}
  111. for filename, content in documents.items():
  112. file_path = os.path.join(self.temp_dir, filename)
  113. with open(file_path, 'w', encoding='utf-8') as f:
  114. f.write(content)
  115. file_paths[filename] = file_path
  116. print(f"✅ 创建文档: {filename}")
  117. return file_paths
  118. def demonstrate_markitdown_conversion(self, file_paths):
  119. """演示MarkItDown转换过程"""
  120. print("\n🔄 MarkItDown转换过程演示")
  121. print("-" * 50)
  122. print("MarkItDown处理流程:")
  123. print("1. 📄 检测文档格式")
  124. print("2. 🔄 转换为Markdown")
  125. print("3. 📝 保持结构信息")
  126. print("4. ✨ 统一格式输出")
  127. conversion_results = {}
  128. for filename, file_path in file_paths.items():
  129. print(f"\n处理文档: {filename}")
  130. print(f"原始格式: {os.path.splitext(filename)[1]}")
  131. start_time = time.time()
  132. # 使用RAGTool添加文档,内部会调用MarkItDown
  133. result = self.rag_tool.run({"action":"add_document",
  134. "file_path":file_path})
  135. process_time = time.time() - start_time
  136. print(f"处理结果: {result}")
  137. print(f"处理时间: {process_time:.3f}秒")
  138. print(f"✅ {filename} → Markdown → 分块 → 向量化")
  139. conversion_results[filename] = {
  140. "result": result,
  141. "time": process_time
  142. }
  143. return conversion_results
  144. def demonstrate_markdown_chunking(self):
  145. """演示基于Markdown的智能分块"""
  146. print("\n📊 基于Markdown的智能分块演示")
  147. print("-" * 50)
  148. print("Markdown分块策略:")
  149. print("• 🏷️ 标题层次感知 - 利用#、##、###结构")
  150. print("• 📝 段落语义保持 - 保持内容完整性")
  151. print("• 🔢 Token精确控制 - 适配嵌入模型")
  152. print("• 🔗 智能重叠策略 - 避免信息丢失")
  153. # 添加一个复杂的Markdown文档来演示分块
  154. complex_markdown = """# 人工智能技术栈
  155. ## 机器学习基础
  156. ### 监督学习
  157. 监督学习使用标注数据训练模型,包括分类和回归任务。
  158. #### 分类算法
  159. - 逻辑回归:用于二分类和多分类问题
  160. - 决策树:基于特征分割的树形结构
  161. - 随机森林:多个决策树的集成方法
  162. - 支持向量机:寻找最优分离超平面
  163. #### 回归算法
  164. - 线性回归:建立特征与目标的线性关系
  165. - 多项式回归:处理非线性关系
  166. - 岭回归:添加L2正则化的线性回归
  167. ### 无监督学习
  168. 无监督学习从无标注数据中发现模式和结构。
  169. #### 聚类算法
  170. - K-means:基于距离的聚类方法
  171. - 层次聚类:构建聚类树状结构
  172. - DBSCAN:基于密度的聚类算法
  173. #### 降维算法
  174. - PCA:主成分分析,线性降维
  175. - t-SNE:非线性降维,适合可视化
  176. - UMAP:保持局部和全局结构的降维
  177. ## 深度学习
  178. ### 神经网络基础
  179. 神经网络是深度学习的基础,模拟人脑神经元结构。
  180. #### 基本组件
  181. - 神经元:基本计算单元
  182. - 激活函数:引入非线性
  183. - 损失函数:衡量预测误差
  184. - 优化器:更新网络参数
  185. ### 常见架构
  186. - CNN:卷积神经网络,适合图像处理
  187. - RNN:循环神经网络,处理序列数据
  188. - LSTM:长短期记忆网络,解决梯度消失
  189. - Transformer:注意力机制,处理长序列
  190. ## 自然语言处理
  191. ### 文本预处理
  192. - 分词:将文本分割为词汇单元
  193. - 词性标注:识别词汇的语法角色
  194. - 命名实体识别:提取人名、地名等实体
  195. - 情感分析:判断文本的情感倾向
  196. ### 语言模型
  197. - N-gram:基于统计的语言模型
  198. - Word2Vec:词向量表示学习
  199. - BERT:双向编码器表示
  200. - GPT:生成式预训练模型
  201. """
  202. print(f"\n📝 添加复杂Markdown文档进行分块测试...")
  203. result = self.rag_tool.run({"action":"add_text",
  204. "text":complex_markdown,
  205. "document_id":"ai_tech_stack",
  206. "chunk_size":800,
  207. "chunk_overlap":100})
  208. print(f"分块结果: {result}")
  209. # 测试基于结构的检索
  210. print(f"\n🔍 测试基于Markdown结构的检索:")
  211. search_queries = [
  212. ("监督学习算法", "测试二级标题内容检索"),
  213. ("神经网络基础", "测试跨层级内容检索"),
  214. ("BERT GPT", "测试具体技术检索"),
  215. ("聚类降维", "测试相关概念检索")
  216. ]
  217. for query, description in search_queries:
  218. print(f"\n查询: '{query}' ({description})")
  219. search_result = self.rag_tool.run({"action":"search",
  220. "query":query,
  221. "limit":2})
  222. print(f"检索结果: {search_result[:200]}...")
  223. def demonstrate_embedding_optimization(self):
  224. """演示面向嵌入的Markdown预处理"""
  225. print("\n🎯 面向嵌入的Markdown预处理演示")
  226. print("-" * 50)
  227. print("Markdown预处理优化:")
  228. print("• 🏷️ 移除格式标记,保留语义内容")
  229. print("• 🔗 处理链接格式,保留链接文本")
  230. print("• 💻 清理代码块,保留代码内容")
  231. print("• 🧹 清理多余空白,优化向量表示")
  232. # 演示预处理前后的对比
  233. raw_markdown = """## 代码示例
  234. 这是一个**重要的**Python函数:
  235. ```python
  236. def process_data(data):
  237. \"\"\"处理数据的函数\"\"\"
  238. return [item.strip() for item in data if item]
  239. ```
  240. 更多信息请参考[官方文档](https://docs.python.org)。
  241. *注意*:这个函数会`自动过滤`空值。
  242. """
  243. print(f"\n📝 原始Markdown内容:")
  244. print(raw_markdown)
  245. # 添加到RAG系统,内部会进行预处理
  246. result = self.rag_tool.run({"action":"add_text",
  247. "text":raw_markdown,
  248. "document_id":"preprocessing_demo"})
  249. print(f"\n✅ 预处理并添加完成: {result}")
  250. # 测试预处理后的检索效果
  251. print(f"\n🔍 测试预处理后的检索效果:")
  252. search_result = self.rag_tool.run({"action":"search",
  253. "query":"Python函数处理数据",
  254. "limit":1})
  255. print(f"检索结果: {search_result}")
  256. def demonstrate_pipeline_performance(self):
  257. """演示处理管道性能"""
  258. print("\n⚡ 处理管道性能演示")
  259. print("-" * 50)
  260. print("性能测试指标:")
  261. print("• 📄 文档转换速度")
  262. print("• 📊 分块处理效率")
  263. print("• 🎯 向量化时间")
  264. print("• 💾 存储操作耗时")
  265. # 批量处理性能测试
  266. batch_texts = [
  267. f"批量处理测试文档 {i+1}:这是一个用于测试MarkItDown处理管道性能的示例文档。"
  268. f"文档包含了多种格式的内容,包括标题、段落、列表等结构化信息。"
  269. f"通过批量处理可以评估系统的整体性能表现。"
  270. for i in range(10)
  271. ]
  272. print(f"\n⏱️ 批量处理性能测试 (10个文档):")
  273. start_time = time.time()
  274. batch_result = self.rag_tool.batch_add_texts(
  275. batch_texts,
  276. document_ids=[f"perf_test_{i+1}" for i in range(10)]
  277. )
  278. batch_time = time.time() - start_time
  279. print(f"批量处理结果: {batch_result}")
  280. print(f"总耗时: {batch_time:.3f}秒")
  281. print(f"平均每文档: {batch_time/10:.3f}秒")
  282. # 获取最终统计
  283. stats = self.rag_tool.run({"action":"stats"})
  284. print(f"\n📊 最终统计: {stats}")
  285. def main():
  286. """主函数"""
  287. print("🔄 RAGTool的MarkItDown处理管道演示")
  288. print("展示Any格式→Markdown→分块→向量化的完整流程")
  289. print("=" * 70)
  290. try:
  291. demo = MarkItDownPipelineDemo()
  292. # 1. 创建多格式示例文档
  293. file_paths = demo.create_sample_documents()
  294. # 2. 演示MarkItDown转换过程
  295. conversion_results = demo.demonstrate_markitdown_conversion(file_paths)
  296. # 3. 演示基于Markdown的智能分块
  297. demo.demonstrate_markdown_chunking()
  298. # 4. 演示面向嵌入的预处理优化
  299. demo.demonstrate_embedding_optimization()
  300. # 5. 演示处理管道性能
  301. demo.demonstrate_pipeline_performance()
  302. print("\n" + "=" * 70)
  303. print("🎉 MarkItDown处理管道演示完成!")
  304. print("=" * 70)
  305. print("\n✨ 处理管道核心特性:")
  306. print("1. 🔄 格式统一 - Any格式→Markdown标准化")
  307. print("2. 🏗️ 结构保持 - 保留文档逻辑结构")
  308. print("3. 📊 智能分块 - 基于Markdown结构的语义分割")
  309. print("4. 🎯 嵌入优化 - 针对向量化的预处理")
  310. print("5. ⚡ 高效处理 - 批量处理和性能优化")
  311. print("\n🎯 技术优势:")
  312. print("• 统一处理 - 一套流程处理所有格式")
  313. print("• 结构感知 - 充分利用Markdown结构信息")
  314. print("• 语义保持 - 在格式转换中保持语义完整性")
  315. print("• 检索优化 - 为向量检索优化的文本表示")
  316. # 清理临时文件
  317. import shutil
  318. shutil.rmtree(demo.temp_dir)
  319. print(f"\n🧹 清理临时文件: {demo.temp_dir}")
  320. except Exception as e:
  321. print(f"\n❌ 演示过程中发生错误: {e}")
  322. import traceback
  323. traceback.print_exc()
  324. if __name__ == "__main__":
  325. main()