CrewAI部署指南

项目概述

1.1CrewAI 框架综述

crewAI是一个创新的开源多智能体编排框架,由João Moura开发,旨在通过协调多个AI智能体的协作来完成复杂任务。这个框架模拟了现实世界中的工作团队,让不同角色的智能体能够自主地相互委派任务和交流,从而实现比单一语言模型更强大的性能表现。

1.2CrewAI 核心概念

CrewAI的核心概念包括智能体(Agent)、任务(Task)、工具(Tool)、流程(Process)和团队(Crew)。每个智能体都有特定的角色、目标和背景故事,可以执行定制的任务并使用各种功能工具。流程定义了智能体如何协作,而团队则是这些组件的组合容器。这种模块化设计使得CrewAI能够灵活地应对复杂问题,同时保持系统的简洁性和可扩展性。

1.3CrewAI 应用场景

这个创新框架在多个领域展现了其强大的应用潜力。在客户服务方面,它可以自动回答咨询并提供个性化服务;在供应链管理中,协调库存、订单处理和物流跟踪等环节;而在网络安全领域,部署智能体监控网络活动并响应威胁. 此外,CrewAI还可用于市场分析与预测,利用智能体分析数据、预测趋势,为决策提供支持。在企业内部,它可作为智能助手,自动化日程管理等日常任务,提高工作效率.

部署过程

2.1系统要求

#系统
unbuntu

#软件依赖
- Python 3.10+
- curl OR wget 
- uv (用于部署安装)

2.2环境部署

在搭建过程中,我们发现直接使用pip安装openai以及crewai会触发unix的环境冲突警告

image-20260115093010336

所以我们这里在虚拟环境下搭建

python3 -m venv ai_env

然后激活该虚拟环境

source ai_env/bin/activate

image-20260115093224046

接下来再把crewai和openai下下来

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple crewai openai

之后我们输入deactivate返回全区变量安装uv

image-20260115131742209

curl -LsSf https://astral.ac.cn/uv/install.sh | sh

将uv写入环境变量之中,检查一下版本

2.3crewai部署

再次进入虚拟环境之中,然后

uv tool insatll crewai#安装crewai

image-20260115132004013

装完之后依旧可以检查一下版本,接着就可以开始运行了。

crewai creat crew BOYITECHSEC #创建一个叫BOYITECHSEC的项目

image-20260115132209648

按照你需要的大模型选择相应的服务商,选择完成之后输入api_key就算是创建完成了

其文件结构大致如下:

my_team/
├── .env         # 存放API密钥
├── src/
│   └── my_team/
│       ├── config/
│       │   ├── agents.yaml  # 员工档案
│       │   └── tasks.yaml   # 工作任务
│       ├── crew.py          # 团队配置
│       └── main.py          # 启动脚本

crewai使用

首先我们需要配置下面两个基本的设置

asks.yaml # 工作任务

image-20260115135059665

agents.yaml # 员工档案

image-20260115135112116

相当于给ai先进行一个简单的定义吧,然后注意这里的这里的全局变量是要记住的,因为他要和你的main函数里的输入变量对上

接着来配置crew.py

from crewai import Agent, Crew, Process, Task, LLM
from crewai.project import CrewBase, agent, crew, task
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
import os
from dotenv import load_dotenv  # 需安装:pip install python-dotenv

# 加载.env文件中的环境变量(生产环境建议直接在系统/容器中配置环境变量)
load_dotenv()

@CrewBase
class Boyitechsec():
    """Boyitechsec crew"""
    
    # 从环境变量读取敏感配置,替换硬编码内容
    my_llm = LLM(
        model=os.getenv("LLM_MODEL", "openai/deepseek-r1"),  # 占位默认值
        base_url=os.getenv("LLM_BASE_URL", "https://your-base-url-here.com/api/v1"),  # 脱敏占位
        api_key=os.getenv("LLM_API_KEY", "your-api-key-here"),  # 脱敏占位
    )
    agents: List[BaseAgent]
    tasks: List[Task]

    @agent  # 对接agents.yml配置
    def analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['analyst'],
            llm=self.my_llm,
            verbose=True
        )
    
    @task  # 对接task.yml配置
    def analysis_task(self) -> Task:
        return Task(
            config=self.tasks_config['analysis_task'],
        )

    @task
    def reporting_task(self) -> Task:
        return Task(
            config=self.tasks_config['reporting_task'],
            output_file='security_report.md'
        )

    @crew
    def crew(self) -> Crew:
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True,
        )

