网络遥测(Telemetry/gNMI)的结构化建模与特征化体系—— 从“采集指标”到“可被 AI 推理的状态向量”

网络遥测(Telemetry/gNMI)的结构化建模与特征化体系------ 从"采集指标"到"可被 AI 推理的状态向量"

引言:当我们谈论"Telemetry 接入"时,我们在谈论什么?

在当前很多企业的网络基础设施团队里,"Telemetry(遥测)已经接进来了"这句话,往往是一个极具误导性的里程碑。在大多数场景下,这意味着运维团队完成了 gNMI/gRPC 的通道建设,Prometheus 的存储里多了一堆高频写入的时序指标(Time-series metrics),Grafana 上多了几张跳动的曲线图,甚至基于阈值的告警规则也相应地增加了一些。

但如果你抛开这些可视化的表象,向架构师仔细问一句:"这些海量的 Telemetry 数据,真的已经变成 AI 可以'理解网络状态'的输入了吗?"

答案通常是令人尴尬的否定。

大多数现有的系统,Telemetry 仅仅被当作了"更高频、更嘈杂的 SNMP"。数据虽然进来了,但它们是一堆离散的、物理的、无上下文的数字尘埃。如果没有一套严格的结构化建模、特征化(Featureization)和上下文绑定机制,Telemetry 根本无法支撑 AIOps 的上层应用。

这一篇长文要解决的,不是"怎么通过 gNMI 采集数据"这种管道问题,而是一个更核心、更具挑战性的数据工程(Data Engineering)问题:

如何把网络遥测数据,从毫无关联的"指标流",重构为 AI 可计算、可对齐、可回放、可推理的"状态向量体系"?

这将是网络运维从"自动化(Automation)"迈向"智能化(Intelligence)"必须跨越的第一道、也是最难的一道门槛。

1. 为什么"Telemetry 接入"之后,AI 仍然什么都推不出来?

1.1 真实现状:指标的海洋,结论的荒漠

在大多数已经部署了 gNMI 的大规模网络环境中,Telemetry 系统呈现出一种典型的"富数据、穷信息"特征:

  • 指标维度极高: 一台核心交换机可能每秒吐出数千个指标,涵盖端口(Interface)、队列(Queue)、缓冲区(Buffer)、拥塞标记(ECN)、BGP 计数器、FIB 表项变化等。
  • 采样频率极高: 从 SNMP 的分钟级,提升到了秒级甚至亚秒级(Sub-second),数据量呈指数级增长。
  • 可视化虽然齐全,但诊断效率停滞: 出了问题,流程依然是传统的"Grafana 找异常 → 工程师凭经验判断关联 → 登录 CLI 验证"。

Telemetry 在这个阶段,仅仅扮演了"高倍显微镜"的角色------它让你看得更清楚了,但它并没有告诉你"看到了什么"。它依然游离在决策主链路之外,属于"辅助观察"工具。

1.2 根本原因:原始数据(Raw Data)≠ 特征(Feature)

问题不在于 AI 模型不够聪明,而在于我们喂给模型的数据本质上是错误的。

  • Telemetry 指标是"设备视角"的原始观测: 它是物理层面的计数。
  • AI 需要的是"网络视角"的状态抽象: 它是逻辑层面的语义。

举个非常典型的例子,假设我们在某一时刻采集到了以下一组数据:

复制代码
interface.eth0.rx_dropped_packets = 150

interface.eth0.tx_queue_depth_bytes = 84000

qos.queue3.tail_drop_counters = 12

bgp.peer.10.1.1.1.state = Established

这些指标本身只是数字。它们并不直接等价于以下结论:

"该链路已进入持续微拥塞状态,导致高优先级业务受损,且风险正在向汇聚层扩散。"

从左边的"数字"到右边的"结论",中间缺失了一个巨大的工程鸿沟。这个鸿沟里,缺的是一整套从指标 → 状态 → 语义 → 推理输入的转化体系 。AI 无法直接理解 rx_dropped = 150 是多还是少(对于核心链路可能很多,对于边缘清洗口可能很少),除非我们对其进行建模

2. Telemetry 数据的三层认知模型:指标、状态、语义

在进入具体的系统设计之前,我们必须先统一一个认知模型。一个成熟的 AIOps 系统,其数据必然分为三个层级。

2.1 第一层:原始指标(Raw Metrics)

