crewai 知识库针对信息安全应急演练的定位和使用

LangChain vs CrewAI:AI工作流底座选型实战指南 大模型应用开发中,智能体工作流框架的选择本质是工程范式决策。LangChain 以‘链式可组合’为核心,提供组件级控制能力,适合需要深度集成私有系统、精细审计与规则校验的场景;CrewAI 则基于‘角色化协作’范式,天然支持多Agent任务编排,显著降低信息整合与内容生成类项目的启动门槛。二者并非替代关系,而是面向不同抽象层级的技术解法:前者强调透明性与可控性,后者追求敏捷性与语义表达力。在RAG知识库、跨职能报告生成及混合数据源决策等典型场景中,选型需回归业务对‘可追溯性’‘交付速度’和‘协作复杂度’的真 阅读详情

知识库针对信息安全应急演练的定位和使用

在信息安全应急演练(以下简称“应急演练”)场景中,CrewAI的核心定位是**“应急演练全流程智能协作中枢与知识支撑平台”**。其核心价值在于通过多智能体(Agent)协同配合,结合专属知识库的精准赋能,实现应急演练从“场景触发-事件处置-复盘优化”的全流程自动化、标准化与智能化,既替代部分人工重复工作(如信息查询、流程校验),又通过知识沉淀与复用持续提升演练真实性和应急响应能力,为真实网络安全事件处置积累实战经验。

CrewAI的使用需以专属知识库为核心支撑,知识库的建设与应用直接决定应急演练的效率、精度与规范性。以下从“建设内容、建设方式、作用发挥”三大核心维度,梳理CrewAI知识库在应急演练场景中的完整落地逻辑。

一、建设内容

应急演练的核心目标是模拟真实网络安全事件(如数据泄露、勒索攻击、DDoS攻击等),检验团队响应能力,其知识库内容需严格围绕“演练准备-事件检测-应急处置-复盘优化”全流程,筛选“可支撑决策、可指导操作、可验证结果、可沉淀经验”的核心信息,杜绝冗余无效内容。结合应急演练流程特点,知识库核心建设内容分为四大模块,同时遵循明确的内容筛选原则。

根据应急演练的流程,数据库主要需要四个部分。

1.领域/专家知识 (Domain Knowledge)

该模块是保障应急演练合规性、专业性的基础,为CrewAI智能体提供权威的判断标准、技术支撑和行业规范,确保演练处置流程不偏离行业准则和技术常识。

核心内容包括:一是行业标准与法规,如《网络安全法》《数据安全法》中关于应急响应的强制性要求、GB/T 22240《信息安全技术 网络安全应急响应指南》、NIST SP 800-61应急响应框架、等保2.0对应急演练的合规考核指标等;二是技术专家手册,如网络安全设备(防火墙、WAF、IDS/IPS)的应急配置手册、漏洞库(CVE、CNVD)的应急修复方案、常见攻击类型(勒索病毒、SQL注入、供应链攻击)的技术原理与识别特征;三是合规性文件,如企业内部网络安全政策、应急演练合规检查表、第三方审计要求(如SOC 2、ISO 27001对应急响应的考核标准)。

该模块内容主要用于智能体在演练中快速核验处置方案的合规性、判断攻击类型的技术特征、匹配漏洞修复的标准流程,避免出现“处置不合规、技术不专业”的问题。

2.运营/事实数据 (Operational Data)

该模块以结构化数据为主,是智能体快速定位问题、明确责任边界、开展协同处置的关键,需确保数据的实时性、准确性和完整性,支持智能体快速查询与关联分析。

核心内容包括:一是网络资产信息,如企业内网IP地址段分配表(含网段归属部门、负责人、设备类型)、服务器资产清单(主机名、操作系统、部署业务、开放端口、管理员联系方式)、数据库资产信息(库名、存储位置、敏感数据类型、访问权限);二是联系人与权限数据,如应急响应团队成员通讯录(姓名、岗位、电话、负责模块)、第三方服务商联系方式(安全厂商、律师事务所、公关公司)、权限审批流程表(如紧急停机、数据备份恢复的审批人及审批流程);三是环境配置数据,如演练环境拓扑图(标注关键节点、网络链路)、生产环境与演练环境的隔离配置、应急工具部署路径(如漏洞扫描工具、日志分析平台的访问地址与账号)。

该模块内容主要用于智能体在演练中快速查询资产归属、联系相关责任人、获取工具访问权限,为应急处置的快速落地提供精准数据支撑。

3.流程与规则 (Procedures & Rules)

该模块是规范智能体处置步骤、确保演练流程标准化的核心,需具备强可执行性,明确“遇到什么情况、该做什么、怎么做、注意什么”,避免智能体出现操作混乱或流程偏差。

核心内容包括:一是应急响应SOP(标准作业流程),按攻击类型分类的标准化处置流程(如勒索病毒应急响应SOP:发现告警→隔离受感染主机→备份关键数据→分析病毒溯源→修复漏洞→恢复业务→审计复盘)、关键操作步骤的先后顺序(如“必须先关闭受影响端口,再排查漏洞”);二是应急预案,针对不同场景的专项预案(数据泄露应急预案、DDoS攻击应急预案、核心系统故障应急预案)、预案触发条件(如“单台服务器CPU占用率持续10分钟≥95%,触发资源耗尽应急处置”);三是演练规则,如演练评分标准(响应时长、处置准确率、合规性得分)、禁止操作清单(禁止在演练中修改生产环境配置、禁止泄露真实用户数据)、演练场景参数(模拟攻击的IP范围、漏洞利用路径)。

该模块内容主要用于智能体在演练中明确操作流程、遵循处置规则、把控演练边界,确保应急处置动作标准化、规范化。

4.历史与经验 (History & Experience)

该模块由CrewAI框架自动管理,无需人工手动维护,核心是沉淀过往演练的关键信息,让智能体“从历史演练中学习”,持续优化处置效率和精度,实现演练能力的迭代升级。

核心内容包括:一是历史演练结果,如过往演练的场景类型、处置过程记录、得分情况、存在的问题(如“2024年Q2勒索病毒演练中,漏洞修复耗时过长”);二是经验教训总结,如成功处置案例、失败案例复盘、优化建议;三是偏好与适配调整,如根据多次演练结果记录的企业处置偏好、不同场景下的智能体协作模式(“DDoS攻击演练中,由网络Agent先处置,再移交安全Agent溯源”)。

该模块内容主要用于智能体在演练中复用成功经验、规避过往错误、适配企业专属处置习惯,同时为演练复盘优化提供核心依据。

内容筛选原则

