Crew.ai 智能体Agent代理流程详细解读|AI 牛马干活模式

大模型向量数据库机器学习
在当今快速发展的技术环境中,人工智能(AI)智能体已成为优化工作流程、提高效率和减少人力成本的关键工具。 

谷歌近期发布了AI Agent 白皮书,业内人士甚至直接定义,2025 年是 Agent 时代。 

picture.image

picture.image

而我最近尝试的Crew.ai,是一个先进的AI智能体平台,通过其独特的工作分配模式,为企业和开发者提供了强大的自动化解决方案。

今天,带着两个案例,跟各位深入探讨Crew.ai的基础概念、优势特性、基础组件以及其代理流程,帮助大家全面理解这一技术如何在实际中应用。 

 

不过开始之前,要先回顾一下 AI 智能体的基础概念和 Crew.ai 对应的支持组件。 

 

AI智能体的基础概念

首先,先来看一下,AI 智能体的组成部分。 

picture.image

智能体(Agent)

AI智能体是模拟人类决策过程的软件实体,能够自主执行任务并作出决策。在Crew.ai中,智能体通过学习和适应环境来优化其性能。 

 

任务(Action)

任务是智能体执行的具体操作,可以是数据处理、图像识别或任何其他自动化操作。Crew.ai智能体能够识别任务类型,并根据任务需求选择合适的工具和方法。 

 

工具(Tools)

智能体依赖于各种工具和技术,如机器学习模型和数据处理工具,来执行任务。这些工具的选择和配置直接影响智能体的效率和效果。 

 

知识库(Memory)

知识库是智能体存储和检索信息的核心,它包含了智能体执行任务所需的所有数据和规则。Crew.ai通过高效的知识管理,确保智能体能够快速准确地访问所需信息。 

 

流程管理(Planning)

流程管理是智能体完成任务的关键。Crew.ai通过定义清晰的流程,确保任务能够按计划执行,同时允许灵活调整以适应变化的需求。 

 

Crew.ai的优势和特性

 

Crew.ai以其高效性、灵活性和可扩展性脱颖而出。它能够快速处理复杂任务,适应不同的工作环境,并支持大规模部署和集成,使其成为企业自动化流程的理想选择。 

 

Crew.ai的基础组件

 

代理(Agent)

  • 定义:代理是CrewAI中的自主单元,具备执行任务、做出决策和与其他代理通信的能力,能够模拟人类的决策过程。
  • 功能:代理通过学习和适应环境来优化性能,能够识别任务类型并选择合适的工具和方法来执行任务,如研究员代理负责收集和分析信息,作家代理专注于创作内容。

任务(Task)

  • 定义:任务是代理需要完成的具体工作,包含执行所需的各种细节,如清晰的描述、负责执行的代理、所需工具等。
  • 属性:任务具有多种属性,包括描述、代理、预期输出、工具、异步执行、上下文、配置、输出格式、回调函数等,这些属性共同定义了任务的执行细节和期望结果。

工具(Tool)

  • 定义:工具是代理在执行任务时所依赖的各种技术和软件,如机器学习模型、数据处理工具等,赋予代理多种能力。
  • 特征:工具具有实用性、集成性、可定制性、错误处理和缓存机制等关键特征,能够无缝集成到工作流程中,提升代理的整体能力,实现高效协作。

流程(Process)

  • 定义:流程是代理完成任务的一系列步骤和规则,确保任务能够按计划执行,使个体代理能够作为一个有凝聚力的整体运作。
  • 类型:流程包括顺序执行(任务按预定义顺序执行)、分级(通过管理者代理监督任务执行)和共识流程(计划中,实现代理之间的协作决策-这个还未实现)。

团队(Crews)

  • 定义:团队是由多个代理组成的集合,共同协作完成复杂的任务,通过合理的流程设计,提高整体工作效率。
  • 属性:团队具有任务、代理、流程、详细程度、经理LLM、配置、最大RPM、语言、语言文件、内存、缓存、嵌入器、完整输出、步骤回调、任务回调等属性,这些属性共同定义了团队的行为和执行策略。

