refactor: 重组项目目录结构
以讲义内容为骨架迁移到标准目录格式: - officefile/ 主内容(12章 + 附录 + CC4SI补充) - dofile/ 代码示例(11个Python脚本) - data/ 图片资源 - output/ 生成输出(忽略) - Archive/ 归档旧目录(忽略) - .claude/skills/ 保留markdown-to-docx工具链 - .pandoc/ 保留CSL和本地化配置 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,761 @@
|
||||
# 01.5 人机协同的原理
|
||||
|
||||
## 核心问题
|
||||
|
||||
> 人类和AI各自的优势是什么?如何互补?
|
||||
> 何时需要人类介入?如何设计审查点?
|
||||
> 如何建立和维护对AI系统的信任?
|
||||
|
||||
---
|
||||
|
||||
## 概念讲解
|
||||
|
||||
### 人类与AI的能力对比
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 人类 vs AI 能力对比 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 能力维度 │ 人类 │ AI │
|
||||
│ ───────────── │ ──────────── │ ───────────────── │
|
||||
│ │
|
||||
│ 模式识别 │ 不擅长大量 │ 非常擅长 │
|
||||
│ │ 数据的模式 │ 大规模模式识别 │
|
||||
│ │
|
||||
│ 语义理解 │ 深度理解 │ 表层理解 │
|
||||
│ │ 上下文关联 │ 统计关联 │
|
||||
│ │
|
||||
│ 创造力 │ 原创性强 │ 组合创新 │
|
||||
│ │ 跳跃思维 │ 已有模式重组 │
|
||||
│ │
|
||||
│ 伦理判断 │ 天然具备 │ 需要显式编码 │
|
||||
│ │ 直觉道德 │ 规则约束 │
|
||||
│ │
|
||||
│ 不确定性处理 │ 直觉判断 │ 概率计算 │
|
||||
│ │ 启发式 │ 量化评估 │
|
||||
│ │
|
||||
│ 知识获取 │ 慢,深度 │ 快,广度 │
|
||||
│ │ 需要学习 │ 即时查询 │
|
||||
│ │
|
||||
│ 注意力控制 │ 有限,易疲劳 │ 不知疲倦 │
|
||||
│ │ 可自主转移 │ 需要任务定义 │
|
||||
│ │
|
||||
│ 可解释性 │ 可事后解释 │ 需要专门设计 │
|
||||
│ │ 理由可能模糊 │ 逻辑清晰 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### HITL的理论基础
|
||||
|
||||
**Human-in-the-Loop (HITL)** 不仅仅是"让人检查结果",而是有理论基础的系统设计方法:
|
||||
|
||||
```
|
||||
HITL的理论支撑
|
||||
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ 1. 互补性原理 │
|
||||
│ 人类和AI有互补优势,结合优于单独使用 │
|
||||
│ │
|
||||
│ 2. 控制论原理 │
|
||||
│ 人类作为反馈回路的一部分,可以校正系统偏差 │
|
||||
│ │
|
||||
│ 3. 信任校准 │
|
||||
│ 通过参与建立对AI能力的准确认知 │
|
||||
│ │
|
||||
│ 4. 价值对齐 │
|
||||
│ 人类介入确保AI行为与人类价值观一致 │
|
||||
│ │
|
||||
│ 5. 责任归属 │
|
||||
│ 人类在关键决策点参与,明确责任边界 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 信任建立的动态
|
||||
|
||||
```
|
||||
信任建立过程
|
||||
|
||||
时间
|
||||
│
|
||||
│ ┌────────────┐
|
||||
│ │ 初始信任 │ 基于声誉、宣传等
|
||||
│ └─────┬──────┘
|
||||
│ │ 第一次使用
|
||||
│ ↓
|
||||
│ ┌────────────┐
|
||||
│ │ 体验信任 │ 基于实际交互
|
||||
│ └─────┬──────┘
|
||||
│ │
|
||||
│ ┌──────┴──────┐
|
||||
│ ↓ ↓
|
||||
│ 成功 失败
|
||||
│ │ │
|
||||
│ ↓ ↓
|
||||
│ ┌─────┐ ┌─────┐
|
||||
│ │信任 │ │不信任│
|
||||
│ │增强 │ │/怀疑 │
|
||||
│ └──┬──┘ └──┬──┘
|
||||
│ │ │
|
||||
│ └──────┬──────┘
|
||||
│ │ 解释/透明度
|
||||
│ ↓
|
||||
│ ┌────────────┐
|
||||
│ │ 校准信任 │ 与能力匹配的信任水平
|
||||
│ └────────────┘
|
||||
│
|
||||
└──────────────────────────→
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 设计原理
|
||||
|
||||
### 何时需要人类介入
|
||||
|
||||
**决策框架**:根据任务的特性决定介入程度
|
||||
|
||||
```python
|
||||
def human_intervention_necessity(task_characteristics: Dict) -> str:
|
||||
"""
|
||||
评估任务需要人类介入的程度
|
||||
|
||||
Args:
|
||||
task_characteristics: 任务特性描述
|
||||
|
||||
Returns:
|
||||
介入程度: 'full', 'selective', 'minimal', 'none'
|
||||
"""
|
||||
scores = {
|
||||
'consequence': 0, # 后果严重性
|
||||
'uncertainty': 0, # 不确定性
|
||||
'ethical': 0, # 伦理敏感性
|
||||
'complexity': 0, # 复杂度
|
||||
'novelty': 0 # 新颖性
|
||||
}
|
||||
|
||||
# 评估后果严重性
|
||||
if task_characteristics.get('life_critical', False):
|
||||
scores['consequence'] = 3
|
||||
elif task_characteristics.get('economic_impact', 0) > 1000000:
|
||||
scores['consequence'] = 2
|
||||
elif task_characteristics.get('economic_impact', 0) > 100000:
|
||||
scores['consequence'] = 1
|
||||
|
||||
# 评估不确定性
|
||||
uncertainty = task_characteristics.get('uncertainty_level', 'low')
|
||||
scores['uncertainty'] = {'low': 0, 'medium': 1, 'high': 2}[uncertainty]
|
||||
|
||||
# 评估伦理敏感性
|
||||
if task_characteristics.get('ethical_concerns', False):
|
||||
scores['ethical'] = 3
|
||||
|
||||
# 评估复杂度
|
||||
complexity = task_characteristics.get('complexity', 'low')
|
||||
scores['complexity'] = {'low': 0, 'medium': 1, 'high': 2}[complexity]
|
||||
|
||||
# 评估新颖性
|
||||
if task_characteristics.get('novel_situation', False):
|
||||
scores['novelty'] = 2
|
||||
|
||||
# 总分
|
||||
total_score = sum(scores.values())
|
||||
|
||||
# 决定介入程度
|
||||
if total_score >= 10:
|
||||
return 'full' # 完全由人类主导
|
||||
elif total_score >= 6:
|
||||
return 'selective' # 关键点介入
|
||||
elif total_score >= 3:
|
||||
return 'minimal' # 异常时介入
|
||||
else:
|
||||
return 'none' # AI自主执行
|
||||
```
|
||||
|
||||
**ENAgent的三个审查点设计依据**:
|
||||
|
||||
| 审查点 | 任务特性 | 介入理由 |
|
||||
|-------|---------|---------|
|
||||
| 源地识别 | 高不确定性 + 本地知识需求 | 遥感分类可能错误,地面实况重要 |
|
||||
| 阻力权重 | 高价值判断 + 物种特异性 | 不同物种权重差异大,专家知识关键 |
|
||||
| 廊道优化 | 多目标权衡 + 社会影响 | 生态与经济/社会的平衡,人类决策 |
|
||||
|
||||
### 信任校准机制
|
||||
|
||||
```python
|
||||
class TrustCalibration:
|
||||
"""
|
||||
信任校准系统
|
||||
|
||||
目标:让用户的信任水平与AI的实际能力匹配
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.declared_confidence = [] # AI声明的置信度
|
||||
self.actual_performance = [] # 实际表现
|
||||
self.user_trust_level = 0.5 # 用户信任水平
|
||||
|
||||
def record_outcome(self, ai_confidence: float,
|
||||
actual_correct: bool,
|
||||
user_trusted: bool):
|
||||
"""
|
||||
记录一次AI决策的结果
|
||||
|
||||
Args:
|
||||
ai_confidence: AI声明的置信度 [0, 1]
|
||||
actual_correct: 实际是否正确
|
||||
user_trusted: 用户是否信任并采用了AI建议
|
||||
"""
|
||||
self.declared_confidence.append(ai_confidence)
|
||||
self.actual_performance.append(1.0 if actual_correct else 0.0)
|
||||
|
||||
def assess_calibration(self) -> Dict:
|
||||
"""
|
||||
评估AI的校准程度
|
||||
|
||||
Returns:
|
||||
校准报告
|
||||
"""
|
||||
if not self.declared_confidence:
|
||||
return {'status': 'insufficient_data'}
|
||||
|
||||
# 按置信度分组统计
|
||||
confidence_bins = {
|
||||
'high': [], # > 0.8
|
||||
'medium': [], # 0.5-0.8
|
||||
'low': [] # < 0.5
|
||||
}
|
||||
|
||||
for conf, perf in zip(self.declared_confidence, self.actual_performance):
|
||||
if conf > 0.8:
|
||||
confidence_bins['high'].append(perf)
|
||||
elif conf > 0.5:
|
||||
confidence_bins['medium'].append(perf)
|
||||
else:
|
||||
confidence_bins['low'].append(perf)
|
||||
|
||||
# 计算各组的平均实际表现
|
||||
calibration_report = {}
|
||||
for bin_name, performances in confidence_bins.items():
|
||||
if performances:
|
||||
avg_performance = sum(performances) / len(performances)
|
||||
calibration_report[bin_name] = {
|
||||
'ai_declared_range': self._get_bin_range(bin_name),
|
||||
'actual_accuracy': avg_performance,
|
||||
'calibration_gap': avg_performance - self._get_bin_expected(bin_name)
|
||||
}
|
||||
|
||||
return calibration_report
|
||||
|
||||
def _get_bin_range(self, bin_name: str) -> str:
|
||||
ranges = {
|
||||
'high': '> 0.8',
|
||||
'medium': '0.5-0.8',
|
||||
'low': '< 0.5'
|
||||
}
|
||||
return ranges[bin_name]
|
||||
|
||||
def _get_bin_expected(self, bin_name: str) -> float:
|
||||
"""该置信度组的期望表现"""
|
||||
expected = {
|
||||
'high': 0.9,
|
||||
'medium': 0.65,
|
||||
'low': 0.25
|
||||
}
|
||||
return expected[bin_name]
|
||||
|
||||
def recommend_trust_adjustment(self) -> str:
|
||||
"""
|
||||
基于校准结果,建议信任调整
|
||||
|
||||
Returns:
|
||||
调整建议
|
||||
"""
|
||||
calibration = self.assess_calibration()
|
||||
|
||||
if calibration.get('status') == 'insufficient_data':
|
||||
return "需要更多数据来评估"
|
||||
|
||||
overconfident = any(
|
||||
v['calibration_gap'] < -0.1
|
||||
for v in calibration.values()
|
||||
if isinstance(v, dict)
|
||||
)
|
||||
|
||||
underconfident = any(
|
||||
v['calibration_gap'] > 0.1
|
||||
for v in calibration.values()
|
||||
if isinstance(v, dict)
|
||||
)
|
||||
|
||||
if overconfident:
|
||||
return "AI倾向于过度自信,建议降低信任度,增加审查"
|
||||
elif underconfident:
|
||||
return "AI实际表现优于声明,可以增加信任"
|
||||
else:
|
||||
return "AI校准良好,当前信任水平适当"
|
||||
```
|
||||
|
||||
### 审查点设计模式
|
||||
|
||||
```python
|
||||
class CheckpointDesign:
|
||||
"""
|
||||
审查点设计框架
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def design_checkpoint(task_info: Dict) -> Dict:
|
||||
"""
|
||||
为任务设计审查点
|
||||
|
||||
Args:
|
||||
task_info: 任务信息
|
||||
|
||||
Returns:
|
||||
审查点设计
|
||||
"""
|
||||
checkpoint = {
|
||||
'name': task_info['name'],
|
||||
'trigger_condition': None,
|
||||
'information_provided': [],
|
||||
'decision_options': [],
|
||||
'default_action': None,
|
||||
'timeout_handling': None
|
||||
}
|
||||
|
||||
# 1. 触发条件设计
|
||||
checkpoint['trigger_condition'] = CheckpointDesign._design_trigger(task_info)
|
||||
|
||||
# 2. 信息提供设计
|
||||
checkpoint['information_provided'] = CheckpointDesign._design_info_display(task_info)
|
||||
|
||||
# 3. 决策选项设计
|
||||
checkpoint['decision_options'] = CheckpointDesign._design_options(task_info)
|
||||
|
||||
# 4. 默认行为
|
||||
checkpoint['default_action'] = CheckpointDesign._design_default(task_info)
|
||||
|
||||
return checkpoint
|
||||
|
||||
@staticmethod
|
||||
def _design_trigger(task_info: Dict) -> Dict:
|
||||
"""设计触发条件"""
|
||||
return {
|
||||
'type': 'conditional', # always, conditional, on_error
|
||||
'conditions': [
|
||||
'confidence_below_threshold',
|
||||
'conflicting_alternatives',
|
||||
'ethical_concern_detected'
|
||||
],
|
||||
'threshold': task_info.get('confidence_threshold', 0.7)
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _design_info_display(task_info: Dict) -> List[str]:
|
||||
"""设计展示给人类的信息"""
|
||||
base_info = [
|
||||
'ai_proposal',
|
||||
'confidence_level',
|
||||
'reasoning_trace'
|
||||
]
|
||||
|
||||
# 根据任务类型添加额外信息
|
||||
if task_info.get('high_stakes', False):
|
||||
base_info.extend([
|
||||
'consequence_analysis',
|
||||
'alternative_options'
|
||||
])
|
||||
|
||||
if task_info.get('uncertain', False):
|
||||
base_info.append('uncertainty_quantification')
|
||||
|
||||
return base_info
|
||||
|
||||
@staticmethod
|
||||
def _design_options(task_info: Dict) -> List[str]:
|
||||
"""设计人类决策选项"""
|
||||
base_options = ['approve', 'reject', 'modify']
|
||||
|
||||
if task_info.get('allow_delegation', False):
|
||||
base_options.append('delegate_to_ai')
|
||||
|
||||
return base_options
|
||||
|
||||
@staticmethod
|
||||
def _design_default(task_info: Dict) -> str:
|
||||
"""设计默认行为(人类不响应时)"""
|
||||
if task_info.get('high_stakes', False):
|
||||
return 'wait_for_human' # 等待人类
|
||||
else:
|
||||
return 'proceed_with_caution' # 谨慎继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 代码示例
|
||||
|
||||
### 完整的HITL工作流实现
|
||||
|
||||
```python
|
||||
"""
|
||||
完整的人机协同工作流实现
|
||||
"""
|
||||
import time
|
||||
from typing import Dict, List, Optional, Callable
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
|
||||
class HumanDecision(Enum):
|
||||
"""人类决策类型"""
|
||||
APPROVE = "approve"
|
||||
REJECT = "reject"
|
||||
MODIFY = "modify"
|
||||
DEFER = "defer"
|
||||
REQUEST_INFO = "request_info"
|
||||
|
||||
@dataclass
|
||||
class CheckpointResult:
|
||||
"""审查点结果"""
|
||||
checkpoint_name: str
|
||||
decision: HumanDecision
|
||||
modifications: Optional[Dict] = None
|
||||
additional_input: Optional[Dict] = None
|
||||
timestamp: float = None
|
||||
|
||||
class HITLWorkflow:
|
||||
"""
|
||||
人机协同工作流
|
||||
"""
|
||||
|
||||
def __init__(self, name: str):
|
||||
self.name = name
|
||||
self.checkpoints: Dict[str, Dict] = {}
|
||||
self.state = {}
|
||||
self.history: List[CheckpointResult] = []
|
||||
|
||||
def add_checkpoint(self,
|
||||
name: str,
|
||||
trigger: Callable,
|
||||
info_formatter: Callable = None,
|
||||
critical: bool = False):
|
||||
"""
|
||||
添加审查点
|
||||
|
||||
Args:
|
||||
name: 审查点名称
|
||||
trigger: 触发条件函数,返回True时需要审查
|
||||
info_formatter: 信息格式化函数
|
||||
critical: 是否为关键审查点
|
||||
"""
|
||||
self.checkpoints[name] = {
|
||||
'trigger': trigger,
|
||||
'info_formatter': info_formatter or (lambda x: x),
|
||||
'critical': critical,
|
||||
'activated': False
|
||||
}
|
||||
|
||||
def execute_step(self,
|
||||
step_name: str,
|
||||
step_function: Callable,
|
||||
**kwargs) -> Dict:
|
||||
"""
|
||||
执行工作流步骤
|
||||
|
||||
Args:
|
||||
step_name: 步骤名称
|
||||
step_function: 执行函数
|
||||
**kwargs: 传递给函数的参数
|
||||
|
||||
Returns:
|
||||
执行结果
|
||||
"""
|
||||
print(f"\n{'='*50}")
|
||||
print(f"执行步骤: {step_name}")
|
||||
print('='*50)
|
||||
|
||||
# 检查是否有审查点
|
||||
checkpoint = self.checkpoints.get(step_name)
|
||||
|
||||
if checkpoint:
|
||||
# 执行步骤
|
||||
result = step_function(self.state, **kwargs)
|
||||
|
||||
# 格式化信息
|
||||
info = checkpoint['info_formatter'](result)
|
||||
|
||||
# 检查是否需要触发审查
|
||||
if checkpoint['trigger'](result, self.state):
|
||||
print(f"\n[审查点触发: {step_name}]")
|
||||
checkpoint['activated'] = True
|
||||
|
||||
# 获取人类决策
|
||||
decision = self._get_human_decision(info, step_name)
|
||||
|
||||
# 记录决策
|
||||
self.history.append(CheckpointResult(
|
||||
checkpoint_name=step_name,
|
||||
decision=decision['type'],
|
||||
modifications=decision.get('modifications'),
|
||||
timestamp=time.time()
|
||||
))
|
||||
|
||||
# 根据决策处理
|
||||
if decision['type'] == HumanDecision.APPROVE:
|
||||
print("✓ 人类批准,继续执行")
|
||||
self.state[step_name] = result
|
||||
|
||||
elif decision['type'] == HumanDecision.REJECT:
|
||||
print("✗ 人类拒绝,回退")
|
||||
return {'status': 'rejected', 'checkpoint': step_name}
|
||||
|
||||
elif decision['type'] == HumanDecision.MODIFY:
|
||||
print("✎ 人类修改结果")
|
||||
result = self._apply_modifications(result, decision['modifications'])
|
||||
self.state[step_name] = result
|
||||
|
||||
elif decision['type'] == HumanDecision.DEFER:
|
||||
print("⏸ 暂停,等待更多信息")
|
||||
return {'status': 'deferred', 'checkpoint': step_name}
|
||||
|
||||
else:
|
||||
print(f"审查点未触发(条件不满足),自动继续")
|
||||
self.state[step_name] = result
|
||||
else:
|
||||
# 没有审查点,直接执行
|
||||
result = step_function(self.state, **kwargs)
|
||||
self.state[step_name] = result
|
||||
|
||||
return result
|
||||
|
||||
def _get_human_decision(self, info: Dict, checkpoint_name: str) -> Dict:
|
||||
"""
|
||||
获取人类决策
|
||||
|
||||
实际实现中可能是GUI、CLI或其他交互方式
|
||||
"""
|
||||
print("\n" + "-"*40)
|
||||
print("信息摘要:")
|
||||
for key, value in info.items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
print("\n可用决策:")
|
||||
print(" 1. 批准 (approve)")
|
||||
print(" 2. 拒绝 (reject)")
|
||||
print(" 3. 修改 (modify)")
|
||||
|
||||
# 模拟人类输入
|
||||
# 实际实现中等待真实输入
|
||||
choice = "1" # 默认批准
|
||||
|
||||
decisions = {
|
||||
"1": HumanDecision.APPROVE,
|
||||
"2": HumanDecision.REJECT,
|
||||
"3": HumanDecision.MODIFY
|
||||
}
|
||||
|
||||
return {'type': decisions[choice]}
|
||||
|
||||
def _apply_modifications(self, original: Dict, modifications: Dict) -> Dict:
|
||||
"""应用人类修改"""
|
||||
if modifications:
|
||||
original.update(modifications)
|
||||
return original
|
||||
|
||||
def get_checkpoint_summary(self) -> Dict:
|
||||
"""获取审查点摘要"""
|
||||
return {
|
||||
'total_checkpoints': len(self.checkpoints),
|
||||
'activated_checkpoints': sum(1 for c in self.checkpoints.values() if c['activated']),
|
||||
'human_decisions': [
|
||||
{
|
||||
'checkpoint': r.checkpoint_name,
|
||||
'decision': r.decision.value,
|
||||
'timestamp': r.timestamp
|
||||
}
|
||||
for r in self.history
|
||||
]
|
||||
}
|
||||
|
||||
# 示例:生态网络分析的HITL工作流
|
||||
def ecological_hitl_example():
|
||||
"""生态网络分析HITL示例"""
|
||||
|
||||
workflow = HITLWorkflow("ecological_network_analysis")
|
||||
|
||||
# 步骤1:加载数据(无审查)
|
||||
def load_data(state):
|
||||
print("加载土地利用数据...")
|
||||
return {'data_loaded': True, 'n_pixels': 10000}
|
||||
|
||||
# 步骤2:识别源地(有审查)
|
||||
def identify_sources(state):
|
||||
print("识别生态源地...")
|
||||
sources = [
|
||||
{'id': 1, 'area': 1500, 'confidence': 0.85},
|
||||
{'id': 2, 'area': 800, 'confidence': 0.65},
|
||||
{'id': 3, 'area': 2000, 'confidence': 0.92}
|
||||
]
|
||||
return {'sources': sources, 'n_sources': len(sources)}
|
||||
|
||||
# 审查条件:有低置信度源地时触发
|
||||
def source_trigger(result, state):
|
||||
return any(s['confidence'] < 0.7 for s in result['sources'])
|
||||
|
||||
# 信息格式化
|
||||
def format_source_info(result):
|
||||
return {
|
||||
'识别源地数': result['n_sources'],
|
||||
'平均置信度': sum(s['confidence'] for s in result['sources']) / result['n_sources'],
|
||||
'低置信度源地': [s['id'] for s in result['sources'] if s['confidence'] < 0.7]
|
||||
}
|
||||
|
||||
workflow.add_checkpoint(
|
||||
'identify_sources',
|
||||
trigger=source_trigger,
|
||||
info_formatter=format_source_info,
|
||||
critical=True
|
||||
)
|
||||
|
||||
# 步骤3:构建阻力面(有审查)
|
||||
def build_resistance(state):
|
||||
print("构建阻力面...")
|
||||
return {'weights': {'forest': 1, 'urban': 100}, 'built': True}
|
||||
|
||||
# 审查条件:总是触发
|
||||
def resistance_trigger(result, state):
|
||||
return True # 权重设置总是需要人类审查
|
||||
|
||||
def format_resistance_info(result):
|
||||
return result['weights']
|
||||
|
||||
workflow.add_checkpoint(
|
||||
'build_resistance',
|
||||
trigger=resistance_trigger,
|
||||
info_formatter=format_resistance_info
|
||||
)
|
||||
|
||||
# 执行工作流
|
||||
print("=== 开始执行HITL工作流 ===")
|
||||
|
||||
workflow.execute_step('load_data', load_data)
|
||||
workflow.execute_step('identify_sources', identify_sources)
|
||||
workflow.execute_step('build_resistance', build_resistance)
|
||||
|
||||
# 摘要
|
||||
summary = workflow.get_checkpoint_summary()
|
||||
print("\n=== 工作流摘要 ===")
|
||||
print(f"总审查点: {summary['total_checkpoints']}")
|
||||
print(f"激活审查点: {summary['activated_checkpoints']}")
|
||||
print("人类决策:")
|
||||
for decision in summary['human_decisions']:
|
||||
print(f" {decision['checkpoint']}: {decision['decision']}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
ecological_hitl_example()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 案例分析
|
||||
|
||||
### ENAgent的审查点实现
|
||||
|
||||
```python
|
||||
class ENAgentHITL:
|
||||
"""
|
||||
ENAgent的人机协同实现
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.review_points = {
|
||||
'source_identification': SourceReview(),
|
||||
'resistance_surface': ResistanceReview(),
|
||||
'corridor_extraction': CorridorReview()
|
||||
}
|
||||
|
||||
class SourceReview:
|
||||
"""源地识别审查"""
|
||||
|
||||
def trigger_condition(self, sources):
|
||||
"""触发条件"""
|
||||
# 条件1:有低置信度源地
|
||||
low_confidence = any(s['confidence'] < 0.7 for s in sources)
|
||||
|
||||
# 条件2:源地数量异常
|
||||
abnormal_count = len(sources) < 3 or len(sources) > 20
|
||||
|
||||
# 条件3:源地分布极不均匀
|
||||
if len(sources) >= 2:
|
||||
areas = [s['area'] for s in sources]
|
||||
area_range = max(areas) - min(areas)
|
||||
uneven = area_range > 10 * sum(areas) / len(areas)
|
||||
else:
|
||||
uneven = False
|
||||
|
||||
return low_confidence or abnormal_count or uneven
|
||||
|
||||
def format_for_review(self, sources):
|
||||
"""格式化信息供审查"""
|
||||
return {
|
||||
'n_sources': len(sources),
|
||||
'sources_by_confidence': sorted(sources,
|
||||
key=lambda x: x['confidence']),
|
||||
'spatial_distribution': self._analyze_distribution(sources),
|
||||
'potential_issues': self._detect_issues(sources)
|
||||
}
|
||||
|
||||
def _detect_issues(self, sources):
|
||||
"""检测潜在问题"""
|
||||
issues = []
|
||||
|
||||
if len(sources) < 3:
|
||||
issues.append("源地数量偏少,可能遗漏重要栖息地")
|
||||
|
||||
low_conf = [s for s in sources if s['confidence'] < 0.7]
|
||||
if low_conf:
|
||||
issues.append(f"{len(low_conf)}个源地置信度低于0.7")
|
||||
|
||||
return issues
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 反思与延伸
|
||||
|
||||
### 思考问题
|
||||
|
||||
1. **责任边界**:当HITL系统出错时,责任应该如何划分?
|
||||
|
||||
2. **审查疲劳**:如果审查点太多,人类会产生疲劳,如何平衡?
|
||||
|
||||
3. **信任过度**:如何防止人类过度信任AI而减少必要的审查?
|
||||
|
||||
4. **可解释性**:AI应该如何向人类解释其推理过程?
|
||||
|
||||
### 实践练习
|
||||
|
||||
1. **审查点设计**:为你熟悉的流程设计审查点
|
||||
|
||||
2. **信任评估**:记录你使用AI工具的经历,评估信任变化
|
||||
|
||||
3. **HITL实现**:实现一个简单的HITL工作流
|
||||
|
||||
### 延伸阅读
|
||||
|
||||
- **"Human-in-the-Loop Machine Learning"** - HITL系统设计
|
||||
- **"Human-Centered AI"** (Ben Shneiderman) - 以人为本的AI
|
||||
- **"Explainable AI"**论文集 - 可解释AI研究
|
||||
|
||||
---
|
||||
|
||||
## 关键要点
|
||||
|
||||
1. **人类和AI有互补优势**,结合优于单独使用
|
||||
2. **HITL不是妥协**,而是有理论基础的系统设计方法
|
||||
3. **审查点选择关键**:在需要人类独特能力的决策点介入
|
||||
4. **信任需要校准**:让信任水平与实际能力匹配
|
||||
5. **责任必须明确**:关键决策点的人类参与确保责任归属
|
||||
Reference in New Issue
Block a user