葛先生 發表於 2024-9-15 00:11:00

基于 CrewAI 多智能体框架,手把手构建一个自动化写作应用实战

<center><strong>明月皓皓,星河灿烂,中秋佳节,团圆美满。祝大家中秋节快乐!</strong>听说台风要来了,也不知道还能不能吃着月饼赏个月?</center>
<hr>
<p>老牛同学在上文(Agent(智能体)和 MetaGPT,一句话实现整个需求应用代码)和大家一起初步理解了什么是 Agent(智能体)、它具备哪些特性等基础知识,然后想着使用 MetaGPT 这个国内开源的多智能体系统,用一句话让它帮忙写一个贪吃蛇小游戏程序,体验一把当“老板”的乐趣。我们的需求确实是用一句话给了 MetaGPT,只可惜“老板”的乐趣是没有体验到,MetaGPT 倒是给我们留了一个有 Bug 的程序,老牛同学又得做回程序员,修 Bug 去!</p>
<p>MetaGPT 这种端到端的多智能体系统设计本身很有吸引力,但是对它所依赖的基础大语言模型(大模型)有很强的诉求,否则根据一句话的需求产出的结果很难尽人意。老牛同学感觉大模型参数量得 <strong>100B</strong> 起步才会较好的效果,且需求越复杂,对大模型的要求就会越高。</p>
<p>今天,老牛同学和大家一起看看另外一个多智能体框架 <strong>CrewAI</strong>,我们使用它,可以像搭乐高积木一样,搭建自己工作流。与 <strong>MetaGPT</strong> 相比,<strong>CrewAI</strong> 更加轻量化,定制的灵活性更高,因此老牛同学称它为框架。</p>
<p>大语言模型最擅长的是自然语言生成,那么我们本次就来使用 <strong>CrewAI</strong> 搭建一个自动化写作系统,本文主要包括以下内容:</p>
<ol>
<li><strong>CrewAI</strong> 框架基本介绍</li>
<li>本地安装 <strong>CrewAI</strong> 框架依赖</li>
<li>使用 <strong>CrewAI</strong> 逐步地搭建我们的自动化写作系统</li>
</ol>
<p>本文所有涉及到的源代码,不出意外的话,源代码地址老牛同学会放在评论区~</p>
<h1 id="crewai-框架基本介绍">CrewAI 框架基本介绍</h1>
<p><strong>CrewAI</strong> 官方开源地址:https://github.com/crewAIInc/crewAI</p>
<p><strong>CrewAI</strong> 是一个多智能体框架,主要为角色扮演中的智能体提供自动化配置,以促进智能体之间的合作,共同解决复杂问题。</p>
<p><strong>CrewAI</strong> 主要由<strong>Agent</strong>(智能体)、<strong>Task</strong>(任务)、<strong>Tool</strong>(工具)和<strong>Crew</strong>(团队)模块组成。<strong>智能体</strong>是具有角色和背景故事、目标和记忆的团队成员;<strong>任务</strong>是智能体需要完成的任务;<strong>工具</strong>是智能体使用的设备,用于辅助完成任务;<strong>团队</strong>则是智能体和任务相结合的容器,是智能体协调合作执行任务的实际场所,智能体由它共同完成实际任务。</p>
<p><img src="https://ntopic.cn/p/2024091401/01.jpg"></p>
<p><strong>CrewAI</strong> 框架比较灵活,它不仅支持<strong>OpenAI</strong>标准 API,还支持<strong>Ollama</strong>标准 API,它具备如下核心特征:</p>
<ol>
<li>角色定制代理:可以根据不同的角色、目标和工具来量身定制代理。</li>
<li>自动任务委派:代理之间能够自主地分配任务和进行交流,有效提升解题效率。</li>
<li>任务管理灵活性:可以根据需要自定义任务和工具,并灵活地指派给不同代理。</li>
<li>流程导向:目前系统仅支持按顺序执行任务,但更加复杂的如基于共识和层级的流程正在研发中。</li>
</ol>
<h1 id="本地安装-crewai-框架依赖">本地安装 CrewAI 框架依赖</h1>
<p><strong>工欲善其事,必先利其器</strong>,我们通过<strong>Miniconda</strong>管理 Python 虚拟环境,<strong>Miniconda</strong>的安装和使用可以参考老牛同学之前的文章:大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama 等)</p>
<pre><code class="language-shell"># Python虚拟环境名:CrewAI,版本号:3.10
conda create -n CrewAI python=3.10 -y

