CrewAI 扫描结果判断与自动迭代机制解析

CrewAI 扫描结果判断与自动迭代机制解析

本文档基于 auto_scanner_project 项目源码,深度解析 CrewAI 如何实现对扫描结果的智能评判、反馈循环以及动态迭代策略。

1. 核心机制概述

传统的自动化扫描通常是线性的(扫描 -> 报告)。而在本项目中,CrewAI 构建了一个闭环反馈系统 。系统引入了一个专门的决策角色------Review Agent (复盘回顾专家),它充当"大脑"的角色,负责审计扫描结果并决定下一步行动:是结束任务,还是调整参数重试,亦或是切换到全新的工具类别。

整个流程可以概括为:

  1. 执行 (Execute):工具执行并生成原始数据。
  2. 报告 (Report):将原始数据转化为结构化报告。
  3. 评判 (Review):分析报告质量,输出 JSON 格式的决策指令。
  4. 迭代 (Iterate) :主程序 (main.py) 根据指令更新上下文,进入下一轮循环。

2. 评判核心:Review Agent

review_agent 是迭代逻辑的核心驱动者。在 core/agents.py 中,其 Role 和 Goal 被明确定义为"分析扫描结果,判断是否满足预期"。

2.1 评判标准 (Backstory Logic)

源码中定义了严格的评判规则,Agent 必须遵循以下逻辑进行决策(参考 core/agents.py):

  • 规则 1:交叉验证 (Cross-Validation)
    必须至少使用 2 种不同的工具或方法对目标进行扫描,除非第一种工具已经给出了极高确信度的结果(如 WAF 确信发现)。
  • 规则 2:一致性检查 (Consistency)
    如果不同工具的扫描结果一致且有效,则判定为 Satisfied。
  • 规则 3:类别切换 (Category Switching)
    这是智能迭代的关键。如果端口扫描(Port Scan)发现了 Web 端口(80/443/8080),Agent 必须 建议切换到 web_scan 类别,以进一步探测 WAF、CMS 或目录。
  • 规则 4:故障处理 (Failure Handling)
    如果当前工具执行失败(如 command not found 或无结果),必须建议尝试备用工具。

2.2 决策输出格式

review_agent 不仅输出文本建议,还必须输出结构化的 JSON 对象,供主程序解析:

json 复制代码
{
    "satisfied": bool,          // 是否满足结束条件
    "suggestion": str,          // 给下一轮 Consultant Agent 的建议文本
    "next_action": "retry" | "finish", // 下一步动作
    "new_parameters": str,      // 建议的新参数
    "new_tool_id": str          // 建议强制使用的新工具 ID
}

3. 循环控制:Main Loop 实现

main.py 中,系统通过一个 while 循环来维持任务的生命周期,直到满足退出条件或达到最大尝试次数。

3.1 状态管理

主程序维护了关键的状态变量:

  • current_attempt: 当前尝试次数(防止无限循环)。
  • feedback: 携带上一轮 review_agentsuggestion,作为下一轮的上下文输入。
  • forced_tool_id: 如果 review_agent 指定了新工具,该变量会强制下一轮使用特定工具。

3.2 迭代逻辑代码解析

以下是 main.py 中处理迭代反馈的关键代码片段:

python 复制代码
# main.py 循环片段
while current_attempt < max_attempts:
    # ... 执行 Phase 1 (策略) 和 Phase 2 (执行) ...

    # 解析 Review Agent 的结果
    if review_data.get("satisfied", False) or review_data.get("next_action") == "finish":
        print(">> Scan Satisfied/Finished! Moving to Final Analysis.")
        break
    
    if review_data.get("next_action") == "retry":
        # 提取反馈信息,构建下一轮的上下文
        feedback = f"Previous attempt failed. Suggestion: {review_data.get('suggestion')}. New Params: {review_data.get('new_parameters')}. New Tool: {review_data.get('new_tool_id')}"
        
        # 如果指定了新工具,更新强制工具 ID
        if review_data.get("new_tool_id"):
            forced_tool_id = review_data.get("new_tool_id")
        
        current_attempt += 1
    else:
        # 其他情况处理...

