Files
aiagent/创建Agent经验.md

1385 lines
22 KiB
Markdown
Raw Permalink Normal View History

2026-01-20 18:05:31 +08:00
# 创建Agent经验总结
## 📋 目录
1. [创建Agent的完整流程](#创建agent的完整流程)
2. [工作流设计经验](#工作流设计经验)
3. [节点配置要点](#节点配置要点)
4. [Prompt设计技巧](#prompt设计技巧)
5. [数据流转与上下文传递](#数据流转与上下文传递)
6. [常见问题和解决方案](#常见问题和解决方案)
7. [最佳实践](#最佳实践)
8. [实战案例](#实战案例)
---
## 创建Agent的完整流程
### 1. 准备工作
#### 1.1 明确Agent目标
- **功能定位**确定Agent要解决什么问题
- **目标用户**:明确使用场景和用户群体
- **输出格式**确定最终输出的格式文本、JSON、Markdown等
#### 1.2 设计工作流结构
- 绘制工作流流程图
- 确定节点类型和数量
- 规划数据流转路径
- 考虑分支和合并逻辑
#### 1.3 准备Prompt模板
- 为每个LLM节点准备详细的Prompt
- 考虑上下文传递和变量替换
- 明确输出格式要求
### 2. 编写生成脚本
#### 2.1 脚本结构模板
```python
#!/usr/bin/env python3
"""
生成[Agent名称]Agent
[Agent功能描述]
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from sqlalchemy.orm import Session
from app.core.database import SessionLocal
from app.models.agent import Agent
from app.models.user import User
from datetime import datetime
import uuid
def generate_xxx_agent(db: Session, username: str = "admin"):
    """生成[Agent名称]Agent"""
    print("=" * 60)
    print("生成[Agent名称]Agent")
    print("=" * 60)
    print()
    # 1. 查找用户
    user = db.query(User).filter(User.username == username).first()
    if not user:
        print(f"❌ 未找到用户 '{username}',请先创建该用户")
        return
    print(f"✅ 找到用户: {user.username} (ID: {user.id})")
    print()
    # 2. 创建工作流配置
    nodes = []
    edges = []
    # 3. 添加节点
    # ... 节点配置 ...
    # 4. 添加连接
    # ... 边配置 ...
    # 5. 创建或更新Agent
    workflow_config = {
        "nodes": nodes,
        "edges": edges
    }
    agent = db.query(Agent).filter(
        Agent.name == "[Agent名称]",
        Agent.user_id == user.id
    ).first()
    if agent:
        # 更新现有Agent
        agent.workflow_config = workflow_config
        agent.updated_at = datetime.now()
        agent.status = "published"  # 设置为已发布
        print("⚠️  Agent已存在将更新它...")
    else:
        # 创建新Agent
        agent = Agent(
            id=str(uuid.uuid4()),
            name="[Agent名称]",
            description="[Agent描述]",
            workflow_config=workflow_config,
            status="published",  # 直接设置为已发布,可立即使用
            user_id=user.id,
            version=1
        )
        db.add(agent)
    # 6. 提交并输出结果
    try:
        db.commit()
        db.refresh(agent)
        print("✅ Agent创建/更新成功!")
        print(f"   - ID: {agent.id}")
        print(f"   - 状态: {agent.status}")
        return agent
    except Exception as e:
        db.rollback()
        print(f"❌ 创建Agent失败: {str(e)}")
        return None
def main():
    """主函数"""
    db = SessionLocal()
    try:
        generate_xxx_agent(db, username="admin")
    finally:
        db.close()
if __name__ == "__main__":
    main()
```
### 3. 执行脚本
```bash
# 1. 添加执行权限
chmod +x backend/scripts/generate_xxx_agent.py
# 2. 运行脚本
python3 backend/scripts/generate_xxx_agent.py
```
### 4. 验证和测试
- 在Agent管理页面查看创建的Agent
- 使用"使用"按钮测试Agent功能
- 根据测试结果调整Prompt和工作流
---
## 工作流设计经验
### 1. 常见工作流模式
#### 模式1线性流程
```
开始 → 处理1 → 处理2 → 处理3 → 结束
```
**适用场景**:简单的顺序处理任务
#### 模式2分支流程
```
开始 → 分析 → 条件判断 → [分支A | 分支B] → 整合 → 结束
```
**适用场景**:需要根据条件选择不同处理路径
#### 模式3并行处理
```
开始 → 分析 → [处理A | 处理B | 处理C] → 整合 → 结束
```
**适用场景**:多个独立任务可以并行执行
#### 模式4循环处理
```
开始 → 循环开始 → 处理 → 条件判断 → [继续循环 | 退出] → 结束
```
**适用场景**:需要重复处理的数据
### 2. 节点布局建议
#### 2.1 位置规划
- **X轴间距**建议200-250像素确保节点不重叠
- **Y轴间距**分支节点建议100-150像素
- **起始位置**:开始节点建议 (50, 300-400)
#### 2.2 布局示例
```python
# 线性布局
start_node = {"position": {"x": 50, "y": 400}}
node1 = {"position": {"x": 250, "y": 400}}
node2 = {"position": {"x": 450, "y": 400}}
# 分支布局
condition_node = {"position": {"x": 450, "y": 400}}
branch_true = {"position": {"x": 650, "y": 300}}  # 上分支
branch_false = {"position": {"x": 650, "y": 500}}  # 下分支
```
### 3. 工作流设计原则
#### 3.1 单一职责原则
- 每个节点只负责一个明确的任务
- 避免在一个节点中做太多事情
#### 3.2 数据流清晰
- 明确每个节点的输入和输出
- 使用Transform节点整理数据
- 避免数据丢失或混乱
#### 3.3 错误处理
- 考虑异常情况的处理
- 提供默认分支
- 添加错误提示节点(可选)
#### 3.4 可扩展性
- 预留扩展点
- 使用条件节点支持多种场景
- 保持工作流的灵活性
---
## 节点配置要点
### 1. 开始节点 (start)
```python
start_node = {
    "id": "start-1",  # 唯一ID建议使用 start-1, start-2 等
    "type": "start",
    "position": {"x": 50, "y": 400},
    "data": {
        "label": "开始",
        "output_format": "json"  # 可选json 或 text
    }
}
```
**要点**
- ID必须唯一
- `output_format` 决定后续节点如何接收数据
### 2. LLM节点 (llm)
```python
llm_node = {
    "id": "llm-xxx",
    "type": "llm",
    "position": {"x": 250, "y": 400},
    "data": {
        "label": "节点名称",
        "provider": "deepseek",  # 或 "openai"
        "model": "deepseek-chat",  # 模型名称
        "temperature": "0.3",  # 温度参数,字符串格式
        "max_tokens": "2000",  # 最大token数字符串格式
        "prompt": """你的Prompt内容
使用 {{variable}} 引用变量
使用 {{query}} 引用用户输入
使用 {{output}} 引用上一个节点的输出"""
    }
}
```
**要点**
- `temperature``max_tokens` 必须是字符串
- Prompt中使用 `{{variable}}` 进行变量替换
- 明确指定输出格式要求JSON、Markdown等
### 3. 条件节点 (condition)
```python
condition_node = {
    "id": "condition-xxx",
    "type": "condition",
    "position": {"x": 450, "y": 400},
    "data": {
        "label": "条件判断",
        "condition": "{variable} contains '关键词' or {variable} contains '另一个关键词'"
    }
}
```
**要点**
- 条件表达式使用 `{variable}` 引用变量
- 支持 `contains``==``!=` 等操作符
- 支持 `and``or` 逻辑运算符
- 连接边需要指定 `sourceHandle``"true"``"false"`
### 4. Transform节点 (transform)
```python
transform_node = {
    "id": "transform-xxx",
    "type": "transform",
    "position": {"x": 650, "y": 400},
    "data": {
        "label": "数据转换",
        "mode": "merge",  # 或 "replace"、"extract"
        "mapping": {
            "key1": "{{variable1}}",
            "key2": "{{variable2}}",
            "key3": "{{output}}"
        }
    }
}
```
**要点**
- `mode: "merge"` 用于合并多个数据源
- `mode: "replace"` 用于替换整个数据
- `mode: "extract"` 用于提取特定字段
- 使用 `{{variable}}` 引用变量
### 5. 结束节点 (end)
```python
end_node = {
    "id": "end-1",
    "type": "end",
    "position": {"x": 1450, "y": 400},
    "data": {
        "label": "结束",
        "description": "返回最终结果"
    }
}
```
**要点**
- 结束节点会返回最终输出
- 可以设置 `output_format` 控制输出格式
### 6. 连接边 (edges)
```python
# 普通连接
edge = {
    "id": "e1",  # 唯一ID
    "source": "start-1",  # 源节点ID
    "target": "llm-xxx"  # 目标节点ID
}
# 条件分支连接
edge_true = {
    "id": "e2-true",
    "source": "condition-xxx",
    "target": "branch-true",
    "sourceHandle": "true"  # true分支
}
edge_false = {
    "id": "e2-false",
    "source": "condition-xxx",
    "target": "branch-false",
    "sourceHandle": "false"  # false分支
}
```
**要点**
- 每个边必须有唯一的ID
- 条件节点的分支必须指定 `sourceHandle`
- 确保所有节点都有正确的连接
---
## Prompt设计技巧
### 1. Prompt结构
#### 1.1 角色定位
```
你是一个专业的[角色],请[任务描述]。
```
**示例**
```
你是一个专业的Android开发顾问。请分析用户的需求提取关键信息。
```
#### 1.2 任务说明
- 明确任务目标
- 列出具体要求
- 提供输出格式示例
#### 1.3 上下文信息
```
用户需求:{{query}}
需求分析结果:{{requirement_analysis}}
```
#### 1.4 输出要求
```
请以JSON格式输出分析结果
{
  "key1": "value1",
  "key2": "value2"
}
```
### 2. 变量使用
#### 2.1 常用变量
- `{{query}}` - 用户原始输入
- `{{user_query}}` - 用户查询(可能经过处理)
- `{{output}}` - 上一个节点的输出
- `{{variable_name}}` - 自定义变量通过Transform节点传递
#### 2.2 变量引用示例
```python
"prompt": """用户需求:{{query}}
需求分析:{{requirement_analysis}}
请根据以上信息生成代码。"""
```
### 3. 输出格式控制
#### 3.1 JSON格式
```
请以JSON格式输出
{
  "field1": "value1",
  "field2": ["item1", "item2"]
}
请确保输出是有效的JSON格式。
```
#### 3.2 Markdown格式
```
请以Markdown格式输出包含
1. 标题
2. 代码块(使用正确的语言标识)
3. 列表
4. 表格(如需要)
```
#### 3.3 纯文本格式
```
请直接输出优化后的完整内容(纯文本格式)。
不要包含JSON格式或其他包装。
```
### 4. 温度参数选择
| 场景 | Temperature | 说明 |
|------|------------|------|
| 代码生成 | 0.2-0.3 | 需要准确、一致的输出 |
| 需求分析 | 0.3-0.5 | 需要平衡准确性和灵活性 |
| 创意内容 | 0.7-0.9 | 需要多样性和创造性 |
| 格式化输出 | 0.1-0.2 | 需要严格按照格式要求 |
### 5. Token限制
| 任务类型 | Max Tokens | 说明 |
|---------|-----------|------|
| 简单分析 | 1000-2000 | 简短的分析和提取 |
| 代码生成 | 3000-4000 | 完整的代码文件 |
| 长文档生成 | 4000-8000 | 长篇文章或文档 |
| 格式化输出 | 2000-4000 | 整理和格式化内容 |
---
## 数据流转与上下文传递
### 1. 数据流转路径
```
开始节点 → LLM节点 → Transform节点 → 条件节点 → LLM节点 → 结束节点
   ↓          ↓            ↓            ↓                   ↓
  query    output      merged_data   condition   solution   final_output
```
### 2. 上下文传递策略
#### 2.1 使用Transform节点合并数据
```python
transform_node = {
    "data": {
        "mode": "merge",
        "mapping": {
            "user_query": "{{query}}",  # 保留原始输入
            "analysis": "{{output}}",   # 保留分析结果
            "context": "{{previous_output}}"  # 保留上下文
        }
    }
}
```
#### 2.2 在Prompt中传递上下文
```python
"prompt": """用户原始需求:{{user_query}}
需求分析结果:{{requirement_analysis}}
请根据以上信息生成代码。"""
```
#### 2.3 数据传递示例
```python
# 完整的数据流转示例
# 1. 开始节点输出:{"query": "用户输入"}
# 2. LLM节点分析输出{"app_type": "...", "modules": [...]}
# 3. Transform节点合并
transform_node = {
"data": {
"mode": "merge",
"mapping": {
"user_query": "{{query}}", # 保留原始输入
"requirement_analysis": "{{output}}" # 保留分析结果
}
}
}
# 4. 后续LLM节点可以使用{{user_query}} 和 {{requirement_analysis}}
```
### 3. 避免数据丢失
#### 3.1 使用Transform节点保留关键数据
```python
# 在分支前合并数据,确保所有分支都能访问
transform_before_branch = {
"data": {
"mode": "merge",
"mapping": {
"original_query": "{{query}}",
"analysis": "{{output}}",
"context": "{{previous_context}}"
}
}
}
```
#### 3.2 在Prompt中明确引用
```python
"prompt": """请参考以下完整上下文:
原始需求:{{user_query}}
分析结果:{{requirement_analysis}}
历史上下文:{{context}}
根据以上信息完成任务。"""
```
---
## 常见问题和解决方案
### 1. Agent无法执行403错误
**问题现象**
- 点击"使用"按钮提示无权限
- API调用返回403
**原因分析**
- Agent状态不是 `published``running`
- 非owner用户尝试执行 `draft` 状态的Agent
**解决方案**
```python
# 在创建脚本中设置状态
agent = Agent(
...
status="published", # 直接设置为已发布
...
)
```
### 2. LLM输出答非所问
**问题现象**
- Agent执行了但回答不相关
- 输出内容与用户需求不符
**原因分析**
- Prompt中没有正确引用用户输入
- 缺少需求分析步骤
- 上下文传递丢失
**解决方案**
```python
# 1. 确保Prompt中包含用户输入
"prompt": """用户需求:{{query}}
请根据用户需求完成任务。"""
# 2. 添加需求分析节点
# 先分析需求,再生成内容
# 3. 使用Transform节点保留原始输入
transform_node = {
"data": {
"mode": "merge",
"mapping": {
"user_query": "{{query}}" # 保留原始输入
}
}
}
```
### 3. 条件节点分支执行错误
**问题现象**
- 条件判断后,所有分支都执行了
- 或者分支执行顺序错误
**原因分析**
- 边的 `sourceHandle` 未设置或设置错误
- 条件表达式不正确
**解决方案**
```python
# 1. 确保条件节点的边有sourceHandle
edge_true = {
"id": "e-true",
"source": "condition-xxx",
"target": "branch-true",
"sourceHandle": "true" # 必须设置
}
edge_false = {
"id": "e-false",
"source": "condition-xxx",
"target": "branch-false",
"sourceHandle": "false" # 必须设置
}
# 2. 条件表达式要明确
"condition": "{user_query} contains '生成' or {user_query} contains '创建'"
```
### 4. 输出格式混乱
**问题现象**
- 输出包含多余信息
- 格式不统一
- 代码块格式错误
**原因分析**
- 缺少格式化节点
- Prompt中格式要求不明确
- End节点输出了不必要的数据
**解决方案**
```python
# 1. 添加格式化节点
format_node = {
"id": "llm-format",
"type": "llm",
"data": {
"label": "格式化输出",
"temperature": "0.1", # 低温度确保格式一致
"prompt": """请将以下内容整理成专业的Markdown格式
内容:{{input}}
要求:
- 使用清晰的标题层级
- 代码块使用正确的语言标识
- 格式统一、易读"""
}
}
# 2. End节点只输出必要字段
# 在workflow_engine.py中End节点会排除query、USER_INPUT等字段
```
### 5. 数据传递中断
**问题现象**
- 后续节点无法获取前面节点的输出
- 变量引用失败
**原因分析**
- 节点之间缺少连接
- Transform节点映射错误
- 变量名不匹配
**解决方案**
```python
# 1. 检查节点连接
edges = [
{"id": "e1", "source": "node1", "target": "node2"},
{"id": "e2", "source": "node2", "target": "node3"}
]
# 2. 使用Transform节点明确映射
transform_node = {
"data": {
"mode": "merge",
"mapping": {
"key1": "{{output}}", # 上一个节点的输出
"key2": "{{query}}", # 用户输入
"key3": "{{custom_var}}" # 自定义变量
}
}
}
# 3. 在Prompt中正确引用
"prompt": """使用变量:{{key1}}、{{key2}}、{{key3}}"""
```
### 6. Token限制导致输出截断
**问题现象**
- 输出内容不完整
- 代码生成到一半就停止了
**原因分析**
- `max_tokens` 设置过小
- 输出内容过长
**解决方案**
```python
# 根据任务类型调整max_tokens
llm_node = {
"data": {
"max_tokens": "4000", # 代码生成建议3000-4000
# 长文档建议4000-8000
}
}
```
---
## 最佳实践
### 1. 工作流设计原则
#### 1.1 单一职责
- 每个节点只做一件事
- 避免在一个节点中处理多个任务
#### 1.2 数据流清晰
- 明确每个节点的输入输出
- 使用Transform节点整理数据
- 保留关键上下文信息
#### 1.3 错误处理
- 提供默认分支
- 考虑异常情况
- 添加错误提示
#### 1.4 可扩展性
- 预留扩展点
- 使用条件节点支持多种场景
- 保持工作流灵活性
### 2. Prompt设计原则
#### 2.1 明确角色定位
```
你是一个专业的[角色],请[任务描述]。
```
#### 2.2 结构化输出
- 明确指定输出格式JSON、Markdown等
- 提供输出示例
- 要求验证格式正确性
#### 2.3 上下文传递
- 在Prompt中明确引用所有需要的变量
- 保留原始用户输入
- 传递分析结果和上下文
#### 2.4 温度参数选择
- 代码生成0.2-0.3(准确)
- 需求分析0.3-0.5(平衡)
- 创意内容0.7-0.9(多样)
- 格式化0.1-0.2(严格)
### 3. 节点配置建议
#### 3.1 节点ID命名规范
- 开始节点:`start-1`, `start-2`
- LLM节点`llm-xxx`(如 `llm-analysis`, `llm-generation`
- 条件节点:`condition-xxx`
- Transform节点`transform-xxx`
- 结束节点:`end-1`
#### 3.2 边ID命名规范
- 普通边:`e1`, `e2`, `e3`...
- 条件分支:`e-true`, `e-false`
- 多分支:`e-branch1`, `e-branch2`
#### 3.3 位置布局
- X轴间距200-250像素
- Y轴间距分支节点100-150像素
- 起始位置:(50, 300-400)
### 4. 测试和验证
#### 4.1 单元测试
- 测试每个节点的输入输出
- 验证数据传递正确性
- 检查条件分支逻辑
#### 4.2 集成测试
- 测试完整工作流
- 验证最终输出格式
- 检查错误处理
#### 4.3 用户测试
- 收集真实使用反馈
- 根据反馈调整Prompt
- 优化工作流结构
---
## 实战案例
### 案例1Android应用开发助手
**目标**帮助开发者快速生成、优化和调试Android应用
**工作流结构**
```
开始 → 需求分析 → 需求分类 → [代码生成 | 架构设计/问题诊断/性能优化] → 结果整合 → 格式化输出 → 结束
```
**关键设计**
1. **需求分析节点**提取结构化信息JSON格式
2. **需求分类节点**:根据关键词判断需求类型
3. **分支处理**:不同需求类型走不同分支
4. **结果整合**使用Transform节点合并数据
5. **格式化输出**统一Markdown格式
**脚本位置**`backend/scripts/generate_android_agent.py`
**状态**:已发布,可直接使用
### 案例2内容生成助手
**目标**:根据用户需求生成各种类型的高质量内容
**工作流结构**
```
开始 → 需求分析 → 内容类型判断 → [文章生成 | 文案生成 | 脚本生成 | 通用生成] → 内容整合 → 内容优化 → 结束
```
**关键设计**
1. **多分支处理**:根据内容类型选择不同生成策略
2. **内容优化**:添加优化润色节点
3. **格式统一**:确保输出格式一致
**脚本位置**`backend/scripts/generate_content_agent.py`
### 案例3智能需求分析与解决方案生成器
**目标**:分析用户需求并生成专业解决方案
**工作流结构**
```
开始 → 需求理解 → 需求分类 → [技术方案分支 | 业务流程分支] → 方案整合 → 输出优化 → 结束
```
**关键设计**
1. **深度分析**:多步骤需求理解
2. **专业分支**:技术方案和业务流程分开处理
3. **方案整合**:合并各分支结果
---
## 总结
创建Agent是一个系统性的工作需要
1. **明确目标**确定Agent要解决什么问题
2. **设计工作流**:规划节点和连接关系
3. **编写Prompt**:设计清晰、有效的提示词
4. **数据流转**:确保上下文正确传递
5. **测试验证**:充分测试各种场景
6. **持续优化**:根据反馈不断改进
### 关键要点
-**状态设置**:创建时直接设置 `status="published"` 可立即使用
-**数据传递**使用Transform节点保留关键上下文
-**条件分支**:必须设置 `sourceHandle` 才能正确分支
-**Prompt设计**:明确角色、任务、输出格式
-**格式化输出**:添加格式化节点确保输出统一
### 参考资源
- **生成脚本示例**
- `backend/scripts/generate_android_agent.py`
- `backend/scripts/generate_content_agent.py`
- `backend/scripts/generate_smart_agent.py`
- **API文档**
- `backend/app/api/agents.py` - Agent管理API
- `backend/app/api/executions.py` - 执行管理API
- **工作流引擎**
- `backend/app/services/workflow_engine.py` - 工作流执行逻辑
- **提示词文档**
- `androidExampleDemo/多功能android应用智能体的提示词.md`
---
**最后更新**2026-01-20
**版本**v1.0
**作者**Agent开发团队