Kubernetes 监控实战:使用 Alertmanager 实现邮件告警、分组路由与告警抑制
前言在前面的监控实践中我们已经通过ServiceMonitor让 Prometheus 抓取了 NVIDIA DCGM Exporter 和 vLLM 的指标并使用PrometheusRule编写了 GPU 与推理服务告警规则。但是Prometheus 负责的是“判断告警是否成立”并不负责完成告警分组、通知路由、静默、抑制以及邮件发送。Alertmanager 正是用来处理这些工作的组件。Prometheus 官方也将两者的职责进行了区分Prometheus 通过告警规则识别当前故障Alertmanager 负责后续的聚合、限流、静默、依赖处理和通知分发。本文基于 Prometheus Operator 提供的AlertmanagerConfigCRD完成以下功能普通告警 → 发送到默认邮箱 带有 notify_groupai-infra 标签的告警 → 发送到 AI Infra 专用邮箱 Watchdog 心跳告警 → 保留在 Alertmanager 中但不发送邮件 同一 namespace、同一 alertname critical 告警触发 → 抑制 warning 和 info 通知 告警恢复 → 发送恢复邮件本文使用的实验环境如下Kubernetes 命名空间monitoring Prometheusprometheus-k8s Alertmanageralertmanager-main 配置方式Prometheus Operator AlertmanagerConfig 通知方式QQ 邮箱 SMTP 业务监控对象vLLM 推理服务 基础设施监控对象NVIDIA GPU一、Prometheus 和 Alertmanager 的告警链路完整链路如下业务服务或 Exporter ↓ Prometheus 抓取指标 ↓ PrometheusRule 计算告警条件 ↓ 告警持续满足 for 后进入 FIRING ↓ Prometheus 将告警发送给 Alertmanager ↓ Alertmanager 执行分组、去重、路由、抑制 ↓ 通过 SMTP 发送邮件通知Prometheus 告警规则常见的状态包括INACTIVE当前表达式不满足告警条件。PENDING表达式已经满足但持续时间还没有达到for。FIRING表达式持续满足的时间已经达到for告警正式触发。PENDING阶段主要由 Prometheus 自己维护当告警进入FIRING后Prometheus 才会把它作为需要通知的告警发送给 Alertmanager。Prometheus 官方文档也说明for用于要求告警条件持续满足指定时间在达到该时间前告警处于pending状态。下面是本次实验中 Prometheus 已加载的 vLLM 告警规则二、检查 AlertmanagerConfig 是否能够生效2.1 检查 Alertmanager 运行状态先确认 Alertmanager Pod、Service 和自定义资源正常存在kubectl -n monitoring get pod | grep alertmanager kubectl -n monitoring get svc | grep alertmanager kubectl -n monitoring get alertmanager在 Prometheus Operator 环境中Alertmanager自定义资源负责声明 Alertmanager 实例Operator 再根据该资源创建 StatefulSet、Pod 和配套 Service。2.2 检查 AlertmanagerConfig CRD 版本AlertmanagerConfig的 API 版本不能直接照抄其他环境必须以当前集群已经安装并处于servedtrue状态的版本为准kubectl get crd alertmanagerconfigs.monitoring.coreos.com \ -o jsonpath{range .spec.versions[?(.servedtrue)]}{.name}{\n}{end}本次实验返回v1alpha1因此本文使用apiVersion: monitoring.coreos.com/v1alpha1 kind: AlertmanagerConfig如果你的集群返回其他版本应同步修改 YAML 中的apiVersion不能只修改 CRD 名称。2.3 检查 Alertmanager 对 AlertmanagerConfig 的选择范围创建AlertmanagerConfig并不代表 Alertmanager 一定会加载它。需要检查Alertmanager自定义资源中的选择器kubectl -n monitoring get alertmanager main -o yaml重点检查spec: alertmanagerConfigSelector: {} alertmanagerConfigMatcherStrategy: type: None这里有两个关键点。alertmanagerConfigSelector: {}表示选择符合命名空间范围的所有AlertmanagerConfig。如果该字段完全未设置资源选择器默认不会选择任何AlertmanagerConfig。alertmanagerConfigNamespaceSelector如果未设置默认只发现与Alertmanager自定义资源位于同一命名空间中的AlertmanagerConfig。本文的Alertmanager和AlertmanagerConfig都位于monitoring因此可以不额外配置该字段。注意如果你的Alertmanager资源由 Helm 或 Kustomize 管理应在对应的 values 或清单源文件中修改避免手工修改后又被重新覆盖。三、创建 SMTP 授权码 Secret邮件密码不能直接写在AlertmanagerConfig中。本文使用 Kubernetes Secret 保存 QQ 邮箱 SMTP 授权码。QQ 邮箱的 SMTP 授权码与网页登录密码不是同一个概念。创建alertmanager-smtp-auth.yamlapiVersion: v1 kind: Secret metadata: name: smtp-credentials namespace: monitoring type: Opaque stringData: password: QQ邮箱SMTP授权码创建 Secret后检查资源kubectl -n monitoring get secret smtp-credentials后续AlertmanagerConfig通过下面的方式引用它authPassword: name: smtp-credentials key: password其中name必须与 Secret 的名称一致。key必须与stringData或data中保存授权码的键一致。Secret 必须与AlertmanagerConfig位于同一个命名空间并且 Prometheus Operator 需要有权限读取它。四、设计告警分组、路由和抑制规则4.1 告警路由树本文设计的路由树如下所有进入 Alertmanager 的告警 ↓ alertname 是否为 Watchdog ├── 是 → null不发送邮件 └── 否 ↓ 是否带有 notify_groupai-infra ├── 是 → email-ai-infra └── 否 → email-defaultAlertmanager 的路由是一个树形结构。每条告警先进入顶层路由再依次匹配子路由。默认情况下continue为false告警匹配到第一个子路由后不再继续匹配后续同级路由如果没有匹配任何子路由则由当前路由的接收器处理。根路由配置为route: receiver: email-default表示未匹配专用子路由的告警统一发送到默认邮箱。AI Infra 专用路由如下- receiver: email-ai-infra matchers: - name: notify_group value: ai-infra matchType: 只要告警中包含labels: notify_group: ai-infra就会进入email-ai-infra接收器。因为没有设置continue: true所以该告警不会再发送给默认接收器。4.2 丢弃 Watchdog 邮件通知Watchdog是 kube-prometheus 中用于验证告警链路的心跳告警通常会长期保持触发状态。本文让它保留在 Alertmanager 页面中但不发送邮件- receiver: null matchers: - name: alertname value: Watchdog matchType: 对应的空接收器为- name: null这里必须把null加上引号避免 YAML 将其解析成空值。4.3 告警分组根路由使用以下分组字段groupBy: - namespace - alertname这表示namespace和alertname都相同的告警会进入同一个通知组。例如下面两个 Pod 告警alertnameKubePodNotReady namespaceai-demo podpod-aalertnameKubePodNotReady namespaceai-demo podpod-b由于pod没有放入groupBy所以它们可以被合并到同一个通知组中而不是为每个 Pod 单独发送一封邮件。Alertmanager 的分组机制主要用于在大规模故障中减少重复通知。4.4 groupWait、groupInterval 和 repeatInterval本文配置groupWait: 30s groupInterval: 5m repeatInterval: 10mgroupWait: 30s表示一个新的告警组第一次出现后先等待 30 秒再发送第一条通知。这样可以收集同组的其他告警也可以等待更高级别的抑制源告警到达。如果告警在groupWait结束前恢复该告警不会发送通知。groupInterval: 5m表示首条通知发送后每隔 5 分钟检查该通知组是否有新告警加入或者是否有告警恢复。只有通知组发生变化时才会发送更新通知。repeatInterval: 10m表示告警持续未恢复并且通知组没有变化时距离上一次通知达到 10 分钟后再次发送提醒。Alertmanager 在每个groupInterval周期检查是否达到repeatInterval因此repeatInterval最好设置为groupInterval的整数倍。以本文配置为例假设第一封通知发送后告警一直处于触发状态并且告警组没有发生变化 告警出现时 新告警组首次出现开始等待 groupWait。 30 秒后 groupWait 结束发送第一封通知。 5 分 30 秒后 到达第一个 groupInterval 检查点。 此时距离上一封通知只有 5 分钟尚未达到 repeatInterval 因此不发送重复通知。 10 分 30 秒后 到达第二个 groupInterval 检查点。 此时距离上一封通知已经达到 10 分钟并且告警仍未恢复、 告警组也没有发生变化因此发送重复通知。4.5 邮件接收器邮件接收器主要使用以下字段emailConfigs: - to: 收件邮箱 from: 发件邮箱 smarthost: smtp.qq.com:587 authUsername: 发件邮箱 authPassword: name: smtp-credentials key: password requireTLS: true sendResolved: true字段含义如下to接收告警通知的邮箱。from邮件头中的发件地址。smarthostSMTP 服务器地址和端口格式为hostname:port。authUsernameSMTP 认证用户名本实验使用完整 QQ 邮箱地址。authPassword从 Kubernetes Secret 中读取 SMTP 授权码。requireTLS要求 SMTP 连接使用 TLS。sendResolved允许在告警恢复后发送恢复通知。这些字段均由 Prometheus Operator 的EmailConfigAPI 定义。4.6 critical 抑制 warning 和 info本文配置以下抑制规则inhibitRules: - sourceMatch: - name: severity value: critical matchType: targetMatch: - name: severity value: warning|info matchType: ~ equal: - namespace - alertname它的含义是存在 severitycritical 的源告警 ↓ 查找 severitywarning 或 severityinfo 的目标告警 ↓ 要求源告警与目标告警的 namespace 和 alertname 相同 ↓ 抑制目标告警的通知需要注意抑制只是不再发送目标告警的通知不会把目标告警从FIRING改成INACTIVE也不会从 Alertmanager 页面中删除它。Alertmanager 官方将 Inhibition 定义为当某些源告警已经触发时抑制符合条件的其他告警通知。例如两个告警规则可以使用相同的alertname但使用不同严重级别- alert: VllmRequestWaiting labels: severity: warning- alert: VllmRequestWaiting labels: severity: critical当两者位于同一个namespace时critical 告警触发后warning 通知会被抑制。Silence与Inhibition不同Silence是运维人员按照标签和时间范围手工创建的静默适合计划维护Inhibition是根据其他正在触发的告警自动执行的抑制。五、创建完整的 AlertmanagerConfig创建alertmanager-main-config.yamlapiVersion: monitoring.coreos.com/v1alpha1 kind: AlertmanagerConfig metadata: name: main-config namespace: monitoring spec: route: # 未匹配到子路由的告警发送给默认收件人。 receiver: email-default # 同 namespace、同 alertname 的告警合并为一个通知组。 groupBy: - namespace - alertname # 新告警组首次出现后等待 30 秒再发送通知。 groupWait: 30s # 已经发送过通知的告警组每 5 分钟检查一次是否发生变化。 groupInterval: 5m # 告警持续未恢复且告警组没有变化时每 10 分钟重复通知。 repeatInterval: 10m routes: # Watchdog 保留在 Alertmanager 中但不发送邮件。 - receiver: null matchers: - name: alertname value: Watchdog matchType: # 带有 notify_groupai-infra 标签的告警发送到专用邮箱。 # continue 默认为 false匹配后不会继续匹配后续同级路由。 - receiver: email-ai-infra matchers: - name: notify_group value: ai-infra matchType: receivers: # 未匹配专用子路由的普通告警接收器。 - name: email-default emailConfigs: - to: 默认告警收件邮箱 from: QQ发件邮箱 smarthost: smtp.qq.com:587 authUsername: QQ发件邮箱 authPassword: name: smtp-credentials key: password requireTLS: true sendResolved: true # AI Infra 专用告警接收器。 - name: email-ai-infra emailConfigs: - to: AI Infra告警收件邮箱 from: QQ发件邮箱 smarthost: smtp.qq.com:587 authUsername: QQ发件邮箱 authPassword: name: smtp-credentials key: password requireTLS: true sendResolved: true # 空接收器只用于匹配后不发送任何通知。 - name: null inhibitRules: # 同 namespace、同 alertname 时critical 抑制 warning 和 info。 - sourceMatch: - name: severity value: critical matchType: targetMatch: - name: severity value: warning|info matchType: ~ equal: - namespace - alertname将占位符替换为实际邮箱后创建资源检查创建结果kubectl -n monitoring get alertmanagerconfig kubectl -n monitoring describe alertmanagerconfig main-config六、通过 NodePort 访问 Alertmanager Web 页面创建alertmanager-main-nodeport.yamlapiVersion: v1 kind: Service metadata: name: alertmanager-main-nodeport namespace: monitoring spec: type: NodePort selector: alertmanager: main ports: - name: web port: 9093 targetPort: web nodePort: 30993浏览器访问http://NodeIP:30993下面是本次实验中的 Alertmanager 页面页面中可以看到不同告警已经进入不同接收器monitoring/main-config/email-default monitoring/main-config/email-ai-infra例如Kubernetes 组件告警、Pod 告警和 GPU 告警进入email-default。VllmTargetDown带有notify_groupai-infra因此进入email-ai-infra。七、验证告警触发和邮件路由7.1 验证告警从 PENDING 进入 FIRING当告警表达式已经满足但还没有持续达到for指定的时间时Prometheus 页面显示为PENDING告警条件持续达到for后状态变成FIRING进入FIRING后Prometheus 将告警状态发送给 AlertmanagerAlertmanager 再根据路由和接收器配置发送邮件。7.2 验证普通 GPU 告警GPU 温度告警没有配置notify_group: ai-infra因此不会匹配 AI Infra 子路由最终由根路由发送到email-default收到的邮件如下邮件中包含告警名称、GPU UUID、主机名、GPU 编号、命名空间、严重级别、当前指标值和告警描述。需要特别说明为了快速验证邮件链路本次实验期间曾临时把 PromQL 的温度阈值调低但没有同步修改annotations.description所以截图中出现了“描述为超过 80 度但当前值为 51”的不一致。这只是测试配置造成的展示问题不代表51 80。实际使用时PromQL 阈值和告警描述必须保持一致避免误导接收人。7.3 验证 AI Infra 专用路由vLLM 告警规则中需要包含labels: severity: critical notify_group: ai-infra当 Prometheus 无法持续抓取 vLLM/metrics并且告警达到for指定的持续时间后VllmTargetDown进入FIRING。由于该告警带有notify_groupai-infra因此匹配email-ai-infra子路由而不会发送给默认接收器。收到的 vLLM 告警邮件如下从邮件中可以看到alertnameVllmTargetDown namespaceai-demo notify_groupai-infra severitycritical7.4 验证恢复通知恢复 vLLM 服务使 Prometheus 能够重新抓取/metrics。当告警条件不再满足后Prometheus 会把告警恢复状态发送给 Alertmanager。由于两个邮件接收器都配置了sendResolved: true因此 Alertmanager 可以向对应收件人发送恢复通知。需要注意sendResolved只控制接收器是否发送恢复消息不负责决定告警什么时候恢复。告警是否恢复仍然由 Prometheus 的表达式计算结果决定。7.5 验证告警抑制准备两个同名、同命名空间但严重级别不同的告警alertnameVllmRequestWaiting namespaceai-demo severitywarningalertnameVllmRequestWaiting namespaceai-demo severitycritical当二者同时触发时critical 告警满足sourceMatchwarning 告警满足targetMatch并且两者的namespace和alertname相同因此 warning 通知会被抑制。预期结果是critical正常发送邮件 warning仍然处于 FIRING但显示为 Inhibited不再重复发送邮件八、总结本文完成了从 Prometheus 告警规则到 Alertmanager 邮件通知的完整链路PrometheusRule 判断告警 ↓ 告警经过 PENDING 后进入 FIRING ↓ Prometheus 将告警发送给 Alertmanager ↓ Alertmanager 按 namespace 和 alertname 分组 ↓ 根据 alertname 和 notify_group 匹配路由 ↓ critical 抑制同名 warning 和 info 通知 ↓ 通过 QQ SMTP 发送告警与恢复邮件最终实现效果如下普通告警 → email-default notify_groupai-infra → email-ai-infra Watchdog → null不发送邮件 同 namespace、同 alertname 的 critical → 抑制 warning 和 info 通知 告警恢复 → sendResolved 发送恢复邮件至此Prometheus 不仅可以发现 GPU 和 vLLM 服务异常Alertmanager 也能够按照告警类型和严重程度把通知发送给正确的接收人并通过分组和抑制减少重复告警。

