【CrewAI系列4】Agent 输出太水?80% 新手都踩的坑,我靠 3 个参数救了回来

21 阅读14分钟

 我调整了 3 个参数,Agent 输出质量提升 10 倍

作者:14 年测试/QA 老兵

系列:CrewAI 多 Agent 测试框架实战(第 4 篇,暂定24篇会持续输出)

字数:约 4,500 字

阅读时间:11 分钟

收益:学完让你的 Agent 输出质量提升 3-5 倍


你是不是也经历过这些

❌ 输出太水 —— Agent 生成的内容空洞,没法直接用

❌ 风格不对 —— 想要专业输出,结果是口水文

❌ 答非所问 —— 让写测试用例,给你讲大道理

❌ 反复重试 —— 执行 10 次,8 次不满意,浪费时间

❌ 成本爆炸 —— Token 花了不少,输出没法看 

如果中了一条,这篇文章就是为你写的。


换个思路:参数配置对了,输出自然好

想象一下:

  • 你定义的 role,让 Agent 瞬间变成 10 年专家

  • 你设定的 goal,让 Agent 知道具体要做什么

  • 你编写的 backstory,让 Agent 输出专业深度

这是调整参数后就能做到的。 

今天这篇文章,我就把 Agent 参数配置这件事彻底讲透。 

看完你就能: 

  • 写出专业的 role 定义

  • 设定清晰的 goal 目标

  • 编写丰富的 backstory

  • 选择合适的可选参数

让你的 Agent 输出质量提升 3-5 倍。


实测:参数调整前后的效果对比

调整前(新手配置)

PYTHON复制

agent = Agent(
    role="助手",
    goal="写测试用例",
    backstory="你有测试经验"
)

task = Task(
    description="为登录功能写测试用例",
    agent=agent
)

输出结果: - 用例数量:5 条 - 输出字数:约 200 字 - 测试覆盖度:60%

  • 专业度:⭐⭐

输出内容:

TEXT复制

1. 测试正常登录
2. 测试密码错误
3. 测试用户不存在
4. 测试空密码
5. 测试锁定用户

调整后(专家配置)

PYTHON复制

agent = Agent(
    role="资深测试设计师 (Senior Test Designer)",
    goal="设计全面的测试用例,覆盖正常/边界/异常场景,至少 20 条",
    backstory="""你是拥有 10 年经验的测试专家,擅长:
    1. 测试用例设计(等价类、边界值、场景法)
    2. 风险评估和优先级划分
    
    你的工作风格:
    - 结果导向,关注测试覆盖率
    - 注重细节,不放过任何边界情况
    
    你曾经在多个大型电商系统负责测试设计。
    你深知:好的测试用例是测试成功的一半。"""
)

task = Task(
    description="为登录功能设计测试用例",
    agent=agent
)

输出结果: - 用例数量:23 条 - 输出字数:约 1200 字 - 测试覆盖度:95%

  • 专业度:⭐⭐⭐⭐⭐

输出内容(部分):

TEXT复制

## 正常场景
1. 正确用户名 + 正确密码 → 登录成功,跳转首页
2. 正确用户名 + 正确密码 + 记住登录 → 7 天内免登录

## 异常场景
3. 正确用户名 + 错误密码 → 提示"密码错误"
4. 错误用户名 + 任意密码 → 提示"用户不存在"
5. 已锁定用户 + 正确密码 → 提示"账户已锁定,请联系管理员"

## 边界场景
6. 用户名长度为最小值(3 字符)→ 登录成功
7. 用户名长度为最大值(20 字符)→ 登录成功
8. 密码长度为最小值(6 字符)→ 登录成功
9. 密码长度为最大值(32 字符)→ 登录成功

## 安全场景
10. SQL 注入尝试 → 拦截并记录安全日志
11. XSS 脚本注入 → 拦截并记录安全日志
12. 连续 5 次密码错误 → 账户锁定 30 分钟
...

参数没花一分钱,输出质量提升 5 倍。


CrewAI Agent 完整参数列表

完整代码示例

PYTHON复制

from crewai import Agent, LLM
from crewai.tools import BaseTool

# 自定义工具
class MyTool(BaseTool):
    name: str = "my_tool"
    description: str = "我的工具"
    
    def _run(self) -> str:
        return "工具执行结果"

