Initial commit: jaspersoft-agent-learn teaching project
This commit is contained in:
@@ -0,0 +1,274 @@
|
||||
"""
|
||||
Step 02 练习题答案
|
||||
|
||||
⚠️ 先自己思考,再看答案!
|
||||
⚠️ 答案不是唯一的,这里只是其中一种实现
|
||||
"""
|
||||
|
||||
from typing import TypedDict, List, Dict, Any
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 练习 1 答案:客服聊天机器人状态
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
class CustomerServiceState(TypedDict, total=False):
|
||||
"""客服聊天机器人的状态"""
|
||||
|
||||
# === 用户信息 ===
|
||||
user_id: str # 用户 ID
|
||||
user_name: str # 用户名
|
||||
user_email: str # 用户邮箱(可选)
|
||||
|
||||
# === 对话历史 ===
|
||||
conversation_history: List[dict] # 对话历史
|
||||
"""
|
||||
格式: [{"role": "user", "content": "..."},
|
||||
{"role": "assistant", "content": "..."}]
|
||||
"""
|
||||
|
||||
# === 问题处理 ===
|
||||
current_issue: str # 当前正在处理的问题描述
|
||||
issue_status: str # 问题状态: "open" / "investigating" / "resolved" / "closed"
|
||||
issue_priority: str # 优先级: "low" / "medium" / "high" / "urgent"
|
||||
|
||||
# === 解决方案 ===
|
||||
proposed_solution: str # 提出的解决方案
|
||||
solution_steps: List[str] # 解决步骤列表
|
||||
is_resolved: bool # 是否已解决
|
||||
|
||||
# === 用户反馈 ===
|
||||
satisfaction_rating: int # 满意度评分 1-5
|
||||
feedback_comment: str # 反馈意见
|
||||
|
||||
# === 元信息 ===
|
||||
session_start: str # 会话开始时间
|
||||
last_interaction: str # 最后互动时间
|
||||
agent_id: str # 处理此会话的客服 ID
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 练习 2 答案:数据分析 Agent 状态
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
class DataAnalysisState(TypedDict, total=False):
|
||||
"""数据分析 Agent 的状态"""
|
||||
|
||||
# === 用户需求 ===
|
||||
user_request: str # 用户的分析需求
|
||||
session_id: str # 会话 ID
|
||||
|
||||
# === 数据源配置 ===
|
||||
data_source_type: str # 数据源类型: "database" / "file" / "api"
|
||||
data_source_config: dict # 数据源配置(连接信息等)
|
||||
"""
|
||||
示例:
|
||||
{
|
||||
"host": "localhost",
|
||||
"database": "sales_db",
|
||||
"table": "orders"
|
||||
}
|
||||
"""
|
||||
|
||||
# === 查询和结果 ===
|
||||
query: str # 执行的 SQL 或查询条件
|
||||
query_result: Any # 查询结果
|
||||
result_row_count: int # 结果行数
|
||||
result_columns: List[str] # 结果列名
|
||||
|
||||
# === 分析过程 ===
|
||||
stage: str # 当前阶段
|
||||
"""
|
||||
阶段值:
|
||||
- "initial": 初始状态
|
||||
- "connecting": 连接数据源
|
||||
- "querying": 执行查询
|
||||
- "analyzing": 分析数据
|
||||
- "generating_report": 生成报告
|
||||
- "completed": 完成
|
||||
- "error": 出错
|
||||
"""
|
||||
|
||||
# === 生成的报告 ===
|
||||
generated_report: str # 生成的报告内容
|
||||
report_format: str # 报告格式: "json" / "csv" / "markdown" / "html"
|
||||
|
||||
# === 错误处理 ===
|
||||
error_message: str # 错误信息(如果有)
|
||||
retry_count: int # 重试次数
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 练习 3 答案:快照和恢复
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
def create_snapshot(state: dict) -> dict:
|
||||
"""
|
||||
创建状态快照
|
||||
|
||||
策略:只保存"业务关键"数据,不保存临时计算结果
|
||||
"""
|
||||
# 定义需要保存的字段(业务关键数据)
|
||||
business_fields = [
|
||||
"user_id",
|
||||
"user_name",
|
||||
"current_task",
|
||||
"progress",
|
||||
"status",
|
||||
# 根据实际情况添加更多...
|
||||
]
|
||||
|
||||
snapshot_data = {}
|
||||
for field in business_fields:
|
||||
if field in state:
|
||||
snapshot_data[field] = state[field]
|
||||
|
||||
return {
|
||||
"data": snapshot_data,
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"version": "1.0"
|
||||
}
|
||||
|
||||
|
||||
def restore_from_snapshot(state: dict, snapshot: dict) -> dict:
|
||||
"""
|
||||
从快照恢复状态
|
||||
"""
|
||||
if not snapshot or "data" not in snapshot:
|
||||
return state
|
||||
|
||||
# 从快照恢复数据
|
||||
snapshot_data = snapshot["data"]
|
||||
for key, value in snapshot_data.items():
|
||||
state[key] = value
|
||||
|
||||
# 更新恢复后的时间戳
|
||||
state["_restored_at"] = datetime.now().isoformat()
|
||||
state["_restored_from"] = snapshot.get("timestamp", "unknown")
|
||||
|
||||
return state
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 练习 4 答案:状态验证
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
def validate_state(state: dict, rules: dict) -> dict:
|
||||
"""
|
||||
验证状态
|
||||
"""
|
||||
errors = []
|
||||
|
||||
for field_name, field_rules in rules.items():
|
||||
value = state.get(field_name)
|
||||
field_type = field_rules.get("type")
|
||||
required = field_rules.get("required", False)
|
||||
|
||||
# 1. 检查必填
|
||||
if required and (value is None or value == ""):
|
||||
errors.append(f"字段 '{field_name}' 是必填的")
|
||||
continue
|
||||
|
||||
# 如果字段为空且不是必填,跳过后续检查
|
||||
if value is None or value == "":
|
||||
continue
|
||||
|
||||
# 2. 检查类型
|
||||
if field_type and not isinstance(value, field_type):
|
||||
errors.append(
|
||||
f"字段 '{field_name}' 类型错误: "
|
||||
f"期望 {field_type.__name__}, 实际 {type(value).__name__}"
|
||||
)
|
||||
continue
|
||||
|
||||
# 3. 检查数值范围
|
||||
if isinstance(value, (int, float)):
|
||||
if "min" in field_rules and value < field_rules["min"]:
|
||||
errors.append(
|
||||
f"字段 '{field_name}' 小于最小值: "
|
||||
f"{value} < {field_rules['min']}"
|
||||
)
|
||||
if "max" in field_rules and value > field_rules["max"]:
|
||||
errors.append(
|
||||
f"字段 '{field_name}' 大于最大值: "
|
||||
f"{value} > {field_rules['max']}"
|
||||
)
|
||||
|
||||
# 4. 检查枚举值
|
||||
if "choices" in field_rules:
|
||||
if value not in field_rules["choices"]:
|
||||
errors.append(
|
||||
f"字段 '{field_name}' 值不在允许范围内: "
|
||||
f"{value} not in {field_rules['choices']}"
|
||||
)
|
||||
|
||||
return {
|
||||
"valid": len(errors) == 0,
|
||||
"errors": errors
|
||||
}
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 测试
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
def test_answers():
|
||||
"""测试答案"""
|
||||
print("\n" + "=" * 60)
|
||||
print("测试练习答案")
|
||||
print("=" * 60)
|
||||
|
||||
# 测试练习 1
|
||||
print("\n📝 练习 1: 客服状态")
|
||||
cs_state: CustomerServiceState = {
|
||||
"user_id": "user_001",
|
||||
"user_name": "张三",
|
||||
"issue_status": "open",
|
||||
"issue_priority": "high",
|
||||
}
|
||||
print(f" 状态: {cs_state}")
|
||||
|
||||
# 测试练习 2
|
||||
print("\n📝 练习 2: 数据分析状态")
|
||||
da_state: DataAnalysisState = {
|
||||
"user_request": "分析本月销售数据",
|
||||
"data_source_type": "database",
|
||||
"stage": "querying",
|
||||
}
|
||||
print(f" 状态: {da_state}")
|
||||
|
||||
# 测试练习 3
|
||||
print("\n📝 练习 3: 快照和恢复")
|
||||
sample_state = {
|
||||
"user_id": "123",
|
||||
"current_task": "数据分析",
|
||||
"progress": 50,
|
||||
"temp_data": ["计算中...", "处理中..."],
|
||||
}
|
||||
print(f" 原始状态: {sample_state}")
|
||||
|
||||
snapshot = create_snapshot(sample_state)
|
||||
print(f" 快照: {snapshot}")
|
||||
|
||||
sample_state["progress"] = 100
|
||||
restored = restore_from_snapshot(sample_state, snapshot)
|
||||
print(f" 恢复后状态: {restored}")
|
||||
|
||||
# 测试练习 4
|
||||
print("\n📝 练习 4: 状态验证")
|
||||
rules = {
|
||||
"user_id": {"type": str, "required": True},
|
||||
"age": {"type": int, "min": 0, "max": 150},
|
||||
"status": {"type": str, "choices": ["active", "inactive"]}
|
||||
}
|
||||
|
||||
valid_state = {"user_id": "123", "age": 25, "status": "active"}
|
||||
print(f" 有效状态: {validate_state(valid_state, rules)}")
|
||||
|
||||
invalid_state = {"user_id": "123", "age": 200, "status": "unknown"}
|
||||
print(f" 无效状态: {validate_state(invalid_state, rules)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_answers()
|
||||
Reference in New Issue
Block a user