第 26 章 · 最佳实践与生产清单
本章目标:把全教程散落的工程纪律收拢为可执行清单——提示词打磨、工具治理、成本控制、安全与可观测,最后给出上线前 checklist 与十大反模式。
26.1 role / goal / backstory 打磨清单
角色提示词是 CrewAI 的第一生产力。逐条自检:
python
import os
from crewai import Agent, LLM
llm = LLM(
model="openai/deepseek-chat",
base_url="https://api.deepseek.com/v1",
api_key=os.getenv("DEEPSEEK_API_KEY"),
)
# ✅ 好的角色定义:职责单一 + 行为准则可验证 + 边界明确
good_analyst = Agent(
role="电商复购分析师",
goal="从订单数据中定位复购率下滑的品类并给出 2 个可执行假设",
backstory=(
"你做过 5 年增长分析。工作准则:\n"
"1) 每个结论必须引用具体数字;\n"
"2) 区分'相关'与'因果',不确定就明说;\n"
"3) 建议必须包含预期效果量级与验证方法。\n"
"你不负责:写代码实现、做营销文案。"
),
llm=llm,
max_iter=5,
)自检清单:
- [ ]
role是"职能+领域"而不是头衔("电商复购分析师" > "高级专家"); - [ ]
goal包含可判定的产出形态("2 个假设"能验收,"深入分析"不能); - [ ]
backstory写行为准则与负面清单(不负责什么),每条都能被裁判打分; - [ ] 一个 Agent 只对一个 Task 负责;发现两个任务共用一个角色且互相矛盾时,拆角色。
26.2 工具治理:粒度、数量与返回值
| 纪律 | 阈值/做法 | 违反后果 |
|---|---|---|
| 单 Agent 工具数 | 建议 <10 个 | 选择错误率随数量上升 |
| 粒度 | 一个工具=一个动词(search/fetch/read) | "万能工具"参数复杂易错 |
| 参数校验 | 必须有 Pydantic args_schema | 模型乱填参数静默失败 |
| 返回值 | 裁剪到决策所需的最小信息 | token 失控、上下文污染 |
| 危险操作 | 白名单过滤 + 二次确认(human_input) | 删库跑路 |
python
from crewai.tools import tool
@tool("search_orders")
def search_orders(query: str, limit: int = 5) -> str:
"""按关键词搜索订单,最多返回 limit 条摘要(id/金额/日期)。
不要用本工具做统计,统计请用 count_orders。"""
# docstring 是模型选择工具的唯一依据:
# 第一行说清"做什么",第二行划定"不做什么"
return f"[{query}] 共命中 128 条,展示前 {limit} 条摘要..."26.3 成本控制:模型分级与迭代上限
三层省钱手段按收益排序:
- 模型分级路由:分类/抽取/格式化用小模型,创作/推理用大模型。同一个 crew 里混搭完全合法:
python
cheap_llm = LLM(
model="openai/deepseek-chat", temperature=0,
base_url="https://api.deepseek.com/v1", api_key=os.getenv("DEEPSEEK_API_KEY"),
)
strong_llm = LLM(
model="openai/deepseek-reasoner", temperature=0.7,
base_url="https://api.deepseek.com/v1", api_key=os.getenv("DEEPSEEK_API_KEY"),
)
router_agent = Agent(role="意图分类器", goal="把用户请求分到 6 个预定义类别",
backstory="只输出类别编号,从不解释", llm=cheap_llm, max_iter=2)
analyst_agent = Agent(role="资深分析师", goal="对分类结果深度归因",
backstory="引用数字说话的行业专家", llm=strong_llm, max_iter=4)max_iter逐角色设防:默认值偏宽松,生产建议 2–6;失控循环是成本爆炸的第一原因;max_rpm保护配额:限制每分钟请求数,既防上游限流又防重试风暴;配合第 21 章 token_usage 护栏形成闭环。
26.4 密钥管理与安全底线
- 密钥只存在于环境变量/Secret 管理系统中,
.env进.gitignore,镜像零密钥(第 22 章); - MCP server 与第三方工具先审后接:白名单过滤高危工具(第 19 章);
- 对外暴露的 kickoff API 必须加鉴权与限流——crew 执行是真金白银的算力;
human_input=True用于不可逆操作前的确认闸门;- 日志脱敏:prompt 里若带用户数据,接入观测平台前先评估合规边界。
26.5 可观测三件套
生产 crew 的最低配置(对应第 21 章):
- metrics:每次 kickoff 记录
token_usage四字段 + 墙钟耗时入库; - callbacks:
task_callback把每个任务的产出摘要与用量推送到日志管道,实现环节级归因; - tracing:Langtrace 一行接入或 OpenLit→Langfuse,保留 trace 至少两周用于回溯。
metrics + callback 的最小落地示例:
python
import json
import time
from pathlib import Path
def audit_task(output):
"""挂在每个 Task 的 callback 上:环节级用量与产出摘要落盘"""
record = {
"ts": time.time(),
"description": output.description[:50],
"chars": len(output.raw or ""),
"token_usage": str(getattr(output, "token_usage", "")),
}
with Path("task_audit.jsonl").open("a") as f:
f.write(json.dumps(record, ensure_ascii=False) + "\n")把 callback=audit_task 加到关键任务上,配合每次 kickoff 结束写入 result.token_usage,就能用一条 jq 命令回答“这个月哪个任务最烧钱”。
26.6 常见反模式 TOP 10
- 万能角色:一个 Agent 既调研又写作又审核 → 拆分角色,单一职责;
- 无上限迭代:不设
max_iter→ 循环烧钱直到超时; - context 大水漫灌:所有任务 context 全部历史 → 只传该环节需要的上游产物;
- 工具返回整张表:DataFrame 全量 to_string → 裁剪到 top-N 与关键列;
- hierarchical 万金油:明明顺序固定却上管理者流程 → sequential 能解决就不用分层;
- LLM 做确定性判断:让模型比较两个日期大小 → 提取成代码逻辑或工具;
- 密钥硬编码:key 写进 yaml/源码 → 环境变量注入;
- 无评估上线:靠感觉判断质量 → 第 20 章回归集 + LLM 裁判双保险;
- 内存态部署:job 表/文件产物放进程本地 → 无状态化外置存储;
- 静默吞异常:kickoff 失败只打印一行 → 回调上报 + checkpoint 可恢复。
26.7 上线前 checklist
text
功能正确性
[ ] 回归评估集全部通过(固定输入 + 特征断言)
[ ] crewai test -n 3 各任务均分 >= 阈值(如 8.0)
稳定性
[ ] 每个 Agent 设置了 max_iter(<=6)
[ ] 外部依赖(搜索/API 工具)有超时与失败降级
[ ] 开启 checkpoint,演练过中断恢复
成本
[ ] token 护栏断言在 CI 中生效
[ ] 分类/小任务已路由到低档模型
安全
[ ] 密钥全部走环境变量,git 历史无泄露
[ ] kickoff 接口有鉴权、限流
[ ] 高危工具已过滤或有 human_input 闸门
可观测
[ ] usage_metrics 入库并有告警阈值
[ ] tracing 平台可见完整调用链
部署
[ ] 服务无状态化四查通过(job 表/产物/记忆/检查点)
[ ] Docker 镜像不含密钥,非 root 运行
[ ] 回滚方案:上一个可用版本镜像 + 配置快照本章小结
- 角色提示词三要素:可验收的 goal、行为准则式 backstory、明确的负面清单;
- 工具治理五纪律:<10 个、单动词粒度、args_schema 校验、最小返回值、危险操作加闸门;
- 成本三板斧:模型分级路由 > max_iter 设防 > max_rpm 限流;
- 安全与可观测是底线配置:密钥环境变量化、metrics/callbacks/tracing 三件套;
- 十大反模式中最贵的前三名:无上限迭代、工具大水漫灌、内存态部署。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 以下哪个 goal 写法最符合"可判定产出"原则?
2. 关于单 Agent 的工具数量,教程建议的上限和理由是?
3. 某团队把"判断用户输入是否包含手机号"交给 Agent 用自然语言推理完成,这属于哪种反模式?
4. 上线前发现 crew 偶发死循环导致账单暴涨,优先落实的两道防线是?
🛠️ 动手实践
- 用本章 26.1 的清单逐条审查你在第 23、24 章写的 agents.yaml / Agent 定义,找出至少 2 处不符合"可判定产出"的描述并改写,对比修改前后的
crewai test -n 2评分变化。 - 为你的项目实现"成本仪表盘"脚本:读取最近 N 次 kickoff 的 token_usage 记录(自己落库),输出每日成本趋势和 Top3 消耗任务,超标时以非零退出码结束。
- 对照 26.7 checklist 完成一次完整的"上线演练":从回归集、max_iter 审计、checkpoint 恢复演练到无状态化四查,记录每一项的实际证据(命令输出/截图说明),补齐缺失项后重新演练一遍。
🎉 全教程完。回顾学习路径:核心概念(01–05)→ 模型与工具(06–08)→ 流程与记忆(09–13)→ 工程化(14–19)→ 评估观测部署(20–22)→ 综合实战(23–25)→ 生产清单(本章)。接下来最好的练习是把你自己业务中的一个真实流程改造成 CrewAI 应用,并让这份 checklist 替你把关。