230 lines
7.5 KiB
Python
230 lines
7.5 KiB
Python
"""
|
|
Step 02 练习题:设计你的第一个 Agent State
|
|
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
🎯 练习目标:
|
|
1. 巩固 State 的基本结构
|
|
2. 设计一个业务相关的 State
|
|
3. 理解状态在多步骤任务中的作用
|
|
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
"""
|
|
|
|
from typing import TypedDict, List, Dict, Any
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 练习 1:完善一个简单的聊天机器人状态
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
"""
|
|
任务:
|
|
设计一个客服聊天机器人的状态
|
|
|
|
要求:
|
|
1. 记录用户信息(用户名、ID)
|
|
2. 记录对话历史
|
|
3. 记录当前正在处理的问题
|
|
4. 记录问题解决状态
|
|
5. 记录用户满意度评分
|
|
|
|
提示:
|
|
- 使用 TypedDict 定义状态
|
|
- 考虑哪些字段是必须的,哪些是可选的
|
|
"""
|
|
|
|
class CustomerServiceState(TypedDict, total=False):
|
|
"""
|
|
客服聊天机器人的状态
|
|
|
|
请补全以下字段的定义:
|
|
"""
|
|
# 用户信息
|
|
user_id: str
|
|
user_name: str
|
|
|
|
# TODO: 添加更多字段...
|
|
pass
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 练习 2:设计一个数据分析 Agent 的状态
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
"""
|
|
任务:
|
|
设计一个数据分析 Agent 的状态
|
|
|
|
功能:
|
|
1. 用户提出数据分析需求
|
|
2. Agent 连接数据源
|
|
3. Agent 执行查询
|
|
4. Agent 生成报告
|
|
|
|
请设计状态来支持这个流程,包括:
|
|
- 用户需求
|
|
- 数据源配置
|
|
- 查询结果
|
|
- 生成的报告
|
|
- 中间状态
|
|
"""
|
|
|
|
class DataAnalysisState(TypedDict, total=False):
|
|
"""
|
|
数据分析 Agent 的状态
|
|
|
|
请补全状态定义...
|
|
"""
|
|
pass
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 练习 3:实现状态快照和恢复
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
"""
|
|
任务:
|
|
给以下状态实现快照和恢复功能
|
|
|
|
提示:
|
|
- 快照应该保存足够的信息来恢复状态
|
|
- 恢复后状态应该是完整的
|
|
- 考虑哪些字段需要保存,哪些不需要
|
|
"""
|
|
|
|
def create_snapshot(state: dict) -> dict:
|
|
"""
|
|
创建状态快照
|
|
|
|
应该保存:
|
|
- 关键业务数据
|
|
- 不包括临时计算的中间结果
|
|
|
|
返回格式:
|
|
{
|
|
"data": {...}, # 快照数据
|
|
"timestamp": "..." # 时间戳
|
|
}
|
|
"""
|
|
# TODO: 实现这个函数
|
|
pass
|
|
|
|
|
|
def restore_from_snapshot(state: dict, snapshot: dict) -> dict:
|
|
"""
|
|
从快照恢复状态
|
|
|
|
参数:
|
|
state: 当前状态(会被更新)
|
|
snapshot: 之前保存的快照
|
|
|
|
返回:
|
|
恢复后的状态
|
|
"""
|
|
# TODO: 实现这个函数
|
|
pass
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 练习 4:状态验证
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
"""
|
|
任务:
|
|
实现状态验证函数
|
|
|
|
验证规则:
|
|
1. 必填字段不能为空
|
|
2. 字段类型要正确
|
|
3. 某些字段有取值范围限制
|
|
|
|
返回:
|
|
{
|
|
"valid": True/False,
|
|
"errors": ["错误1", "错误2", ...]
|
|
}
|
|
"""
|
|
|
|
def validate_state(state: dict, rules: dict) -> dict:
|
|
"""
|
|
验证状态
|
|
|
|
参数:
|
|
state: 要验证的状态
|
|
rules: 验证规则,格式:
|
|
{
|
|
"field_name": {
|
|
"type": int/str/list/dict,
|
|
"required": True/False,
|
|
"min": 0, # 可选,数字最小值
|
|
"max": 100, # 可选,数字最大值
|
|
"choices": ["a", "b"] # 可选,枚举值
|
|
}
|
|
}
|
|
|
|
示例:
|
|
rules = {
|
|
"user_id": {"type": str, "required": True},
|
|
"age": {"type": int, "min": 0, "max": 150},
|
|
"status": {"type": str, "choices": ["active", "inactive"]}
|
|
}
|
|
"""
|
|
# TODO: 实现这个函数
|
|
pass
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 测试
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
def test_exercises():
|
|
"""测试所有练习"""
|
|
print("\n" + "=" * 60)
|
|
print("测试练习答案")
|
|
print("=" * 60)
|
|
|
|
# 测试练习 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
|
|
print(f"修改后状态: {sample_state}")
|
|
|
|
# 恢复
|
|
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_exercises()
|