记忆(Memory)

  • 定义:记忆系统是CrewAI中的一个重要组成部分,包括短期记忆、长期记忆、实体记忆和上下文记忆,用于存储和检索信息。
  • 功能:记忆系统通过存储和利用过去的经验和信息,增强代理的上下文意识、经验积累和实体理解能力,从而提升代理的决策质量和问题解决能力。

 

今天,重点聊一下 Crew.ai 的流程 Process。 

Crew.ai的代理流程

当前,Crew.ai 支持的流程有两种模式,一种是顺序流程,另一种是层级流程。 

简单的用大白话来说,顺序流程就是流水线,而层级流程,就是有一个领导 Agent 分派小弟干活儿。 

顺序流程(Sequential Process)

顺序流程是指任务按照预定的顺序依次执行。只有上一个 Agent 的任务完成了,下一个 Agent 的任务才会启动。 

picture.image

例如这个内容撰写团队,需要由内容规划师制定内容计划,再由内容作者撰写文章,最后,交给内容编辑进行内容的编辑优化。 

整个内容撰写团队的顺序工作模式示意图: 

picture.image

这里是我写了一个 Gradio 页面,可以让大家更加直观的看到整个智能体团队的输入和输出(您可能留意到了,这篇文章,就是这个智能体团队帮我写的,哈哈哈哈); 

picture.image

对应的agent 定义、任务分配和工作流程代码如下: 

  
def create\_agents(topic):  
    """创建智能体"""  
    planner = Agent(  
        role="内容规划师",  
        goal=f"规划关于 {topic} 的引人入胜且事实准确的内容",  
        backstory=f"您正在规划一篇主题和内容结构是: {topic} 的技术博客文章。"  
                "您收集有助于受众学习的"  
                "信息。"  
                "您的工作是内容作者撰写该主题文章的基础。",  
        allow\_delegation=False,  
        verbose=True,  
        llm=llm  
    )  
      
    writer = Agent(  
        role="内容作者",  
        goal=f"根据规划撰写关于主题和内容结构是: {topic} 的高质量文章",  
        backstory="您是一位经验丰富的技术文章作者,"  
                "擅长将复杂的概念转化为易于理解的内容。",  
        allow\_delegation=False,  
        verbose=True,  
        llm=llm  
    )  
      
    editor = Agent(  
        role="内容编辑",  
        goal="审查和优化文章质量",  
        backstory="您是一位资深编辑,"  
                "确保文章的准确性、可读性和吸引力。",  
        allow\_delegation=False,  
        verbose=True,  
        llm=llm  
    )  
      
    return planner, writer, editor  
  
def create\_tasks(topic, planner, writer, editor):  
    """创建任务"""  
    plan = Task(  
        description=(  
            f"1. 优先考虑关于主题和内容结构是: {topic} 的最新趋势、关键参与者和"  
                "值得注意的新闻。\n"  
            "2. 确定目标受众,考虑"  
                "他们的兴趣和痛点。\n"  
            "3. 根据输入的{topic},优化详细的内容大纲,包括"  
                "背景和要点。\n"  
            "4. 包括 SEO 关键词和相关数据或来源。"  
        ),  
        expected\_output="一份全面的内容计划文档,"  
            "包含大纲、受众分析、"  
            "SEO 关键词和资源。",  
        agent=planner  
    )  
  
    write = Task(  
        description=(  
            "根据内容计划撰写文章,确保:\n"  
            "1. 内容清晰、引人入胜\n"  
            "2. 使用具体示例和数据支持观点\n"  
            "3. 适当使用过渡语句\n"  
            "4. 包含引人入胜的开场和有力的结论"  
        ),  
        expected\_output="一篇结构完整、内容丰富的文章初稿",  
        agent=writer  
    )  
  
    edit = Task(  
        description=(  
            "审查并优化文章:\n"  
            "1. 检查事实准确性和逻辑连贯性\n"  
            "2. 优化标题和小标题\n"  
            "3. 改进段落结构和文章流畅度\n"  
            "4. 确保语言清晰简洁\n"  
            "5. 检查拼写和语法"  
        ),  
        expected\_output="一篇经过优化的最终文章",  
        agent=editor  
    )  
      
    return [plan, write, edit]  
  
