用 CrewAI 构建研究与写作流程

原标题Building a Research and Writing Flow with CrewAI

Matthew Berman 与 CrewAI 创始人 João Moura 构建并调试一个双 crew 工作流,用于规划和撰写教育文章。

JMJoão Moura嘉宾 · CrewAI
频道
Matthew Berman
发布
2024年11月12日
视频
1:42:56
阅读
11 分钟
幻灯片
7
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

Matthew Berman 披露自己投资了 CrewAI,并与创始人 João Moura 合作,将现有的研究与写作 crew 改造成事件驱动流程。研究 crew 生成结构化计划,第二个 crew 逐节撰写;两人随后调试配置、数据传递、模型选择和审核输出。最后,他们完成一个原型,并将来源核验和人工审核列为后续工作。

  1. 1先规划再写作Moura 建议先由一个 crew 负责研究与规划,再由另一个 crew 逐节写作。
  2. 2结构化计划Pydantic 计划保存章节信息,让流程可以逐项遍历。
  3. 3传入当前章节两人发现写作循环漏传了当前章节,于是更新输入和任务定义。
  4. 4审核输出与最终内容质量评估报告起初取代了文章正文;他们修改预期输出,要求返回修订后的文字。
  5. 5原型与后续工作流程生成了文本文件,但来源核验、深入审核和提示词优化仍有待完成。

要点建议

  1. 构建长文时,可以将研究和规划与逐节写作分开。
  2. 结构化的 Pydantic 计划让章节和来源更容易传递给后续代码。
  3. 每次调用写作 crew 时,既要传入共享的主题和受众信息,也要传入具体章节。
  4. 如果工作流要保存修订后的内容,最终审核智能体就必须返回这份内容。
  5. 检查追踪记录、成本和实际输出,并对照来源核实生成内容。
  6. 教程展示的是 2024 年的 CLI 和 API,可能与当前 CrewAI 版本不同。
全文

按章节阅读整理后的全文

只看原始文稿
01

原有 crew 与新计划

Berman 解释教育内容的使用场景并披露自己投资了 CrewAI。Moura 建议将研究规划与逐节写作分开。

Matthew Berman 欢迎 CrewAI 创始人兼首席执行官 João Moura 做客,一起扩展他们在上一期视频中开始构建的教育内容工作流。Berman 披露自己是 CrewAI 的投资人,并称它是自己最喜欢的智能体框架。他们的目标是研究 AI 主题,为教育内容门户生成有用的初稿。

Berman 最初的 crew 包含一位使用 Serper 搜索的研究员和一位根据研究结果写作的内容创作者。一份关于大语言模型微调的示例报告还算不错,但尽管他反复要求全面覆盖,篇幅和细节仍不如他希望的那样充分。他还在考虑加入审核智能体。

Berman 说,在他的实验中,OpenAI 的 o1 模型生成了更详细的报告,但成本和耗时都高得多。Moura 表示,根据他的经验,o1 在智能体工作流中有时会在使用可用工具之前推断答案,并产生幻觉。这些是两人的观察,不是对模型质量的受控比较。

Moura 建议把规划与写作分开:先研究主题,再创建大纲,说明各节及其重点,最后开始写作。末尾还可以安排审核员。对于更长的文档,他建议使用两个 crew:一个负责研究和规划,另一个按计划逐节撰写。

Berman 还用 Langtrace 查看追踪记录、成本和耗时;他表示 Langtrace 没有赞助这期视频。Moura 强调,可观测性是构建智能体系统的有用部分。接下来,他们将这个分工方案变成可以运行的 flow。

02

创建并理解 flow

两人创建 flow,研究启动函数和监听函数,再用两个 crew 替换初始的写诗示例。

他们使用当时的 `crewai create flow` 命令启动新流程,并将现有 crew 移到 flow 的 crews 目录下作为参考。环境配置放在 flow 层。教程展示的是 2024 年版本的 CrewAI,因此读者应查看当前文档,确认命令和 API 是否有所变化。

