05_RAGTool_Advanced_Search.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 代码示例 05: RAGTool高级检索策略
  5. 展示MQE、HyDE等先进检索技术的实现和应用
  6. """
  7. import time
  8. from hello_agents.tools import RAGTool
  9. class AdvancedSearchDemo:
  10. """高级检索演示类"""
  11. def __init__(self):
  12. self.rag_tool = RAGTool(
  13. knowledge_base_path="./advanced_search_kb",
  14. rag_namespace="advanced_search_demo"
  15. )
  16. self._setup_knowledge_base()
  17. def _setup_knowledge_base(self):
  18. """设置知识库内容"""
  19. print("📚 设置知识库内容")
  20. print("=" * 50)
  21. # 添加技术文档
  22. tech_documents = [
  23. {
  24. "id": "transformer_architecture",
  25. "content": """# Transformer架构详解
  26. ## 注意力机制
  27. Transformer的核心是自注意力机制(Self-Attention),它允许模型在处理序列时关注到序列中的不同位置。
  28. ### 多头注意力
  29. 多头注意力机制将输入投影到多个不同的子空间,每个头关注不同的表示子空间。
  30. ### 位置编码
  31. 由于Transformer没有循环结构,需要位置编码来提供序列中位置信息。
  32. ## 编码器-解码器结构
  33. - 编码器:将输入序列编码为表示
  34. - 解码器:基于编码器输出生成目标序列
  35. ## 应用领域
  36. - 机器翻译
  37. - 文本摘要
  38. - 问答系统
  39. - 代码生成
  40. """
  41. },
  42. {
  43. "id": "deep_learning_optimization",
  44. "content": """# 深度学习优化技术
  45. ## 梯度下降算法
  46. 梯度下降是深度学习中最基础的优化算法。
  47. ### 随机梯度下降(SGD)
  48. - 每次使用单个样本更新参数
  49. - 计算效率高,但收敛不稳定
  50. ### 批量梯度下降
  51. - 使用全部训练数据计算梯度
  52. - 收敛稳定,但计算成本高
  53. ### 小批量梯度下降
  54. - 平衡了SGD和批量梯度下降的优缺点
  55. - 是实际应用中最常用的方法
  56. ## 自适应学习率算法
  57. - Adam:结合动量和自适应学习率
  58. - AdaGrad:根据历史梯度调整学习率
  59. - RMSprop:解决AdaGrad学习率衰减过快的问题
  60. ## 正则化技术
  61. - Dropout:随机丢弃神经元防止过拟合
  62. - Batch Normalization:标准化层输入
  63. - Weight Decay:权重衰减正则化
  64. """
  65. },
  66. {
  67. "id": "nlp_applications",
  68. "content": """# 自然语言处理应用
  69. ## 文本分类
  70. 文本分类是NLP中的基础任务,包括情感分析、主题分类、垃圾邮件检测等。
  71. ### 传统方法
  72. - 词袋模型(Bag of Words)
  73. - TF-IDF特征
  74. - 朴素贝叶斯分类器
  75. ### 深度学习方法
  76. - CNN用于文本分类
  77. - RNN和LSTM处理序列信息
  78. - BERT等预训练模型
  79. ## 命名实体识别(NER)
  80. 识别文本中的人名、地名、组织名等实体。
  81. ### 序列标注方法
  82. - BIO标注体系
  83. - CRF条件随机场
  84. - BiLSTM-CRF模型
  85. ## 机器翻译
  86. 将一种语言的文本翻译成另一种语言。
  87. ### 统计机器翻译
  88. - 基于短语的翻译模型
  89. - 语言模型和翻译模型
  90. ### 神经机器翻译
  91. - Seq2Seq模型
  92. - 注意力机制
  93. - Transformer架构
  94. """
  95. },
  96. {
  97. "id": "computer_vision",
  98. "content": """# 计算机视觉技术
  99. ## 图像分类
  100. 图像分类是计算机视觉的基础任务,目标是将图像分配到预定义的类别中。
  101. ### 卷积神经网络(CNN)
  102. - 卷积层:提取局部特征
  103. - 池化层:降低维度和计算量
  104. - 全连接层:进行最终分类
  105. ### 经典架构
  106. - LeNet:最早的CNN架构
  107. - AlexNet:深度学习在图像识别的突破
  108. - VGG:使用小卷积核的深层网络
  109. - ResNet:残差连接解决梯度消失
  110. ## 目标检测
  111. 在图像中定位和识别多个对象。
  112. ### 两阶段方法
  113. - R-CNN:区域提议+CNN分类
  114. - Fast R-CNN:端到端训练
  115. - Faster R-CNN:RPN网络生成提议
  116. ### 单阶段方法
  117. - YOLO:将检测作为回归问题
  118. - SSD:多尺度特征检测
  119. ## 图像分割
  120. 将图像分割为不同的区域或对象。
  121. ### 语义分割
  122. - FCN:全卷积网络
  123. - U-Net:编码器-解码器结构
  124. - DeepLab:空洞卷积
  125. ### 实例分割
  126. - Mask R-CNN:在Faster R-CNN基础上添加分割分支
  127. """
  128. }
  129. ]
  130. # 批量添加文档
  131. for doc in tech_documents:
  132. result = self.rag_tool.execute("add_text",
  133. text=doc["content"],
  134. document_id=doc["id"])
  135. print(f"✅ 添加文档: {doc['id']}")
  136. print(f"📊 知识库设置完成,共添加 {len(tech_documents)} 个文档")
  137. def demonstrate_basic_search(self):
  138. """演示基础搜索功能"""
  139. print("\n🔍 基础搜索功能演示")
  140. print("-" * 50)
  141. print("基础搜索特点:")
  142. print("• 向量相似度匹配")
  143. print("• 基于嵌入的语义理解")
  144. print("• 相关性排序")
  145. print("• 快速响应")
  146. basic_queries = [
  147. ("注意力机制", "测试精确概念匹配"),
  148. ("深度学习优化", "测试主题匹配"),
  149. ("图像分类CNN", "测试多词匹配"),
  150. ("机器翻译模型", "测试跨文档匹配")
  151. ]
  152. print(f"\n🔍 基础搜索测试:")
  153. for query, description in basic_queries:
  154. print(f"\n查询: '{query}' ({description})")
  155. start_time = time.time()
  156. result = self.rag_tool.execute("search",
  157. query=query,
  158. limit=2,
  159. enable_advanced_search=False)
  160. search_time = time.time() - start_time
  161. print(f"耗时: {search_time:.3f}秒")
  162. print(f"结果: {result[:200]}...")
  163. def demonstrate_mqe_search(self):
  164. """演示多查询扩展(MQE)搜索"""
  165. print("\n🔄 多查询扩展(MQE)搜索演示")
  166. print("-" * 50)
  167. print("MQE搜索原理:")
  168. print("• 🤖 使用LLM生成语义等价查询")
  169. print("• 🔍 并行执行多个查询")
  170. print("• 📊 合并和去重结果")
  171. print("• 🎯 提高召回率和覆盖面")
  172. mqe_queries = [
  173. ("深度学习", "测试概念扩展"),
  174. ("优化算法", "测试技术扩展"),
  175. ("神经网络", "测试架构扩展")
  176. ]
  177. print(f"\n🔄 MQE搜索测试:")
  178. for query, description in mqe_queries:
  179. print(f"\n查询: '{query}' ({description})")
  180. # 基础搜索对比
  181. start_time = time.time()
  182. basic_result = self.rag_tool.execute("search",
  183. query=query,
  184. limit=3,
  185. enable_advanced_search=False)
  186. basic_time = time.time() - start_time
  187. # MQE搜索
  188. start_time = time.time()
  189. mqe_result = self.rag_tool.execute("search",
  190. query=query,
  191. limit=3,
  192. enable_advanced_search=True)
  193. mqe_time = time.time() - start_time
  194. print(f"基础搜索耗时: {basic_time:.3f}秒")
  195. print(f"MQE搜索耗时: {mqe_time:.3f}秒")
  196. print(f"基础结果: {basic_result[:150]}...")
  197. print(f"MQE结果: {mqe_result[:150]}...")
  198. print(f"性能对比: MQE搜索耗时是基础搜索的 {mqe_time/basic_time:.1f} 倍")
  199. def demonstrate_hyde_search(self):
  200. """演示假设文档嵌入(HyDE)搜索"""
  201. print("\n📝 假设文档嵌入(HyDE)搜索演示")
  202. print("-" * 50)
  203. print("HyDE搜索原理:")
  204. print("• 🤖 LLM生成假设性答案文档")
  205. print("• 📄 将假设文档作为查询向量")
  206. print("• 🎯 改善查询-文档匹配效果")
  207. print("• 🔍 特别适合复杂问题检索")
  208. hyde_queries = [
  209. ("如何提高深度学习模型的性能?", "测试方法性问题"),
  210. ("Transformer相比RNN有什么优势?", "测试对比性问题"),
  211. ("什么是计算机视觉中的目标检测?", "测试定义性问题")
  212. ]
  213. print(f"\n📝 HyDE搜索测试:")
  214. for query, description in hyde_queries:
  215. print(f"\n查询: '{query}' ({description})")
  216. # 使用智能问答(内部使用HyDE)
  217. start_time = time.time()
  218. hyde_result = self.rag_tool.execute("ask",
  219. question=query,
  220. limit=3,
  221. enable_advanced_search=True)
  222. hyde_time = time.time() - start_time
  223. print(f"HyDE问答耗时: {hyde_time:.3f}秒")
  224. print(f"HyDE结果: {hyde_result[:300]}...")
  225. def demonstrate_combined_advanced_search(self):
  226. """演示组合高级搜索"""
  227. print("\n🚀 组合高级搜索演示")
  228. print("-" * 50)
  229. print("组合搜索策略:")
  230. print("• 🔄 MQE + HyDE 双重扩展")
  231. print("• 📊 多策略结果融合")
  232. print("• 🎯 最大化检索效果")
  233. print("• ⚡ 智能缓存优化")
  234. complex_queries = [
  235. ("深度学习中的注意力机制是如何工作的?", "复杂技术问题"),
  236. ("比较不同的梯度下降优化算法", "对比分析问题"),
  237. ("计算机视觉和自然语言处理的共同技术", "跨领域问题")
  238. ]
  239. print(f"\n🚀 组合高级搜索测试:")
  240. for query, description in complex_queries:
  241. print(f"\n查询: '{query}' ({description})")
  242. # 组合高级搜索
  243. start_time = time.time()
  244. # 先进行高级搜索获取相关片段
  245. search_result = self.rag_tool.execute("search",
  246. query=query,
  247. limit=4,
  248. enable_advanced_search=True)
  249. # 再进行智能问答生成完整答案
  250. qa_result = self.rag_tool.execute("ask",
  251. question=query,
  252. limit=4,
  253. enable_advanced_search=True,
  254. include_citations=True)
  255. combined_time = time.time() - start_time
  256. print(f"组合搜索耗时: {combined_time:.3f}秒")
  257. print(f"搜索片段: {search_result[:200]}...")
  258. print(f"智能问答: {qa_result[:400]}...")
  259. def demonstrate_search_performance_analysis(self):
  260. """演示搜索性能分析"""
  261. print("\n📊 搜索性能分析")
  262. print("-" * 50)
  263. print("性能分析指标:")
  264. print("• ⏱️ 响应时间对比")
  265. print("• 🎯 检索质量评估")
  266. print("• 💾 资源使用情况")
  267. print("• 📈 扩展性分析")
  268. # 性能测试查询
  269. performance_queries = [
  270. "机器学习",
  271. "深度学习优化算法",
  272. "Transformer注意力机制原理",
  273. "计算机视觉目标检测方法比较"
  274. ]
  275. print(f"\n📊 性能对比测试:")
  276. # 测试不同搜索策略的性能
  277. strategies = [
  278. ("基础搜索", {"enable_advanced_search": False}),
  279. ("高级搜索", {"enable_advanced_search": True})
  280. ]
  281. performance_results = {}
  282. for strategy_name, params in strategies:
  283. print(f"\n{strategy_name}性能测试:")
  284. strategy_times = []
  285. for query in performance_queries:
  286. start_time = time.time()
  287. result = self.rag_tool.execute("search",
  288. query=query,
  289. limit=3,
  290. **params)
  291. query_time = time.time() - start_time
  292. strategy_times.append(query_time)
  293. print(f" 查询: '{query[:20]}...' 耗时: {query_time:.3f}秒")
  294. avg_time = sum(strategy_times) / len(strategy_times)
  295. performance_results[strategy_name] = {
  296. "times": strategy_times,
  297. "average": avg_time
  298. }
  299. print(f" 平均耗时: {avg_time:.3f}秒")
  300. # 性能对比分析
  301. print(f"\n📈 性能对比分析:")
  302. basic_avg = performance_results["基础搜索"]["average"]
  303. advanced_avg = performance_results["高级搜索"]["average"]
  304. print(f"基础搜索平均耗时: {basic_avg:.3f}秒")
  305. print(f"高级搜索平均耗时: {advanced_avg:.3f}秒")
  306. print(f"性能比值: {advanced_avg/basic_avg:.1f}x")
  307. print(f"分析: 高级搜索通过多策略提升检索质量,耗时增加 {((advanced_avg/basic_avg-1)*100):.0f}%")
  308. # 获取系统统计
  309. stats = self.rag_tool.execute("stats")
  310. print(f"\n📊 系统统计: {stats}")
  311. def main():
  312. """主函数"""
  313. print("🚀 RAGTool高级检索策略演示")
  314. print("展示MQE、HyDE等先进检索技术的实现和应用")
  315. print("=" * 70)
  316. try:
  317. demo = AdvancedSearchDemo()
  318. # 1. 基础搜索演示
  319. demo.demonstrate_basic_search()
  320. # 2. MQE搜索演示
  321. demo.demonstrate_mqe_search()
  322. # 3. HyDE搜索演示
  323. demo.demonstrate_hyde_search()
  324. # 4. 组合高级搜索演示
  325. demo.demonstrate_combined_advanced_search()
  326. # 5. 搜索性能分析
  327. demo.demonstrate_search_performance_analysis()
  328. print("\n" + "=" * 70)
  329. print("🎉 高级检索策略演示完成!")
  330. print("=" * 70)
  331. print("\n✨ 高级检索核心技术:")
  332. print("1. 🔄 MQE多查询扩展 - 提高召回率和覆盖面")
  333. print("2. 📝 HyDE假设文档嵌入 - 改善查询匹配效果")
  334. print("3. 🚀 组合搜索策略 - 多技术融合优化")
  335. print("4. 📊 智能结果排序 - 多因素评分机制")
  336. print("5. ⚡ 性能优化 - 缓存和批量处理")
  337. print("\n🎯 技术优势:")
  338. print("• 语义理解 - 超越关键词匹配的语义检索")
  339. print("• 查询扩展 - 自动生成相关查询提升召回")
  340. print("• 上下文感知 - 理解查询意图和上下文")
  341. print("• 质量优化 - 多策略融合提升检索质量")
  342. print("\n💡 应用场景:")
  343. print("• 技术文档问答 - 复杂技术问题的精准回答")
  344. print("• 知识发现 - 从大量文档中发现相关知识")
  345. print("• 智能搜索 - 理解用户意图的智能搜索")
  346. print("• 内容推荐 - 基于语义相似度的内容推荐")
  347. except Exception as e:
  348. print(f"\n❌ 演示过程中发生错误: {e}")
  349. import traceback
  350. traceback.print_exc()
  351. if __name__ == "__main__":
  352. main()