# GEO 平台 - AI Agent 框架设计

## 概述

GEO 平台的 AI Agent 框架是系统的核心智能层，负责执行各种需要 AI 能力的业务任务。框架采用模块化、可插拔的设计，支持 Agent 的动态注册、任务分发和状态管理。

本文档定义 Agent 框架的整体架构、核心组件和通信机制。

## Agent 列表

### CitationDetector（引用检测 Agent）

| 属性 | 说明 |
|------|------|
| **职责** | 解析 AI 平台响应，识别其中是否包含品牌引用 |
| **输入** | AI 平台原始响应文本、品牌名称列表、竞品名称列表 |
| **输出** | 引用检测结果（引用/未引用/竞品引用）、引用片段、置信度评分 |
| **核心能力** | 自然语言理解、实体识别、引用关系判定 |
| **触发方式** | 查询任务完成后自动触发 |
| **优先级** | P0 |

**处理流程**：
```
接收响应文本 ──▶ 文本预处理 ──▶ 品牌实体识别 ──▶ 引用关系判定
                                              │
                                              ▼
                                    竞品引用检测 ──▶ 置信度评估
                                              │
                                              ▼
                                    结果格式化 ──▶ 上报结果
```

**引用类型判定**：
| 类型 | 判定标准 | 置信度权重 |
|------|----------|------------|
| `direct_quote` | 品牌名被直接提及并作为信息来源 | 高 |
| `indirect_reference` | 品牌信息被提及但未明确标注来源 | 中 |
| `no_reference` | 品牌完全未被提及 | 确定 |
| `competitor_reference` | 竞品被引用而品牌未被引用 | 高 |

### ContentGenerator（内容生成 Agent）

| 属性 | 说明 |
|------|------|
| **职责** | 根据策略和规则生成 GEO 优化的内容资产 |
| **输入** | 内容主题、规则库配置、品牌素材、参考数据 |
| **输出** | GEO 优化内容（文章/问答/指南等）、内容元数据 |
| **核心能力** | 创意写作、SEO/GEO 优化、多风格适配 |
| **触发方式** | 用户手动触发或按排期自动触发 |
| **优先级** | P0 |

**处理流程**：
```
接收生成任务 ──▶ 需求分析 ──▶ 素材收集 ──▶ 大纲生成
                                          │
                                          ▼
                                    内容撰写 ──▶ GEO 优化处理
                                          │
                                          ▼
                                    自检校验 ──▶ 输出结果
```

**内容类型支持**：
| 类型 | 说明 | 适用场景 |
|------|------|----------|
| `article` | 长篇文章（800-2000 字） | 深度行业内容 |
| `qa` | 问答对 | 常见品牌问题 |
| `guide` | 操作指南 | 产品使用场景 |
| `comparison` | 对比分析 | 竞品对抗 |
| `data_report` | 数据报告 | 行业研究 |

### RuleChecker（规则检查 Agent）

| 属性 | 说明 |
|------|------|
| **职责** | 检查内容是否符合规则库中的约束条件 |
| **输入** | 待检查内容、规则库配置 |
| **输出** | 检查结果（通过/不通过）、问题列表、改进建议 |
| **核心能力** | 规则引擎、内容质量评估、语义分析 |
| **触发方式** | ContentGenerator 生成后自动触发，或手动触发 |
| **优先级** | P0 |

**检查维度**：
| 维度 | 说明 | 示例规则 |
|------|------|----------|
| `keyword_coverage` | 关键词覆盖度 | 必须包含核心关键词 |
| `readability` | 可读性评分 | Flesch 阅读 ease 分数 |
| `tone_consistency` | 语气一致性 | 保持专业、客观语气 |
| `length_compliance` | 长度合规 | 符合目标平台偏好长度 |
| `fact_accuracy` | 事实准确性 | 品牌信息准确无误 |
| `geo_optimization` | GEO 优化度 | 符合 GEO 最佳实践 |

### CompetitorAnalyzer（竞品分析 Agent）