# 创建 LLM
llm = LLM(
    model="qwen-plus",
    api_key="sk-your-key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 创建完整配置的 Agent
agent = Agent(
    # ========== 必填参数 ==========
    role="测试经理",                    # 角色
    goal="制定测试计划",                # 目标
    backstory="你是拥有 15 年经验的...", # 背景故事
    
    # ========== 可选参数 ==========
    llm=llm,                            # LLM 配置
    tools=[MyTool()],                   # 工具列表
    verbose=True,                       # 详细日志
    allow_delegation=False,             # 允许委派
    allow_code_execution=False,         # 允许执行代码
    max_iter=15,                        # 最大迭代次数
    max_rpm=None,                       # 每分钟最大请求数
    max_execution_time=None,            # 最大执行时间
    memory=True,                        # 启用记忆
    cache=True,                         # 启用缓存
    human_input=False,                  # 是否需要人工输入
)

参数分类与重要性

类别参数重要性影响输出质量
必填role、goal、backstory⭐⭐⭐⭐⭐直接决定
推荐llm、tools、verbose⭐⭐⭐⭐显著提升
可选max_iter、memory、cache⭐⭐⭐优化性能
高级allow_delegation、max_rpm⭐⭐特殊场景

参数调优的本质,是把你的专业经验,翻译成 Agent 能理解的语言。


必填参数详解(决定 80% 的输出质量)

role(角色)—— 定义身份

作用: 定义 Agent 的身份和专业领域 ❌ 不好的示例:

PYTHON复制

role="助手"           # 太模糊,不知道擅长什么
role="测试人员"        # 缺乏专业性,像初级员工

✅ 好的示例:

PYTHON复制

role="测试经理 (Test Manager)"
role="资深测试设计师 (Senior Test Designer)"
role="性能测试专家 (Performance Specialist)"
role="安全测试工程师 (Security Test Engineer)"

命名公式:

TEXT复制

role = [经验级别] + [专业领域] + [英文对照]

经验级别:初级/中级/高级/资深/专家
专业领域:测试设计/性能测试/安全测试/自动化测试

效果对比:

role 定义输出质量专业度适合场景
"助手"⭐⭐简单问答
"测试人员"⭐⭐⭐⭐⭐基础任务
"测试经理 (Test Manager)"⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐专业场景

role 定义的是身份,身份决定输出高度。


goal(目标)—— 定义方向

作用: 定义 Agent 要完成的具体任务 ❌ 模糊的目标:

PYTHON复制

goal="做好测试"        # 不可衡量,什么叫"好"?
goal="写文档"          # 太宽泛,写什么文档?
goal="执行测试"        # 怎么执行?记录什么?

✅ 明确的目标:

PYTHON复制

goal="制定测试计划,确保 P0 用例覆盖率 100%"
goal="设计全面的测试用例,覆盖正常/边界/异常场景"
goal="执行 API 测试,记录响应时间和错误信息"
goal="分析测试结果,生成包含根本原因的 Bug 报告"

命名公式:

TEXT复制

goal = [核心动作] + [产出物] + [质量要求]

核心动作:制定/设计/执行/分析/生成
产出物:测试计划/测试用例/测试报告/Bug 报告
质量要求:覆盖率 100%/至少 20 条/包含根本原因

goal 定义的是方向,方向清晰才不会跑偏。


backstory(背景故事)—— 定义深度

作用: 让 Agent 更"真实",输出更专业 完整结构:

PYTHON复制

backstory="""
【经验年限】
你是拥有 X 年经验的 [角色],擅长:
1. [核心技能 1]
2. [核心技能 2]
3. [核心技能 3]

【工作风格】
你的工作风格:
- [风格特点 1]
- [风格特点 2]

【项目经验】
你曾经在 [项目类型] 负责 [具体工作]。

【价值观】
你深知 [职业理念]。
"""

完整示例:

PYTHON复制

backstory="""
你是拥有 15 年经验的测试经理,擅长:
1. 根据需求评估测试范围和工作量
2. 制定合理的测试计划和优先级
3. 识别高风险区域并重点测试

你的工作风格:
- 结果导向,关注测试覆盖率
- 风险驱动,优先测试核心功能
- 数据驱动,用指标说话

你曾经在多个大型电商系统负责测试管理。
你深知测试的价值不在于找 bug,而在于降低业务风险。
"""

效果对比:

backstory 长度输出字数专业度建议场景
10 字100 字⭐⭐简单任务
50 字300 字⭐⭐⭐常规任务
200 字1000+ 字⭐⭐⭐⭐⭐专业场景

backstory 定义的是深度,深度决定输出价值。


推荐参数详解(显著提升能力)

llm(LLM 配置)

作用: 指定使用的语言模型 方式 1:使用环境变量(推荐)

PYTHON复制

# .env 文件
DASHSCOPE_API_KEY=sk-your-key
OPENAI_MODEL=qwen-plus

# 代码中不需要配置
agent = Agent(
    role="测试经理",
    goal="制定测试计划"
    # 自动使用环境变量
)

方式 2:显式配置

PYTHON复制

from crewai import LLM

llm = LLM(
    model="qwen-plus",
    api_key="sk-your-key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

agent = Agent(
    role="测试经理",
    goal="制定测试计划",
    llm=llm  # 显式传入
)

常用模型对比:

模型价格延迟适用场景
qwen-plus¥0.004/1K tokens平衡性能和成本
qwen-max¥0.04/1K tokens高质量输出
qwen-turbo¥0.002/1K tokens快速响应

建议: 开发用 qwen-plus,生产根据成本选择。


tools(工具列表)

作用: 扩展 Agent 能力,让它能"做事" 示例:

PYTHON复制

from crewai.tools import BaseTool
import requests

class APITestTool(BaseTool):
    name: str = "api_test"
    description: str = "发送 HTTP 请求测试 API"
    
    def _run(self, url: str) -> dict:
        response = requests.get(url)
        return {"status": response.status_code, "body": response.text}

# 使用工具
agent = Agent(
    role="测试工程师",
    goal="执行 API 测试",
    tools=[APITestTool()]  # 挂载工具
)

有无工具对比:

配置能力输出
无工具只能"想象"虚构的测试结果
有工具可以真实调用真实的 API 响应

工具让 Agent 从"空谈"变成"实干"。


verbose(详细日志)

作用: 控制日志输出级别 verbose=False(生产环境):

PYTHON复制

agent = Agent(..., verbose=False)

输出:

TEXT复制

✅ 执行完成!
结果:测试计划已完成

verbose=True(开发调试):

PYTHON复制

agent = Agent(..., verbose=True)

输出:

TEXT复制

🚀 Crew Execution Started
📋 Task Started
🤖 Agent Started
💭 Agent 思考中...
🔧 Agent 使用工具:api_test
✅ Agent Final Answer
✅ 执行完成!

建议: - 开发调试 - verbose=True(看详细过程)

  • 生产环境 - verbose=False(只输出结果)

可选参数详解(优化性能)

max_iter(最大迭代次数)

作用: 限制 Agent 思考次数,防止无限循环 默认值: 15 使用场景:

PYTHON复制

# 简单任务,减少迭代(节省时间和 Token)
agent = Agent(..., max_iter=5)

# 复杂任务,增加迭代(提高输出质量)
agent = Agent(..., max_iter=25)

效果对比:

max_iter执行时间输出质量适用场景
5⭐⭐⭐简单问答
15中等⭐⭐⭐⭐常规任务
25⭐⭐⭐⭐⭐复杂分析

memory(记忆)

作用: 启用记忆机制,Agent 可以记住之前的对话 启用记忆:

PYTHON复制

agent = Agent(..., memory=True)

效果: - ✅ Agent 可以记住上下文 - ✅ 多轮对话更连贯

  • ❌ 占用更多内存

建议: - 多轮对话 - memory=True

  • 单次任务 - memory=False

cache(缓存)

作用: 启用缓存,避免重复调用 LLM 启用缓存:

PYTHON复制

agent = Agent(..., cache=True)

效果: - ✅ 相同请求直接返回缓存结果 - ✅ 节省 Token 和费用

  • ❌ 首次执行后才有缓存

建议: 始终启用 cache=True(省钱!)


参数组合最佳实践(直接抄作业)

测试经理 Agent

PYTHON复制

manager = Agent(
    role="测试经理 (Test Manager)",
    goal="制定测试计划,确保测试覆盖率≥95%",
    backstory="""你是拥有 15 年经验的测试经理,擅长:
    1. 根据需求评估测试范围和工作量
    2. 制定合理的测试计划和优先级
    3. 识别高风险区域并重点测试
    
    你的工作风格:
    - 结果导向,关注测试覆盖率
    - 风险驱动,优先测试核心功能
    - 数据驱动,用指标说话
    
    你曾经在多个大型电商系统负责测试管理。
    你深知测试的价值不在于找 bug,而在于降低业务风险。""",
    llm=None,                    # 使用环境变量
    tools=[],                    # 不需要工具
    verbose=True,                # 开发时启用
    allow_delegation=False,      # 亲自制定计划
    max_iter=20,                 # 复杂任务
    memory=True,                 # 记住上下文
    cache=True                   # 启用缓存
)

测试工程师 Agent

PYTHON复制

engineer = Agent(
    role="测试工程师 (Test Engineer)",
    goal="执行测试用例,记录详细结果",
    backstory="""你是执行力强的测试工程师,擅长:
    1. 准确执行测试用例
    2. 详细记录测试步骤和结果
    3. 发现并复现问题
    
    你的工作风格:
    - 严格按照测试用例执行
    - 详细记录每一步操作
    - 及时报告阻塞性问题
    
    你有 5 年自动化测试经验,熟悉 API 测试、性能测试、UI 测试。
    你相信细节决定成败,每一个测试结果都可能揭示重要的问题。""",
    llm=None,                    # 使用环境变量
    tools=[APITestTool()],       # 需要工具
    verbose=True,                # 开发时启用
    allow_delegation=False,      # 亲自执行
    max_iter=15,                 # 标准迭代
    memory=False,                # 不需要记忆
    cache=True                   # 启用缓存
)


常见问题 FAQ

Q1: 参数太多记不住怎么办?

解决: 使用模板

PYTHON复制

# 保存为 agent_template.py
def create_agent(role, goal, backstory, tools=[]):
    return Agent(
        role=role,
        goal=goal,
        backstory=backstory,
        verbose=True,
        allow_delegation=False,
        max_iter=15,
        memory=True,
        cache=True,
        tools=tools
    )

# 使用时
manager = create_agent(
    role="测试经理",
    goal="制定测试计划",
    backstory="..."
)

Q2: 如何选择合适的 max_iter?

建议:

任务类型max_iter说明
简单问答5-10快速响应
文档生成15-20保证质量
复杂分析20-25深度思考

Q3: memory 和 cache 有什么区别?

特性memorycache
作用记住对话上下文缓存 LLM 响应
适用多轮对话重复请求
内存占用较多占用较少
建议按需启用始终启用

Q4: 输出还是不满意怎么办?

排查步骤: 1. 检查 role 是否够专业(加经验级别) 2. 检查 goal 是否够具体(加质量要求) 3. 检查 backstory 是否够详细(加工作风格) 4. 增加 max_iter(给更多思考时间)


📢 互动话题 + 福利

你的 Agent 输出质量如何? A. 很好,参数配置得当,输出可直接用 B. 一般,偶尔输出不满意,需要修改 C. 较差,经常需要手动调整 D. 还没开始用 Agent 评论区告诉我你的选择!


🎁 双重福利

福利 1:点赞福利 送 《Agent 参数配置模板》 (含 5 个专业 Agent 定义 + 使用文档),私信我获取一下哈。。

福利 2:关注福利(无限量) 关注「测试员周周」,获取: - ✅ Agent 参数速查表(PDF) - ✅ 通用 Agent 模板(可直接复制),私信我获取一下哈。

  • ✅ 本文完整代码示例

💡 建议两个都拿:通用模板免费,进阶模板更专业。


为什么送这个模板? 写这个系列 24 篇,经常有读者问: "周周,参数太多了记不住怎么办?" "能不能给个模板,我直接套用?" 这次一次性给你。 

模板里包含:

  • 测试经理 Agent(完整配置)

  • 测试用例设计师 Agent(带工具)

  • 测试执行工程师 Agent(带日志)

  • Bug 分析专家 Agent(带记忆)

  • 性能测试专家 Agent(带限流)

直接复制,改改就能用。 省掉你 3 天摸索时间。


总结:

role 定义的是身份,身份决定输出高度。

goal 定义的是方向,方向清晰才不会跑偏。

backstory 定义的是深度,深度决定输出价值。

参数调优的本质,是把你的专业经验,翻译成 Agent 能理解的语言。

下一步: 

第 5 篇:角色设计方法论(如何写出专业的 role)

第 6 篇:backstory 写作技巧(让 Agent 更"真实")


作者说:参数配置是基本功,熟练掌握后可以根据场景灵活调整。 欢迎关注「测试员周周」,获取更多 AI+ 测试实战内容!


📚 系列文章索引

序号文章状态
01CrewAI 入门指南✅ 已完成
02Agent 角色设计方法论✅ 已完成
03你的第一个 Agent✅ 已完成
04理解核心参数✅ 本篇
05角色设计方法论📝 下一篇
.........

作者:测试员周周,14 年测试经验,专注 AI+ 测试实战