相关新闻

OpenAMP 架构深度剖析:remoteproc 与 RPMsg 在 FreeRTOS+Linux 双系统通信中的协作机制

OpenAMP 架构深度剖析:remoteproc 与 RPMsg 在 FreeRTOS+Linux 双系统通信中的协作机制

OpenAMP 架构深度剖析:remoteproc 与 RPMsg 在 FreeRTOSLinux 双系统通信中的协作机制 一、多核异构系统的通信地狱——当 Cortex-A 的 Linux 遇上了 Cortex-M 的裸机 现代边缘 SoC(如 STM32MP1、i.MX 8M Mini)普遍集成 Cortex-A Cortex-M…

2026/7/15 23:30:35阅读更多 →
【沐风老师】3DMAX编织建模插件:从可编辑多边形到艺术品的进阶指南

【沐风老师】3DMAX编织建模插件:从可编辑多边形到艺术品的进阶指南

1. 为什么可编辑多边形是编织建模的最佳载体第一次接触3DMAX编织建模时,我也曾疑惑:为什么教程都强调要使用可编辑多边形?直到亲手对比测试才发现,这简直是天壤之别。想象你要编织一个竹篮,用原始圆柱体和用可编辑多边…

2026/7/15 23:30:35阅读更多 →
NCNN 多线程推理的负载均衡调度对决:按输出通道均分与按计算量均分两种策略的基准测试报告