为确保知识库内容的“精准性、可用性、安全性”,建设过程中需严格遵循三大筛选原则:

  1. 必要性原则:仅保留与应急演练直接相关、智能体完成任务必须的信息,坚决剔除冗余内容,如过时的旧版应急预案、与演练无关的日常运维数据、重复的漏洞说明文档、测试用的无效数据等,避免占用存储资源、影响检索效率。

  2. 可解析性原则:优先选择结构化(CSV、Excel、JSON)或半结构化(Markdown、带标题的Word)数据,确保智能体可快速提取关键字段;对于非结构化文本(如长PDF手册),需按“场景-步骤-注意事项”分层排版(如应急预案按“事件类型→处置流程→风险提示”分章节),便于智能体进行文本切片和精准检索,避免因格式混乱导致信息无法解析。

  3. 安全性原则:针对敏感信息(如服务器管理员密码、真实用户数据、核心网络拓扑图、核心算法),必须进行加密存储或脱敏处理(如密码加密、用户数据替换为测试数据、拓扑图隐藏关键节点地址);同时严格限制智能体对敏感数据的访问权限(如仅允许指定智能体读取权限审批表),避免演练过程中出现信息泄露,保障演练环境和企业核心信息安全。

二、建设方式

应急演练的数据源呈现“结构化数据与非结构化文档并存、小规模配置文件与大规模手册共生”的特征,不同类型、规模的数据适配不同的建设路径。结合CrewAI框架特性,知识库建设主要有三种核心路径,可单独使用或混合搭配,核心目标是平衡“开发成本、检索效率、使用便捷性”,确保知识库能高效支撑应急演练需求。

路径一:工具挂载 (Tool-based)
1. 适用场景

核心适配运营/事实数据中的小规模结构化文件,以及简易版流程规则表格,具体满足:数据类型为CSV、Excel、JSON等结构化格式;单文件体积≤10MB,总文件数量≤20个;使用需求为快速查询字段、提取关键信息,无需复杂语义解析(如“查询某IP的归属部门”“提取应急联系人电话”)。

典型应用:挂载网络资产清单(CSV)、应急响应团队通讯录(Excel)、演练评分标准(Excel)等。

2. 建设方法

无需复杂开发,直接使用CrewAI框架内置的FileReadTool(单文件读取工具)和DirectoryReadTool(目录读取工具),按以下步骤完成建设:

第一步,数据预处理:对结构化文件进行清理,确保字段清晰,删除空行和无效数据,统一文件编码,避免读取乱码;

第二步,工具配置:针对单个关键文件,使用FileReadTool配置文件路径、编码格式,并添加工具描述(如“用于查询网络资产的IP地址、归属部门、负责人等信息”),便于智能体识别工具用途;针对存放多个规则表格的目录,使用DirectoryReadTool配置目录路径,通过valid_extensions参数限定仅读取CSV、Excel、JSON格式文件,避免无关文件干扰;

第三步,工具绑定与测试:将配置好的工具绑定至负责“信息查询”的智能体(如对应的Agent),测试工具调用是否正常,确保智能体可精准提取目标字段。

3. 核心优势与局限

优势:零开发成本、部署速度快、检索效率高,适配演练中快速查询的刚需;

局限:仅支持结构化数据和小规模文件,不具备语义检索能力,无法适配大规模非结构化文档的检索需求。

路径二:自定义 RAG (Custom RAG)
1. 适用场景

核心适配领域/专家知识、流程与规则中的大规模非结构化文档,具体满足:数据类型为PDF手册、长文本Markdown、复杂Word文档;单文档体积≥50MB、总文档数量≥50个;使用需求为精准语义检索(如“查询勒索病毒应急响应中的数据备份步骤”)、需精细化控制文本切片逻辑(如按章节、场景拆分文档)。

典型应用:挂载GB/T 22240标准PDF、NIST应急响应框架手册、详细版应急预案(Markdown)、复杂攻击类型处置手册等。

2. 建设方法

需基于向量库和嵌入模型构建检索增强生成(RAG)系统,封装为CrewAI自定义工具,核心步骤如下:

第一步,选型配置:向量库优先选择轻量级ChromaDB(适合私有部署、演练环境隔离,成本低、部署便捷),大规模场景可选用Milvus;嵌入模型选择SentenceTransformer的all-MiniLM-L6-v2,高精度需求可选用OpenAI的text-embedding-ada-002;

第二步,文本预处理与切片:对非结构化文档进行清理,按“场景-章节-核心内容”分层切片,为每个切片添加元数据标签,便于后续溯源和精准检索;

第三步,向量库构建:将切片文本、元数据一同传入嵌入模型生成向量,存入向量库并建立索引,设置定期更新机制;

第四步,自定义工具封装:基于CrewAI的BaseTool类,封装检索逻辑,明确检索规则,确保智能体可快速获取相关内容;

第五步,工具绑定与调试:将自定义RAG工具绑定至负责“专业解读、流程指导”的智能体,调试检索精度,确保查询意图与检索结果匹配度≥80%。

3. 核心优势与局限

优势:检索精度高(支持语义检索,可精准匹配复杂查询需求)、支持大规模文档存储、切片和检索规则可自定义,适配演练中复杂场景的专业知识查询需求;

局限:开发成本较高、需维护向量库、本地部署需适配硬件资源。

路径三:原生 Memory 系统
1. 适用场景

核心适配历史与经验数据的沉淀,以及跨任务关联信息的传递,具体满足:数据类型为过往演练结果、经验教训、跨任务协作数据(如前序智能体的查询结果);使用需求为无需手动维护、智能体自主记忆与复用信息、支持多智能体协作演练(如资产查询Agent→处置执行Agent→复盘优化Agent的信息传递)。

典型应用:存储历史演练复盘报告、跨智能体协作数据、智能体处置偏好等。

2. 建设方法

无需手动构建知识库结构,直接依托CrewAI框架原生Memory系统,按以下步骤完成配置:

第一步,基础配置:在Crew(智能体团队)初始化时,开启memory=True参数,指定记忆存储路径,避免默认临时目录导致记忆丢失;

第二步,嵌入模型适配:演练环境为私有部署时,选择Ollama的nomic-embed-text模型;可访问公网时,选用OpenAI Embedding提升记忆检索精度;

第三步,记忆类型配置:根据演练需求灵活开启记忆类型,跨任务协作时开启短期记忆(Short-term Memory)+实体记忆(Entity Memory),经验沉淀时开启长期记忆(Long-term Memory),减少资源占用;

