我调整了 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 有什么区别?
| 特性 | memory | cache |
|---|---|---|
| 作用 | 记住对话上下文 | 缓存 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+ 测试实战内容!
📚 系列文章索引
| 序号 | 文章 | 状态 |
|---|---|---|
| 01 | CrewAI 入门指南 | ✅ 已完成 |
| 02 | Agent 角色设计方法论 | ✅ 已完成 |
| 03 | 你的第一个 Agent | ✅ 已完成 |
| 04 | 理解核心参数 | ✅ 本篇 |
| 05 | 角色设计方法论 | 📝 下一篇 |
| ... | ... | ... |
作者:测试员周周,14 年测试经验,专注 AI+ 测试实战