这是 gNMI / Telemetry Agent 最直接的产物,也是目前绝大多数系统停留的层面。

  • 内容: Counters(累计计数)、Gauges(瞬时值)、Rates(速率)。
  • 特征:
    • 高维且碎片化: 单点数据极其丰富。
    • 设备强相关: 依赖于特定厂商(Cisco/Juniper/Arista/Huawei)的 YANG 模型实现。
    • 无上下文: drop = 1 不知道是因为拥塞、ACL 过滤还是校验错误。
    • 不可直接推理: 它是"事实的碎片",而非"事实的全貌"。

2.2 第二层:网络状态(Network State)

这是 AI 真正能吃进去的第一层有效输入,也是本文构建的重点。

状态(State)不是某一个单一指标,而是一组指标在时间、拓扑和策略上下文中的组合表现。

例如,我们不再关注"丢包数"这个标量,而是关注"拥塞状态"这个向量:

  • "端口处于轻度拥塞 / 持续拥塞 / 瞬时抖动"
  • "ECMP 路径组出现哈希极化(Hash Polarization)"
  • "BGP 邻居进入 Flapping(震荡)收敛区间"

状态具备三个关键特征:

  1. 有持续性: 剔除了一次性的毛刺。
  2. 有阈值逻辑(归一化): 将绝对值转化为相对程度(Severity)。
  3. 可被枚举或量化: 可以作为分类模型或时序预测模型的输入。

2.3 第三层:语义事件(Semantic Event)

这是最终进入 AIOps 根因分析(RCA)、自动化止损或工单系统的层级。它描述的是"对业务的影响"。

例如:

  • "核心到边缘的 QoS 策略在高负载下失效"
  • "变更 Change-1024 引发的灰度流量慢性丢包"
  • "光模块老化导致的数据面误码"

语义事件往往不是 Telemetry 单独决定的,它是 Telemetry + Flow(流量) + Syslog + Config(配置) + Topology(拓扑) 的联合产物。

3. 为什么 Featureizer(特征化器)是 Telemetry 系统的"生死线"

3.1 没有 Featureizer,AI 只能看到噪声

很多初尝 AIOps 的团队会犯一个经典错误:直接把 Prometheus 里的原始时序数据(Raw Metrics)丢给 LSTM、Isolation Forest(孤立森林)或 Transformer 模型进行训练。

结果往往是灾难性的:模型极不稳定,误报率高到不可用,且无法解释。

原因很简单,原始指标并不是特征(Feature)。

  • 量纲差异: 100G 端口丢 1000 个包,和 1G 端口丢 1000 个包,严重程度完全不同。
  • 基线差异: 核心链路常态负载可能是 40%,而带外管理口常态负载只有 1%。
  • 拓扑位置差异: 防火墙接口的丢包(可能是策略阻断)与骨干网接口的丢包(可能是线路故障),物理含义完全相反。

Featureizer(特征化器) 的核心任务,就是去噪、对齐、归一化。它是把物理世界的"设备指标",转化为数学世界的"可比较、可学习、可推理的特征向量"。

3.2 Featureizer 在系统架构中的位置

在一套成熟的网络数据架构中,Featureizer 处于承上启下的核心位置:

代码段

复制代码
graph TD
    A[Raw Telemetry (gNMI/SNMP)] --> B[Normalizer (清洗/格式化)]
    B --> C[Featureizer (特征提取与计算)]
    C --> D[State Vector Construction (状态向量构建)]
    D --> E[AI Inference / Reasoning (推理引擎)]
    
    subgraph "Featureizer 的职责"
    F[归一化]
    G[时窗聚合]
    H[多指标融合]
    end

Featureizer 是系统唯一一个必须"懂网络"的组件。

  • 它必须理解 QoS 队列机制,才能计算拥塞深度。
  • 它必须理解路由协议,才能区分正常的 Update 和异常的 Flap。
  • 它决定了"什么才算是一个有效的网络状态"。

4. Telemetry Feature 的设计原则(工程关键)

设计一套好的特征体系,比选择什么 AI 模型更重要。根据大规模网络的实战经验,Feature 的设计必须遵循以下三大原则:

4.1 原则一:特征必须"去设备化" (Device-Agnostic)

同样的物理现象(例如拥塞),在不同厂商、不同角色的设备上,原始指标完全不同。

  • 厂商 A 叫 queue_drop_count,厂商 B 叫 discard_packets。
  • TOR 交换机上 80% 的 Buffer 占用可能意味着"危险",而深缓存(Deep Buffer)路由器上 80% 的占用可能只是"常规突发"。

