CrewAI 扫描结果判断与自动迭代机制解析
本文档基于 auto_scanner_project 项目源码,深度解析 CrewAI 如何实现对扫描结果的智能评判、反馈循环以及动态迭代策略。
1. 核心机制概述
传统的自动化扫描通常是线性的(扫描 -> 报告)。而在本项目中,CrewAI 构建了一个闭环反馈系统 。系统引入了一个专门的决策角色------Review Agent (复盘回顾专家),它充当"大脑"的角色,负责审计扫描结果并决定下一步行动:是结束任务,还是调整参数重试,亦或是切换到全新的工具类别。
整个流程可以概括为:
- 执行 (Execute):工具执行并生成原始数据。
- 报告 (Report):将原始数据转化为结构化报告。
- 评判 (Review):分析报告质量,输出 JSON 格式的决策指令。
- 迭代 (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_agent的suggestion,作为下一轮的上下文输入。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 ""
)
# ...
工作流程示例:
- 场景 :第一轮使用
port_scan发现了 80 端口。 - Review :Review Agent 识别到 Web 端口,输出
next_action="retry",suggestion="Found port 80, switch to web_scan",new_tool_id="wafw00f". - 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" } ] }
运行原理:
-
经验沉淀 (Save) :
每轮扫描结束后,
ReviewAgent会调用Save Experience工具。- 如果工具报错(如
simple_async协程错误),它会记录一条outcome: failure的经验,并在 summary 中注明原因。 - 如果扫描成功,它会记录
outcome: success及成功的参数组合。
- 如果工具报错(如
-
经验查阅 (Consult) :
在做出决策前,
ReviewAgent会调用Consult Experience工具读取最近的 3 条经验。- 避坑 :如果它看到最近
simple_async频繁失败,它在建议新工具时就会主动避开该工具,转而推荐nmap或rustscan。 - 复用 :如果它看到
nmap -sV在类似目标上成功率高,它会优先建议使用该参数。
- 避坑 :如果它看到最近
作用:
这种机制使得 CrewAI 具备了自适应进化能力。即使重启程序,之前的失败教训(如某个工具在当前环境不可用)依然会被记住,从而避免在同一个坑里跌倒两次。
5. 总结
auto_scanner_project 通过**"执行-评判-反馈-记忆"**的四元组机制,实现了从单一工具执行到智能任务编排的跨越。其核心在于:
- 结构化决策:强制 LLM 输出可解析的 JSON 指令。
- 上下文传递 :通过
feedback变量在多轮对话间传递状态。 - 动态路由:基于扫描结果(如端口发现)动态改变任务路径。
- 经验进化:利用 JSON 经验库实现跨会话的知识积累与自我优化。