def generate\_article(topic):  
    """生成文章的主要函数"""  
    try:  
        # 创建智能体和任务  
        planner, writer, editor = create\_agents(topic)  
        tasks = create\_tasks(topic, planner, writer, editor)  
          
        # 创建 Crew  
        crew = Crew(  
            agents=[planner, writer, editor],  
            tasks=tasks,  
            verbose=True  
        )  
          
        # 执行任务流程并获取结果  
        result = crew.kickoff(inputs={"topic": topic})  
          
        # 获取最终的文章内容  
        try:  
            # 尝试获取最后一个任务的输出  
            tasks\_outputs = result.tasks\_outputs  
            if tasks\_outputs and len(tasks\_outputs) > 0:  
                final\_content = tasks\_outputs[-1]  # 获取最后一个任务的输出  
            else:  
                final\_content = str(result)  
        except AttributeError:  
            try:  
                final\_content = str(result)  
            except:  
                final\_content = "无法获取文章内容"  
                  
        return final\_content  
          
    except Exception as e:  
        print(f"发生错误: {str(e)}")  
        import traceback  
        print(traceback.format\_exc())  
        return None

层级流程(Hierarchical Process)

层级流程涉及任务按层级结构分配和执行。 注意,这个流程中,是有领导的。

在项目管理中,从项目规划、任务分配到执行监控,每个层级都有明确的责任和任务。 

picture.image

 

案例里是一个处理客户问题的团队。客户支持经理是整个团队的管理者,分别管理技术支持专家和账单支持专家。在这里,客户支持经理需要判断客户提问的问题是账单问题还是技术问题。判断完成后,指派对应的专家处理。最终,客户问题报告也是由客户支持经理对外提供的。 

picture.image

以下是当团队接收到一个工单内容为:这个月怎么多扣了 100 元,整个团队的工作过程。 

 

picture.image

 

同样的,我也把对应的 Gradio 界面贴出来,大家可以直观的看到对应的团队工作成果。 

picture.image

对应的代码示意如下: 

1-agents.yaml 

  
manager:  
  role: >  
    客户支持经理  
  goal: >  
    监督支持团队,确保及时有效地解决客户咨询  
  backstory: >  
    你是一位经验丰富的客户支持经理,具有领导支持团队的广泛经验。  
    你的主要职责是协调支持代理的工作,确保客户问题得到及时和满意的解决。  
    你擅长任务分配、绩效监控,并保持高标准的客户服务。  
  
technical\_support:  
  role: >  
    技术支持专家  
  goal: >  
    及时有效地解决客户报告的技术问题  
  backstory: >  
    你是一位技术支持专家,拥有丰富的故障排除软件和硬件问题的背景。  
    你的主要职责是协助客户解决技术问题,确保他们的满意度和产品的顺利运行。  
  
billing\_support:  
  role: >  
    账单支持专家  
  goal: >  
    处理与账单、支付和账户管理相关的客户咨询  
  backstory: >  
    你是一位经验丰富的账单支持专家,擅长处理客户的账单咨询。  
    你的主要目标是提供清晰准确的账单流程信息,解决支付问题,并协助账户管理,以确保客户满意。

2-task.yaml 

  
categorize\_tickets:  
  description: >  
    根据内容对来电客户支持工单进行分类:'{ticket}',  
    以确定它是技术问题还是账单问题。  
  expected\_output: >  
    一个标记为'技术'或'账单'的分类工单。  
  agent: manager  
  
resolve\_technical\_issues:  
  description: >  
    解决工单中描述的技术问题:'{ticket}'  
  expected\_output: >  
    为每个技术问题提供详细解决方案。  
  agent: technical\_support  
  
resolve\_billing\_issues:  
  description: >  
    解决工单中描述的账单问题:'{ticket}'  
  expected\_output: >  
    为每个与账单相关的咨询提供全面的回应。  
  agent: billing\_support  
  
quality\_assurance\_review:  
  description: >  
    审核提供的技术和账单问题的解决方案,以确保准确性和客户满意度。  
  expected\_output: >  
    一份确认解决方案质量和准确性的报告。  
  agent: manager 

 