Moura 将 flow 解释为连接 crew 和普通 Python 代码的轻量编排层。带有 `@start` 标记的函数启动工作,带有 `@listen` 标记的函数则在指定的前一个函数结束后运行。初始的写诗示例依次生成句子数量、生成诗歌并保存。

Flow 启动与监听示例
幻灯片 1 / 7Flow 启动与监听示例初始代码展示了函数如何触发后续工作。

对于他们的内容系统,第一步将运行研究 crew 并生成计划。然后,监听步骤在循环中调用写作 crew,每个章节调用一次。这样可以明确结构和顺序,而不是要求一个智能体一次完成整篇长文的研究和写作。

他们重命名初始 flow 和函数,移除写诗专用的状态,并为两个阶段留下占位符。Moura 解释,空的 Python 函数需要 `pass` 之类的语句。随后他们运行 flow 绘图命令,查看各步骤的简单可视化表示。

flow 图可以进一步加入条件、路由器或监听器。Moura 举例说,后续可以用 Python 函数监听已完成的内容,再通过 API 推送到 CMS。Berman 认为这符合他打算建立的发布流程,但他们在本次演示中没有实现。

他们通过 CLI 帮助找到正确语法,为 flow 添加研究 crew 和内容写作 crew,并删除写诗示例 crew。每个新 crew 都用 YAML 定义智能体和任务。原有 crew 暂时保留,供他们参考 Berman 已写好的角色和提示词。

研究与写作 crew
幻灯片 2 / 7研究与写作 crew项目目录和 flow 骨架展示了两个阶段的组装过程。
03

配置研究与规划

他们定义研究员和规划员角色、受众输入与来源要求。调试 kickoff 后,研究 crew 生成了一份大纲。

Moura 演示如何使用 Cursor 的行内编辑和聊天功能改写原有定义。研究 crew 将包含收集信息的研究员,以及将信息整理成大纲的规划员。两人把助手生成的修改当作建议,逐项检查和调整,而非盲目接受。

他们编辑研究任务,明确主题和目标受众,首先选择面向初学者的微调材料。Moura 建议给研究员一个目标,让其返回相关信息和参考来源,再由规划员决定如何呈现材料。他们打算通过测试逐步改进这些指令。

研究和规划任务定义
幻灯片 3 / 7研究和规划任务定义YAML 展示了细化规划指令之前的初始任务输出。

规划任务的预期输出是一系列章节,每节包含小标题、高层目标、该节为何重要以及来源。Berman 添加受众水平变量,让同一流程能够适配初级、中级或高级读者。他们没有要求计划采用 Markdown 格式,因为下一阶段需要使用结构化数据。

他们把研究 crew 导入 flow,并传入示例主题和受众作为输入。第一次启动因调用 crew 的方式错误而失败;调试后,他们先实例化对象,再调用其 crew 方法,最后调用 `kickoff`。他们还将 Serper 搜索工具接入研究员。

一次成功的研究运行找到参考来源,并生成面向初学者的大语言模型微调大纲,包括介绍、微调的含义、流程、技术和挑战。Berman 喜欢这个结构,而 Moura 指出,他们仍需要把计划转换成下一阶段可用的对象。

04

结构化计划并增加写作人员

Pydantic 将计划表示为章节列表。他们创建写作、编辑和审核任务,并对每一节调用第二个 crew。

Moura 解释了 Pydantic 模型的作用:应用不必只传递一个长字符串,还可以要求返回名称和类型明确的字段。一个章节可以包含标题、目标、重要性、来源和提纲;一份教育内容计划则包含章节列表。普通 Python 代码随后就能遍历这个列表。

他们使用 Cursor 起草 Pydantic 类,并简化建议的结构。规划任务被配置为通过 `output_pydantic` 返回 `EducationalPlan`。flow 从研究步骤返回结构化结果,让监听该步骤的写作函数能够收到计划。

Pydantic 计划结构
幻灯片 4 / 7Pydantic 计划结构带类型的章节和计划对象为下游遍历提供结构。

在写作步骤中,他们遍历 `plan.sections`,并准备一个集合存放最终内容。预期行为是针对每个章节运行写作 crew,并追加结果。之后,一个独立监听函数可以保存合并后的输出、将其发送到云服务,或传给其他系统。

