解构智能体:手把手教你用 CrewAI 打造“网络调研专家”

导读:在大模型时代,Agent(智能体)被认为是下一个爆发点。但如何从一个简单的对话机器人,进化为能独立完成任务的“智能员工”?本文通过一段完整的 CrewAI 代码,深度解构 Agent 的解剖学,带你掌握 ReAct 范式与人设工程的核心技巧。


大家好,我是你们的 AI 领航员。

在上一节课中,我们了解了 Agent 的基本概念。今天,我们直接进入实战环节。

很多初学者在写 Agent 代码时,容易陷入一个误区:只关注代码逻辑,忽略了“人设工程”。结果就是,Agent 虽然能跑,但像个没有灵魂的脚本,稍微复杂的任务就“幻觉”满天飞。

今天分享的这段代码,是一个标准的单 Agent 执行任务示例。它构建了一个**“网络调研专家”**,不仅能搜索,还能深度抓取网页、撰写报告并保存文件。

我们将通过这段代码,深入理解 Agent 的解剖学结构以及ReAct 执行范式


🤖 一、Agent 的解剖学:灵魂三问

在 CrewAI 框架中,定义一个 Agent 核心在于三个参数:role(角色)、goal(目标)、backstory(背景故事)。

这不仅仅是填字段,这是提示词工程(Prompt Engineering)的封装

1. 代码中的“人设”

1
2
3
4
5
6
7
8
9
10
11
searcher = Agent(
role="网络调研专家",
goal="通过系统化的网络搜索和信息提取,完成用户指定的调研任务,并生成结构化的 Markdown 格式调研报告写入文件",
backstory="""你是一位经验丰富的网络调研专家,擅长通过系统化的方法收集、分析和整理网络信息。
你的工作流程遵循以下步骤:
1. **任务分析**:首先深入理解用户任务的意图和需求...
2. **搜索策略**:基于任务需求,生成多组精准的搜索关键词...
3. **深度挖掘(强制要求)**:...必须使用网页抓取工具深入抓取这些网页的完整内容...
...
"""
)

💡 学习要点

  • Role(角色):给模型一个身份锚点。告诉它“你是专家”,它的输出语气和专业度会立刻不同。
  • Goal(目标):明确终点。这里不仅是“搜索”,而是“生成报告并写入文件”。
  • Backstory(背景故事)这是最关键的部分!
    • 在代码中,backstory 占据了最大篇幅。
    • 它不仅仅是背景介绍,更是思维链(Chain of Thought)的硬编码
    • 注意看代码中的第 4 点:“搜索结果的摘要信息通常不够详细…必须使用网页抓取工具”。这是通过人设强行纠正大模型“偷懒”只读摘要的习惯。

📝 记忆口诀:角色定身份,目标定方向,背景定流程。


🛠️ 二、工具集成:给 Agent 装上“手”

没有工具的 Agent 只是聊天机器人。有了工具,它才能改变世界(或者至少改变本地文件)。

1. 代码中的工具配置

1
2
3
4
5
tools=[
ScrapeWebsiteTool(), # 网页抓取:获取详细内容
BaiduSearchTool(), # 百度搜索:获取信息线索
FileWriterTool() # 文件写入:保存劳动成果
]

💡 学习要点

  • 搜索 vs 抓取:这是本示例的精髓。
    • BaiduSearchTool 返回的是摘要(Snippet),信息往往不全。
    • ScrapeWebsiteTool 返回的是全文(Content),信息准确。
    • 最佳实践:代码中的 backstory 反复强调“搜索后必须抓取”。这是为了保证信息的可追溯性准确性
  • 文件操作:Agent 的产出必须落地。FileWriterTool 让 Agent 能将虚拟的思考转化为本地的 .md 文件。

🧠 三、ReAct 范式:Agent 是如何思考的?

代码中有一行 result = crew.kickoff()。当这行代码执行时,Agent 内部发生了什么?

这就是 ReAct 范式(Reasoning + Acting)。

1. ReAct 循环流程

  1. Thought(思考):Agent 分析任务。“我要调研极客时间,我需要先搜索关键词。”
  2. Action(行动):Agent 调用工具。“调用 BaiduSearchTool,参数是‘极客时间’。”
  3. Observation(观察):工具返回结果。“搜索到了 10 条结果,包含链接和摘要。”
  4. Repeat(循环):Agent 再次思考。“摘要不够,我需要调用 ScrapeWebsiteTool 抓取前 3 个链接。”
  5. Final Answer(最终回答):信息收集完毕,撰写报告,调用 FileWriterTool 保存。

2. 代码中的控制

1
2
3
max_iter=100,  # 最大迭代次数,防止 Agent 陷入无限循环
memory=True, # 启用记忆功能,Agent 可以记住之前的对话内容
verbose=True, # 启用详细日志,可以看到 Agent 的思考过程
  • max_iter:防止 Agent 钻牛角尖,比如一直搜索不到满意结果而死循环。
  • verbose=True学习调试神器。在控制台你能亲眼看到 Agent 的 ThoughtAction,这是理解 ReAct 最好的方式。

📝 四、任务与 Crew:组织与执行

有了 Agent 和工具,还需要明确具体的任务(Task)组织(Crew)

1. Task 定义

1
2
3
4
5
task = Task(
description="帮我调研极客时间的相关信息...",
expected_output="完整的 Markdown 格式研究报告并写入文件...",
agent=searcher,
)
  • expected_output:这不仅是给人类看的,更是给 Agent 的验收标准。代码中详细列出了“内容完整性”、“信息准确性”等标准,这能显著提高输出质量。

2. Crew 定义

1
2
3
4
5
crew = Crew(
agents=[searcher],
tasks=[task],
verbose=True,
)
  • Crew 是管家。在单 Agent 场景下,它负责启动流程;在多 Agent 场景下,它负责协调多个 Agent 的协作。

🚀 五、实战建议与避坑指南

基于这段代码,在大家自己尝试时,我有几条建议:

  1. 不要吝啬 Backstory
    很多教程里的 Backstory 只有一句话。但你看示例代码,它写了 10 步流程。你给 Agent 的指令越细致,它犯错的概率越低。 把 Backstory 当作 SOP(标准作业程序)来写。

  2. 强制工具使用
    大模型有惰性,它可能觉得搜索摘要就够了。必须在 Backstory 里用加粗强制要求等词汇,明确告诉它:“不抓取网页内容视为任务失败”。

  3. 关注 LLM 配置
    代码中使用了 aliyun_llm.AliyunLLM。不同的模型对 ReAct 的支持能力不同。如果 Agent 经常陷入循环或工具调用失败,尝试更换更强的模型(如 Qwen-Max 或 GPT-4)。

  4. 观察日志
    运行代码时,不要只看最后的结果。打开 verbose=True,观察 Agent 的每一次思考。这是调试 Agent 行为最直观的方法。


🎓 六、总结

通过这段代码,我们不仅学会了 CrewAI 的 API 调用,更掌握了构建高质量 Agent 的核心心法:

  1. 人设工程:用详细的 Backstory 规范 Agent 的思维链。
  2. 工具组合:搜索 + 抓取 + 写入,形成闭环。
  3. ReAct 机制:理解 思考 - 行动 - 观察 的循环本质。
  4. 验收标准:在 Task 中明确 expected_output 的质量要求。