第四步,通用知识挂载:将通用型应急知识(如基础应急响应流程、常见攻击识别特征)直接通过knowledge_sources参数挂载,框架自动处理文本切片、向量化与存储,无需人工干预。

3. 核心优势与局限

优势:开箱即用、自动管理记忆生命周期、支持跨任务信息复用、可自动沉淀历史经验;

局限:记忆存储路径配置灵活度低、切片和检索逻辑不可自定义、大规模数据下性能略有下降。

三、发挥作用

知识库的核心价值不在于“存得多”,而在于“用得好”。需将知识库深度融入应急演练“准备-处置-复盘”全环节,通过“检索增强、决策约束、跨任务记忆”三大核心机制,让智能体自主调用知识、规范执行流程、高效协同协作,实现知识的动态赋能。

(一)检索增强 (RAG)

Agent 在思考时检索相关知识,将其注入 Prompt,使其能基于特定文档回答问题,减少幻觉。

1. 核心逻辑

智能体在执行演练任务时,自动检索知识库中与当前场景匹配的专业知识、流程规则和数据信息,将检索结果注入Prompt,让智能体基于权威、准确的知识做出决策,避免因知识储备不足或主观判断导致的“幻觉”。

2. 典型应用场景
  1. 事件识别阶段:当演练触发“服务器异常告警”,处置智能体自动调用自定义RAG工具,检索“常见服务器异常对应的攻击类型”,结合告警特征快速判断为DDoS攻击或勒索病毒入侵,避免误判;

  2. 处置执行阶段:执行“漏洞修复”步骤时,智能体调用领域/专家知识模块,检索对应漏洞的应急修复方案,严格按手册中的操作步骤执行,确保操作专业合规;

  3. 合规验证阶段:演练结束后,复盘智能体调用RAG工具检索行业标准和企业合规要求,验证处置流程是否符合响应时长、操作规范等考核指标,生成合规性报告。

3. 优化技巧

在工具描述(description)中明确检索场景,引导智能体在特定场景下精准调用对应知识库工具,提升检索效率和匹配精度;同时设置检索结果过滤规则,仅返回与当前任务高度相关的信息,避免信息过载。

(二)决策约束

通过检索到的规则,强制 Agent 遵循业务逻辑。

1. 核心逻辑

通过知识库中的流程规则、禁止操作清单、优先级排序等内容,为智能体的决策和操作设置“刚性边界”,强制智能体遵循业务逻辑和演练规范,避免出现违规操作、流程偏差等问题。

2. 典型应用场景
  1. 权限约束:当智能体尝试执行“关闭核心业务服务器”“修改数据库访问权限”等高危操作时,自动检索流程与规则模块中的“权限审批流程”和“禁止操作清单”,若未获取审批权限,智能体将暂停操作并发起权限申请,确保操作合规;

  2. 流程约束:处置智能体在执行“数据恢复”步骤时,检索到应急预案中的明确规则“数据恢复前必须先完成漏洞修复和病毒清除”,因此自动调整操作顺序,先执行漏洞修复和病毒清除,再进行数据恢复,避免恢复后系统再次被攻击;

  3. 优先级约束:当同时出现多个处置任务,智能体检索“任务优先级规则”,按优先级顺序执行任务,确保核心目标达成。

3. 实现方式

在自定义RAG工具或文件工具中添加“规则校验逻辑”,智能体检索到相关规则后,自动将其作为操作前提条件;若检测到违反规则的操作意图,智能体将拒绝执行并提示原因,同时引导其执行合规流程。

(三)跨任务记忆

利用 Short-term Memory,让后续任务的 Agent 直接利用前序 Agent 的查证结果,无需重复劳动。

1. 核心逻辑

利用CrewAI的短期记忆(Short-term Memory)和实体记忆(Entity Memory),实现跨任务、跨智能体的信息无缝流转,前序任务的执行结果自动传递给后续任务的智能体,无需重复查询;同时通过长期记忆(Long-term Memory)沉淀历史经验,持续优化演练流程和智能体处置能力。

2. 典型应用场景
  1. 跨智能体信息复用:资产查询智能体完成“受攻击IP的归属查询”,处置执行智能体直接从短期记忆中获取该结果,无需重新调用工具查询,快速联系受害ip负责人确认服务器状态并开展协同处置;

  2. 多步骤任务信息传递:在“攻击检测→资产定位→漏洞修复→业务恢复→复盘优化”的全流程演练中,每个步骤的执行结果自动存入记忆,后续步骤的智能体可随时调取,确保流程连贯、信息不丢失;

  3. 历史经验复用:复盘优化智能体从长期记忆中提取“往年演练的经验教训”,结合本次演练结果,生成针对性优化建议,并自动更新至知识库,供后续演练使用。

3. 优化技巧

设置记忆有效期(如短期记忆保留24小时,适配单场演练的跨任务协作;长期记忆永久保留,适配多场演练的经验沉淀),定期清理无效记忆(如重复的查询结果、过时的演练数据),避免占用过多存储资源;同时通过实体记忆提取关键信息(如IP地址、漏洞编号、负责人姓名),确保记忆内容精准、可用。

四、方案总结

在信息安全应急演练场景中,CrewAI的定位是“全流程智能协作中枢与知识支撑平台”,其核心价值实现依赖于专属知识库的精准建设与高效应用。知识库需围绕“领域/专家知识、运营/事实数据、流程与规则、历史与经验”四大核心内容构建,遵循“必要性、可解析性、安全性”三大筛选原则;建设过程中需结合数据特征,采用“工具挂载+自定义RAG+原生Memory系统”的混合建设路径,平衡开发成本与使用需求;通过“检索增强、决策约束、跨任务记忆”三大机制,实现知识在演练全流程的动态赋能,最终达成“演练流程标准化、决策判断精准化、协同协作高效化、能力迭代自动化”的核心目标,为真实网络安全事件的处置积累实战经验,提升企业整体应急响应能力。

五、具体实施

想要让crewai在应急响应中发挥作用,首先需要有庞大的知识库作为支撑。这个知识库不仅能指导ai在演练被红队攻击时处理事务的优先级,还能规范ai对应急的响应操作,确保其迅速有效。此外,我们还可以把公司的资产以及对应负责人的信息放进csv文件中,方便crewai使用readtools对其进行排查上报。

1、数据生成
import os
import csv
import random
from datetime import datetime

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
KNOWLEDGE_DIR = os.path.join(BASE_DIR, "knowledge")

def ensure_dir(path):
    if not os.path.exists(path):
        os.makedirs(path)