到这里基本上就已经初步布置完毕了

在main函数里,我们需要把要用到的变量名给写上去,且变量名需要和之前的一致,不然会报错

image-20260115145603731

最后在运行之前安装一下LLM方便我们远程ai的导入

# 使用 uv 将 litellm 添加到项目依赖并安装
uv add litellm

最后输入运行

crewai run

项目运行时会显示我们的agent以及task,最后返回简化后的结果,并将报告写到更目录下

image-20260115145914485

image-20260115150045660

crewai扩展性

在agent能正常工作的基础上,我们可以尝试去扩展接入一些工具

因为crewai实在lang_chain上进行二开的,所以lang_chain社区的一些工具我们都可以进行使用

如果需要进行工具扩展先要下载他们官方的工具包

pip install 'crewai[tools]'

4.1 官方tools

我们先测试crewai官方提供的工具:

工具 描述
CodeDocsSearchTool 专为搜索代码文档和相关技术文档而优化的 RAG 工具。
CSVSearchTool 专为在 CSV 文件中搜索而设计的 RAG 工具,适用于处理结构化数据。
DirectorySearchTool 用于在目录中搜索的 RAG 工具,可用于浏览文件系统。
DOCXSearchTool 旨在在 DOCX 文档中搜索的 RAG 工具,适用于处理 Word 文件。
DirectoryReadTool 便于读取和处理目录结构及其内容。
FileReadTool 可读取并提取文件中的数据,支持各种文件格式。
GithubSearchTool 用于在 GitHub 存储库中搜索的 RAG 工具,适用于代码和文档搜索。
SerperDevTool 专为开发目的而设计的专用工具,具有特定的功能正在开发中。
TXTSearchTool 专注于在文本(.txt)文件中搜索的 RAG 工具,适用于非结构化数据。
JSONSearchTool 专为在 JSON 文件中搜索而设计的 RAG 工具,适用于处理结构化数据。
MDXSearchTool 专为在 Markdown(MDX)文件中搜索而定制的 RAG 工具,适用于文档。
PDFSearchTool 旨在在 PDF 文档中搜索的 RAG 工具,适用于处理扫描文档。
PGSearchTool 专为在 PostgreSQL 数据库中搜索而优化的 RAG 工具,适用于数据库查询。
RagTool 通用的 RAG 工具,能够处理各种数据源和类型。
ScrapeElementFromWebsiteTool 可从网站中抓取特定元素,适用于有针对性的数据提取。
ScrapeWebsiteTool 便于抓取整个网站,适用于全面的数据收集。
WebsiteSearchTool 用于搜索网站内容的 RAG 工具,优化了网络数据提取。
XMLSearchTool 专为在 XML 文件中搜索而设计的 RAG 工具,适用于结构化数据格式。
YoutubeChannelSearchTool 用于在 YouTube 频道中搜索的 RAG 工具,适用于视频内容分析。
YoutubeVideoSearchTool 旨在在 YouTube 视频中搜索的 RAG 工具,适用于视频数据提取。

调用的话

大致的模版如下:

#首先引入工具库
from crewai_tools import (
        FileReadTool,           # 用于读取本地文件
        DirectoryReadTool,      # 用于遍历目录
        WebsiteSearchTool,      # 用于搜索网页内容 (RAG)
        ScrapeWebsiteTool,      # 用于抓取网页正文
        GithubSearchTool,       # 用于搜索 GitHub 代码库
        CodeDocsSearchTool,     # 用于搜索代码文档
        CSVSearchTool,          # 用于搜索 CSV 数据
        JSONSearchTool          # 用于搜索 JSON 数据
    )
#然后对你要用的tools进行定义
        # [文件系统类] - 用于本地取证和日志分析
        # 允许 Agent 读取特定日志目录
        log_dir_tool = DirectoryReadTool(directory='./logs') 
        # 允许 Agent 读取特定配置文件
        config_file_tool = FileReadTool(file_path='./config.json') 
        # [网络情报类] - 用于外部威胁情报收集
        # 允许 Agent 搜索互联网 (需配置 SERPER_API_KEY)
        web_rag_tool = WebsiteSearchTool()
        # 允许 Agent 抓取特定安全博客的内容
        site_scrape_tool = ScrapeWebsiteTool(website_url='https://thehackernews.com')