NCNN 多线程推理的负载均衡调度对决:按输出通道均分与按计算量均分两种策略的基准测试报告

NCNN 多线程推理的负载均衡调度对决:按输出通道均分与按计算量均分两种策略的基准测试报告 一、线程闲置的真相——当 4 核 CPU 的推理吞吐量还不如单核时发生了什么 在 NCNN 的边缘推理部署中,开启多线程后延迟反而恶化的情况并不少见。以 RK3588 上的 …

2026/7/15 23:30:35阅读更多 →
告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南

告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南

告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

2026/7/16 0:30:45阅读更多 →
Proteus进阶:从8×8到16×16点阵屏的硬件设计与软件驱动全解析

Proteus进阶:从8×8到16×16点阵屏的硬件设计与软件驱动全解析

1. 点阵屏基础与硬件选型如果你玩过单片机开发,肯定对88点阵屏不陌生——那种能显示简单图案和字符的小方阵。但要用它显示完整汉字,就显得捉襟见肘了。一个1616的点阵屏才是汉字显示的"黄金尺寸",可惜Proteus元件库里并没有现成的…

2026/7/16 0:30:44阅读更多 →
深入UDS诊断:0x83服务如何精准调控通信时序参数

深入UDS诊断:0x83服务如何精准调控通信时序参数