def generate_assets():
    print("Generating Asset Inventory...")
    assets_dir = os.path.join(KNOWLEDGE_DIR, "assets")
    ensure_dir(assets_dir)
    
    # 1. Server Inventory
    departments = ["Finance", "HR", "R&D", "Marketing", "Operations", "IT_Security"]
    os_types = ["Ubuntu 22.04", "CentOS 7", "Windows Server 2019", "Windows Server 2022", "RedHat 8"]
    services = ["Web Server", "Database", "File Share", "Domain Controller", "App Server", "Backup Server"]
    
    with open(os.path.join(assets_dir, "server_inventory.csv"), "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(["Asset_ID", "IP_Address", "Hostname", "OS", "Service", "Department", "Owner", "Criticality", "Last_Patched"])
        
        for i in range(1, 201):  # 200 Servers
            dept = random.choice(departments)
            ip = f"192.168.{random.randint(10, 50)}.{random.randint(1, 254)}"
            hostname = f"{dept[:3].upper()}-SRV-{i:03d}"
            os_ver = random.choice(os_types)
            svc = random.choice(services)
            owner = f"admin_{dept.lower()}@company.com"
            criticality = "High" if svc in ["Database", "Domain Controller"] else random.choice(["Medium", "Low"])
            last_patched = datetime(2025, random.randint(1, 12), random.randint(1, 28)).strftime("%Y-%m-%d")
            
            writer.writerow([f"ASSET-{i:04d}", ip, hostname, os_ver, svc, dept, owner, criticality, last_patched])

    # 2. Emergency Contacts
    with open(os.path.join(assets_dir, "emergency_contacts.csv"), "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(["Role", "Name", "Phone", "Email", "Availability"])
        roles = [
            ("CISO", "Zhang Wei", "+86-13800000001", "ciso@company.com", "24/7"),
            ("Network Lead", "Li Qiang", "+86-13800000002", "net_lead@company.com", "On-Call"),
            ("Server Lead", "Wang Fang", "+86-13800000003", "srv_lead@company.com", "9am-6pm"),
            ("Legal Counsel", "Zhao Min", "+86-13800000004", "legal@company.com", "Business Hours"),
            ("PR Manager", "Sun Li", "+86-13800000005", "pr@company.com", "On-Call")
        ]
        for r in roles:
            writer.writerow(r)

def generate_policies():
    print("Generating Security Policies...")
    policies_dir = os.path.join(KNOWLEDGE_DIR, "policies")
    ensure_dir(policies_dir)
    
    # 1. Network Security Policy (Long Text)
    content = "# Enterprise Network Security Policy\n\n"
    content += "## Chapter 1: General Provisions\n"
    content += "This policy dictates the requirements for network security within the organization.\n\n"
    
    for i in range(1, 51):
        content += f"### Article 1.{i}: Network Access Control\n"
        content += f"All network access must be authenticated. Rule 1.{i} states that access to VLAN {100+i} is restricted to authorized personnel only. "
        content += "Users must use MFA for VPN access. Port security must be enabled on all edge switches.\n\n"

    for i in range(1, 51):
        content += f"### Article 2.{i}: Firewall Configuration\n"
        content += f"Firewall rule set {i} must default to DENY ALL. Only ports 80, 443, and 53 are allowed outbound for user segments. "
        content += "Management interfaces must not be exposed to the internet.\n\n"

    with open(os.path.join(policies_dir, "network_security_policy.md"), "w", encoding="utf-8") as f:
        f.write(content)

    # 2. Data Protection Standard
    content = "# Data Protection & Privacy Standard\n\n"
    content += "## Classification of Data\n"
    levels = ["Public", "Internal", "Confidential", "Restricted"]
    for level in levels:
        content += f"### {level} Data\n"
        content += f"Data classified as {level} requires specific handling controls. Encryption at rest is {'mandatory' if level in ['Confidential', 'Restricted'] else 'optional'}.\n\n"
    
    with open(os.path.join(policies_dir, "data_protection.md"), "w", encoding="utf-8") as f:
        f.write(content)

def generate_sops():
    print("Generating SOPs...")
    sops_dir = os.path.join(KNOWLEDGE_DIR, "sops")
    ensure_dir(sops_dir)
    
    # 1. Ransomware SOP
    content = "# Ransomware Incident Response SOP\n\n"
    phases = [
        ("Preparation", "Ensure backups are immutable. Update antivirus signatures."),
        ("Detection", "Monitor for mass file renames, encryption extensions (e.g., .locked), and ransom notes."),
        ("Containment", "1. Disconnect infected host from network immediately.\n2. Isolate the VLAN.\n3. Do NOT power off if RAM analysis is needed, but hibernate."),
        ("Eradication", "1. Identify the strain of ransomware.\n2. Locate the entry point (RDP, Phishing).\n3. Reimage the machine from gold image."),
        ("Recovery", "1. Restore data from offline backups.\n2. Verify data integrity.\n3. Phased network reconnection."),
        ("Lessons Learned", "Conduct post-incident review within 48 hours.")
    ]
    
    for phase, action in phases:
        content += f"## Phase: {phase}\n{action}\n\n"
        content += "### Detailed Checkpoints\n"
        for i in range(1, 6):
            content += f"- [ ] Checkpoint {phase[0]}-{i}: Verify step {i} of {phase} is complete.\n"
        content += "\n"

    with open(os.path.join(sops_dir, "ransomware_sop.md"), "w", encoding="utf-8") as f:
        f.write(content)

    # 2. DDoS SOP
    content = "# DDoS Incident Response SOP\n\n"
    content += "## Immediate Actions\n1. Verify if traffic is legitimate.\n2. Contact ISP for upstream blocking.\n3. Enable WAF under attack mode.\n\n"
    content += "## Analysis\nCheck logs for IP patterns. Identify if Layer 3 (Volumetric) or Layer 7 (App).\n"
    
    with open(os.path.join(sops_dir, "ddos_sop.md"), "w", encoding="utf-8") as f:
        f.write(content)

if __name__ == "__main__":
    generate_assets()
    generate_policies()
    generate_sops()
    print("Knowledge Base Generation Complete.")

因为是演练,所以我们用随机数+循环函数生成了大量的数据来模拟ai在日志中找出疑点,此外在生成一些应急报告、操作指南以及相关的联系人员名单等

2、rag_tools封装

还是依照之前的方法,通过猴子补丁把embedder的调用路径给替换成本地的模型库进行切片分隔

import os
from typing import Type, Any
from pydantic import BaseModel, Field, PrivateAttr
from crewai.tools import BaseTool
import chromadb
from sentence_transformers import SentenceTransformer

# ==============================================================================
# Global Singleton Resources (Module Level)
# To avoid Pydantic serialization issues and re-initialization
# ==============================================================================
_RAG_CLIENT = None
_RAG_COLLECTION = None
_RAG_EMBED_MODEL = None
_LOCAL_EMBEDDING_MODEL_PATH = os.getenv(
    "LOCAL_EMBEDDING_MODEL",
    "/root/.cache/huggingface/hub/models--sentence-transformers--all-MiniLM-L6-v2/snapshots/c9745ed1d9f207416be6d2e6f8de32d1f16199bf"
)

def _get_or_init_resources(knowledge_path: str):
    global _RAG_CLIENT, _RAG_COLLECTION, _RAG_EMBED_MODEL, _LOCAL_EMBEDDING_MODEL_PATH
    
    if _RAG_CLIENT is None:
        print("Initializing RAG System Resources...")
        
        # 1. Setup ChromaDB
        db_path = os.path.join(os.path.dirname(knowledge_path), "rag_vector_db")
        _RAG_CLIENT = chromadb.PersistentClient(path=db_path)
        
        # 2. Setup Embedding Model
        print(f"Loading Embedding Model from: {_LOCAL_EMBEDDING_MODEL_PATH}")
        try:
            _RAG_EMBED_MODEL = SentenceTransformer(_LOCAL_EMBEDDING_MODEL_PATH)
        except Exception as e:
            print(f"Failed to load local model from {_LOCAL_EMBEDDING_MODEL_PATH}, falling back to 'all-MiniLM-L6-v2'")
            _RAG_EMBED_MODEL = SentenceTransformer('all-MiniLM-L6-v2')

        # 3. Get Collection
        _RAG_COLLECTION = _RAG_CLIENT.get_or_create_collection(name="security_knowledge")
        
        # 4. Check ingestion
        if _RAG_COLLECTION.count() == 0:
            _ingest_knowledge(knowledge_path)
        else:
            print(f"RAG DB already contains {_RAG_COLLECTION.count()} documents.")

def _ingest_knowledge(knowledge_path: str):
    global _RAG_COLLECTION, _RAG_EMBED_MODEL
    print(f"Ingesting knowledge from {knowledge_path}...")
    docs = []
    ids = []
    metadatas = []
    
    for root, _, files in os.walk(knowledge_path):
        for file in files:
            if file.endswith(".md") or file.endswith(".txt"):
                file_path = os.path.join(root, file)
                with open(file_path, "r", encoding="utf-8") as f:
                    text = f.read()
                
                # Simple chunking
                chunks = [c.strip() for c in text.split('\n\n') if c.strip()]
                
                for i, chunk in enumerate(chunks):
                    if len(chunk) < 10: continue
                    docs.append(chunk)
                    ids.append(f"{file}_{i}")
                    metadatas.append({"source": file, "category": os.path.basename(root)})

    if docs:
        print(f"Embedding {len(docs)} chunks...")
        embeddings = _RAG_EMBED_MODEL.encode(docs).tolist()
        
        batch_size = 100
        for i in range(0, len(docs), batch_size):
            end = min(i + batch_size, len(docs))
            _RAG_COLLECTION.add(
                ids=ids[i:end],
                documents=docs[i:end],
                embeddings=embeddings[i:end],
                metadatas=metadatas[i:end]
            )
        print("Ingestion Complete.")


# Define Input Schema for the Tool
class SecurityKnowledgeInput(BaseModel):
    query: str = Field(..., description="The search query regarding security policies, SOPs, or standards.")

class SecurityKnowledgeRAGTool(BaseTool):
    name: str = "Security Knowledge Base Search"
    description: str = (
        "Useful for searching security policies, compliance standards, and incident response SOPs. "
        "Input should be a specific question or keyword related to the incident."
    )
    args_schema: Type[BaseModel] = SecurityKnowledgeInput
    
    def __init__(self, knowledge_path: str = "./knowledge", **kwargs):
        super().__init__(**kwargs)
        _get_or_init_resources(knowledge_path)

    def _run(self, query: str) -> str:
        global _RAG_COLLECTION, _RAG_EMBED_MODEL
        print(f"Searching RAG for: {query}")
        
        if _RAG_EMBED_MODEL is None or _RAG_COLLECTION is None:
             return "Error: RAG System not initialized."

        query_embedding = _RAG_EMBED_MODEL.encode([query]).tolist()
        
        results = _RAG_COLLECTION.query(
            query_embeddings=query_embedding,
            n_results=3,
            include=['documents', 'metadatas']
        )
        
        output = "### Search Results:\n"
        if results['documents'] and results['documents'][0]:
            for i, doc in enumerate(results['documents'][0]):
                meta = results['metadatas'][0][i]
                output += f"**Source:** {meta['source']} ({meta['category']})\n"
                output += f"**Content:** {doc}\n\n"
        else:
            output += "No relevant documents found."
            
        return output
3.main函数执行

最后按照我们直接的建设内容进行人员任务划分,并接入llm,最后将输出结果写到md当中去。

import os
import sys
from typing import List, Any
from sentence_transformers import SentenceTransformer

# ==============================================================================
# 1. Environment Configuration & Patching
# ==============================================================================

# LLM Configuration
LLM_API_KEY = os.getenv("LLM_API_KEY", "YOUR_LLM_API_KEY_HERE")
LLM_BASE_URL = os.getenv("LLM_BASE_URL", "https://YOUR_LLM_BASE_URL/api/v1")
LLM_MODEL = os.getenv("LLM_MODEL", "deepseek-v3")

# Important: Set OPENAI_API_KEY to satisfy validation checks in CrewAI/ChromaDB
# even though we will intercept the actual calls.
os.environ["OPENAI_API_KEY"] = LLM_API_KEY

# Local Embedding Model Path
LOCAL_EMBEDDING_MODEL = os.getenv(
    "LOCAL_EMBEDDING_MODEL",
    "{YOUR_LOCAL_EMBEDDING_MODEL_CACHE_PATH}",
)

print(f"🔧 [Patch] Loading local embedding model: {LOCAL_EMBEDDING_MODEL}")
try:
    _local_embed_model = SentenceTransformer(LOCAL_EMBEDDING_MODEL)
except Exception:
    print(f"⚠️ [Patch] Failed to load from {LOCAL_EMBEDDING_MODEL}, falling back to 'all-MiniLM-L6-v2'")
    _local_embed_model = SentenceTransformer('all-MiniLM-L6-v2')

# --- MONKEY PATCH: Intercept OpenAI Embedding Calls ---
import openai.resources.embeddings
from openai.types import CreateEmbeddingResponse, Embedding
from openai.types.create_embedding_response import Usage

def local_create_embedding(self, *args, **kwargs):
    """
    Mock function to replace openai.resources.embeddings.Embeddings.create
    Intercepts calls from CrewAI/ChromaDB and uses local SentenceTransformer.
    """
    input_text = kwargs.get('input')
    if not input_text:
        return CreateEmbeddingResponse(
            data=[], 
            model="local-model", 
            object="list", 
            usage=Usage(prompt_tokens=0, total_tokens=0)
        )

    if isinstance(input_text, str):
        input_text = [input_text]
    
    # Generate embeddings locally
    vectors = _local_embed_model.encode(input_text).tolist()
    
    # Construct response object mimicking OpenAI API
    data_items = []
    for i, vec in enumerate(vectors):
        data_items.append(Embedding(
            index=i,
            embedding=vec,
            object="embedding"
        ))
    
    return CreateEmbeddingResponse(
        data=data_items,
        model="text-embedding-3-small-local",
        object="list",
        usage=Usage(prompt_tokens=len(input_text), total_tokens=len(input_text))
    )

print("🔧 [Patch] Replacing openai.resources.embeddings.Embeddings.create with local implementation")
openai.resources.embeddings.Embeddings.create = local_create_embedding

# ==============================================================================
# 2. Application Logic
# ==============================================================================

from crewai import Agent, Task, Crew, Process, LLM
from crewai_tools import FileReadTool
from rag_tool import SecurityKnowledgeRAGTool

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
KNOWLEDGE_DIR = os.path.join(BASE_DIR, "knowledge")
ASSETS_DIR = os.path.join(KNOWLEDGE_DIR, "assets")

# Initialize LLM
my_llm = LLM(
    model=f"openai/{LLM_MODEL}",
    base_url=LLM_BASE_URL,
    api_key=LLM_API_KEY
)

# Tools
asset_file_tool = FileReadTool(
    file_path=os.path.join(ASSETS_DIR, "server_inventory.csv"),
    description="读取服务器资产清单,用于查找IP地址对应的归属部门、负责人和操作系统信息。"
)

contact_file_tool = FileReadTool(
    file_path=os.path.join(ASSETS_DIR, "emergency_contacts.csv"),
    description="读取应急联系人列表。"
)

rag_tool = SecurityKnowledgeRAGTool(knowledge_path=KNOWLEDGE_DIR)

# Agents
analyst = Agent(
    role='高级安全分析师',
    goal='分析安全告警,识别攻击类型,并从知识库中检索正确的应急响应SOP。',
    backstory=(
        "你是网络安全取证专家。你的职责是根据告警信息,"
        "查询知识库中的SOP和安全策略,确定技术层面的处置步骤。"
    ),
    tools=[rag_tool],
    verbose=True,
    memory=True,
    llm=my_llm
)

asset_manager = Agent(
    role='IT资产管理员',
    goal='定位受影响的系统及其负责人。',
    backstory=(
        "你管理着企业的CMDB。当提供IP地址或主机名时,"
        "你能快速查出该资产属于哪个部门、谁是负责人以及其重要性等级。"
    ),
    tools=[asset_file_tool, contact_file_tool],
    verbose=True,
    memory=True,
    llm=my_llm
)

commander = Agent(
    role='应急演练指挥官',
    goal='制定最终的应急响应方案并确保合规。',
    backstory=(
        "你是本次演练的总指挥。你需要汇总分析师的技术方案和资产管理员的背景信息,"
        "生成一份可执行的、符合公司规定的《应急响应行动计划》。"
    ),
    verbose=True,
    allow_delegation=True,
    llm=my_llm
)

# Tasks
INCIDENT_SERVER_IP = "{INFECTED_SERVER_IP}"
incident_input = f"告警:在服务器 {INCIDENT_SERVER_IP} 上检测到大量文件被重命名为 .locked 后缀,疑似勒索病毒感染。"

task_analyze = Task(
    description=(
        f"分析以下告警信息:'{incident_input}'。\n"
        "1. 使用RAG工具搜索知识库,判断这是什么类型的攻击。\n"
        "2. 检索并总结该攻击类型对应的 SOP (标准作业程序) 的关键步骤。\n"
        "3. 找出任何相关的安全策略条款。"
    ),
    expected_output="一份事故分析报告,包含攻击类型、SOP关键摘要和相关策略引用。",
    agent=analyst
)

task_asset_context = Task(
    description=(
        f"基于告警IP ({INCIDENT_SERVER_IP}),查询资产详情。\n"
        "1. 在资产清单中查找该IP的主机名、归属部门和负责人。\n"
        "2. 确定该系统的关键性等级 (Criticality)。\n"
        "3. 在联系人列表中找到相关负责人的电话。"
    ),
    expected_output="受影响资产画像,包含负责人联系方式和业务重要性。",
    agent=asset_manager
)

task_response_plan = Task(
    description=(
        "综合分析报告和资产画像,制定最终的《应急响应行动计划》。\n"
        "计划必须包含:\n"
        "1. 事故摘要 (Executive Summary)。\n"
        "2. 通知对象 (谁需要被叫醒)。\n"
        "3. 详细处置步骤 (基于SOP,例如是否断网、是否关机等)。\n"
        "4. 合规性说明 (引用具体的策略条款)。"
    ),
    expected_output="一份专业的、可立即执行的应急响应行动计划。",
    agent=commander,
    context=[task_analyze, task_asset_context],
    output_file='incident_response_plan.md'
)

# Crew
security_drill_crew = Crew(
    agents=[analyst, asset_manager, commander],
    tasks=[task_analyze, task_asset_context, task_response_plan],
    process=Process.sequential,
    memory=True, 
    verbose=True,
    embedder={
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
)

if __name__ == "__main__":
    print("## 信息安全应急演练系统启动 ##")
    print(f"当前演练场景: {incident_input}")
    print("------------------------------------------------")
    
    result = security_drill_crew.kickoff()
    
    print("\n\n########################")
    print("## 最终响应方案 ##")
    print("########################\n")
    print(result)

    # 确保保存到文件(双重保险)
    with open("final_response.md", "w", encoding="utf-8") as f:
        f.write("# 应急响应演练最终报告\n\n")
        f.write(str(result))
    print("\n\n✅ 结果已保存至: incident_response_plan.md 和 final_response.md")

MCP协议与CrewAI:构建企业级AI协作的上下文标准 上下文管理是多Agent系统稳定运行的基础能力,其本质是解决跨模型、跨服务、跨团队的数据语义一致性问题。MCP(Model Context Protocol)作为轻量级上下文通信协议,通过context_id、source、schema_version等结构化元数据,实现上下文的可追溯、可验证、可治理;CrewAI则基于该协议提供角色驱动、上下文感知、共享内存可信的智能编排能力。二者结合,显著提升AI系统在金融风控、保险理赔等强合规场景下的可复现性、可观测性与可扩展性,为企业从单点AI实验迈向规模化Agen 阅读详情

相关推荐

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声?

本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。

weixin_30555125的博客 114

AutoGen与CrewAI本质差异:对话流派vs角色流派的工程哲学

多智能体系统是当前AI工程化落地的核心范式,其本质是通过角色分工与协作实现复杂任务自动化。AutoGen以事件驱动和结构化消息流为根基,强调可审计、可追溯、强约束的对话式协作;CrewAI则基于角色-任务-剧组三层抽象,追求低门槛配置、高迭代弹性与声明式流程编排。二者共同支撑LLM智能体协同这一基础能力,但在安全水位、团队适配性、运维可观测性及工具链集成方式上存在根本分野。技术选型不应聚焦参数性能,而应回归业务本质:强监管场景需AutoGen的‘法庭级’控制力,敏捷产品场景则依赖CrewAI的‘摄制组式’灵

weixin_30416871的博客 562

C++结合大漠插件实现DNF自动化脚本:从原理到实战

自动化技术通过模拟用户操作,实现重复性任务的自动执行,其核心原理在于对系统输入输出接口的精确控制。在Windows平台,这通常涉及窗口管理、图像识别与键鼠模拟等技术。这些技术为软件自动化测试、办公流程自动化及特定场景的辅助工具开发提供了工程实践基础。大漠插件作为国内广泛使用的Windows自动化开发组件,封装了上述底层操作,显著降低了开发门槛。通过其提供的COM接口,开发者可以高效实现窗口绑定、后台找图找色及内存读写等关键功能。本文以《地下城与勇士》为例,详细解析如何利用C++集成大漠插件,构建一个稳定、高

weixin_34185512的博客 577

CrewAI知识库实战:让应急演练告别背剧本

从大模型到多智能体协作,现代AI技术正在重塑企业应急响应方式。知识库作为大模型应用中的关键组件,通过RAG检索增强生成机制,将散落的预案、资产清单、历史事件转化为可即时调用的决策依据。将知识库与多智能体框架结合,能够实现告警分析、影响评估、处置协调、复盘归档的自动化闭环,解决传统演练中信息爆炸、经验流失、协作断档等痛点。以CrewAI知识库为例,其按角色隔离知识源、任务级检索、引用溯源等特性,让每一步处置建议都有据可查。本文从知识库切片策略、元数据过滤、防幻觉设计到完整演练流程落地,展示智能体驱动的应急演练

weixin_33309048的博客 273

Numpy快速入门(np)!看这一篇就够了

Numpy快速入门(np)!看这一篇就够了

weixin_74009895的博客 2679

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1653

CrewAI知识库驱动应急演练:智能体让安全响应有据可依

在安全运营与应急响应场景中,决定研判速度的往往不是算力,而是知识调取的效率。检索增强生成(RAG)通过外部知识库与智能体协同,让AI模型在回答问题前先检索权威依据,从而减少幻觉、提升结论可信度。这一技术已在智能客服、企业知识管理等场景验证价值,同样适用于安全事件处置:将应急预案、历史复盘、操作手册结构化后,借助CrewAI编排的多角色智能体,在演练中实现知识动态供给,把研判时间从20分钟压缩到5分钟以内。本文以红蓝对抗演练为背景,分享知识库分层架构、切分参数、混合检索与智能体协作的工程实践,帮助安全团队构建

weixin_28235513的博客 219

大白映射 宝马Esys编程设码映射、USB设备映射

大白映射,宝马Esys设码编程、USB设备映射

denson0394的博客 4800

CrewAI多智能体与知识库驱动的应急演练智能化实践

在安全运营与应急响应场景中,知识获取效率往往决定了事件处置速度。传统方式下,预案、案例、情报分散在不同系统,分析师需在高压状态下手工检索,成本高且难以复用。检索增强生成(RAG)技术将知识库与大模型结合,让模型基于事实生成建议,而多智能体框架进一步将信息汇聚、研判分析、处置建议、复盘总结等职责拆分为独立协作单元,避免上下文互相干扰。通过工具调用与预注入检索联动,智能体可以快速定位历史案例和预案章节,输出结构化、可溯源的处置步骤。这一思路在安全应急演练中具有重要意义:既能缩短决策时间,又能沉淀组织经验,形成持

weixin_28224217的博客 225

一种白平衡增益计算中白点权重计算简易实现方式

一种白平衡白点距离权重简易实现方式

大熊 384

嵌入式面经(2)——央企篇

前文得知我只投央企,不投国企,有面试的央企大致有三类:感兴趣的同学可以和我私聊军工央企相关(航空航天,兵器兵工)制造央企相关(三桶油,装备制造)金融运维相关(信通集团,国有银行)接下来我将对我有的面试中询问的面经进行总结。

coldmood77的博客 468

【亲测免费】 CrewAI框架详解及入门指南

CrewAI是一个创新的框架,旨在协调多个角色扮演的自主AI代理协同工作,通过促进合作智能,使这些代理能够无缝协作并解决复杂的任务。这个框架尤其适合构建智能助手平台、自动化客服团队或者任何需要多智能体协作的系统。它借鉴了Autogen的对话灵活性和ChatDev的结构化处理方式,但提供了更高的可扩展性和生产环境的适应性。 ## 项目快速启动 要开始使用CrewAI,按照以下步骤操作: 1. ...

gitblog_00336的博客 2207

Unity 热更 之 【YooAsset 热更】几分钟快速了解 YooAsset [功能面板]、以及 [基础代码] 说明

Unity 的资源管理系统不断发展,以适应不同项目的需求和解决特定的问题。AssetBundle 和 Addressable Asset System 是 Unity 官方提供的资源管理解决方案,而 YooAsset 是第三方提供的资源管理系统。简化的API和易用性YooAsset 可能提供了更简单直观的 API,使得资源加载和管理更加容易。对于不熟悉 Addressable 或 AssetBundle 复杂配置的开发者来说,YooAsset 可能是一个更易于上手的选择。性能优化。

仙魁XAN 2956

第39章:CrewAI 生产级可观测性与 SRE 应急体系

本章为 CrewAI 应用建立生产级 SRE 体系。核心是 SLI/SLO 定义(成功率、P95 延迟、错误率、成本)与四级告警(P0–P3),配套告警抑制与去重。通过 Runbook 标准化故障响应流程,并设计六级降级策略(L0 正常 → L5 人工接管),基于 SLI 阈值自动触发与恢复。实战实现 SLOMonitor、AlertManager、DegradationController,模拟 OpenAI 故障场景,验证自动降级、告警发送与恢复流程,强调故障可感知、可恢复、可复盘。

davidwang456的专栏 78

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

如何快速掌握CrewAI框架:多AI代理协作的完整指南

CrewAI是一个创新的框架,专门用于协调具有角色扮演能力的自主AI代理,通过促进协作智能,使这些代理能够无缝协作并解决复杂的任务。这个框架特别适合构建智能助手平台、自动化客服团队或者任何需要多智能体协作的系统。 ## 什么是CrewAI框架? CrewAI框架的核心设计理念是通过"团队协作"的方式来解决复杂问题。与传统的单代理AI系统不同,CrewAI允许多个AI代理各自扮演不同角色,通过明

gitblog_00233的博客 346

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

小白入门大模型应用必读:一文看懂人工智能核心框架 LangChain 和 Crewai

LangChain 和 CrewAI 是当前人工智能领域中两个重要的框架,它们在设计理念、功能定位和应用场景上存在显著差异,但也存在一定的互补关系。太长不看版:LangChain是一个开源框架,主要用于将大语言模型与外部数据源和工具结合,模块化设计,支持多种LLM集成,适用于对话AI、内容生成、数据分析等场景。而CrewAI,专注于多智能体协作,基于角色分工,适合需要团队合作的任务,比如项目管理、复杂问题解决等。

lyy2017175913的博客 1345

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

CrewAI多智能体系统API密钥安全防护10大实战技巧

在构建基于大语言模型的多智能体协作系统时,API密钥管理与安全配置是保障项目稳定运行的核心基础。其原理在于通过环境隔离与动态注入机制,实现敏感信息与代码逻辑的分离,从而从根源上避免密钥泄露风险。这一技术实践的价值不仅在于防止因密钥暴露导致的经济损失和未授权访问,更在于为智能体系统的规模化部署提供了可靠的安全基线。在CrewAI这类智能体编排框架的应用场景中,由于涉及频繁的外部API调用和复杂的任务协作流程,安全配置需要覆盖密钥存储、访问控制、操作审计和网络隔离等多个层面。本文聚焦于【密钥管理】与【速率限制】

weixin_30443813的博客 537

CrewAI vs LangGraph:多智能体编排该选谁?一篇讲清,小白也能懂!

CrewAI 和 LangGraph 都是智能体编排相关的开源框架,前者采用代码优先的编排方式,后者则提供可视化编排能力。

bugyinyin的博客 2013

CrewAI构建可审计供应链智能代理实战指南

智能代理(Agent)是当前AI工程化落地的核心范式,其本质是将领域知识、业务规则与工具调用能力封装为可编排、可追溯、可协作的自主角色。相比传统RPA或单点LLM应用,多智能体系统强调角色分工、任务契约与执行留痕,尤其适用于规则明确但路径动态的复杂业务场景。在供应链领域,supply chain agent需兼顾数据分散性、决策联动性与人工协同刚性,而CrewAI作为轻量级多Agent编排引擎,通过强约束工具调用、自然语言Task定义和内置可观测性,显著提升方案可信度与落地效率。本文聚焦真实产线缺料响应、跨

weixin_30629653的博客 446

零基础也能懂!CrewAI和LangGraph选型指南:从概念到部署,一篇通吃多智能体

对于需要在快速原型开发与未来可扩展性之间取得平衡的开发者而言,在CrewAI和LangGraph之间做选择并非易事。

m0_59164520的博客 1252

大模型多智能体框架之争:AutoGen、CrewAI、LangGraph选型策略

文章深入对比三大多智能体框架:Autogen(对话驱动,擅长人机协作)、CrewAI(模块化流水线架构)和LangGraph(状态机驱动的流程编排)。通过分析三者在开发效率、灵活性和控制粒度上的差异,结合金融、电商、自动驾驶等实际应用场景,提供针对性选型建议。文章还强调提示词设计和协作优化的重要性,指出开发者应根据具体业务场景选择最合适的框架,而非盲目追随技术趋势。

weixin_55154866的博客 1436

CrewAI完整指南:多智能体协作框架的终极入门教程

想要构建智能的AI团队协作系统吗?CrewAI框架让多个AI代理像真实团队一样无缝配合,共同解决复杂任务。作为多智能体协作领域的创新工具,它结合了对话灵活性和结构化处理的优势,为开发者提供了强大的生产级解决方案。 ## 🎯 为什么选择CrewAI? CrewAI框架的核心价值在于它能够协调多个具备角色扮演能力的AI代理,通过促进协作智能,使这些代理能够高效协同工作。与传统的单一AI模型相比,

gitblog_00222的博客 474

CrewAI 实战手记:我给 AI 排了个“值班班组“,故障诊断和写周报都不用我操心

CrewAI 的 agent 自己不会查日志看监控,你得给它配工具。工具就是一个 Python 函数,你告诉 AI"这个工具是干嘛的、怎么用",它自己决定什么时候调。@tool("错误日志检索工具")"""根据关键词检索最近 N 分钟内的错误日志。输入参数:keyword 是检索关键词(如接口路径、异常类名),minutes 是时间范围(分钟)。返回格式化的日志摘要列表,包含时间戳、服务名、错误信息。"""# 实际生产中对接 ELK / Loki,这里是简化示例params={},

牛肉胡辣汤 312

CrewAI(一) 什么是“Crew”?从传统协作到 AI 时代的演进

《从航海到AI:crewAI框架背后的团队协作哲学》摘要 本文探讨了crewAI多智能体框架的设计理念,揭示其灵感源自海事与航空领域的专业团队协作模式。不同于传统单体AI,crewAI通过角色专业化(如船长、轮机长)、明确目标边界和严密协同架构,实现了集体智能的突破。文章分析了历史上海员与机组人员的职能分工如何转化为AI智能体的角色定义、工具分配和任务流程,并通过代码示例展示了如何构建具有海事职级特征的AI团队。这种借鉴现实世界专业协作的模式,有效减少了AI幻觉风险,提升了复杂任务的执行可靠性,为AI协作提

weixin_44074465的博客 817
上一篇: crewai构建知识库的方式
下一篇: Crewai 挂载接入nmap的方法,让nmap扫描智能化
T_Fire_of_Square
博客等级 码龄3年 110粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值