#定义哪些角色需要使用哪些工具,这里以自己写的一个agent为例
        osint_analyst = Agent(
            role="开源情报分析师",
            goal="搜集关于目标组件的已知漏洞和社区讨论",
            backstory="你擅长利用公开资源挖掘安全情报。你会查看安全新闻网站。",
            llm=self.llm,
            # 扩展点:挂载网络搜索工具
            tools=[web_rag_tool, site_scrape_tool],    #在这里填入就好了,之后他会自己调用的
            verbose=True
        )

4.2自定义tools调用

自定义tools分为子类化basetool和利用tool装饰器

子类化 BaseTool,这个可以定义一些更加复杂的函数参数等

from crewai_tools import BaseTool
class MyCustomTool(BaseTool):
    name: str = "我的工具名称"
    description: str = "清晰描述此工具用于什么,您的代理将需要这些信息来使用它。"
    def _run(self, argument: str) -> str:
        # 实现在这里
        return "自定义工具的结果"

利用 tool 装饰器,这个比较轻量化,适合简单的定义一些东西

from crewai_tools import tool
@tool("我的工具名称")
def my_tool(question: str) -> str:
    """清晰描述此工具用于什么,您的代理将需要这些信息来使用它。"""
    # 函数逻辑在这里
    return "您的自定义工具的结果"

挂载是和官方一样的,直接写到对应的agents的tools栏里就好

使用 @tool 装饰器 (轻量级)
class SecurityOpsTools:
    @tool("Firewall IP Blocker")
    def block_ip(ip_address: str):
        """
        在企业防火墙上封禁指定的恶意 IP 地址。
        使用此工具来阻断来自攻击者的流量。
        参数: ip_address (str) - 需要封禁的 IP (例如 '192.168.1.105')
        """
        # 模拟封禁操作
        return f"SUCCESS: 防火墙规则已更新。IP 地址 {ip_address} 已被永久封禁。所有来自该 IP 的流量将被丢弃。"

    @tool("Threat Intelligence Lookup")
    def check_ip_reputation(ip_address: str):
        """
        查询 IP 地址的威胁信誉。
        用于确认一个 IP 是否已知为恶意 IP。
        """
        # 模拟威胁情报查询
        if "192.168.1.105" in ip_address:
            return f"警告: IP {ip_address} 被标记为 '高风险'。关联威胁组织: APT-29. 历史行为: SSH 暴力破解, 数据窃取。"
        return f"信息: IP {ip_address} 信誉良好,未发现恶意记录。"
    
#挂载
tools=[SecurityOpsTools.block_ip, SecurityOpsTools.check_ip_reputation], # 赋予执行响应动作的能力

这里举些实例

继承 BaseTool 类 (专业级)
class LogSearchInput(BaseModel):
   keyword: str = Field(..., description="要在日志中搜索的关键词,例如 'Failed password', 'root', 'error'")

class SystemLogSearchTool(BaseTool):
   name: str = "System Log Search Tool"
   description: str = "用于在服务器系统日志中搜索特定事件。输入关键词,返回相关的日志行。这对于取证调查非常有用。"
   args_schema: Type[BaseModel] = LogSearchInput

   def _run(self, keyword: str) -> str:
       """执行日志搜索逻辑"""
       # 模拟一些系统日志数据
       mock_logs = [
           "May 10 03:22:11 server sshd[123]: Failed password for root from 192.168.1.105 port 22 ssh2",
           "May 10 03:22:15 server sshd[123]: Failed password for root from 192.168.1.105 port 22 ssh2",
           "May 10 03:22:19 server sshd[123]: Accepted password for root from 192.168.1.105 port 22 ssh2",
           "May 10 03:23:01 server kernel: [1234.56] iptables: IN=eth0 OUT= MAC=00:11:22:33:44:55 SRC=192.168.1.105 DST=192.168.1.10 LEN=60",
           "May 10 03:25:00 server sudo: root : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/cat /etc/shadow"
       ]
       
       results = [log for log in mock_logs if keyword.lower() in log.lower()]
       
       if results:
           return f"找到包含 '{keyword}' 的日志:\n" + "\n".join(results)
       else:
           return f"未找到包含 '{keyword}' 的日志。"
#封装挂载
log_search_tool = SystemLogSearchTool()
tools=[log_search_tool, file_read_tool, directory_read_tool], # 赋予读取系统文件和搜索日志的能力
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