1. 0x83服务基础概念与核心价值在汽车电子诊断领域,UDS协议中的0x83服务就像交通信号灯控制系统,它负责动态调节诊断通信的"红绿灯节奏"。想象一下早晚高峰时交警手动调整路口信号灯的场景——0x83服务就是诊断通信中的那位"智能交警&quo…

2026/7/16 0:30:44阅读更多 →
STM32与SX1262实战:从驱动移植到LoRaWAN节点开发

STM32与SX1262实战:从驱动移植到LoRaWAN节点开发

1. STM32与SX1262硬件选型指南在物联网节点开发中,硬件选型直接影响通信距离和功耗表现。STM32F4系列(如STM32F407)凭借168MHz主频和丰富外设成为中高端LoRa节点的首选,而STM32L0系列(如STM32L071)则因其超…

2026/7/16 0:30:44阅读更多 →
NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南

NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南

1. NAND Flash为什么需要ECC保护?第一次拿到NAND Flash芯片时,你可能觉得它就是个普通的存储设备。但实际使用中会发现,即使严格按照时序操作,读取的数据偶尔也会出错。这是因为NAND Flash的物理特性决定了它在存储数据时存在固有…

2026/7/16 0:30:42阅读更多 →
程序员必看:2026年AI大模型如何影响你的薪资?从12K到6万,关键技能大揭秘!

程序员必看:2026年AI大模型如何影响你的薪资?从12K到6万,关键技能大揭秘!

2026年程序员薪资出现严重分化,前端、后端岗位需求下降52%,但AI大模型岗位月薪可达40K。企业裁员的同时,也在加大AI投入,新发AI岗位量同比增长约12倍,平均月薪超6万元。传统软件开发技能贬值,而掌握AI工具、…

2026/7/16 0:25:40阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代…

2026/7/16 0:00:38阅读更多 →
遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…

2026/7/16 0:00:38阅读更多 →
5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…

2026/7/16 0:00:38阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →