| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- 代码示例 07: RAGTool智能问答系统
- 展示完整的检索→上下文构建→答案生成流程
- """
- import time
- from hello_agents.tools import RAGTool
- from dotenv import load_dotenv
- load_dotenv()
- 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.run({"action":"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.run({"action":"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.run({"action":"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.run({"action":"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.run({"action":"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.run({"action":"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.run({"action":"ask",
- "question":question,
- "limit":3,
- "include_citations":True})
-
- # 禁用引用的问答对比
- answer_without_citations = self.rag_tool.run({"action":"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()
|