#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 代码示例 07: RAGTool智能问答系统 展示完整的检索→上下文构建→答案生成流程 """ import time from hello_agents.tools import RAGTool class IntelligentQADemo: """智能问答演示类""" def __init__(self): self.rag_tool = RAGTool( knowledge_base_path="./qa_demo_kb", rag_namespace="intelligent_qa_demo" ) self._setup_knowledge_base() def _setup_knowledge_base(self): """设置知识库""" print("📚 设置智能问答知识库") print("=" * 50) # 添加技术知识文档 knowledge_documents = [ { "id": "ai_fundamentals", "content": """# 人工智能基础 ## 定义和历史 人工智能(Artificial Intelligence, AI)是计算机科学的一个分支,旨在创造能够执行通常需要人类智能的任务的机器。AI的概念最早由Alan Turing在1950年提出。 ## 主要分支 ### 机器学习(Machine Learning) 机器学习是AI的核心分支,使计算机能够从数据中学习而无需明确编程。 #### 监督学习 - 分类:预测离散标签 - 回归:预测连续数值 - 常用算法:线性回归、决策树、随机森林、SVM #### 无监督学习 - 聚类:发现数据中的群组 - 降维:减少数据维度 - 常用算法:K-means、PCA、t-SNE #### 强化学习 通过与环境交互学习最优策略,应用于游戏AI、机器人控制等。 ### 深度学习(Deep Learning) 基于人工神经网络的机器学习方法,在图像识别、自然语言处理等领域取得突破。 #### 神经网络架构 - 前馈神经网络:最基础的网络结构 - 卷积神经网络(CNN):专门处理图像数据 - 循环神经网络(RNN):处理序列数据 - Transformer:基于注意力机制的架构 ### 自然语言处理(NLP) 使计算机能够理解、解释和生成人类语言。 #### 核心任务 - 文本分类:判断文本类别 - 命名实体识别:提取人名、地名等 - 情感分析:判断文本情感倾向 - 机器翻译:语言间的自动翻译 - 问答系统:理解问题并生成答案 """ }, { "id": "programming_best_practices", "content": """# 编程最佳实践 ## 代码质量 高质量的代码应该具备可读性、可维护性和可扩展性。 ### 命名规范 - 使用有意义的变量名和函数名 - 遵循一致的命名约定 - 避免使用缩写和模糊的名称 ### 函数设计 - 单一职责原则:每个函数只做一件事 - 函数长度适中:通常不超过20-30行 - 参数数量合理:避免过多参数 ### 代码组织 - 模块化设计:将相关功能组织在一起 - 层次化结构:清晰的目录和文件组织 - 接口设计:定义清晰的模块接口 ## 测试策略 ### 单元测试 - 测试单个函数或方法 - 使用断言验证预期结果 - 覆盖边界条件和异常情况 ### 集成测试 - 测试模块间的交互 - 验证系统的整体功能 - 模拟真实使用场景 ### 性能测试 - 测量执行时间和内存使用 - 识别性能瓶颈 - 优化关键路径 ## 版本控制 ### Git最佳实践 - 频繁提交,小步快跑 - 编写清晰的提交信息 - 使用分支管理功能开发 - 代码审查确保质量 ### 协作开发 - 制定编码规范 - 使用Issue跟踪问题 - 文档化API和架构 - 持续集成和部署 """ }, { "id": "system_design", "content": """# 系统设计原则 ## 设计模式 设计模式是软件设计中常见问题的典型解决方案。 ### 创建型模式 - 单例模式:确保类只有一个实例 - 工厂模式:创建对象的接口 - 建造者模式:构建复杂对象 ### 结构型模式 - 适配器模式:接口适配和转换 - 装饰器模式:动态添加功能 - 组合模式:树形结构的统一处理 ### 行为型模式 - 观察者模式:对象间的一对多依赖 - 策略模式:算法的封装和切换 - 命令模式:请求的封装和参数化 ## 架构原则 ### SOLID原则 - 单一职责原则(SRP) - 开闭原则(OCP) - 里氏替换原则(LSP) - 接口隔离原则(ISP) - 依赖倒置原则(DIP) ### 高内聚低耦合 - 模块内部元素紧密相关 - 模块间依赖关系最小化 - 提高代码的可维护性 ## 性能优化 ### 算法优化 - 选择合适的数据结构 - 优化算法复杂度 - 避免不必要的计算 ### 系统优化 - 缓存策略:减少重复计算 - 并发处理:提高系统吞吐量 - 资源管理:合理使用内存和CPU """ } ] # 批量添加知识文档 for doc in knowledge_documents: result = self.rag_tool.execute("add_text", text=doc["content"], document_id=doc["id"]) print(f"✅ 添加知识文档: {doc['id']}") print(f"📊 知识库设置完成") def demonstrate_question_understanding(self): """演示问题理解和分类""" print("\n🧠 问题理解和分类演示") print("-" * 50) print("问题类型分析:") print("• 📖 概念定义类 - '什么是...?'") print("• 🔍 方法询问类 - '如何...?'") print("• ⚖️ 对比分析类 - '...和...的区别?'") print("• 💡 应用场景类 - '...用于什么?'") print("• 🔧 实现细节类 - '...是怎么实现的?'") question_categories = [ { "category": "概念定义", "questions": [ "什么是人工智能?", "什么是深度学习?", "什么是Transformer架构?" ] }, { "category": "方法询问", "questions": [ "如何提高代码质量?", "如何进行系统设计?", "如何优化算法性能?" ] }, { "category": "对比分析", "questions": [ "监督学习和无监督学习的区别是什么?", "CNN和RNN有什么不同?", "单元测试和集成测试的区别?" ] }, { "category": "应用场景", "questions": [ "强化学习主要用于什么场景?", "设计模式在什么情况下使用?", "缓存策略适用于哪些场景?" ] } ] # 测试不同类型问题的处理效果 for category_info in question_categories: category = category_info["category"] questions = category_info["questions"] print(f"\n📋 {category}问题测试:") for question in questions[:2]: # 每类测试2个问题 print(f"\n❓ 问题: {question}") start_time = time.time() answer = self.rag_tool.execute("ask", question=question, limit=3, include_citations=True) qa_time = time.time() - start_time print(f"⏱️ 响应时间: {qa_time:.3f}秒") print(f"🤖 回答: {answer[:300]}...") print("-" * 40) def demonstrate_context_construction(self): """演示上下文构建过程""" print("\n🏗️ 上下文构建过程演示") print("-" * 50) print("上下文构建步骤:") print("1. 🔍 检索相关文档片段") print("2. 📊 按相关性排序") print("3. 🧹 清理和格式化内容") print("4. ✂️ 智能截断保持完整性") print("5. 🔗 添加引用信息") # 使用复杂问题演示上下文构建 complex_question = "如何设计一个高质量的机器学习系统?" print(f"\n❓ 复杂问题: {complex_question}") print("这个问题需要整合多个文档的信息...") # 先进行搜索,查看检索到的片段 print(f"\n🔍 第一步:检索相关片段") search_result = self.rag_tool.execute("search", query=complex_question, limit=4, enable_advanced_search=True) print(f"检索片段: {search_result}") # 然后进行智能问答,查看完整的上下文构建 print(f"\n🤖 第二步:构建上下文并生成答案") start_time = time.time() qa_result = self.rag_tool.execute("ask", question=complex_question, limit=4, enable_advanced_search=True, include_citations=True, max_chars=1500) qa_time = time.time() - start_time print(f"问答耗时: {qa_time:.3f}秒") print(f"完整回答: {qa_result}") def demonstrate_answer_quality_analysis(self): """演示答案质量分析""" print("\n📊 答案质量分析演示") print("-" * 50) print("质量评估指标:") print("• 🎯 相关性得分 - 检索内容与问题的匹配度") print("• 📚 引用完整性 - 答案来源的可追溯性") print("• 💡 答案完整性 - 回答的全面性和准确性") print("• ⚡ 响应速度 - 系统的响应时间") # 质量测试问题集 quality_test_questions = [ { "question": "什么是机器学习?", "expected_aspects": ["定义", "分类", "应用"], "difficulty": "简单" }, { "question": "如何选择合适的机器学习算法?", "expected_aspects": ["数据特点", "问题类型", "性能要求"], "difficulty": "中等" }, { "question": "在设计大规模系统时如何平衡性能和可维护性?", "expected_aspects": ["架构设计", "性能优化", "代码质量"], "difficulty": "复杂" } ] print(f"\n📊 答案质量测试:") quality_results = [] for test_case in quality_test_questions: question = test_case["question"] difficulty = test_case["difficulty"] expected_aspects = test_case["expected_aspects"] print(f"\n❓ 问题: {question}") print(f"🎯 难度: {difficulty}") print(f"📋 期望涵盖: {', '.join(expected_aspects)}") # 执行问答 start_time = time.time() answer = self.rag_tool.execute("ask", question=question, limit=4, enable_advanced_search=True, include_citations=True) qa_time = time.time() - start_time # 分析答案质量 answer_length = len(answer) has_citations = "参考来源" in answer response_time = qa_time quality_score = self._calculate_quality_score( answer, expected_aspects, response_time ) quality_results.append({ "question": question, "difficulty": difficulty, "answer_length": answer_length, "has_citations": has_citations, "response_time": response_time, "quality_score": quality_score }) print(f"⏱️ 响应时间: {response_time:.3f}秒") print(f"📏 答案长度: {answer_length}字符") print(f"📚 包含引用: {'是' if has_citations else '否'}") print(f"⭐ 质量评分: {quality_score:.2f}/10") print(f"🤖 答案预览: {answer[:200]}...") print("-" * 50) # 质量分析总结 self._analyze_quality_results(quality_results) def _calculate_quality_score(self, answer: str, expected_aspects: list, response_time: float) -> float: """计算答案质量评分""" score = 0.0 # 内容完整性评分 (40%) content_score = 0 for aspect in expected_aspects: if aspect.lower() in answer.lower(): content_score += 1 content_score = (content_score / len(expected_aspects)) * 4.0 # 答案长度评分 (30%) length_score = min(len(answer) / 500, 1.0) * 3.0 # 引用完整性评分 (20%) citation_score = 2.0 if "参考来源" in answer else 0.0 # 响应速度评分 (10%) speed_score = max(0, 1.0 - (response_time - 1.0) / 5.0) * 1.0 total_score = content_score + length_score + citation_score + speed_score return min(total_score, 10.0) def _analyze_quality_results(self, results: list): """分析质量测试结果""" print(f"\n📈 质量分析总结:") avg_score = sum(r["quality_score"] for r in results) / len(results) avg_time = sum(r["response_time"] for r in results) / len(results) citation_rate = sum(1 for r in results if r["has_citations"]) / len(results) print(f"平均质量评分: {avg_score:.2f}/10") print(f"平均响应时间: {avg_time:.3f}秒") print(f"引用完整率: {citation_rate:.1%}") # 按难度分析 difficulty_analysis = {} for result in results: difficulty = result["difficulty"] if difficulty not in difficulty_analysis: difficulty_analysis[difficulty] = [] difficulty_analysis[difficulty].append(result["quality_score"]) print(f"\n📊 按难度分析:") for difficulty, scores in difficulty_analysis.items(): avg_difficulty_score = sum(scores) / len(scores) print(f" {difficulty}: {avg_difficulty_score:.2f}/10") def demonstrate_prompt_engineering(self): """演示提示词工程""" print("\n🎨 提示词工程演示") print("-" * 50) print("提示词设计要素:") print("• 🎯 系统角色定义") print("• 📋 任务明确描述") print("• 🔍 上下文信息注入") print("• 📝 输出格式要求") print("• 🚫 限制和约束条件") # 演示不同的提示词策略 prompt_strategies = [ { "name": "基础提示", "system_prompt": "你是一个AI助手,请回答用户的问题。", "description": "简单直接的角色定义" }, { "name": "专业提示", "system_prompt": """你是一个专业的技术顾问,具备以下能力: 1. 深入理解技术概念和原理 2. 提供准确可靠的技术建议 3. 用清晰简洁的语言解释复杂概念 4. 基于提供的上下文信息回答问题""", "description": "详细的能力描述和要求" }, { "name": "结构化提示", "system_prompt": """你是一个专业的知识助手,请按以下要求回答: 【理解】仔细分析问题的核心意图 【检索】基于提供的上下文信息 【整合】从多个片段提取关键信息 【回答】用结构化格式清晰表达 【引用】标注信息来源和依据""", "description": "结构化的处理流程" } ] test_question = "什么是深度学习,它有哪些主要应用?" print(f"\n🧪 提示词策略对比测试:") print(f"测试问题: {test_question}") for strategy in prompt_strategies: print(f"\n📝 {strategy['name']} ({strategy['description']}):") # 这里简化演示,实际的提示词工程在RAGTool内部实现 start_time = time.time() answer = self.rag_tool.execute("ask", question=test_question, limit=3) response_time = time.time() - start_time print(f"⏱️ 响应时间: {response_time:.3f}秒") print(f"🤖 回答长度: {len(answer)}字符") print(f"📄 回答预览: {answer[:250]}...") def demonstrate_citation_system(self): """演示引用系统""" print("\n📚 引用系统演示") print("-" * 50) print("引用系统特点:") print("• 🔗 自动标注信息来源") print("• 📊 显示相似度得分") print("• 📄 提供文档定位") print("• ✅ 确保答案可追溯性") citation_test_questions = [ "机器学习有哪些主要类型?", "如何进行代码质量管理?", "系统设计中的SOLID原则是什么?" ] print(f"\n📚 引用系统测试:") for question in citation_test_questions: print(f"\n❓ 问题: {question}") # 启用引用的问答 answer_with_citations = self.rag_tool.execute("ask", question=question, limit=3, include_citations=True) # 禁用引用的问答对比 answer_without_citations = self.rag_tool.execute("ask", question=question, limit=3, include_citations=False) print(f"🔗 带引用回答: {answer_with_citations[:400]}...") print(f"📝 无引用回答: {answer_without_citations[:200]}...") # 分析引用信息 citation_count = answer_with_citations.count("参考来源") print(f"📊 引用分析: 包含 {citation_count} 个引用来源") def main(): """主函数""" print("🤖 RAGTool智能问答系统演示") print("展示完整的检索→上下文构建→答案生成流程") print("=" * 70) try: demo = IntelligentQADemo() # 1. 问题理解和分类演示 demo.demonstrate_question_understanding() # 2. 上下文构建过程演示 demo.demonstrate_context_construction() # 3. 答案质量分析演示 demo.demonstrate_answer_quality_analysis() # 4. 提示词工程演示 demo.demonstrate_prompt_engineering() # 5. 引用系统演示 demo.demonstrate_citation_system() print("\n" + "=" * 70) print("🎉 智能问答系统演示完成!") print("=" * 70) print("\n✨ 智能问答核心能力:") print("1. 🧠 问题理解 - 准确识别问题类型和意图") print("2. 🔍 智能检索 - 多策略检索相关内容") 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()