#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 代码示例 05: RAGTool高级检索策略 展示MQE、HyDE等先进检索技术的实现和应用 """ import time from hello_agents.tools import RAGTool class AdvancedSearchDemo: """高级检索演示类""" def __init__(self): self.rag_tool = RAGTool( knowledge_base_path="./advanced_search_kb", rag_namespace="advanced_search_demo" ) self._setup_knowledge_base() def _setup_knowledge_base(self): """设置知识库内容""" print("📚 设置知识库内容") print("=" * 50) # 添加技术文档 tech_documents = [ { "id": "transformer_architecture", "content": """# Transformer架构详解 ## 注意力机制 Transformer的核心是自注意力机制(Self-Attention),它允许模型在处理序列时关注到序列中的不同位置。 ### 多头注意力 多头注意力机制将输入投影到多个不同的子空间,每个头关注不同的表示子空间。 ### 位置编码 由于Transformer没有循环结构,需要位置编码来提供序列中位置信息。 ## 编码器-解码器结构 - 编码器:将输入序列编码为表示 - 解码器:基于编码器输出生成目标序列 ## 应用领域 - 机器翻译 - 文本摘要 - 问答系统 - 代码生成 """ }, { "id": "deep_learning_optimization", "content": """# 深度学习优化技术 ## 梯度下降算法 梯度下降是深度学习中最基础的优化算法。 ### 随机梯度下降(SGD) - 每次使用单个样本更新参数 - 计算效率高,但收敛不稳定 ### 批量梯度下降 - 使用全部训练数据计算梯度 - 收敛稳定,但计算成本高 ### 小批量梯度下降 - 平衡了SGD和批量梯度下降的优缺点 - 是实际应用中最常用的方法 ## 自适应学习率算法 - Adam:结合动量和自适应学习率 - AdaGrad:根据历史梯度调整学习率 - RMSprop:解决AdaGrad学习率衰减过快的问题 ## 正则化技术 - Dropout:随机丢弃神经元防止过拟合 - Batch Normalization:标准化层输入 - Weight Decay:权重衰减正则化 """ }, { "id": "nlp_applications", "content": """# 自然语言处理应用 ## 文本分类 文本分类是NLP中的基础任务,包括情感分析、主题分类、垃圾邮件检测等。 ### 传统方法 - 词袋模型(Bag of Words) - TF-IDF特征 - 朴素贝叶斯分类器 ### 深度学习方法 - CNN用于文本分类 - RNN和LSTM处理序列信息 - BERT等预训练模型 ## 命名实体识别(NER) 识别文本中的人名、地名、组织名等实体。 ### 序列标注方法 - BIO标注体系 - CRF条件随机场 - BiLSTM-CRF模型 ## 机器翻译 将一种语言的文本翻译成另一种语言。 ### 统计机器翻译 - 基于短语的翻译模型 - 语言模型和翻译模型 ### 神经机器翻译 - Seq2Seq模型 - 注意力机制 - Transformer架构 """ }, { "id": "computer_vision", "content": """# 计算机视觉技术 ## 图像分类 图像分类是计算机视觉的基础任务,目标是将图像分配到预定义的类别中。 ### 卷积神经网络(CNN) - 卷积层:提取局部特征 - 池化层:降低维度和计算量 - 全连接层:进行最终分类 ### 经典架构 - LeNet:最早的CNN架构 - AlexNet:深度学习在图像识别的突破 - VGG:使用小卷积核的深层网络 - ResNet:残差连接解决梯度消失 ## 目标检测 在图像中定位和识别多个对象。 ### 两阶段方法 - R-CNN:区域提议+CNN分类 - Fast R-CNN:端到端训练 - Faster R-CNN:RPN网络生成提议 ### 单阶段方法 - YOLO:将检测作为回归问题 - SSD:多尺度特征检测 ## 图像分割 将图像分割为不同的区域或对象。 ### 语义分割 - FCN:全卷积网络 - U-Net:编码器-解码器结构 - DeepLab:空洞卷积 ### 实例分割 - Mask R-CNN:在Faster R-CNN基础上添加分割分支 """ } ] # 批量添加文档 for doc in tech_documents: result = self.rag_tool.execute("add_text", text=doc["content"], document_id=doc["id"]) print(f"✅ 添加文档: {doc['id']}") print(f"📊 知识库设置完成,共添加 {len(tech_documents)} 个文档") def demonstrate_basic_search(self): """演示基础搜索功能""" print("\n🔍 基础搜索功能演示") print("-" * 50) print("基础搜索特点:") print("• 向量相似度匹配") print("• 基于嵌入的语义理解") print("• 相关性排序") print("• 快速响应") basic_queries = [ ("注意力机制", "测试精确概念匹配"), ("深度学习优化", "测试主题匹配"), ("图像分类CNN", "测试多词匹配"), ("机器翻译模型", "测试跨文档匹配") ] print(f"\n🔍 基础搜索测试:") for query, description in basic_queries: print(f"\n查询: '{query}' ({description})") start_time = time.time() result = self.rag_tool.execute("search", query=query, limit=2, enable_advanced_search=False) search_time = time.time() - start_time print(f"耗时: {search_time:.3f}秒") print(f"结果: {result[:200]}...") def demonstrate_mqe_search(self): """演示多查询扩展(MQE)搜索""" print("\n🔄 多查询扩展(MQE)搜索演示") print("-" * 50) print("MQE搜索原理:") print("• 🤖 使用LLM生成语义等价查询") print("• 🔍 并行执行多个查询") print("• 📊 合并和去重结果") print("• 🎯 提高召回率和覆盖面") mqe_queries = [ ("深度学习", "测试概念扩展"), ("优化算法", "测试技术扩展"), ("神经网络", "测试架构扩展") ] print(f"\n🔄 MQE搜索测试:") for query, description in mqe_queries: print(f"\n查询: '{query}' ({description})") # 基础搜索对比 start_time = time.time() basic_result = self.rag_tool.execute("search", query=query, limit=3, enable_advanced_search=False) basic_time = time.time() - start_time # MQE搜索 start_time = time.time() mqe_result = self.rag_tool.execute("search", query=query, limit=3, enable_advanced_search=True) mqe_time = time.time() - start_time print(f"基础搜索耗时: {basic_time:.3f}秒") print(f"MQE搜索耗时: {mqe_time:.3f}秒") print(f"基础结果: {basic_result[:150]}...") print(f"MQE结果: {mqe_result[:150]}...") print(f"性能对比: MQE搜索耗时是基础搜索的 {mqe_time/basic_time:.1f} 倍") def demonstrate_hyde_search(self): """演示假设文档嵌入(HyDE)搜索""" print("\n📝 假设文档嵌入(HyDE)搜索演示") print("-" * 50) print("HyDE搜索原理:") print("• 🤖 LLM生成假设性答案文档") print("• 📄 将假设文档作为查询向量") print("• 🎯 改善查询-文档匹配效果") print("• 🔍 特别适合复杂问题检索") hyde_queries = [ ("如何提高深度学习模型的性能?", "测试方法性问题"), ("Transformer相比RNN有什么优势?", "测试对比性问题"), ("什么是计算机视觉中的目标检测?", "测试定义性问题") ] print(f"\n📝 HyDE搜索测试:") for query, description in hyde_queries: print(f"\n查询: '{query}' ({description})") # 使用智能问答(内部使用HyDE) start_time = time.time() hyde_result = self.rag_tool.execute("ask", question=query, limit=3, enable_advanced_search=True) hyde_time = time.time() - start_time print(f"HyDE问答耗时: {hyde_time:.3f}秒") print(f"HyDE结果: {hyde_result[:300]}...") def demonstrate_combined_advanced_search(self): """演示组合高级搜索""" print("\n🚀 组合高级搜索演示") print("-" * 50) print("组合搜索策略:") print("• 🔄 MQE + HyDE 双重扩展") print("• 📊 多策略结果融合") print("• 🎯 最大化检索效果") print("• ⚡ 智能缓存优化") complex_queries = [ ("深度学习中的注意力机制是如何工作的?", "复杂技术问题"), ("比较不同的梯度下降优化算法", "对比分析问题"), ("计算机视觉和自然语言处理的共同技术", "跨领域问题") ] print(f"\n🚀 组合高级搜索测试:") for query, description in complex_queries: print(f"\n查询: '{query}' ({description})") # 组合高级搜索 start_time = time.time() # 先进行高级搜索获取相关片段 search_result = self.rag_tool.execute("search", query=query, limit=4, enable_advanced_search=True) # 再进行智能问答生成完整答案 qa_result = self.rag_tool.execute("ask", question=query, limit=4, enable_advanced_search=True, include_citations=True) combined_time = time.time() - start_time print(f"组合搜索耗时: {combined_time:.3f}秒") print(f"搜索片段: {search_result[:200]}...") print(f"智能问答: {qa_result[:400]}...") def demonstrate_search_performance_analysis(self): """演示搜索性能分析""" print("\n📊 搜索性能分析") print("-" * 50) print("性能分析指标:") print("• ⏱️ 响应时间对比") print("• 🎯 检索质量评估") print("• 💾 资源使用情况") print("• 📈 扩展性分析") # 性能测试查询 performance_queries = [ "机器学习", "深度学习优化算法", "Transformer注意力机制原理", "计算机视觉目标检测方法比较" ] print(f"\n📊 性能对比测试:") # 测试不同搜索策略的性能 strategies = [ ("基础搜索", {"enable_advanced_search": False}), ("高级搜索", {"enable_advanced_search": True}) ] performance_results = {} for strategy_name, params in strategies: print(f"\n{strategy_name}性能测试:") strategy_times = [] for query in performance_queries: start_time = time.time() result = self.rag_tool.execute("search", query=query, limit=3, **params) query_time = time.time() - start_time strategy_times.append(query_time) print(f" 查询: '{query[:20]}...' 耗时: {query_time:.3f}秒") avg_time = sum(strategy_times) / len(strategy_times) performance_results[strategy_name] = { "times": strategy_times, "average": avg_time } print(f" 平均耗时: {avg_time:.3f}秒") # 性能对比分析 print(f"\n📈 性能对比分析:") basic_avg = performance_results["基础搜索"]["average"] advanced_avg = performance_results["高级搜索"]["average"] print(f"基础搜索平均耗时: {basic_avg:.3f}秒") print(f"高级搜索平均耗时: {advanced_avg:.3f}秒") print(f"性能比值: {advanced_avg/basic_avg:.1f}x") print(f"分析: 高级搜索通过多策略提升检索质量,耗时增加 {((advanced_avg/basic_avg-1)*100):.0f}%") # 获取系统统计 stats = self.rag_tool.execute("stats") print(f"\n📊 系统统计: {stats}") def main(): """主函数""" print("🚀 RAGTool高级检索策略演示") print("展示MQE、HyDE等先进检索技术的实现和应用") print("=" * 70) try: demo = AdvancedSearchDemo() # 1. 基础搜索演示 demo.demonstrate_basic_search() # 2. MQE搜索演示 demo.demonstrate_mqe_search() # 3. HyDE搜索演示 demo.demonstrate_hyde_search() # 4. 组合高级搜索演示 demo.demonstrate_combined_advanced_search() # 5. 搜索性能分析 demo.demonstrate_search_performance_analysis() print("\n" + "=" * 70) print("🎉 高级检索策略演示完成!") print("=" * 70) print("\n✨ 高级检索核心技术:") print("1. 🔄 MQE多查询扩展 - 提高召回率和覆盖面") print("2. 📝 HyDE假设文档嵌入 - 改善查询匹配效果") print("3. 🚀 组合搜索策略 - 多技术融合优化") print("4. 📊 智能结果排序 - 多因素评分机制") print("5. ⚡ 性能优化 - 缓存和批量处理") print("\n🎯 技术优势:") print("• 语义理解 - 超越关键词匹配的语义检索") print("• 查询扩展 - 自动生成相关查询提升召回") print("• 上下文感知 - 理解查询意图和上下文") print("• 质量优化 - 多策略融合提升检索质量") print("\n💡 应用场景:") print("• 技术文档问答 - 复杂技术问题的精准回答") print("• 知识发现 - 从大量文档中发现相关知识") print("• 智能搜索 - 理解用户意图的智能搜索") print("• 内容推荐 - 基于语义相似度的内容推荐") except Exception as e: print(f"\n❌ 演示过程中发生错误: {e}") import traceback traceback.print_exc() if __name__ == "__main__": main()