他们为写作 crew 配置内容写手、编辑和质量审核员,并为每个角色添加任务。受众水平仍作为输入,使文章适合目标读者。他们用 Cursor 起草 YAML 和 Python 定义,但具体角色和任务指令仍需要细化。

他们导入写作 crew,开始将它接入循环。第一次尝试暴露了一个遗漏:写作 crew 同样需要主题和受众水平。他们把共享输入集中到一个地方,避免重复填写,然后再次运行,观察结构化计划结果的处理情况。

遍历计划中的章节
幻灯片 5 / 7遍历计划中的章节流程原型对每一节调用写作 crew;输入问题在后面得到修正。
05

调试写作循环

两人修正智能体和任务名称、共享输入以及遗漏的章节变量,并讨论可观测性与潜在扩展。

Berman 介绍自己偏好的开发策略:先使用能力强的模型,再在改进工作流后尝试较便宜的模型。他和 Moura 希望通过任务拆分,以更低成本和延迟获得高质量输出,但本次并没有进行受控的质量比较。实际节省多少取决于模型、工作负载和调用次数。

接下来的错误显示,内容写作 crew 仍在使用初始定义。Cursor 提出了修改,但 Moura 注意到其中有不必要的手动 YAML 加载,于是两人拒绝了这个过于复杂的建议。他们缩小要求,只让 Python crew 的智能体和任务名称与 YAML 定义对应,再补上缺失的审核员。

进一步测试发现,质量审核任务的名称及其关联智能体存在不一致。他们统一 YAML 和 Python 文件中的名称,确保每个任务都引用正确的智能体。这类调试很重要:如果配置不一致,智能体工作流可能在模型进行任何有用推理之前就失败。

第二个 crew 启动后,会为计划中的每一节单独运行。Berman 和 Moura 注意到一个重要遗漏:循环虽然传入了主题和受众,却没有传入当前章节。缺少这项信息时,每次调用可能不知道自己应该写文章的哪一部分。

他们在循环内部复制共享输入、加入当前章节,并在写作任务描述中引用该章节。他们尝试的一个 Pydantic 转换方法不正确;用 Cursor 查过后,改用 `model_dump_json`。为每次迭代传入实际章节计划,可以明确提供该任务所需的上下文。

Moura 提出未来可以增加的功能:给写作 crew 配备搜索或其他工具,以便查看参考资料和核实事实;还可以创建工具,检索以前批准过的内容作为示例。Berman 询问图形和示意图的生成方式,Moura 则介绍了另一个案例:编程智能体根据支持数据中的发现编写绘图代码。

06

保存并改进输出

他们保存合并后的输出,修正审核报告替代正文的问题,并检查模型配置。最后,他们计划核验来源并进行人工审核。

质量报告代替文章正文
幻灯片 6 / 7质量报告代替文章正文输出显示了最终审核任务为何必须返回修订后的内容。

两人还需要收集完整结果,而不是只查看最后一节。他们调整原始输出的处理方式,并添加监听函数,将返回的内容保存到文本文件。写作步骤返回合并后的结果,保存步骤才能接收并使用它。

Langtrace 显示调用使用了 GPT-4o,而 Berman 原本以为使用的是 GPT-4o mini。他们检查模型配置,为后续运行修改一个环境设置。Moura 还指出,研究员目前只能看到搜索结果,并没有抓取链接页面;添加抓取工具是建议中的改进,本次并未完成。

新的运行暴露了输出设计问题:最后一个智能体是质量审核员,因此它的质量评估报告被当成文章章节。Berman 打开输出文件,发现本应出现正文的地方是审核反馈。仅仅增加审核员并不能解决问题;最后一个任务必须返回流程实际需要的产物。

他们修改编辑任务的预期输出,要求只返回润色后的章节,不包含反馈。同样,他们要求质量审核员返回吸收反馈后的改进版本,而不是评估报告本身。写作任务也被限定为长篇文章中的一到两段。

