2.1 Agent (智能体)


2.1 Agent (智能体)

本节约处在第二章第一站:零件手册的第一页,Agent。很多新手把 Agent 当成"一个会聊天的模型",结果写出一堆行为飘忽的角色。我们说清楚:Agent 是一个被系统设定约束住的决策单元,它决定"怎么干",但不决定"干哪件"——后者是 Task 的事。

先看一个 Agent 在运行时的

先看一个 Agent 在运行时的内部结构,避免把它想象成黑盒:

先看一个 Agent 在运行时的

Agent 的核心字段各有分工,不要把约束都堆进 backstory:

- role:一句话身份,决定它

  • role:一句话身份,决定它在团队里被如何看待,也影响系统提示的开头。
  • goal:这个角色要达成的成果,是行为方向的"指南针",比人设更影响决策。
  • backstory:背景故事,用来塑造语气与视角,建议只放风格与经验,不放具体任务约束。
  • tools:可调用工具列表,没有就纯靠语言模型。
  • allow_delegation:是否允许把活转给队友,默认 False 更可控。
  • verbose:是否打印思考过程,调试时务必开。
  • llm:可单独指定模型,不写则用全局默认。

下面演示一个"保守型研究员"和一个"激进型写手"如何靠字段差异表现出不同风格。注意两者用的是同一个底层模型,差异来自设定。

from crewai import Agent conservative = Agent( role="保守研究员", goal="只输出有出处支撑的结论", backstory="在金融风控岗位工作八年,习惯标注不确定性", verbose=True, allow_delegation=False, ) aggressive = Agent( role="激进写手", goal="快速产出有感染力的初稿", backstory="新媒体主编,追求传播力,容忍一定夸张", verbose=True, allow_delegation=False, ) # 2.1 Agent (智能体)

运行这类对比时你会发现:模型能力相同,但 goalbackstory 把输出分布推向了不同区间。这正是角色化设计的用处——用设定换可控性,而不是靠反复调温度。

再讲一个工程上容易踩的坑:delegation。打开它后,Agent 在卡住时可以呼叫其他成员帮忙,听起来美好,实则让执行路径变随机,日志也更难读。我们的建议是:在不确定业务里默认关闭,等流程真的出现"某角色常需他人补位"的明确信号,再针对性开启,而不是一上来全开。

# 默认关闭委派,流程可预测 researcher = Agent( role="研究员", goal="收集事实", backstory="严谨", allow_delegation=False, # 关键:先关 verbose=True, ) # 只有当多个任务间确实需要互相补位时,才对特定角色开启 coordinator = Agent( role="协调员", goal="在成员间分派补漏", backstory="熟悉每个人的特长", allow_delegation=True, # 仅协调角色开启 verbose=True, )

关于模型选择,Agent 级 llm 字段允许你给不同角色配不同模型:贵且强的模型给写结论的角色,便宜快的给做检索摘要的角色,整体账单能降一截。用法是指定一个 LLM 实例:

from crewai import LLM, Agent cheap = LLM(model="openai/gpt-4o-mini", temperature=0.2) strong = LLM(model="openai/gpt-4o", temperature=0.4) summarizer = Agent(role="摘要员", goal="压缩文本", backstory="简洁", llm=cheap, verbose=True) analyst = Agent(role="分析师", goal="深度解读", backstory="严谨", llm=strong, verbose=True)

这里 temperature 越低,输出越稳;越高,越有变化。多智能体系统我们一般压低温度,把"创意"留给 Task 描述,而不是让模型在每一步自由发挥。

收尾给一个判断标准:当你发现某个

收尾给一个判断标准:当你发现某个 Agent 的 backstory 越写越长、越写越像任务清单,说明约束放错了地方——把它挪到对应 Task 的 expected_output 里。Agent 负责"成为谁",Task 负责"这次做成什么样",这条边界守住了,第二章后面几节才好懂。

Agent 的关键参数与取舍

Agent 除了 role/goal/backstory 三件套,还有几个直接影响行为的参数,写错一个就可能让系统失控或爆成本:

参数 作用 我们常用的取值
allow_delegation 能否把活派给别人 sequential 下 False,hierarchical 下 True
verbose 是否打印思考过程 开发期 True,生产期 False
max_iter 单 agent 最大反思轮数 15~25,防死循环
max_retry_limit 工具调用失败重试次数 2~3
memory 是否启用长期记忆 需要跨任务记上下文时 True

⚠️ 常见坑:把 allow_delegation 在 sequential 流程里开成 True,会让本应顺序执行的 agent 互相甩锅,链路变不可预测。我们只在 hierarchical 流程才打开它。

下面演示一个带工具与限速的 Agent,注释里标出每个参数为什么叫这个名字:

from crewai import Agent from crewai_tools import SerperDevTool search = SerperDevTool() # 外部搜索工具 analyst = Agent( role="市场分析师", goal="给出可落地的市场判断", backstory="十年行研,只读一手数据", tools=[search], # 给它一把"查资料"的刀 allow_delegation=False, # 顺序流,不甩锅 verbose=True, max_iter=20, # 最多反思 20 轮,超出就停 max_retry_limit=2, # 工具挂了最多重试 2 次 ) print(analyst.role, analyst.goal)

💡 关键直觉:Agent 是"演员"不是"剧本"。剧本是 Task,演员只负责按自己的人设去演剧本。所以调 Agent 时改的是人设与工具,调流程时改的是 Task 与 Process——这两层别混。当你发现某个 agent 总跑偏,先问是人设没写清,还是剧本(Task)没写清。

# 想让两个 agent 共享同一把工具也很自然 shared = [search] a = Agent(role="A", goal="g", backstory="b", tools=shared, verbose=True) b = Agent(role="B", goal="g2", backstory="b2", tools=shared, verbose=True)

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U