| 属性 | 说明 |
|------|------|
| **职责** | 分析竞品的 GEO 表现和策略 |
| **输入** | 竞品名称、查询结果、引用数据 |
| **输出** | 竞品分析报告、SWOT 分析、策略建议 |
| **核心能力** | 竞品数据对比、模式识别、策略推断 |
| **触发方式** | 诊断分析流程中自动触发 |
| **优先级** | P1 |

**分析维度**：
| 维度 | 说明 |
|------|------|
| `citation_share` | 竞品引用份额占比 |
| `platform_presence` | 各平台出现频率 |
| `content_pattern` | 竞品被引用的内容模式 |
| `strength_weakness` | 竞品的优劣势分析 |
| `strategy_inference` | 推测竞品的 GEO 策略 |

### PerformanceTracker（性能追踪 Agent）

| 属性 | 说明 |
|------|------|
| **职责** | 持续追踪品牌 GEO 表现，计算 KPI，检测异常 |
| **输入** | 历史引用数据、当前查询结果、KPI 配置 |
| **输出** | KPI 计算结果、趋势分析、异常告警、优化建议 |
| **核心能力** | 时间序列分析、趋势预测、异常检测 |
| **触发方式** | 按设定周期自动执行 |
| **优先级** | P1 |

**追踪指标**：
| 指标 | 计算方式 | 更新频率 |
|------|----------|----------|
| `citation_rate` | 被引用查询数 / 总查询数 | 每日 |
| `avg_confidence` | 引用记录置信度平均值 | 每次查询 |
| `platform_coverage` | 已覆盖平台数 / 目标平台数 | 每周 |
| `ranking_position` | 品牌在引用中的平均排名 | 每周 |
| `competitor_gap` | 品牌引用率 - 竞品平均引用率 | 每周 |

## 通信协议

### Agent 间通信模型

GEO 平台 Agent 之间采用 **基于 Redis 消息队列的异步通信协议**。

```
┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│  Agent A    │◀────▶│   Redis     │◀────▶│  Agent B    │
│ (Producer)  │      │   Queue     │      │ (Consumer)  │
└─────────────┘      └──────┬──────┘      └─────────────┘
                            │
                     ┌──────▼──────┐
                     │  Registry   │
                     │ (Hash Map)  │
                     └─────────────┘
```

### 消息格式规范

```python
class AgentMessage:
    """Agent 间通信消息标准格式"""
    
    message_id: str          # UUID，消息唯一标识
    timestamp: datetime      # ISO 8601 格式时间戳
    sender: str              # 发送方 Agent 名称
    recipient: str           # 接收方 Agent 名称，或 "broadcast"
    message_type: str        # 消息类型
    correlation_id: str      # 关联 ID，用于追踪请求-响应链路
    reply_to: str            # 回复目标 Agent
    payload: dict            # 消息负载数据
    ttl: int                 # 消息存活时间（秒），默认 300
```

**消息类型（message_type）**：
| 类型 | 说明 | 使用场景 |
|------|------|----------|
| `task_request` | 任务请求 | Agent A 请求 Agent B 执行任务 |
| `task_result` | 任务结果 | Agent B 返回任务执行结果 |
| `status_update` | 状态更新 | Agent 上报自身状态变化 |
| `heartbeat` | 心跳 | Agent 定期发送健康信号 |
| `config_update` | 配置更新 | 通知 Agent 配置变更 |
| `error_report` | 错误报告 | Agent 报告执行错误 |

### 消息负载（payload）规范

```python
class TaskPayload:
    """任务请求/结果负载"""
    
    task_id: str             # 任务唯一标识
    task_type: str           # 任务类型
    parameters: dict         # 任务参数
    data: dict               # 输入/输出数据
    priority: int            # 优先级 1-10，默认 5
    deadline: datetime       # 截止时间（可选）
    retry_count: int         # 已重试次数
    max_retries: int         # 最大重试次数
```

### 通信模式

#### 1. 点对点模式（Point-to-Point）

```
Agent A ──task_request──▶ Queue ──▶ Agent B
Agent A ◀──task_result─── Queue ◀── Agent B
```

- 每个 Agent 有专属的输入队列
- 任务按轮询方式分配
- 适用于明确的任务分配场景

#### 2. 发布/订阅模式（Pub/Sub）

