geo/docs/02-design/agent-framework.md

503 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 的具体实现算法和模型选型在模块指南中详细说明。*