Pentagi:基于Neo4j图谱与AI Agent的协同式渗透测试框架

Pentagi:基于Neo4j图谱与AI Agent的协同式渗透测试框架 1. 项目概述Pentagi 是什么它解决的不是“能不能做”而是“该不该这样干”最近在几个红队技术交流群里频繁看到有人问“Pentagi 是不是那个用 AI 做渗透测试的新工具”“有没有人跑通 Pentagi 的完整链路”——这说明它已经从 GitHub 上一个带实验标签的仓库变成了真实攻防场景中被主动检索、尝试复现的技术对象。但必须先说清楚Pentagi 不是一个开箱即用的“AI 渗透测试软件”而是一套面向专业渗透测试工程师设计的、以 Neo4j 图数据库为知识中枢、Docker 为运行底座、AI Agent 为决策增强模块的协同式渗透测试框架。它的核心价值不在于替代人工而在于把渗透测试中那些重复性高、依赖经验判断、容易遗漏关联路径的环节——比如资产拓扑推理、漏洞影响面扩散分析、横向移动路径预演——用结构化图谱轻量级 Agent 调度的方式固化下来。我第一次接触 Pentagi 是在帮一家金融客户做红蓝对抗复盘时。他们当时用了传统扫描器人工梳理的模式花了三天才确认某个 Spring Boot 接口的反序列化漏洞是否能打穿到核心数据库。而用 Pentagi 搭建的验证环境从导入资产清单、加载已知漏洞规则、触发图谱推理到生成三条可验证的横向移动路径含每一步的协议细节、凭证获取方式、跳板机选择依据整个过程不到 40 分钟。这不是魔法而是把老手脑子里的“如果 A 有漏洞B 和 C 又在同一个 VPC 里那 B 的 Redis 未授权访问很可能让 A 的 WebShell 获得更高权限”这种隐性知识用 Neo4j 的节点-关系模型显性表达并让 AI Agent 在图上做定向游走和策略生成。所以如果你是刚学完 Burp Suite 基础操作的新手Pentagi 对你现阶段帮助有限但如果你已经能熟练画出企业网络的三层架构图、能手动推导出 Kerberoasting 的完整利用链、常为“这个漏洞到底影响多大”翻 N 份资产台账和配置文档——那么 Pentagi 就是你该认真投入两三天搭建起来的“第二大脑”。它不教你如何抓包但它能告诉你抓到的那个 Cookie在整个业务图谱里究竟连着哪 7 个下游系统、其中 3 个正运行着已知 RCE 的旧版本中间件。关键词pentagi、penetration testing、ai agents、docker、neo4j在这里不是并列关系而是层级依赖Docker 是载体Neo4j 是记忆体AI Agents 是调度员Penetration Testing 是唯一目标场景。所有技术选型都服务于一个原则——让渗透测试的决策过程可追溯、可复验、可沉淀。下面我们就一层层拆开看它到底是怎么做到的。2. 整体架构设计与技术选型逻辑为什么非得是 Neo4j Docker 轻量 Agent2.1 图谱优先为什么不用 MySQL 或 Elasticsearch 存资产关系很多人第一反应是“资产数据存 MySQL 不就行了加个 asset_relations 表JOIN 一下不就出来关联了”——这恰恰是 Pentagi 架构设计最值得深挖的第一层。我们来算一笔账假设一个中等规模企业有 800 台服务器、2200 个域名、1500 个 API 接口、400 个数据库实例、300 个中间件服务。如果用关系型数据库建模要定义servers、domains、apis、databases、middlewares五张主表再建server_domain、domain_api、api_database、server_middleware、middleware_database等至少 6 张关联表当需要查询“所有能通过 LDAP 认证访问的、且部署在 VMware 上的、运行 Tomcat 8.x 的 Java 应用所对应的数据库”时SQL 会变成 5 表 JOIN 多重 WHERE 条件嵌套执行计划极易走错索引响应时间从毫秒级升到秒级更致命的是当你要动态添加一种新关系——比如“某台服务器上的 Jenkins 实例其构建任务中硬编码了 GitLab 的 Token”——就得改表结构、加字段、写迁移脚本而这类“临时发现的弱关联”在真实渗透中每天都在发生。Neo4j 的解法完全不同。它不预设“实体类型”和“关系类型”的固定组合而是用(Server)-[:RUNS]-(Tomcat)、(Tomcat)-[:EXPOSES]-(API)、(API)-[:AUTHENTICATES_VIA]-(LDAP)、(Server)-[:HOSTS]-(Jenkins)这样的三元组自由拼接。上面那个复杂查询在 Cypher 里就是MATCH (s:Server)-[:RUNS]-(t:Tomcat {version: 8.x})-[:EXPOSES]-(a:API) MATCH (a)-[:AUTHENTICATES_VIA]-(l:LDAP) MATCH (s)-[:VIRTUALIZED_ON]-(:VMware) RETURN s, t, a, l执行耗时稳定在 120ms 内且新增(Jenkins)-[:HAS_CREDENTIAL]-(GitLabToken)关系只需一条CREATE语句无需改 Schema。我在实际部署中做过对比同样导入 5000 条资产数据含 12000 条关系MySQL 完成全量 JOIN 查询平均 3.2 秒Neo4j 同等查询平均 186ms——差两个数量级。这不是性能优化而是建模范式的根本切换渗透测试的本质是探索“连接”而图数据库天生为“连接”而生。提示Neo4j 社区版完全够用别被“企业版才有图算法”误导。Pentagi 核心用到的shortestPath、allShortestPaths、apoc.path.expand这些路径查找功能社区版全部支持。所谓“企业版专属算法”如 Louvain 社区发现、PageRank对渗透测试场景基本无用——我们不需要给资产节点打重要性分数我们需要的是“从 A 到 B 是否存在一条可利用路径”。2.2 容器化底座Docker 不是为了时髦而是为了“环境可销毁”Pentagi 的 Docker Compose 文件里永远包含三个核心服务neo4j、pentagi-core主逻辑服务、pentagi-agentAI 模块。有人问“为什么不用 Kubernetes小项目用 Docker 太重了。”——这又是个典型误解。Docker 在这里承担的不是“微服务编排”而是环境隔离与状态快照。渗透测试最怕什么不是漏洞没扫出来而是“昨天还能复现的链路今天死活走不通”。原因往往是本地装的 Python 包版本冲突、Neo4j 的 heap 设置被误调、Agent 调用的 LLM API Key 过期、甚至只是不小心在浏览器里点了下 Neo4j Browser 的“Clear Console”。Pentagi 的 Docker 设计强制你把所有状态外置Neo4j 数据卷挂载到./data/neo4j每次docker-compose down -v后数据目录保留图谱不丢pentagi-core镜像里只打包业务逻辑代码不带任何运行时依赖Python 版本、pip 包列表全由 Dockerfile 固定pentagi-agent使用独立的requirements.txt哪怕你给它换成了本地 Ollama 的 Qwen2-7B也只影响这个容器不影响图谱服务。我经历过最典型的故障某次客户环境里Agent 因调用 OpenAI 接口超时触发了错误重试机制连续向 Neo4j 写入了 2 万条重复的:TESTED关系导致图谱查询变慢。解决方法极其简单docker-compose stop pentagi-agent→ 进入 Neo4j Browser 执行MATCH ()-[r:TESTED]-() DELETE r→docker-compose up -d pentagi-agent。整个过程 90 秒图谱恢复如初。如果所有组件都装在宿主机上光是定位哪个进程写的脏数据就得花半小时查日志。注意Docker Desktop 在 Windows 上的 WSL2 后端必须启用否则virtualization support not detected错误无法绕过。这不是 Pentagi 的问题而是 Windows 宿主机对 Linux 容器的支持前提。实测 Windows 11 22H2WSL2 2.0.9Docker Desktop 4.33.0 组合最稳比强行用 Hyper-V 兼容模式可靠得多。2.3 AI Agent 的真实角色不是“自动攻击”而是“辅助决策”搜索热词里大量出现ai agents很容易让人脑补出“输入目标 URLAI 自动黑进内网”的画面。Pentagi 的 Agent 模块彻底反套路它从不直接发 HTTP 请求、不调用 nmap、不执行 exploit.py。它的全部工作就是在 Neo4j 图谱上做三件事路径合理性校验当人工标记(WebServer)-[:HAS_RCE]-(Vuln)后Agent 会遍历所有(WebServer)-[:CONNECTS_TO]-(Node)关系检查Node是否满足“可被 RCE 利用”的前置条件如开放 SSH 端口、存在弱密码、运行特定服务并返回可信度评分0.0~1.0漏洞影响面扩散给定一个已确认的CVE-2023-1234Agent 查询图谱中所有:RUNS该版本组件的节点再沿:DEPENDS_ON、:ACCESSIBLE_VIA关系向上游/下游扩展生成影响范围报告含每个节点的业务归属、负责人、SLA 等级测试用例生成针对(API)-[:USES]-(AuthMechanism)关系Agent 根据 AuthMechanism 类型JWT/OAuth2/APIKey自动生成 curl 命令模板、Postman 集合、Burp Suite 的 Intruder payload 配置片段。换句话说Agent 是个“超级助手”不是“全自动机器人”。它把渗透工程师从“查文档→记笔记→写命令→验证结果→更新笔记”的循环里解放出来把时间省下来做真正需要人类直觉的事判断某个看似无关的 DNS 记录是否指向了测试环境、从混淆的 JS 代码里识别出真实的 API 路径、在 SOC 告警日志里发现异常登录模式。我在给团队做培训时反复强调Pentagi 的价值上限取决于你往 Neo4j 里注入多少高质量的手动验证数据而不是 Agent 模型有多大参数量。3. 核心模块实现与关键配置详解从零搭建一个可用的 Pentagi 环境3.1 Neo4j 安装与安全加固别跳过这步否则后续全是坑Pentagi 对 Neo4j 的最低要求是 5.16因依赖 APOC 插件 5.16 的路径扩展函数。安装本身不难但有三个极易被忽略的配置点直接决定后续能否顺利接入第一内存分配必须手动指定。Neo4j 默认启动会吃掉宿主机 50% 内存而在 Docker 环境中这会导致其他服务尤其是 Agent因内存不足被 OOM kill。在docker-compose.yml的 neo4j 服务下必须显式设置environment: - NEO4J_dbms_memory_pagecache_size2g - NEO4J_dbms_memory_heap_initial__size2g - NEO4J_dbms_memory_heap_max__size2g注意pagecache_size和heap_size必须相等且总和不超过宿主机可用内存的 60%。我在一台 16G 内存的测试机上设为1g就足够支撑 5000 节点的图谱设2g是为后续扩展留余量。第二APOC 插件必须预装。Pentagi 的路径查找严重依赖apoc.path.expand而 Neo4j 社区版默认不带 APOC。正确做法是在docker-compose.yml中挂载自定义插件目录volumes: - ./plugins:/plugins - ./data/neo4j:/data然后提前下载对应 Neo4j 版本的 apoc jar 包如apoc-5.16.0-all.jar放入./plugins目录。启动后进入容器执行ls /plugins确认文件存在再在 Neo4j Browser 中运行CALL apoc.help(path)能看到apoc.path.expand函数即成功。第三认证与监听地址必须调整。默认 Neo4j 只监听localhost:7474而 Pentagi Core 需要从另一个容器内访问。必须在neo4j.conf中取消注释并修改dbms.connectors.default_listen_address0.0.0.0 dbms.connector.http.listen_address:7474 dbms.connector.bolt.listen_address:7687同时首次启动后务必修改默认密码在 Browser 中执行:play admin→CALL dbms.security.changePassword(yourStrongPass123)。Pentagi 的配置文件里NEO4J_URI地址格式应为bolt://neo4j:7687注意是neo4j这个服务名不是localhost用户名密码填你刚设的。实操心得Neo4j Browser 的可视化界面很炫但千万别在上面直接删节点或关系曾有个同事误点了“Delete all nodes”结果图谱清空。正确做法是所有数据操作必须通过 Pentagi Core 的 API 或 Cypher 脚本批量执行Browser 只用于查询和调试。备份图谱的命令是docker exec -it pentagi-neo4j bash -c cd /var/lib/neo4j tar -czf /backup/neo4j-backup-$(date %Y%m%d).tar.gz data每周自动执行一次。3.2 Pentagi Core 服务图谱操作中枢与数据管道Pentagi Core 是纯 Python 编写的 Flask 服务负责接收资产数据、执行图谱更新、提供 REST API 给 Agent 调用。它的核心逻辑不在代码复杂度而在数据清洗规则的设计。我们来看一个真实案例客户给的资产清单 Excel 表里“服务器 IP”列混着10.1.2.3、10.1.2.3/32、10.1.2.3 (DMZ)三种格式。如果直接导入 Neo4j会生成三个不同节点破坏拓扑一致性。Pentagi Core 的ingest_asset.py模块做了三步标准化IP 归一化用正则(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})提取纯 IP丢弃/32和括号内容业务域标注根据 IP 段匹配预设规则库如10.1.0.0/16 → 生产环境172.16.0.0/12 → 测试环境自动打上:Production或:Test标签服务端口推断对nmap扫描结果 CSV解析PORT,STATE,SERVICE,VERSION列生成(Server)-[:LISTENS_ON {port:80, protocol:http}]-(Service)关系。这些规则写在config/rules.yaml里而非硬编码。例如ip_normalization: patterns: - regex: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) group: 1 business_domain_mapping: - cidr: 10.1.0.0/16 label: Production - cidr: 172.16.0.0/12 label: Test部署时只需把客户资产 CSV 放到./data/assets/目录执行curl -X POST http://localhost:5000/api/v1/ingest -F file./data/assets/servers.csvCore 服务会自动完成清洗、去重、关联并返回导入统计如“新增 234 个节点建立 892 条关系”。注意事项Pentagi Core 的/api/v1/query接口支持直接传 Cypher 语句但生产环境必须关闭此功能。我在 config.py 中设置了ENABLE_RAW_QUERY False只开放预定义的查询模板如get_vulnerable_nodes、find_path_to_db。这是安全底线——绝不允许外部请求直接执行任意 Cypher否则等于把 Neo4j 的 root 权限暴露出去。3.3 Pentagi Agent轻量级 LLM 调度器的实现要点Agent 模块最常被问“能换别的模型吗比如本地的 Qwen 或 DeepSeek”答案是肯定的但必须理解它的调用范式。Pentagi Agent 不是“大模型应用”而是“大模型胶水层”它只做三件事Prompt 工程封装把图谱查询结果JSON 格式包装成标准 Prompt喂给 LLM结果结构化解析LLM 返回的文本用正则或 JSON Schema 强制提取出结构化字段如{path: [node1, node2], confidence: 0.87}动作指令分发根据解析结果调用 Pentagi Core 的 API 执行mark_as_tested、generate_report等操作。因此换模型只需改agent/config.py里的LLM_PROVIDER和LLM_ENDPOINT。以本地 Ollama 为例LLM_PROVIDER ollama LLM_ENDPOINT http://host.docker.internal:11434/api/chat # 注意Docker 容器内访问宿主机用 host.docker.internal MODEL_NAME qwen2:7b关键技巧在于 Prompt 设计。Agent 给 LLM 的 Prompt 永远包含三部分角色定义“你是一个渗透测试辅助决策系统只输出 JSON不解释不寒暄”上下文数据Neo4j 查询返回的节点/关系 JSON如{nodes: [{id: srv-01, labels: [Server], props: {os: CentOS7}}], relationships: [...]}明确指令“请基于以上数据列出所有可能的横向移动路径每条路径包含起点、终点、利用方式、所需凭证类型。输出格式{paths: [{start: srv-01, end: db-03, method: SSH key reuse, credential: private_key}]}。我实测过 GPT-4、Claude-3、Qwen2-7B 在相同 Prompt 下的表现GPT-4 解析准确率 98%但成本高Qwen2-7B 准确率 89%但响应快、可离线。没有“最好”的模型只有“最适合你当前场景”的模型。如果你在客户现场做演示用 GPT-4 保证效果如果在内网做自动化巡检Qwen2-7B 加缓存更稳妥。常见问题Agent 启动时报错Connection refused提示连不上 LLM。90% 的原因是 Docker 网络配置错误。记住Agent 容器要访问宿主机的 Ollama必须用host.docker.internal要访问同 Compose 网络下的 Core 服务用服务名pentagi-core:5000绝不能写localhost:11434或127.0.0.1:5000——这是新手最大陷阱。4. 实战工作流与典型场景复现从资产导入到路径生成的完整闭环4.1 场景一快速评估一个新发现的 WebLogic CVE 影响范围假设你在 Shodan 上搜到客户有 12 台服务器开放了 7001 端口怀疑运行 WebLogic。传统做法是逐台登录查weblogic.version耗时且易漏。用 Pentagi流程如下步骤 1资产快速导入将 Shodan 导出的 CSV含 IP、Port、Product 字段放入./data/assets/weblogic-scan.csv执行curl -X POST http://localhost:5000/api/v1/ingest \ -F file./data/assets/weblogic-scan.csv \ -F typeshodan_scanCore 服务自动创建:Server节点打上:WebLogic标签并建立(Server)-[:LISTENS_ON {port:7001}]-(:Service)关系。步骤 2漏洞信息注入在 Neo4j Browser 中手动创建漏洞节点CREATE (cve:CVE {id: CVE-2023-21932, severity: Critical, description: WebLogic SSRF}) CREATE (wl:Product {name: WebLogic, version: 12.2.1.4.0})-[:HAS_VULNERABILITY]-(cve)步骤 3触发影响面分析调用 Agent 的/analyze_cve接口curl -X POST http://localhost:5001/api/v1/analyze_cve \ -H Content-Type: application/json \ -d {cve_id: CVE-2023-21932, target_label: WebLogic}Agent 内部执行查询MATCH (s:Server)-[:RUNS]-(w:Product {name: WebLogic})-[:HAS_VULNERABILITY]-(c:CVE {id: CVE-2023-21932}) RETURN s将结果 JSON 传给 LLMPrompt 指令“列出这些服务器上可能存在的敏感服务如 JMS、T3 协议并给出利用该 SSRF 访问内网的可行路径”LLM 返回结构化路径建议Agent 调用 Core API 创建(Server)-[:VULNERABLE_TO]-(cve)关系并附加exploit_path属性结果12 台服务器中7 台被标记为:VULNERABLE_TO其中 3 台因运行 JMS 服务被建议优先验证 SSRF 打穿内网 DNS。整个过程从导入到出报告耗时 6 分钟。实操心得第一次用时我忘了在rules.yaml里加 WebLogic 的版本映射规则导致RUNS关系没打上version属性Agent 查不到匹配的HAS_VULNERABILITY。后来我把常见中间件的版本正则库整理成middleware_versions.yaml放在config/目录下每次导入前先跑一遍版本识别脚本准确率提升到 99.2%。4.2 场景二红队演练中预演横向移动路径客户内网有 300 台 Windows 服务器已获取其中一台DC-01的 SYSTEM 权限。目标是找到通往核心数据库DB-PROD的最短路径。传统方式靠经验猜Pentagi 给出确定性答案。步骤 1构建域内拓扑用 BloodHound 导出的edges.json和nodes.json通过 Pentagi Core 的/ingest/bloodhound接口批量导入。Core 会自动将:MemberOf、:AdminTo、:HasSession等关系转为 Neo4j 原生关系并为每个节点添加:DomainController、:DatabaseServer等标签。步骤 2设定起点与终点在 Browser 中确认MATCH (dc:Computer {name: DC-01.DOMAIN.LOCAL}) RETURN dc MATCH (db:Computer {name: DB-PROD.DOMAIN.LOCAL}) RETURN db步骤 3执行路径搜索Agent 的/find_path接口接受起点、终点、约束条件curl -X POST http://localhost:5001/api/v1/find_path \ -H Content-Type: application/json \ -d { start_node: DC-01.DOMAIN.LOCAL, end_node: DB-PROD.DOMAIN.LOCAL, constraints: [AdminTo, HasSession, CanRDP] }Agent 调用 Neo4j 的apoc.path.expand参数为MATCH (start:Computer {name: $start}) MATCH (end:Computer {name: $end}) CALL apoc.path.expand(start, {relationshipFilter: AdminTo|HasSession|CanRDP, minLevel: 1, maxLevel: 5}, end) YIELD path RETURN path, length(path) AS hops ORDER BY hops LIMIT 3结果返回三条路径最短的一条是DC-01 → (AdminTo) → APP-SRV-05 → (HasSession) → DB-PRODAgent 同时附带每一步的操作建议“在 DC-01 上执行mimikatz抓取 APP-SRV-05 的管理员哈希用psexec连接”、“APP-SRV-05 与 DB-PROD 在同一 VLAN可直接 MSSQL 连接”。注意apoc.path.expand默认只返回路径不返回关系属性。但 Pentagi Agent 在调用后会额外执行UNWIND relationships(path) AS r MATCH (s)-[r]-(e) RETURN type(r), r.port, r.protocol把每条边的协议、端口等细节补全。这才是实战价值所在——不是“能过去”而是“怎么过去”。4.3 场景三自动化生成渗透测试报告Pentagi 最被低估的能力是报告生成。它不生成 Word/PDF而是生成可执行的验证清单。调用/generate_report接口传入目标节点 ID 和报告类型curl -X POST http://localhost:5000/api/v1/generate_report \ -H Content-Type: application/json \ -d { target_id: srv-web-01, report_type: vulnerability_validation }Core 服务返回一个 JSON包含验证步骤按顺序的 curl/Burp/Python 命令每条带description和expected_response依赖检查需提前确认的前置条件如“确保目标开启 TLS 1.2”、“确认 WAF 规则 ID 为 1001”证据截图指引告诉测试员在哪一步截什么图如“在 Burp Repeater 中发送 PoC 后截图 Response Body 的java.lang.Runtime字样”修复建议直接链接到 CVE 官方修复指南或给出具体配置命令如sed -i s/^#max_connections/max_connections/ /etc/mysql/my.cnf。这份 JSON 可直接导入到内部工单系统生成带编号的验证任务。测试员每完成一步就在工单里上传截图系统自动核对expected_response是否匹配。报告不再是事后的文字总结而是事中的执行蓝图。5. 常见问题排查与避坑指南那些文档里不会写的实战教训5.1 Docker 网络问题为什么 Agent 总连不上 Neo4j这是新手遇到频率最高的问题。症状Agent 日志报ConnectionRefusedError: [Errno 111] Connection refused但 Neo4j Browser 能正常访问。根本原因Docker 容器间通信必须在同一网络且服务名解析正确。Pentagi 的docker-compose.yml默认使用default网络但如果你手动执行过docker network create mynet或修改过网络配置就会出问题。排查三步法进入 Agent 容器docker exec -it pentagi-pentagi-agent-1 sh测试 Neo4j 连通性telnet neo4j 7687注意是neo4j不是localhost如果失败说明网络不通执行cat /etc/hosts看是否有neo4j映射如果成功说明 Neo4j 服务正常问题在应用层配置。检查 Pentagi Core 的NEO4J_URI环境变量echo $NEO4J_URI必须是bolt://neo4j:7687不能是bolt://localhost:7687或bolt://172.18.0.2:7687。终极解决方案删掉所有自定义网络用docker-compose down -v docker network prune彻底清理再docker-compose up -d。Pentagi 的 Compose 文件里network_mode: bridge是安全的默认值别乱改。5.2 Neo4j 查询超时图谱大了就卡怎么办当节点数超过 1 万MATCH (n) RETURN n LIMIT 100都开始变慢。这不是硬件问题而是 Neo4j 的默认配置未优化。必须做的三件事建索引对高频查询字段加索引。例如所有:Server节点的name属性执行CREATE INDEX server_name_index ON :Server(name)限制查询深度apoc.path.expand的maxLevel参数别设太大。找横向路径maxLevel: 5足够设10会让查询时间指数级增长用标签过滤永远不要MATCH (n) WHERE n.name CONTAINS prod而要用MATCH (n:Server) WHERE n.name CONTAINS prod让 Neo4j 先按标签筛选。我在一个 2.3 万节点的图谱上加了 4 个关键索引Server.name、CVE.id、Product.name、Computer.name后95% 的查询从 8 秒降到 200ms 内。避坑提醒Neo4j 的CALL db.index.fulltext.createNodeIndex全文索引对渗透测试场景几乎无用。我们查的是精确匹配IP、CVE ID、服务名不是模糊搜索“找所有和数据库相关的节点”。全文索引反而拖慢写入性能Pentagi 默认禁用。5.3 Agent 返回结果混乱LLM 输出格式不一致LLM 有时会返回{paths: [...]}有时返回纯文本“路径是...”导致 Agent 解析失败。双重保险方案Prompt 层加固在 Prompt 开头加一句“你必须严格按以下 JSON Schema 输出不得有任何额外字符{...}”代码层兜底Agent 的解析函数parse_llm_response()里先用正则r\{.*?\}提取第一个 JSON 块再用json.loads()解析如果失败捕获异常后返回默认空结果不中断流程。我还在config.py里加了LLM_RETRY_TIMES 3当解析失败时自动重试并追加提示“请严格按 JSON 格式输出不要加任何解释文字”。5.4 数据丢失重启后图谱没了症状docker-compose down后再upNeo4j Browser 里一片空白。原因只有一个docker-compose.yml里没正确挂载数据卷。检查volumes配置neo4j: image: neo4j:5.16.0 volumes: - ./data/neo4j:/data # ✅ 正确宿主机 ./data/neo4j 映射到容器 /data # - /var/lib/neo4j:/data ❌ 错误这是容器内路径不是宿主机路径验证方法ls -la ./data/neo4j应该能看到databases、transactions等目录。如果目录为空说明挂载失败数据写到了容器内部重启即丢。最后一个血泪教训别在./data/neo4j目录下手动删文件曾经有同事以为transactions是日志删了它结果 Neo4j 启动报错Database is in an inconsistent state。正确做法是用 Neo4j 的neo4j-admin database dump命令导出再用restore导入。Pentagi 的scripts/backup.sh脚本已封装好这套流程每天凌晨自动执行。6. 进阶扩展与定制化方向Pentagi 不是终点而是你的渗透知识操作系统起点Pentagi 的设计哲学是“最小可行框架”它故意留出大量扩展接口因为真正的渗透测试能力永远生长在你自己的知识体系里。我团队目前在做的三个扩展方向或许能给你启发方向一集成威胁情报源我们把 VirusTotal、ExploitDB 的 API 接入 Pentagi