You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

571 lines
21 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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