07_RAGTool_Intelligent_QA.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 代码示例 07: RAGTool智能问答系统
  5. 展示完整的检索→上下文构建→答案生成流程
  6. """
  7. import time
  8. from hello_agents.tools import RAGTool
  9. from dotenv import load_dotenv
  10. load_dotenv()
  11. class IntelligentQADemo:
  12. """智能问答演示类"""
  13. def __init__(self):
  14. self.rag_tool = RAGTool(
  15. knowledge_base_path="./qa_demo_kb",
  16. rag_namespace="intelligent_qa_demo"
  17. )
  18. self._setup_knowledge_base()
  19. def _setup_knowledge_base(self):
  20. """设置知识库"""
  21. print("📚 设置智能问答知识库")
  22. print("=" * 50)
  23. # 添加技术知识文档
  24. knowledge_documents = [
  25. {
  26. "id": "ai_fundamentals",
  27. "content": """# 人工智能基础
  28. ## 定义和历史
  29. 人工智能(Artificial Intelligence, AI)是计算机科学的一个分支,旨在创造能够执行通常需要人类智能的任务的机器。AI的概念最早由Alan Turing在1950年提出。
  30. ## 主要分支
  31. ### 机器学习(Machine Learning)
  32. 机器学习是AI的核心分支,使计算机能够从数据中学习而无需明确编程。
  33. #### 监督学习
  34. - 分类:预测离散标签
  35. - 回归:预测连续数值
  36. - 常用算法:线性回归、决策树、随机森林、SVM
  37. #### 无监督学习
  38. - 聚类:发现数据中的群组
  39. - 降维:减少数据维度
  40. - 常用算法:K-means、PCA、t-SNE
  41. #### 强化学习
  42. 通过与环境交互学习最优策略,应用于游戏AI、机器人控制等。
  43. ### 深度学习(Deep Learning)
  44. 基于人工神经网络的机器学习方法,在图像识别、自然语言处理等领域取得突破。
  45. #### 神经网络架构
  46. - 前馈神经网络:最基础的网络结构
  47. - 卷积神经网络(CNN):专门处理图像数据
  48. - 循环神经网络(RNN):处理序列数据
  49. - Transformer:基于注意力机制的架构
  50. ### 自然语言处理(NLP)
  51. 使计算机能够理解、解释和生成人类语言。
  52. #### 核心任务
  53. - 文本分类:判断文本类别
  54. - 命名实体识别:提取人名、地名等
  55. - 情感分析:判断文本情感倾向
  56. - 机器翻译:语言间的自动翻译
  57. - 问答系统:理解问题并生成答案
  58. """
  59. },
  60. {
  61. "id": "programming_best_practices",
  62. "content": """# 编程最佳实践
  63. ## 代码质量
  64. 高质量的代码应该具备可读性、可维护性和可扩展性。
  65. ### 命名规范
  66. - 使用有意义的变量名和函数名
  67. - 遵循一致的命名约定
  68. - 避免使用缩写和模糊的名称
  69. ### 函数设计
  70. - 单一职责原则:每个函数只做一件事
  71. - 函数长度适中:通常不超过20-30行
  72. - 参数数量合理:避免过多参数
  73. ### 代码组织
  74. - 模块化设计:将相关功能组织在一起
  75. - 层次化结构:清晰的目录和文件组织
  76. - 接口设计:定义清晰的模块接口
  77. ## 测试策略
  78. ### 单元测试
  79. - 测试单个函数或方法
  80. - 使用断言验证预期结果
  81. - 覆盖边界条件和异常情况
  82. ### 集成测试
  83. - 测试模块间的交互
  84. - 验证系统的整体功能
  85. - 模拟真实使用场景
  86. ### 性能测试
  87. - 测量执行时间和内存使用
  88. - 识别性能瓶颈
  89. - 优化关键路径
  90. ## 版本控制
  91. ### Git最佳实践
  92. - 频繁提交,小步快跑
  93. - 编写清晰的提交信息
  94. - 使用分支管理功能开发
  95. - 代码审查确保质量
  96. ### 协作开发
  97. - 制定编码规范
  98. - 使用Issue跟踪问题
  99. - 文档化API和架构
  100. - 持续集成和部署
  101. """
  102. },
  103. {
  104. "id": "system_design",
  105. "content": """# 系统设计原则
  106. ## 设计模式
  107. 设计模式是软件设计中常见问题的典型解决方案。
  108. ### 创建型模式
  109. - 单例模式:确保类只有一个实例
  110. - 工厂模式:创建对象的接口
  111. - 建造者模式:构建复杂对象
  112. ### 结构型模式
  113. - 适配器模式:接口适配和转换
  114. - 装饰器模式:动态添加功能
  115. - 组合模式:树形结构的统一处理
  116. ### 行为型模式
  117. - 观察者模式:对象间的一对多依赖
  118. - 策略模式:算法的封装和切换
  119. - 命令模式:请求的封装和参数化
  120. ## 架构原则
  121. ### SOLID原则
  122. - 单一职责原则(SRP)
  123. - 开闭原则(OCP)
  124. - 里氏替换原则(LSP)
  125. - 接口隔离原则(ISP)
  126. - 依赖倒置原则(DIP)
  127. ### 高内聚低耦合
  128. - 模块内部元素紧密相关
  129. - 模块间依赖关系最小化
  130. - 提高代码的可维护性
  131. ## 性能优化
  132. ### 算法优化
  133. - 选择合适的数据结构
  134. - 优化算法复杂度
  135. - 避免不必要的计算
  136. ### 系统优化
  137. - 缓存策略:减少重复计算
  138. - 并发处理:提高系统吞吐量
  139. - 资源管理:合理使用内存和CPU
  140. """
  141. }
  142. ]
  143. # 批量添加知识文档
  144. for doc in knowledge_documents:
  145. result = self.rag_tool.run({"action":"add_text",
  146. "text":doc["content"],
  147. "document_id":doc["id"]})
  148. print(f"✅ 添加知识文档: {doc['id']}")
  149. print(f"📊 知识库设置完成")
  150. def demonstrate_question_understanding(self):
  151. """演示问题理解和分类"""
  152. print("\n🧠 问题理解和分类演示")
  153. print("-" * 50)
  154. print("问题类型分析:")
  155. print("• 📖 概念定义类 - '什么是...?'")
  156. print("• 🔍 方法询问类 - '如何...?'")
  157. print("• ⚖️ 对比分析类 - '...和...的区别?'")
  158. print("• 💡 应用场景类 - '...用于什么?'")
  159. print("• 🔧 实现细节类 - '...是怎么实现的?'")
  160. question_categories = [
  161. {
  162. "category": "概念定义",
  163. "questions": [
  164. "什么是人工智能?",
  165. "什么是深度学习?",
  166. "什么是Transformer架构?"
  167. ]
  168. },
  169. {
  170. "category": "方法询问",
  171. "questions": [
  172. "如何提高代码质量?",
  173. "如何进行系统设计?",
  174. "如何优化算法性能?"
  175. ]
  176. },
  177. {
  178. "category": "对比分析",
  179. "questions": [
  180. "监督学习和无监督学习的区别是什么?",
  181. "CNN和RNN有什么不同?",
  182. "单元测试和集成测试的区别?"
  183. ]
  184. },
  185. {
  186. "category": "应用场景",
  187. "questions": [
  188. "强化学习主要用于什么场景?",
  189. "设计模式在什么情况下使用?",
  190. "缓存策略适用于哪些场景?"
  191. ]
  192. }
  193. ]
  194. # 测试不同类型问题的处理效果
  195. for category_info in question_categories:
  196. category = category_info["category"]
  197. questions = category_info["questions"]
  198. print(f"\n📋 {category}问题测试:")
  199. for question in questions[:2]: # 每类测试2个问题
  200. print(f"\n❓ 问题: {question}")
  201. start_time = time.time()
  202. answer = self.rag_tool.run({"action":"ask",
  203. "question":question,
  204. "limit":3,
  205. "include_citations":True})
  206. qa_time = time.time() - start_time
  207. print(f"⏱️ 响应时间: {qa_time:.3f}秒")
  208. print(f"🤖 回答: {answer[:300]}...")
  209. print("-" * 40)
  210. def demonstrate_context_construction(self):
  211. """演示上下文构建过程"""
  212. print("\n🏗️ 上下文构建过程演示")
  213. print("-" * 50)
  214. print("上下文构建步骤:")
  215. print("1. 🔍 检索相关文档片段")
  216. print("2. 📊 按相关性排序")
  217. print("3. 🧹 清理和格式化内容")
  218. print("4. ✂️ 智能截断保持完整性")
  219. print("5. 🔗 添加引用信息")
  220. # 使用复杂问题演示上下文构建
  221. complex_question = "如何设计一个高质量的机器学习系统?"
  222. print(f"\n❓ 复杂问题: {complex_question}")
  223. print("这个问题需要整合多个文档的信息...")
  224. # 先进行搜索,查看检索到的片段
  225. print(f"\n🔍 第一步:检索相关片段")
  226. search_result = self.rag_tool.run({"action":"search",
  227. "query":complex_question,
  228. "limit":4,
  229. "enable_advanced_search":True})
  230. print(f"检索片段: {search_result}")
  231. # 然后进行智能问答,查看完整的上下文构建
  232. print(f"\n🤖 第二步:构建上下文并生成答案")
  233. start_time = time.time()
  234. qa_result = self.rag_tool.run({"action":"ask",
  235. "question":complex_question,
  236. "limit":4,
  237. "enable_advanced_search":True,
  238. "include_citations":True,
  239. "max_chars":1500})
  240. qa_time = time.time() - start_time
  241. print(f"问答耗时: {qa_time:.3f}秒")
  242. print(f"完整回答: {qa_result}")
  243. def demonstrate_answer_quality_analysis(self):
  244. """演示答案质量分析"""
  245. print("\n📊 答案质量分析演示")
  246. print("-" * 50)
  247. print("质量评估指标:")
  248. print("• 🎯 相关性得分 - 检索内容与问题的匹配度")
  249. print("• 📚 引用完整性 - 答案来源的可追溯性")
  250. print("• 💡 答案完整性 - 回答的全面性和准确性")
  251. print("• ⚡ 响应速度 - 系统的响应时间")
  252. # 质量测试问题集
  253. quality_test_questions = [
  254. {
  255. "question": "什么是机器学习?",
  256. "expected_aspects": ["定义", "分类", "应用"],
  257. "difficulty": "简单"
  258. },
  259. {
  260. "question": "如何选择合适的机器学习算法?",
  261. "expected_aspects": ["数据特点", "问题类型", "性能要求"],
  262. "difficulty": "中等"
  263. },
  264. {
  265. "question": "在设计大规模系统时如何平衡性能和可维护性?",
  266. "expected_aspects": ["架构设计", "性能优化", "代码质量"],
  267. "difficulty": "复杂"
  268. }
  269. ]
  270. print(f"\n📊 答案质量测试:")
  271. quality_results = []
  272. for test_case in quality_test_questions:
  273. question = test_case["question"]
  274. difficulty = test_case["difficulty"]
  275. expected_aspects = test_case["expected_aspects"]
  276. print(f"\n❓ 问题: {question}")
  277. print(f"🎯 难度: {difficulty}")
  278. print(f"📋 期望涵盖: {', '.join(expected_aspects)}")
  279. # 执行问答
  280. start_time = time.time()
  281. answer = self.rag_tool.run({"action":"ask",
  282. "question":question,
  283. "limit":4,
  284. "enable_advanced_search":True,
  285. "include_citations":True})
  286. qa_time = time.time() - start_time
  287. # 分析答案质量
  288. answer_length = len(answer)
  289. has_citations = "参考来源" in answer
  290. response_time = qa_time
  291. quality_score = self._calculate_quality_score(
  292. answer, expected_aspects, response_time
  293. )
  294. quality_results.append({
  295. "question": question,
  296. "difficulty": difficulty,
  297. "answer_length": answer_length,
  298. "has_citations": has_citations,
  299. "response_time": response_time,
  300. "quality_score": quality_score
  301. })
  302. print(f"⏱️ 响应时间: {response_time:.3f}秒")
  303. print(f"📏 答案长度: {answer_length}字符")
  304. print(f"📚 包含引用: {'是' if has_citations else '否'}")
  305. print(f"⭐ 质量评分: {quality_score:.2f}/10")
  306. print(f"🤖 答案预览: {answer[:200]}...")
  307. print("-" * 50)
  308. # 质量分析总结
  309. self._analyze_quality_results(quality_results)
  310. def _calculate_quality_score(self, answer: str, expected_aspects: list, response_time: float) -> float:
  311. """计算答案质量评分"""
  312. score = 0.0
  313. # 内容完整性评分 (40%)
  314. content_score = 0
  315. for aspect in expected_aspects:
  316. if aspect.lower() in answer.lower():
  317. content_score += 1
  318. content_score = (content_score / len(expected_aspects)) * 4.0
  319. # 答案长度评分 (30%)
  320. length_score = min(len(answer) / 500, 1.0) * 3.0
  321. # 引用完整性评分 (20%)
  322. citation_score = 2.0 if "参考来源" in answer else 0.0
  323. # 响应速度评分 (10%)
  324. speed_score = max(0, 1.0 - (response_time - 1.0) / 5.0) * 1.0
  325. total_score = content_score + length_score + citation_score + speed_score
  326. return min(total_score, 10.0)
  327. def _analyze_quality_results(self, results: list):
  328. """分析质量测试结果"""
  329. print(f"\n📈 质量分析总结:")
  330. avg_score = sum(r["quality_score"] for r in results) / len(results)
  331. avg_time = sum(r["response_time"] for r in results) / len(results)
  332. citation_rate = sum(1 for r in results if r["has_citations"]) / len(results)
  333. print(f"平均质量评分: {avg_score:.2f}/10")
  334. print(f"平均响应时间: {avg_time:.3f}秒")
  335. print(f"引用完整率: {citation_rate:.1%}")
  336. # 按难度分析
  337. difficulty_analysis = {}
  338. for result in results:
  339. difficulty = result["difficulty"]
  340. if difficulty not in difficulty_analysis:
  341. difficulty_analysis[difficulty] = []
  342. difficulty_analysis[difficulty].append(result["quality_score"])
  343. print(f"\n📊 按难度分析:")
  344. for difficulty, scores in difficulty_analysis.items():
  345. avg_difficulty_score = sum(scores) / len(scores)
  346. print(f" {difficulty}: {avg_difficulty_score:.2f}/10")
  347. def demonstrate_prompt_engineering(self):
  348. """演示提示词工程"""
  349. print("\n🎨 提示词工程演示")
  350. print("-" * 50)
  351. print("提示词设计要素:")
  352. print("• 🎯 系统角色定义")
  353. print("• 📋 任务明确描述")
  354. print("• 🔍 上下文信息注入")
  355. print("• 📝 输出格式要求")
  356. print("• 🚫 限制和约束条件")
  357. # 演示不同的提示词策略
  358. prompt_strategies = [
  359. {
  360. "name": "基础提示",
  361. "system_prompt": "你是一个AI助手,请回答用户的问题。",
  362. "description": "简单直接的角色定义"
  363. },
  364. {
  365. "name": "专业提示",
  366. "system_prompt": """你是一个专业的技术顾问,具备以下能力:
  367. 1. 深入理解技术概念和原理
  368. 2. 提供准确可靠的技术建议
  369. 3. 用清晰简洁的语言解释复杂概念
  370. 4. 基于提供的上下文信息回答问题""",
  371. "description": "详细的能力描述和要求"
  372. },
  373. {
  374. "name": "结构化提示",
  375. "system_prompt": """你是一个专业的知识助手,请按以下要求回答:
  376. 【理解】仔细分析问题的核心意图
  377. 【检索】基于提供的上下文信息
  378. 【整合】从多个片段提取关键信息
  379. 【回答】用结构化格式清晰表达
  380. 【引用】标注信息来源和依据""",
  381. "description": "结构化的处理流程"
  382. }
  383. ]
  384. test_question = "什么是深度学习,它有哪些主要应用?"
  385. print(f"\n🧪 提示词策略对比测试:")
  386. print(f"测试问题: {test_question}")
  387. for strategy in prompt_strategies:
  388. print(f"\n📝 {strategy['name']} ({strategy['description']}):")
  389. # 这里简化演示,实际的提示词工程在RAGTool内部实现
  390. start_time = time.time()
  391. answer = self.rag_tool.run({"action":"ask",
  392. "question":test_question,
  393. "limit":3})
  394. response_time = time.time() - start_time
  395. print(f"⏱️ 响应时间: {response_time:.3f}秒")
  396. print(f"🤖 回答长度: {len(answer)}字符")
  397. print(f"📄 回答预览: {answer[:250]}...")
  398. def demonstrate_citation_system(self):
  399. """演示引用系统"""
  400. print("\n📚 引用系统演示")
  401. print("-" * 50)
  402. print("引用系统特点:")
  403. print("• 🔗 自动标注信息来源")
  404. print("• 📊 显示相似度得分")
  405. print("• 📄 提供文档定位")
  406. print("• ✅ 确保答案可追溯性")
  407. citation_test_questions = [
  408. "机器学习有哪些主要类型?",
  409. "如何进行代码质量管理?",
  410. "系统设计中的SOLID原则是什么?"
  411. ]
  412. print(f"\n📚 引用系统测试:")
  413. for question in citation_test_questions:
  414. print(f"\n❓ 问题: {question}")
  415. # 启用引用的问答
  416. answer_with_citations = self.rag_tool.run({"action":"ask",
  417. "question":question,
  418. "limit":3,
  419. "include_citations":True})
  420. # 禁用引用的问答对比
  421. answer_without_citations = self.rag_tool.run({"action":"ask",
  422. "question":question,
  423. "limit":3,
  424. "include_citations":False})
  425. print(f"🔗 带引用回答: {answer_with_citations[:400]}...")
  426. print(f"📝 无引用回答: {answer_without_citations[:200]}...")
  427. # 分析引用信息
  428. citation_count = answer_with_citations.count("参考来源")
  429. print(f"📊 引用分析: 包含 {citation_count} 个引用来源")
  430. def main():
  431. """主函数"""
  432. print("🤖 RAGTool智能问答系统演示")
  433. print("展示完整的检索→上下文构建→答案生成流程")
  434. print("=" * 70)
  435. try:
  436. demo = IntelligentQADemo()
  437. # 1. 问题理解和分类演示
  438. demo.demonstrate_question_understanding()
  439. # 2. 上下文构建过程演示
  440. demo.demonstrate_context_construction()
  441. # 3. 答案质量分析演示
  442. demo.demonstrate_answer_quality_analysis()
  443. # 4. 提示词工程演示
  444. demo.demonstrate_prompt_engineering()
  445. # 5. 引用系统演示
  446. demo.demonstrate_citation_system()
  447. print("\n" + "=" * 70)
  448. print("🎉 智能问答系统演示完成!")
  449. print("=" * 70)
  450. print("\n✨ 智能问答核心能力:")
  451. print("1. 🧠 问题理解 - 准确识别问题类型和意图")
  452. print("2. 🔍 智能检索 - 多策略检索相关内容")
  453. print("3. 🏗️ 上下文构建 - 智能整合检索结果")
  454. print("4. 🤖 答案生成 - 基于上下文的准确回答")
  455. print("5. 📚 引用标注 - 完整的来源追溯")
  456. print("\n🎯 技术优势:")
  457. print("• 语义理解 - 深度理解问题语义和意图")
  458. print("• 上下文感知 - 充分利用检索上下文")
  459. print("• 质量保证 - 多层次的质量控制机制")
  460. print("• 可追溯性 - 完整的答案来源追溯")
  461. print("\n💡 应用场景:")
  462. print("• 技术支持 - 自动回答技术问题")
  463. print("• 知识问答 - 企业内部知识查询")
  464. print("• 学习辅导 - 个性化学习问答")
  465. print("• 文档助手 - 快速理解复杂文档")
  466. except Exception as e:
  467. print(f"\n❌ 演示过程中发生错误: {e}")
  468. import traceback
  469. traceback.print_exc()
  470. if __name__ == "__main__":
  471. main()