特征化要求:

Feature 必须包含设备角色(Role)、拓扑层级(Tier)和归一化后的数值。

我们不给 AI 输入"Queue Depth = 1MB",而是输入:

  • utilization_score = 0.85 (归一化)
  • role_context = 'spine'
  • buffer_type = 'shallow'

否则,模型只能学到错误的"过拟合"相关性(例如:认为只有 Cisco 设备会拥塞,因为训练数据里 Cisco 较多)。

4.2 原则二:特征必须"时间可组合" (Time-Composable)

绝大多数网络异常不是瞬时的,而是一个过程。

  • 逐渐形成: 内存泄露、光衰增加。
  • 间歇性爆发: 微突发(Micro-burst)。

因此,Feature 决不能只是"某一时刻的采样值"。一个优秀的特征,必须包含时间维度的统计信息。

我们在构建特征时,通常会计算滑动窗口(Sliding Window)内的统计量:

  • mean (均值:看趋势)
  • p99 (99分位值:看极值)
  • std_dev (标准差:看抖动)
  • change_rate (变化率:看突变)

AI 只有看到"变化率",才能预测"未来"。

4.3 原则三:特征必须能"回放与复现" (Replayable)

这是工程系统中经常被忽略、但导致系统最终失败的致命点。

如果一个 Feature 是依赖于内存中的临时状态计算出来的,一旦服务重启,或者我想去复盘上个月的事故时,发现无法在历史数据中复算出一模一样的特征值,那么这个特征就是不可用的。

Featureizer 必须具备幂等性: 只要输入的原始 Telemetry 历史数据一致,配置上下文一致,输出的 Feature 向量必须严格一致。这是模型训练与推理一致性(Training-Serving Consistency)的基础。

5. 典型 Telemetry 特征的分类体系

为了让大家更有体感,我们不罗列枯燥的指标,而是列举在工程上被证明最有效的几类"复合特征"。

这层特征的目标不是描述"有没有流量",而是描述"链路本身是否健康"。

  • 原始来源: ifHCInOctets, ifOutDiscards, dot3StatsSymbolErrors, queue_depth.
  • 典型特征化方式:
    • link_saturation_ratio: \\frac{Current\\_Bps}{Link\\_Capacity} (链路饱和度,归一化到 0-1)
    • effective_drop_rate: \\frac{Drop\\_Packets}{Total\\_Packets} (有效丢包率,剔除 ACL 丢弃)
    • congestion_index (拥塞指数): 这是一个加权复合特征。

Congestion = w_1 \\times Norm(QueueDepth) + w_2 \\times Norm(ECN\\_Marking) + w_3 \\times Drop\\_Slope

解释:结合了队列深度、ECN 标记和丢包增长斜率,比单一指标更能准确反映拥塞。

    • burstiness_score: 短窗口(如 100ms)峰值与长窗口(如 5s)均值的比率。用于检测微突发。

5.2 转发表与路径特征 (FIB & Path Features)

这层特征服务于"流量走得对不对"。

  • 原始来源: ECMP Group stats, Next-hop counters, Flow sampling (sFlow/IPFIX).
  • 典型特征化方式:
    • path_skew_index (路径倾斜度): 在一个 ECMP 组中,流量分布的标准差。
      • 如果 Index 趋近于 0,说明负载均衡完美。
      • 如果 Index 突然飙升,说明出现了"哈希极化"或"大象流(Elephant Flow)"。
    • null_route_hits: 命中黑洞路由的流量速率。
    • reroute_frequency: 单位时间内下一跳(Next-hop)发生变化的次数。用于检测路由震荡导致的路径切换。

5.3 控制面健康特征 (Control Plane Features)

控制面是网络的大脑,它的特征往往是"事件型"的,需要转化为"数值型"。

  • 原始来源: BGP session state, OSPF LSA counters, ARP table capacity.
    • churn_density (抖动密度): 单位时间(例如 5 分钟)内,路由表(RIB)发生 Update 或 Withdraw 的总次数。
    • convergence_latency_est (收敛延迟估算): 从收到 BGP Update 到 FIB 表项完成写入的时间差(通常需要特定 Telemetry 探针支持)。
    • protocol_resource_strain: 协议内存占用 / 总可用内存。

