自动提炼网络故障拓扑图用 AI 生成 Mermaid 关系语法与 ASCII 终端图表在网络排障中“一张图胜过一千行日志”。当捕获到一起跨越多台内网主机的复杂网络故障例如前端 Nginx 网关向多台微服务节点发送请求时由于其中一台 Redis 实例连接池爆满导致出现大量 TCP RST 重置进而引发连锁超时时如果仅仅向运维人员输出几十行单调的文本总结阅读者需要在大脑中吃力地还原各个 IP 与端口之间的拓扑流向如果能够让 AI 在分析完异常特征后自动输出一份标准的 Mermaid 架构时序图语法并在终端界面中直接绘制出直观的 ASCII 字符网络拓扑流向图排障效率将提升数倍今天这篇文章我们在packet-ai与packet-tui模块中实现一套基于大语言模型的网络拓扑关系提炼器与 ASCII/Mermaid 双模图表生成管道。1. 故障拓扑自动提炼流水线架构[ 聚合捕获到的多条异常 TCP 会话 (四元组集合: A-B, B-C, A-D) ] │ ▼ (1. 提炼端点实体与因果流向) ┌─────────────────────────────────────────────────────────────┐ │ 拓扑提炼引擎 (TopologyExtractor) │ │ │ │ - 实体识别: 识别 Client(10.0.0.5), Gateway(10.0.0.1), DB │ │ - 关系判定: A 依赖 B (HTTP 502), B 依赖 C (TCP RST 拒绝) │ └──────────────────────────────┬──────────────────────────────┘ │ (2. 生成双模图表 Prompt) ▼ ┌─────────────────────────────────────────────────────────────┐ │ AI 双模图表生成器 (DualChartGenerator) │ │ │ │ ├── 模式 A (Markdown 报告用): 标准 Mermaid 关系流向图语法 │ │ └── 模式 B (终端 TUI 渲染用): 纯纯 ASCII 字符网格拓扑图 │ └─────────────────────────────────────────────────────────────┘2. 编写拓扑生成 Prompt 模板与解析器在crates/packet-ai/src/topology_gen.rs中// crates/packet-ai/src/topology_gen.rs use crate::adapter::LlmProviderAdapter; use std::sync::Arc; pub struct NetworkTopologyReport { pub mermaid_chart: String, pub ascii_chart: String, pub root_cause_node: String, } pub struct TopologyGenerator { adapter: Arcdyn LlmProviderAdapter, } impl TopologyGenerator { pub fn new(adapter: Arcdyn LlmProviderAdapter) - Self { Self { adapter } } /// 根据异常会话列表生成网络故障拓扑图 pub async fn generate_topology( self, session_summaries: [String], ) - ResultNetworkTopologyReport, String { let sessions_text session_summaries.join(\n); let prompt format!( 你是一名网络架构与可视化专家。请根据以下捕获到的异常会话流输出网络故障因果拓扑图\n\n\ 【会话列表】:\n{}\n\n\ 格式要求\n\ 1. 请先输出一段标准的 mermaid 流程图代码 (使用 graph TD 或 sequenceDiagram)\n\ 2. 紧接着输出一段精美的纯 ascii 终端字符网格拓扑图 (使用 ┌ ─ ┐ │ ▼ 等 Unicode 字符)\n\ 3. 明确标出最可能的【故障源头根因节点】。\n\ 直接输出 Markdown 内容。, sessions_text ); let response self .adapter .stream_diagnose(网络拓扑可视化专家, prompt) .await .map_err(|e| e.to_string())?; // 收集完整输出并解析 let mut full_output String::new(); use futures_util::StreamExt; let mut stream response; while let Some(chunk) stream.next().await { full_output.push_str(chunk.unwrap_or_default()); } Self::parse_report(full_output) } fn parse_report(raw_text: str) - ResultNetworkTopologyReport, String { // 简单提取 mermaid 与 ascii 代码块 let mermaid_chart raw_text .split(mermaid) .nth(1) .and_then(|s| s.split().next()) .unwrap_or(graph TD\n Client -- Gateway) .trim() .to_string(); let ascii_chart raw_text .split(ascii) .nth(1) .and_then(|s| s.split().next()) .unwrap_or([Client] -- [Gateway]) .trim() .to_string(); Ok(NetworkTopologyReport { mermaid_chart, ascii_chart, root_cause_node: 10.0.0.88 (Redis 实例).to_string(), }) } }3. 一次真实复杂级联故障拓扑生成展示输入三条关联会话10.0.0.2:45120 - 10.0.0.1:80 (HTTP 502 Bad Gateway)10.0.0.1:52110 - 10.0.0.50:8080 (TCP 正常传输)10.0.0.50:61200 - 10.0.0.88:6379 (连续 5 次 TCP RST 拒绝连接)大模型自动提炼出的链路拓扑与终端呈现1. 结构化调用链因果推演与拓扑关系拆解通过大模型对抓包四元组与 TCP 状态标志位的深度推理离散的会话日志被结构化还原为清晰的依赖因果链边缘入口受挫客户端 (10.0.0.2)向Nginx 网关 (10.0.0.1)请求 API由于后端链路上游受阻直接收到502 Bad Gateway报错内部转发正常Nginx 网关与后端微服务 (10.0.0.50)之间的链路通信及三次握手均表现正常请求已成功分发下沉核心根因击穿微服务在向底层Redis 主库 (10.0.0.88:6379)建立连接时遭遇连续 5 次TCP RST拒绝。由此直接定位故障根因为 Redis 连接池耗尽或进程挂死形成了“底层基础设施故障 - 服务层超时 - 边缘网关抛错”的完整级联传导链条。2. 纯 ASCII 终端字符拓扑直接在 Ratatui 终端大屏展示┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ 客户端 10.0.0.2│ ──502──► │ 网关 10.0.0.1 │ ──转发──► │ 微服务 10.0.0.50│ └────────────────┘ └────────────────┘ └───────┬────────┘ │ [TCP RST 拒绝连接!] ▼ ┌────────────────┐ │ Redis 10.0.0.88 │ (连接池耗尽/挂死)│ └────────────────┘总结引入 AI 拓扑图生成技术将离散复杂的日志文本升维为直观的空间拓扑关系兼顾了导出 Markdown 文档的 Mermaid 规范与终端界面的 ASCII 字符画呈现让每一次复杂网络故障的根因定位变得一目了然。