1
0

05_RAGTool_Advanced_Search.py 16 KB

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