#!/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()