这套分类体系的关键在于:每一类特征,都在回答一个特定的网络问题,而不是简单地陈列数据。

6. Featureizer 的工程实现模型

在实际的代码工程中,Featureizer 不是一段随意的 Python 脚本,它需要被严格管理。

6.1 Schema 化与版本控制

一个成熟的 Featureizer 通常具备明确的 Input Schema 和 Output Schema。

复制代码
# Feature Definition Example (v1.2)

feature_group: link_congestion

version: 1.2

inputs:

  - metric: interfaces/interface/state/counters/out-octets

    type: rate

  - metric: qos/interfaces/interface/output/queues/queue/state/transmit-pkts

    type: counter

transformation:

  - function: sliding_window_stats

    window_size: 30s

    metrics: [mean, p95, std]

output:

  - vector_id: congestion_vec_30s

每次特征定义的变更(例如调整了时间窗口,或者修改了加权公式),都必须:

  1. 版本号升级: (v2 -> v1.3)
  2. 历史重算: 使用新逻辑跑历史数据,验证对模型的影响。
  3. 不破坏下游: 保证下游模型能兼容或平滑迁移。

6.2 上下文绑定的必要性

同一个 Feature 值,在不同上下文含义不同。Featureizer 在输出特征时,必须"附着"上下文标签。

  • Topology Context: pod_id, spine/leaf, region
  • Service Context: tenant_id, vrf_name
  • Change Context: is_maintenance_window (是否在变更窗口内)

如果 Feature 向量里不包含 is_maintenance_window,模型就会把运维人员的主动流量切换误报为"网络故障"。上下文是特征的灵魂。

7. 网络状态向量(Network State Vector)的结构设计

在 AI 领域,数据最终必须变成向量(Vector)。但在网络工程领域,**"状态向量"**并不是简单地把几十个特征数值拼成一个数组。

一个设计不良的向量结构,会导致后续的模型训练出现严重的维度灾难(Curse of Dimensionality)或者上下文丢失

7.1 误区:盲目的"宽向量"

很多初学者倾向于构建一个超级大的"上帝向量",例如把一台核心交换机的所有接口(48个)、所有队列(8个/口)、所有协议状态全部拼成一个长度为 5000+ 的向量。

这种做法是错误的。

  • 稀疏性问题: 绝大多数时候,大部分接口是正常的,向量中 99% 的元素是 0 或无效值。
  • 拓扑变动敏感: 一旦扩容板卡,向量维度改变,模型就得重训。

7.2 工程最佳实践:基于"作用域(Scope)"的向量设计

在工程上,我们建议构建多层级、标准化的状态向量。每个向量只描述一个特定作用域的状态。

推荐的数据结构(Protobuf/Avro 定义示例):

复制代码
message NetworkStateVector {
    // 1. 唯一标识与作用域
    string vector_id = 1;          // UUID
    string scope_type = 2;         // 枚举:INTERFACE | DEVICE | PATH | SERVICE
    map<string, string> identity = 3; // { "device": "spine-01", "iface": "eth1/0" }

    // 2. 时间锚点(非常关键)
    int64 timestamp = 4;           // 当前时间点
    int64 window_duration = 5;     // 特征计算的窗口大小 (e.g., 60s)

    // 3. 上下文标签 (用于后续的 Filter 和 GroupBy)
    map<string, string> context = 6; // { "role": "spine", "vendor": "cisco", "change_window": "false" }

    // 4. 特征载荷 (AI 真正关心的部分)
    // 浮点型特征 (归一化后的数值)
    map<string, float> numerical_features = 7; 
    // 类别型特征 (One-hot 编码前的值)
    map<string, string> categorical_features = 8;

    // 5. 数据质量标记
    bool is_imputed = 9;           // 是否包含插值/补全的数据
}

设计哲学:

  • 解耦: 模型可以只订阅 scope_type = INTERFACE 的向量流,而无需关心 BGP 的状态。
  • 自描述: 向量自带上下文(Context),这意味着即使存储在时序数据库或向量数据库中,它也是"独立可理解的",不需要去查 CMDB 就能知道它是谁。

"Telemetry 是秒级的,所以处理也必须是实时的。"

为了实现从 gNMI 采集到状态向量生成的低延迟(< 5秒),业界标准的架构模式是 Streaming First

8.1 采集层:一切从"可重放(Replayable)"开始