# 激活虚拟环境
conda activate CrewAI
</code></pre>
<p>接下来,我们就可以安装 CrewAI 框架依赖了:</p>
<pre><code class="language-shell">pip install crewai
</code></pre>
<p>至此,<strong>CrewAI</strong> 框架依赖就安装好了,我们接下来使用它来构建一个自动化协作应用。</p>
<h1 id="使用-crewai-搭建自动化写作系统">使用 CrewAI 搭建自动化写作系统</h1>
<p>前面提到,智能体依赖的大模型既支持 OpenAI 标准接口,也支持 Ollama 标准接口。老牛同学为了方便演示,使用 Ollama 本地部署<strong>Qwen2-7B</strong>大模型,有关 Ollama 详细介绍和使用,参见老牛同学之前的文章,本文不在赘述:Ollama 完整教程:本地 LLM 管理、WebUI 对话、Python/Java 客户端 API 应用</p>
<p>【<strong>第一步:</strong> 明确我们的需求】</p>
<p>我们在来想当一次“老板”,还是以<strong>儿童绘本故事</strong>为例,我们只提供一个<strong>主题</strong>:由第 1 个智能体根据主题产出绘本故事的<strong>构思</strong>内容,然后由第 2 个智能体根据第 1 个智能体的构思内容,产出<strong>故事</strong>内容。</p>
<p>因此,我们需要有 2 个<strong>智能体</strong>(即:需要定义 2 个角色),分别是:故事内容<strong>构思者</strong>,和故事内容<strong>协作者</strong>;他们各自都有一个<strong>任务</strong>,分别是:产出故事内容<strong>构思</strong>,和根据构思编写<strong>故事</strong>。</p>
<p>接下来,我们就开始实现我们的智能体了,在此之前,我们先引入<strong>CrewAI</strong>核心模块类,同时配置大模型:</p>
<p><img src="https://ntopic.cn/p/2024091401/11.jpg"></p>
<p>【<strong>第二步:</strong> 定义<strong>构思者</strong>角色的智能体】</p>
<p><img src="https://ntopic.cn/p/2024091401/12.jpg"></p>
<p>对于<strong>构思者</strong>智能体,它的定义如下:</p>
<ul>
<li>我们要给它设定一个与任务相符的角色(<code>role</code>):为了简单,我们就设定为构思者</li>
<li>我们为这个智能体设定了一个目标(<code>goal</code>):要根据给定的主题(<code>{topic}</code>),产出儿童绘本故事内容创意</li>
<li>我们再为规划者智能体设定一个背景故事(<code>backstory</code>):我们尽可能多地设定相关的上下文,比如它的职责、对它产出物的要求等。</li>
<li>我们还要设置一些其它属性:<code>allow_delegation</code> 代表这个智能体不允许把工作委托给其他的智能体;<code>verbose</code> 代表把它的工作详细记录下来,这样我们可以看到它在执行内部任务时是如何运行的</li>
</ul>
<p>【<strong>第三步:</strong> 定义<strong>写作者</strong>角色的智能体】</p>
<p><img src="https://ntopic.cn/p/2024091401/13.jpg"></p>
<p>对于<strong>写作者</strong>智能体来说,它的目标就是:根据构思者所提供的儿童绘本故事创意来编写故事内容。</p>
<p>【<strong>第四步:</strong> 定义每个智能体的任务】</p>
<p>上面我们定义了 2 个智能体角色,现在给他们分别定义 1 个任务:</p>
<p><img src="https://ntopic.cn/p/2024091401/14.jpg"></p>
<p><strong>构思者</strong>和<strong>写作者</strong>的任务,均包含了描述、期望输出和分配的智能体等 3 个属性:</p>
<ul>
<li>描述(<code>description</code>):期望智能体能做什么</li>
<li>预期的输出(<code>expected_output</code>):类似一种强制机制,明确任务的产出结果</li>
<li>智能体(<code>agent</code>):即为这个任务分配智能体</li>
</ul>
<p>【<strong>第五步:</strong> 让智能体和任务协同工作】</p>
<p><img src="https://ntopic.cn/p/2024091401/15.jpg"></p>
<p>智能体是按照顺序执行任务的,上一个任务的输出,会被作为下一个任务的输入。<strong>特别注意</strong>:我们提供了<code>topic</code>上下文参数,它在智能体和任务中可以通过<code>{topic}</code>使用。</p>
<p>运行程序,我们可以逐步看到<strong>构思者</strong>智能体的运行过程内容:</p>
<p><img src="https://ntopic.cn/p/2024091401/16.jpg"></p>
<p>接下来,可以看到<strong>写作者</strong>智能体的运行过程内容:</p>
<p><img src="https://ntopic.cn/p/2024091401/17.jpg"></p>
<p>最终,所有的智能体执行完成,产出的目标故事内容:</p>
<p><img src="https://ntopic.cn/p/2024091401/18.jpg"></p>
<h1 id="最后crewai-总结说明">最后:CrewAI 总结说明</h1>
<p>通过以上示例,我们了解了 <strong>CrewAI</strong> 的三个核心模块:<strong>Agent</strong>智能体,<strong>Task</strong>任务,<strong>Crew</strong>团体或者称容器,容器把他们组合在一起。</p>
<ul>
<li><strong>Agent:</strong> 一般情况下,一个<strong>Agent</strong>只做一件事,明确智能体的目标和期望;当然,一个<strong>Agent</strong>可以执行多项任务。</li>
<li><strong>Task:</strong> 无论是创建 Agent 还是 Task 都需要明确自己的职责,以及对自己的期望。</li>
<li><strong>Crew:</strong> 最终把任务,按照串行或并行的方式组织起来。</li>
</ul>
<p>vLLM CPU 和 GPU 模式署和推理 Qwen2 等大语言模型详细教程</p>
<p>基于 Qwen2/Lllama3 等大模型,部署团队私有化 RAG 知识库系统的详细教程(Docker+AnythingLLM)</p>
<p>使用 Llama3/Qwen2 等开源大模型,部署团队私有化 Code Copilot 和使用教程</p>
<p>基于 Qwen2 大模型微调技术详细教程(LoRA 参数高效微调和 SwanLab 可视化监控)</p>
<p>MiniCPM-V 2.6 面壁“小钢炮”,多图、视频理解多模态模型,部署和推理实战教程</p>
<p><img src="https://ntopic.cn/WX-21.png"></p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文作者:<b>奔跑的蜗牛</b>,转载请注明原文链接:https://ntopic.cn</p><br><br>
来源:https://www.cnblogs.com/obullxl/p/18414880/NTopic2024091401
頁: [1]
查看完整版本: 基于 CrewAI 多智能体框架,手把手构建一个自动化写作应用实战