随后的一次运行遇到 Langtrace 导入问题。他们检查示例代码后修正导入,并恢复追踪。两人计划利用追踪记录检查模型选择、运行成本和延迟,而不是凭猜测判断实际使用了哪个模型。

修改后的编辑与审核任务
幻灯片 7 / 7修改后的编辑与审核任务任务定义要求返回改进后的章节内容,而不是反馈意见。

Moura 表示,GPT-4o mini 是他当时在智能体工作流中偏爱的模型,并认为设计良好的工作流在某些场景中可能达到或超过 o1 的质量。Berman 回忆说,之前一次简单的 o1 运行大约花了 50 至 60 美分。他们关于便宜模型能覆盖大多数使用场景的广泛判断是估计,并非本次演示的实测结果。

两人讨论了自行部署开放模型这一选项,适合希望数据留在自身基础设施中的组织。Berman 对小模型能够处理多少工作给出了推测性百分比;这些数字不应视为基准统计。选择模型仍需结合任务、质量要求、安全性和部署成本进行测试。

查看生成的章节时,Moura 建议不要处处强制使用项目符号,也不要在每个中间章节末尾都写一段结论。Berman 添加了这些指令,但表示在进一步修改之前,他会先检查内容的准确性、完整性和深度是否合适。单纯增加篇幅不是他的目标。

Moura 建议为研究 crew 添加网页抓取工具,也可以考虑给写作 crew 添加,以便更深入地核查参考来源。Berman 还提出,未来可以考虑用更快的推理方式进行优化。这些都是后续想法,并不能证明当前输出已经过事实核查,也不能证明会达到某个特定的加速幅度。

最终的文本文件包含微调文章的多个章节,Berman 认为初看很有希望。他计划更仔细地审核内容,继续迭代智能体和任务定义,并表示会在链接的代码库中分享代码。本次演示以一个可运行的原型结束,同时明确列出了尚待改进的质量问题。

同频道的其他文章

12 张幻灯片34:21EN → 简体中文
Matthew Berman· 2026年10月27日Matthew Berman 解读 Anthropic 的上市文件、AI 增长与治理Matthew Berman, Sam Altman · Forward Future主持人审视 S-1 中的财务指标、算力战略和投票结构,并质疑 AI 快速发展与安全之间的张力。AnthropicAI Safety企业 AI+2
2 张幻灯片0:36EN → 简体中文
Matthew Berman· 2026年10月25日Kimi K3.1 与魔方求解演示Matthew Berman · Forward FutureMatthew Berman 展示一个被打乱的虚拟魔方如何复原,并对 Kimi K3.1 的测试给予积极评价。评估编程智能体Open-weight models
6 张幻灯片25:50EN → 简体中文
Matthew Berman· 2026年10月24日Kimi K3.1 Pro 实测:3D 演示出色,表现不一,价格有竞争力Matthew Berman · Forward FutureMatthew Berman 测试这款开放权重模型的编程、3D 渲染和视觉讲解能力,并比较基准成绩与价格。Open-weight modelsBenchmarksAI cost & performance+1
2 张幻灯片32:20EN → 简体中文
Matthew Berman· 2026年10月23日本地 AI 究竟适合谁?成本、取舍与混合模式的未来Matthew Berman · Forward FutureMatthew Berman 权衡数据控制和自主权,与硬件成本、设置复杂度及推理速度之间的关系。Local inferenceOpen-weight modelsAI cost & performance+1
6 张幻灯片1:03:37EN → 简体中文
Matthew Berman· 2026年10月23日Matthew Berman 团队测试 Kimi K3.1:动画、游戏与图表Matthew Berman, Alex, Brian · Forward Future一场团队直播问答变成了对 Kimi K3.1 的非正式测试,内容涵盖个人智能体工作流、动态图形、浏览器游戏和基准图表。编程智能体Generative media评估+2
0:53EN → 简体中文
Matthew Berman· 2026年10月22日Sam Altman 谈 AI 与新知识的发现Sam Altman · OpenAIAltman 预计,数学发现方面的进展将延伸到生物学、材料和能源领域。AI for scienceMathematicsComputational Biology+1