4. 动态策略调整与经验进化

系统采用了"短期反馈"与"长期记忆"相结合的双轨制策略调整机制,既能在当前任务中快速纠错,又能跨任务积累经验。

4.1 短期反馈循环 (Short-term Feedback Loop)

这是基于内存的即时反馈机制,用于在单次运行的多次尝试(Attempt)之间传递上下文。

main.py 捕获到 ReviewAgent 的反馈(feedback)后,它会在下一轮循环中传递给 Consultant Agent (策略顾问) 。在 create_strategy_task 函数中,PREVIOUS FEEDBACK 被直接注入到 Prompt 中:

python 复制代码
def create_strategy_task(scenario, forced_tool_id, feedback):
    feedback_block = (
        f"\nPREVIOUS FEEDBACK: {feedback}\nAdjust your strategy based on this feedback..."
        if feedback else ""
    )
    # ...

工作流程示例:

  1. 场景 :第一轮使用 port_scan 发现了 80 端口。
  2. Review :Review Agent 识别到 Web 端口,输出 next_action="retry", suggestion="Found port 80, switch to web_scan", new_tool_id="wafw00f".
  3. Next Loop :Consultant Agent 收到反馈,立即将策略从端口扫描调整为 Web 扫描,Manager Agent 随后调用 wafw00f

4.2 长期经验记忆 (Long-term Experience Memory)

这是基于文件持久化的进化机制,用于让 Agent "越用越聪明"。系统通过 data/experience_base.json 维护一个持久化的经验库。

核心组件:

  • 存储路径auto_scanner_project/data/experience_base.json

  • 数据结构 :包含 summary (经验总结) 和 outcome (结果:success/failure/partial)。

    json 复制代码
    {
      "experiences": [
        {
          "summary": "Scan failed due to Python coroutine error in simple_async tool...",
          "outcome": "failure"
        },
        {
          "summary": "Full nmap scan (-T4 -p- -sV) successfully identified SSH service...",
          "outcome": "success"
        }
      ]
    }

运行原理:

  1. 经验沉淀 (Save)

    每轮扫描结束后,ReviewAgent 会调用 Save Experience 工具。

    • 如果工具报错(如 simple_async 协程错误),它会记录一条 outcome: failure 的经验,并在 summary 中注明原因。
    • 如果扫描成功,它会记录 outcome: success 及成功的参数组合。
  2. 经验查阅 (Consult)

    在做出决策前,ReviewAgent 会调用 Consult Experience 工具读取最近的 3 条经验。

    • 避坑 :如果它看到最近 simple_async 频繁失败,它在建议新工具时就会主动避开该工具,转而推荐 nmaprustscan
    • 复用 :如果它看到 nmap -sV 在类似目标上成功率高,它会优先建议使用该参数。

作用:

这种机制使得 CrewAI 具备了自适应进化能力。即使重启程序,之前的失败教训(如某个工具在当前环境不可用)依然会被记住,从而避免在同一个坑里跌倒两次。

5. 总结

auto_scanner_project 通过**"执行-评判-反馈-记忆"**的四元组机制,实现了从单一工具执行到智能任务编排的跨越。其核心在于:

  1. 结构化决策:强制 LLM 输出可解析的 JSON 指令。
  2. 上下文传递 :通过 feedback 变量在多轮对话间传递状态。
  3. 动态路由:基于扫描结果(如端口发现)动态改变任务路径。
  4. 经验进化:利用 JSON 经验库实现跨会话的知识积累与自我优化。
相关推荐
九.九10 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见10 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭10 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
deephub10 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
大模型RAG和Agent技术实践11 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢11 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖11 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能
PythonPioneer11 小时前
在AI技术迅猛发展的今天,传统职业该如何“踏浪前行”?
人工智能
冬奇Lab11 小时前
一天一个开源项目(第20篇):NanoBot - 轻量级AI Agent框架,极简高效的智能体构建工具
人工智能·开源·agent
阿里巴巴淘系技术团队官网博客12 小时前
设计模式Trustworthy Generation:提升RAG信赖度
人工智能·设计模式