Files
aiagent/创建Agent经验.md
2026-01-20 18:05:31 +08:00

1385 lines
22 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 创建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开发团队