采集层的核心目标不是"快",而是完整有序

  • 接入协议: gNMI (Google Network Management Interface) 是首选,因为它是基于 Protobuf 的结构化数据,比 SNMP 的 OID 解析效率高出数量级。
  • 数据总线: 必须使用 Kafka 或 Pulsar。
    • Topic 分区策略: 关键点! 必须按 Device_ID 进行 Partition Key 散列。这确保了同一台设备的指标,总是严格有序地发往同一个 Kafka Partition,从而被同一个 Flink Slot 处理。这是计算"状态变化率"的前提。

为什么是 Flink 而不是简单的 Python 脚本?因为网络特征计算需要 State(状态)

当我们需要计算"过去 1 分钟的丢包率增量"时,系统必须记住"1分钟前的值"。Python 脚本通常是无状态的,难以处理窗口计算。

Flink Job 的典型处理逻辑:

  1. Ingestion: 消费 Kafka 中的 Raw_gNMI_Stream。
  2. KeyBy: 按 Device + Interface 分组。
  3. Windowing: 开启一个滑动窗口(Sliding Window,例如:窗口60s,步长10s)。
  4. Feature Computation (In-Window):
    • 计算窗口内的 Mean, Max, Min。
    • 计算 Delta (当前值 - 上个窗口值)。
    • Data Enrichment: 调用外部缓存(Redis/Guava)关联 CMDB 数据(比如端口对端的设备名、链路的角色),注入到上下文中。
  5. Sink:
    • 热路径: 推送至 AIOps 推理引擎 / 告警系统。
    • 冷路径: 写入 ClickHouse / Druid 供报表查询;写入 Feature Store (Offline) 供模型训练。

8.3 解决"乱序"与"迟到"

网络设备上报 Telemetry 经常因为 CPU 繁忙而延迟。

  • Watermark (水位线) 机制: Flink 利用 Watermark 允许数据迟到一定时间(如 5秒)。超过 5秒的数据将被丢弃或进入侧输出流(Side Output)进行离线补录,防止实时计算逻辑被无限阻塞。

9. 事件指纹(Fingerprinting)与去重:让 Telemetry 不再泛滥

Telemetry 最大的痛点之一是:同一件故障,会产生海量事件。

例如,一条光缆中断,BGP 会 Down,OSPF 会 Down,接口会 Down,上万条路由会 Withdraw。如果直接把这些全部告警,NOC(网络监控中心)会被淹没。

解决方案:语义指纹(Semantic Fingerprinting)。

9.1 指纹的生成算法

指纹的目的不是压缩数据,而是识别"这是同一类事"

我们需要定义一个函数 generate_fingerprint(event_vector):

python 复制代码
import hashlib

def generate_fingerprint(vector):
    # 提取关键维度的 Key
    keys = []
    
    # 1. 拓扑位置 (Where)
    keys.append(vector.context.get('pod_id'))
    keys.append(vector.context.get('switch_role'))
    
    # 2. 故障类型 (What)
    # 注意:这里不包含具体的 metric value,只包含类型
    # 例如:不管是丢 100 个包还是 200 个包,都是 'congestion'
    keys.append(vector.event_type) 
    
    # 3. 归一化后的时间片 (When - Coarse Grained)
    # 将时间按 5分钟取整,意味着 5分钟内的同类事件算作同一个
    time_bucket = vector.timestamp // 300
    keys.append(str(time_bucket))
    
    # 排序并拼接 (Sort is crucial for consistency)
    raw_str = "|".join(sorted([str(k) for k in keys if k]))
    
    # 生成 Hash
    return hashlib.sha256(raw_str.encode()).hexdigest()[:16]

9.2 指纹的应用

一旦生成了指纹:

  1. 告警去重: 系统维护一个 Active_Fingerprints 集合(Redis Set)。新事件到达,指纹已存在 -> 忽略或仅增加计数;指纹不存在 -> 触发新告警。
  2. 事件聚合: 在工单系统中,将相同指纹的 Telemetry 事件自动归并到同一个 Ticket 下。

10. 向量检索(Vector Retrieval):网络运维的"杀手级"应用

在构建了状态向量后,最令人兴奋的应用不是"预测未来",而是**"对齐历史"**。

很多时候,根因定位(RCA)非常困难,因为网络太复杂。但网络故障往往具有重复性。上个月发生的 BGP 慢收敛,下个月可能因为同样的配置错误再次发生。

10.1 核心思想:相似性搜索 (Similarity Search)