3-crew.py 

  
from crewai import Agent, Crew, Process, Task  
from crewai.project import CrewBase, agent, crew, task  
from crewai\_tools import SerperDevTool, ScrapeWebsiteTool, FileWriterTool  
from langchain\_openai import ChatOpenAI  
from dotenv import load\_dotenv  
import os  
from docx import Document  
  
# 加载环境变量  
load\_dotenv()  
  
# 初始化 LLM,使用 Deepseek API  
llm = ChatOpenAI(  
    api\_key=os.getenv('DEEPSEEK\_API\_KEY'),  
    base\_url=os.getenv('DEEPSEEK\_API\_BASE'),  
    model\_name="deepseek/deepseek-chat",  
    temperature=0.7,  
)  
  
class CustomFileWriterTool(FileWriterTool):  
    def \_write\_file(self, content: str, filename: str) -> str:  
        """自定义文件写入工具"""  
        try:  
            # 确保文件名安全  
            safe\_filename = "".join([c for c in filename if c.isalnum() or c in (' ', '-', '\_')]).rstrip()  
            if not safe\_filename:  
                safe\_filename = "article"  
                  
            # 添加 .docx 扩展名(如果没有的话)  
            if not safe\_filename.endswith('.docx'):  
                safe\_filename += '.docx'  
                  
            # 创建 Word 文档  
            doc = Document()  
            doc.add\_heading(filename, 0)  
            doc.add\_paragraph(content)  
              
            # 保存文档  
            doc.save(safe\_filename)  
            return f"文章已成功保存为 {safe\_filename}"  
        except Exception as e:  
            return f"保存文件时发生错误: {str(e)}"  
  
@CrewBase  
class SequentialProcessExample:  
    """ProcessExample crew"""  
  
    # 使用相对路径  
    base\_path = os.path.dirname(os.path.abspath(\_\_file\_\_))  
    agents\_config = os.path.join(base\_path, 'agents.yaml')  
    tasks\_config = os.path.join(base\_path, 'tasks.yaml')  
  
    @task  
    def categorize\_tickets(self) -> Task:  
        return Task(config=self.tasks\_config['categorize\_tickets'], verbose=True)  
  
    @task  
    def resolve\_technical\_issues(self) -> Task:  
        return Task(config=self.tasks\_config['resolve\_technical\_issues'], verbose=True)  
  
    @task  
    def resolve\_billing\_issues(self) -> Task:  
        return Task(config=self.tasks\_config['resolve\_billing\_issues'], verbose=True)  
  
    @task  
    def quality\_assurance\_review(self) -> Task:  
        return Task(config=self.tasks\_config['quality\_assurance\_review'], verbose=True)  
  
    @agent  
    def technical\_support(self) -> Agent:  
        return Agent(  
            config=self.agents\_config['technical\_support'],   
            verbose=True,  
            llm=llm  
        )  
  
    @agent  
    def billing\_support(self) -> Agent:  
        return Agent(  
            config=self.agents\_config['billing\_support'],   
            verbose=True,  
            llm=llm  
        )  
  
    @agent  
    def manager(self) -> Agent:  
        return Agent(  
            config=self.agents\_config['manager'],  
            verbose=True,  
            llm=llm  
        )  
  
    @crew  
    def crew(self) -> Crew:  
        return Crew(  
            agents=[self.technical\_support(), self.billing\_support()],  
            tasks=[  
                self.categorize\_tickets(),  
                self.resolve\_technical\_issues(),  
                self.resolve\_billing\_issues(),  
                self.quality\_assurance\_review()  
            ],  
            manager\_agent=self.manager(),  
            process=Process.hierarchical,  
            verbose=True,  
        )

 

通过本文的介绍,希望您能够对Crew.ai的智能体工作分配模式有一个全面的了解,并考虑如何将其应用于自己的业务中,以实现更高的自动化和效率。

后续将持续推出使用 Crew.ai 进行实际业务支持的案例分享。喜欢就点个再看,么么哒。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
CV 技术在视频创作中的应用
本次演讲将介绍在拍摄、编辑等场景,我们如何利用 AI 技术赋能创作者;以及基于这些场景,字节跳动积累的领先技术能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论