```
Agent A ──config_update──▶ Topic
                            │
            ┌───────────────┼───────────────┐
            ▼               ▼               ▼
        Agent B         Agent C         Agent D
```

- 使用 Redis Pub/Sub 频道
- 适用于配置变更、状态广播

#### 3. 工作流模式（Workflow）

```
┌────────────┐    ┌────────────┐    ┌────────────┐
│ QueryTask  │───▶│ Citation   │───▶│ Report     │
│  Completed │    │ Detector   │    │ Generator  │
└────────────┘    └────────────┘    └────────────┘
```

- 基于事件驱动的工作流编排
- 使用 correlation_id 串联整个工作流
- 支持并行和串行执行

## 注册机制

### Agent 注册流程

```
Agent 启动
    │
    ▼
读取配置（能力声明、资源需求、版本信息）
    │
    ▼
连接 Redis
    │
    ▼
向 Registry 注册
    │
    ▼
创建专属输入队列
    │
    ▼
启动心跳定时器
    │
    ▼
开始监听任务
```

### Registry 数据结构

```python
# Redis Hash: agent:registry:{agent_name}
{
    "name": "CitationDetector",
    "version": "1.0.0",
    "capabilities": "[\"citation_detect\", \"entity_recognition\"]",
    "status": "online",           # online / busy / offline
    "queue_name": "agent:citation_detector",
    "registered_at": "2026-01-01T00:00:00Z",
    "last_heartbeat": "2026-01-01T00:01:00Z",
    "current_task": "task_123",   # 当前执行任务 ID，空闲时为 null
    "concurrency": 5,             # 最大并发数
    "load": 0.6                   # 当前负载 0-1
}
```

### 服务发现

```python
# 获取所有在线 Agent
agents = redis.hgetall("agent:registry:*")
online_agents = [a for a in agents if a.status == "online"]

# 按能力筛选 Agent
capable_agents = [a for a in online_agents if "citation_detect" in a.capabilities]

# 选择负载最低的 Agent
selected = min(capable_agents, key=lambda a: a.load)
```

## 任务分发

### 分发策略

| 策略 | 说明 | 适用场景 |
|------|------|----------|
| `round_robin` | 轮询分配 | 同类型 Agent 负载均衡 |
| `least_load` | 最低负载优先 | 不同 Agent 性能差异时 |
| `capability_match` | 能力匹配 | 需要特定能力的任务 |
| `priority_queue` | 优先级队列 | 任务有明确优先级差异 |
| `sticky` | 粘性分配 | 需要上下文连续性的任务 |

### 任务分发流程

```
任务提交
    │
    ▼
解析任务类型 ──▶ 确定所需能力
    │
    ▼
查询 Registry ──▶ 筛选可用 Agent
    │
    ▼
应用分发策略 ──▶ 选择目标 Agent
    │
    ▼
序列化消息 ──▶ 写入目标队列
    │
    ▼
更新任务状态 ──▶ 等待结果
```

### 任务状态机

```
┌──────────┐    提交任务     ┌──────────┐
│  PENDING │───────────────▶│  QUEUED  │
└──────────┘               └─────┬────┘
                                 │ 入队
                                 ▼
                           ┌──────────┐
                    开始执行│ RUNNING  │
                   ┌───────┤          │
                   │       └─────┬────┘
                   │             │
              执行成功         执行失败
                   │             │
                   ▼             ▼
            ┌──────────┐   ┌──────────┐
            │COMPLETED │   │  FAILED  │
            └──────────┘   └─────┬────┘
                                 │
                    重试次数 < 最大重试
                                 │
                                 ▼
                           ┌──────────┐
                           │  RETRY   │
                           └────┬─────┘
                                │ 重新入队
                                └────▶ QUEUED
```

## 状态上报

### 上报内容

每个 Agent 需要定期上报以下状态信息：

| 字段 | 说明 | 上报频率 |
|------|------|----------|
| `status` | 当前状态 | 每次变化 + 心跳 |
| `current_task` | 正在执行的任务 | 每次变化 |
| `load` | 当前负载 0-1 | 心跳时 |
| `queue_depth` | 待处理任务数 | 心跳时 |
| `processed_count` | 已处理任务总数 | 心跳时 |
| `error_count` | 错误次数 | 心跳时 |
| `avg_process_time` | 平均处理时间 | 心跳时 |