我们可以将历史上的故障时刻的"状态向量"存储在向量数据库(如 Milvus, Faiss, Elasticsearch Dense Vector)中。

当当下发生异常时:

  1. 实时生成当前的 Query Vector
  2. 在向量库中搜索 Top-K 最相似的历史向量

10.2 为什么这比传统告警强?

  • 传统告警: 告诉你"CPU > 90%"。(你需要自己分析这意味着什么)
  • 向量检索: 告诉你"当前状态向量与 2023-11-12 日的'某板卡内存泄露事故'相似度 98%"。

这直接给出了潜在的根因处置建议

实现技术栈:

  • Embedding: 如果特征维度太高,可以使用 AutoEncoder 将 State Vector 压缩为低维 Embedding。
  • Distance Metric: 通常使用余弦相似度(Cosine Similarity),因为它关注方向(特征之间的比例关系)而非绝对距离。

11. Telemetry × 拓扑 × 变更:拼上最后一块拼图

单独的 Telemetry 系统只是一个孤岛。为了实现真正的智能,它必须与另外两类数据强关联。

11.1 拓扑关联:爆炸半径(Blast Radius)计算

Telemetry 告诉我们"哪个节点坏了",拓扑数据(Topology Graph) 告诉我们"谁会受影响"。

在 Flink 处理流中,我们可以引入图计算逻辑:

  • 当 Interface_Down 事件发生。
  • 查询图数据库(Neo4j / Nebula Graph)。
  • 找到该 Interface 承载的所有 Overlay_Tunnel 和 Service_App。
  • 生成**衍生告警(Derived Alarms)**给业务团队,告知"你的业务可能受损",而不是告诉他们"Eth1/0 Down 了"。

11.2 变更关联:因果性的免费标签

80% 的网络故障是由变更(Change)引起的。 Telemetry 数据流必须与变更管理系统(Change Management System)的时间轴对齐。

工程实现: 在生成 State Vector 时,查询变更系统的 API。如果当前时间处于某个变更窗口(Change Window)内,且涉及的设备与变更范围匹配,则在向量的 Context 字段打上标记: context'change_id' = 'CHG-2024-8888'

这不仅有助于 AI 排除误报(变更期间的震荡可能是预期的),更是为后续的**"自动变更回滚"**提供了直接依据。

12. 结语:Telemetry 真正改变的,不是"观测",而是"决策路径"

如果你回顾这完整的第 21 篇内容,你会发现一条清晰的主线:

  1. gNMI/Telemetry 只是解决了"数据获取的效率"。
  2. Featureizer 解决了"数据的语义化与归一化"。
  3. State Vector 解决了"数据的可计算性"。
  4. Fingerprinting & Search 解决了"经验的数字化与复用"。

传统的网络运维是:人看图 -> 人分析 -> 人决策 。 构建了这套体系后的 AIOps 是:机器看向量 -> 机器搜历史 -> 机器推根因 -> 人确认

Telemetry 系统的最终价值,不在于你在 Grafana 上画出了多么漂亮的 4K 曲线图,而在于你是否构建出了一套可回放、可比较、可推理的数字孪生状态流

这才是下一代网络可观测性(Observability)的真实含义。

最后,我想给你一份下一步行动指南 (Actionable Next Steps)

如果你想在你的团队落地这套体系,建议按以下步骤启动:

  1. 盘点现状: 不要急着上 AI 模型。先看你的 gNMI 数据,是否仅仅是存起来了?
  2. 构建第一个 Featureizer: 选一个最痛的点(比如"微突发拥塞"),写一个流式作业,把原始 counters 转化为 congestion_score。
  3. 定义向量结构: 按照本文第 7 节的 Protobuf 示例,定义你们团队的第一个标准状态向量。
  4. 建立指纹机制: 在告警风暴把大家淹没之前,先实施基于 Hash 的指纹去重。

愿你的网络,从"可被监控",进化为"可被理解"。

(文:陈涉川)

2025年12月17日

相关推荐
江畔柳前堤14 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术14 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客14 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
咱入行浅15 小时前
汽车之家联合HarmonyOS SDK,深度构建鸿蒙生态体系
华为·汽车·harmonyos
阿里云大数据AI技术15 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO16 小时前
GEO技术服务选型指南
大数据·人工智能·python
nxb55616 小时前
haproxy算法,ip透传,自定义haproxy错误页面
运维·服务器
阿里云大数据AI技术16 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架16 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab16 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能