07_RAGTool_Intelligent_QA.py 21 KB

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