### 心跳机制

```python
# 心跳间隔：30 秒
HEARTBEAT_INTERVAL = 30

# 心跳超时判定：90 秒（3 个心跳周期）
HEARTBEAT_TIMEOUT = 90

# 心跳消息格式
heartbeat_message = {
    "message_type": "heartbeat",
    "sender": "CitationDetector",
    "timestamp": "2026-01-01T00:01:00Z",
    "payload": {
        "status": "online",
        "load": 0.4,
        "queue_depth": 2,
        "processed_count": 150,
        "error_count": 3,
        "avg_process_time": 2.5
    }
}
```

### 状态监控

- Registry 定期检查 Agent 心跳超时
- 超时 Agent 自动标记为 `offline`
- 正在执行的任务自动重新分发
- 管理员可通过 Dashboard 查看 Agent 状态

## 配置管理

### 配置层级

| 层级 | 说明 | 优先级 |
|------|------|--------|
| `system_default` | 系统默认配置 | 最低 |
| `tenant_config` | 租户级配置（覆盖默认） | 中 |
| `agent_override` | Agent 本地配置（覆盖租户） | 最高 |

### 配置项

```python
class AgentConfig:
    """Agent 配置项"""
    
    # 通用配置
    max_concurrency: int = 5           # 最大并发数
    task_timeout: int = 300            # 任务超时时间（秒）
    retry_policy: str = "exponential"  # 重试策略
    max_retries: int = 3               # 最大重试次数
    
    # CitationDetector 专用
    confidence_threshold: float = 0.7  # 置信度阈值
    enable_semantic_analysis: bool = True
    
    # ContentGenerator 专用
    default_content_length: int = 1500
    content_styles: List[str] = ["professional", "casual", "technical"]
    
    # RuleChecker 专用
    strict_mode: bool = False
    custom_rules: List[dict] = []
```

### 动态配置更新

```
管理员更新配置
    │
    ▼
写入 Redis 配置存储
    │
    ▼
发布 config_update 消息
    │
    ▼
各 Agent 接收消息
    │
    ▼
Agent 热重载配置（无需重启）
```

## 管理功能需求

### Agent Dashboard

管理员需要通过 Dashboard 监控和管理所有 Agent：

| 功能 | 说明 | 优先级 |
|------|------|--------|
| Agent 列表 | 查看所有已注册 Agent 的状态 | P0 |
| 实时状态看板 | 展示 Agent 在线状态、负载、任务数 | P0 |
| 任务队列监控 | 查看各队列的待处理任务数 | P0 |
| 任务执行日志 | 查看任务执行的详细日志 | P1 |
| 错误告警 | Agent 异常时发送告警通知 | P1 |
| 配置管理 | 在线修改 Agent 配置 | P1 |
| Agent 启停 | 远程启动或停止 Agent | P2 |
| 版本管理 | 查看和升级 Agent 版本 | P2 |
| 性能统计 | 查看 Agent 的性能指标和趋势 | P2 |

### Agent 日志规范

```python
# 日志格式
{
    "timestamp": "2026-01-01T00:00:00Z",
    "level": "INFO",          # DEBUG / INFO / WARNING / ERROR
    "agent": "CitationDetector",
    "task_id": "task_123",
    "message": "开始执行引用检测",
    "metadata": {
        "query_id": "q_456",
        "brand": "ExampleBrand"
    }
}
```

### 错误处理

| 错误类型 | 处理方式 | 告警级别 |
|----------|----------|----------|
| 任务执行失败 | 自动重试，达到最大重试后标记失败 | Warning |
| Agent 心跳超时 | 标记离线，任务重新分发 | Error |
| 队列积压 | 触发弹性扩容或告警 | Warning |
| Agent 崩溃 | 自动重启（配合 supervisor） | Critical |
| 配置错误 | 拒绝加载，保持上次有效配置 | Error |

---

*本文档定义 GEO 平台的 AI Agent 框架设计，各 Agent 的具体实现算法和模型选型在模块指南中详细说明。*
