普通视图

发现新文章,点击刷新页面。
昨天以前首页

TDS数据治理深度实践:从标准化到智能化的演进之路

作者 百度Geek说
2025年9月4日 15:17

TDS数据治理深度实践:从标准化到智能化的演进之路

TDS(Turing Data Studio)是专注于数据开发和治理的平台。其架构涵盖了从基础设施到用户功能的各个层次,包括数据开发、数仓管理、监控运维和资源管理等模块,支持高效的任务调度、资源管理和数据血缘分析。

上一代大数据产品在实际运行中仍存在以下关键问题:

1. 开发阶段风险控制不足:

  • 数据开发任务经过修改调试后,会直接用于处理线上数据,存在误操作直接影响线上数据的隐患。

2. 产出阶段质量保障滞后:

  • 数据产出质量。需要等数据完全产出后,通过人工校验或下游反馈发现,无法在数据产出过程中实时拦截空值、异常值等问题。

  • 数据产出时效性。任务执行达到重试失败上限或触发延迟产出报警后,数据RD才能收到通知,难以有效维持数据时效性。

3. 运维阶段处理低效:

  • 日志分析有时需要值班同学帮助查看定位原因排查问题,依赖人工经验,处理问题效率较低。

  • 数据产出异常时,由于涉及的类型和层级较多,难以快速准确识别下游受损范围,并导致未及时回溯数据。

为了解决上述问题,TDS建设了体系化的数据治理方案。

流程标准化(规范开发)→ 质量可控化(主动防控)→ 运维智能化(降本提效)。

从多环节入手进行数据治理的深度实践,覆盖数据开发全流程,确保数据资产的健康与可信。

本章节将详细阐述TDS平台在构建这一数据治理体系中的核心理念、技术实践与显著成效,为业界提供一套可借鉴的深度治理方案。

01 流程标准化:构建数据开发的“交通规则”体系——百度MEG TDS平台实践

在百度移动生态事业群组(MEG)的复杂数据开发生态中,日均处理超过40万个任务实例。

面对“环境混用、配置失控、协作低效”这三大长期痛点,我们基于TDS平台构建了一套四级流程控制引擎,将开发规范体系化落地。

本文将深入解析该体系中的三大核心机制:代码强制留档与评审测试环境自动化构建与管理智能配置管理的实践与成效。

1.1 全链路规范化设计:精密控制开发生命周期

数据治理的起点在于规范开发流程。我们认为,只有在开发阶段就将规则融入工具链,才能真正实现“零门槛”的合规。

1.1.1 开发阶段:环境隔离与自动化验证

混乱的开发环境是导致生产事故的常见原因。TDS平台通过自动化技术,为每个任务创建了一个安全、隔离的沙盒环境,确保开发与生产互不干扰。

  • 自动化测试环境构建与管理:当开发人员在数仓管理模块创建生产表(如 user_behavior)时,系统会自动构建与之对应的完整测试环境体系。

图片

  • 配置中心标准化管理:
    通过预置标准化资源模板,实现配置的零接触管理和自动注入,从根本上杜绝了因手动配置错误导致的生产问题。

图片

  • 实施效果:

配置错误率从实施前的18.7%显著下降至0.4%。

新成员环境配置和基础任务上手时间从平均3天缩短至2小时以内。

  • 分钟级任务验证加速:
    基于TDS内置的TDE调试优化引擎,开发人员在编辑任务时可以随时提交SQL调试任务,大幅缩短验证周期。

  • 核心技术支撑:

     智能数据采样:自动抽取极小比例(如0.1%)的样本数据进行快速验证。

     测试表直连:调试结果直接输出到对应的测试表(如 user_behavior_tdsqa)。

     资源隔离:使用专用调试队列,避免与生产任务争抢资源。

1.2 上线阶段:代码留档、智能防护与强审批

任务上线是数据生产流程中的关键环节,任何疏漏都可能引发严重的生产事故。TDS平台通过代码强制留档、智能变更识别核心任务审批,构筑了三重安全防线。

1.2.1 上线单完整流程

图片

1.2.2 自动化代码治理流水线

建立强制性的代码评审与归档流程,确保变更可追溯、可审计。

图片

  • 核心控制机制与价值:

     强制代码提交:深度集成icode API,实现100%变更可追溯。

     评审硬卡点:TDS流程引擎与iCode状态强同步,杜绝未经评审的代码进入生产。

     版本快照绑定:任务版本与icode Commit ID 绑定,秒级精准定位任意历史任务版本。

1.2.3 智能变更识别引擎与核心任务审批

采用双轨检测技术(配置比对 + AST语法树分析)精准识别变更风险,并对核心任务实施严格审批。

图片

  • MD5比对关键字段:

     输出目标:生产环境AFS路径、ClickHouse表名等。

     数据来源:输入表、文件路径。

     计算逻辑指纹:SQL语句/Python代码核心片段的哈希值。

  • 核心任务标识与审批强化: 对于平台标记为“核心任务”的任务(通常涉及关键业务数据、高流量或具有广泛下游依赖),任何配置或代码的变更,无论风险评估等级高低,均强制触发完整的三级审批流程。此流程需业务负责人、技术负责人及平台负责人共同确认。

  • 拦截成效:

平均每月成功拦截可能导致数据污染、服务中断的高危操作超过50次。

生产环境配置误变更率降至0.1%。

02 质量可控化——数据可信度的保障

数据质量是数据价值实现的前提。在流程标准化建立起开发规范后,如何确保流经平台的数据本身是可靠、可信的,成为下一个核心挑战。

TDS平台构建了一套“预防为主、监控为辅、治理兜底”的三层防护体系,覆盖数据任务从设计、执行到故障处理的全生命周期。

2.1 三层防护体系:构建全流程数据治理监控屏障

2.1.1 事前防控:从源头规避数据风险

事前防控是数据治理监控的第一道防线。我们通过建立数仓 Schema 强约束,在数据任务开发与设计阶段就规避潜在风险,减少后续环节的异常。

  • 字段类型预校验:确保数据类型的一致性和准确性,防止因类型不匹配导致的计算错误或数据截断。例如,如果源字段是 STRING 类型,而目标字段是 INT 类型,系统会发出警告或直接阻止任务创建。

  • 分区规则预校验:确保分区字段、分区格式与命名规范统一,避免因分区不一致导致的数据查询不完整或任务失败。

2.1.2 事中监控:实时捕捉异常并快速响应

事中监控是数据治理的核心环节,旨在实时发现数据质量与任务进度的异常,并触发告警。

2.1.2.1 数据质量校验:多维度保障数据可靠性

数据质量校验通过构建多维度的评估指标体系,对数据进行实时检测。架构图如下:

图片

  • 架构

外部输入层:用户在TDS平台配置数据质量校验规则,指定数据源为图灵数仓表。

  • 核心架构层

     数据质量约束(Data Quality Constraints):涵盖行数、重复值、空值、异常值、表字段等多种规则,从精确度、完整性、唯一性、有效性、一

致性等多维度进行校验。

    SQL-Generator:根据用户配置的校验规则生成Spark SQL。

     TDS-Scheduler:在数据加工过程中,调度数据质量校验算子进行数据校验。

     指标计算:利用Spark从图灵数仓读取数据源,计算各项质量指标。

     数据校验:将计算结果与预设规则进行比对,判断是否存在质量问题。

  • 输出层:

     数据质量报告:生成可视化、结构化的报告,汇总约束验证结果。报告样例如下:

图片

  • 异常报警:采用分级报警机制(警告、严重、紧急),支持邮箱、如流、短信、电话等多种报警方式,确保异常能被及时处理。
2.1.2.2 SLA 风险监控:保障任务执行时效性

SLA(服务等级协议)是衡量任务执行效率的重要标准。TDS平台的SLA实时追踪功能,通过对任务执行进度的实时监控,及时发现超时或失败的任务,确保任务按时完成。架构图如下:

图片

  • 基础信息输入层

     数据血缘:记录数据从产生到使用的全链路关系,为后续构建任务依赖图提供关联依据。

     任务历史执行信息:存储任务过往执行的开始/结束时间、时长、状态等记录,是任务执行时间预估的核心依据。

  • SLA 管理模块(策略与分析层)

     SLA 配置:手动设置任务的服务级别协议,定义任务完成时限。

     任务 SLA 智能推荐:结合历史执行信息和数据血缘,利用算法自动推荐合理的SLA,减少人工配置的盲目性。

     SLA 历史达成情况分析:复盘过往SLA达成情况,为优化配置提供数据支撑。

  • 任务流程与风险预警层(核心执行与分析)

     构建任务依赖图:依据数据血缘梳理任务上下游关系,形成可视化图谱。

     任务执行时间预估:基于历史数据预测任务本次执行所需时间。

     关键链路分析:识别对整体SLA影响最大的关键路径,优先保障其资源和监控力度。

     LLM 风险预警分析:通过大语言模型分析SLA达成的潜在风险。

     打破 SLA 风险预警:综合以上分析结果,一旦识别到风险,立即发出预警,让负责人员提前介入,降低SLA打破的概率。

通过数据质量校验与SLA实时追踪的协同作用,事中监控能够实现对数据任务执行过程的全方位、实时化管控,将异常发现与响应的时间大幅缩短,有效减少异常对业务的影响。

2.1.3 事后治理:基于血缘实现故障快速溯源与修复

尽管事前防控与事中监控已大幅降低异常发生概率,但面对突发故障,事后治理仍至关重要。

其核心目标是快速定位根源、修复问题,并总结经验优化前序环节。

基于数据血缘的故障溯源是事后治理的关键技术手段。

如第三章“基于血缘的智能运维”所言,数据血缘指的是数据从源头到消费端的流转关系:每一个数据表、任务或文件从何而来,被谁消费,形成怎样的依赖链路。

在事后治理场景中,血缘的价值尤为突出:一旦出现数据异常,运维人员可以基于血缘快速定位到上游影响范围和下游受影响对象,避免盲目排查,大幅缩短故障定位与修复的时间。

当上游任务或表修复后,可以利用基于血缘的批量回溯能力,一键触发所有受影响的下游任务,实现自动化修复。

同时,通过分析故障原因并结合血缘,能够反向优化事前防控与事中监控的规则,形成“发现问题 - 定位根源 - 修复问题 - 优化规则”的闭环治理流程。

03 智能化运维

智能化运维旨在利用自动化分析与智能决策技术,提升数据开发平台的运维效率与问题处理速度。

TDS平台在该领域融合了任务日志分析基于血缘的智能运维两大能力,旨在构建一个高效、稳定、自愈的数据生产体系。

3.1 任务日志分析

任务日志是诊断问题的核心依据。TDS平台通过智能化的日志分析,帮助用户快速定位并解决问题。架构图如下:

图片

3.1.1 依赖检测算子日志分析

依赖检测类算子用于在任务执行前,判断上游数据是否已按时产出,避免因数据缺失导致的下游计算异常。平台通过结合任务执行日志与数仓元数据,提供清晰直观的依赖检测结果提示:

  • 平均产出时间提示:基于历史数据预估任务最早可启动时间,帮助用户合理安排调度。

  • 当前产出细节展示:以列表形式展示所有上游依赖的产出信息,包括产出状态(已到位/未到位)和具体时间,支持细化到分区/分表级别。

3.1.2 通用报错智能诊断

对于非依赖检测类的通用错误,平台引入大模型辅助诊断能力,结合内部知识库与外部信息,为用户提供智能化的错误分析与修复建议。

  • 执行日志解析:实时采集算子运行日志并结构化处理,将关键错误片段作为诊断输入。

  • 知识库 + 千帆大模型服务

     内部知识库:沉淀平台运维团队的常见错误模式、处理经验和最佳实践。

     互联网查询:当内部知识库无匹配方案时,系统会通过联网搜索补充诊断依据。

     千帆大模型分析:大模型对日志、知识库与检索结果进行综合推理,生成针对性诊断结论。

  • 输出结果:提供错误信息归纳、可能原因分析和可行的解决方案,并支持一键生成问题工单。

  • 效果与价值

     运维效率提升:自动化的依赖检测和智能诊断减少人工排查时间。

     问题定位更精准:日志与血缘关系的结合帮助快速锁定问题。

     经验可持续沉淀:错误分析结果自动回流知识库,形成正向闭环。

3.2 基于血缘的智能运维

数据血缘是连接数据链路的核心,它的价值在于让数据流转可见、可控、可回溯

  • 问题溯源与定位:一旦数据异常,可快速定位到上游影响范围和下游受影响对象。

  • 变更影响分析:修改某个表字段时,可提前评估下游影响,降低风险。

  • 回溯与修复:当发现上游数据有问题时,可以一键触发下游任务的批量回溯。

3.2.1 血缘架构图

图片

上图展示了TDS血缘治理系统的整体架构,涵盖从信息采集、解析、存储到对外展示的全流程。

  • 血缘数据来源

     TDS任务开发平台:自动提取任务依赖信息。

     第三方报表平台:采集分析报表与底层表的关系。

     任务配置和脚本:作为解析器的输入来源。

  • 血缘解析器:将各类任务、SQL和配置转化为结构化的血缘依赖,整合了任务DAG、SparkSQL、MySQL等多个解析服务。

  • 全链路血缘数据:设计了分层血缘视图,满足不同用户需求,包括:

     任务层血缘:展示任务DAG。

     数据表层血缘:支持多种存储引擎。

     AFS(文件系统)层血缘:跟踪文件上下游关系。

     报表层血缘:第三方报表数据源配置信息。

图片

3.2.2 血缘查看能力

平台提供了快捷易用的血缘查看能力,包括交互式血缘图、节点展开、时间筛选和数据导出。更重要的是,通过实例状态聚合能力,用户可以实时查看上下游任务实例状态,快速定位数据延迟的根因,大幅提升排障效率。

3.2.3 基于血缘的批量回溯能力

在数仓开发中,经常出现上游任务或表修复后,需要让下游数据重新跑一次的场景。例如:

  • 上游任务补数据后,需要让下游任务重新消费。

  • 某张表发现历史分区错误,需要让下游衍生表重新计算。

手动逐一触发下游任务效率低下且容易遗漏。基于血缘解析能力,我们实现了批量回溯:用户选定一个起始任务节点和时间范围,平台自动遍历血缘图,计算受影响的所有下游节点,并支持批量回溯回溯策略,用户可自行勾选需要回溯的多个任务节点,完成任务的批量回溯。该能力让回溯从“全靠经验”变为“半自动”,减少了人为失误和漏回溯风险。

3.2.4 基于血缘的回溯通知

回溯只是第一步,及时通知相关负责人同样关键。平台会:

  1. 基于血缘关系定位所有受影响节点的下游负责人;

  2. 自动生成受影响范围清单,并推送给下游任务的 Owner;

  3. 在通知中附带关键信息:回溯触发原因、影响范围(任务清单)。

这样,数据团队可以在第一时间获知回溯任务情况,及时跟进并降低数据事故影响。

04 总结:价值闭环与未来展望

TDS平台的数据治理实践,从根本上改变了百度MEG的数据生产模式。我们不再是被动地应对数据问题,而是主动地通过技术手段进行预防、监控与治理。

首先,流程标准化将散乱的开发行为转变为有序的“交通规则”,显著降低了人为错误的发生率,极大地提升了协作效率。通过环境隔离、配置注入和强制审批,我们将数据生产的风险前置化,让开发者能够专注于业务逻辑本身,而不是纠缠于繁琐的环境配置。

其次,质量可控化为数据资产构建了坚实的“防护衣”。事前约束从源头确保数据质量,事中监控实时捕获异常,事后治理则通过血缘快速溯源,形成了一个持续优化的闭环。这不仅保障了数据的可信度,也为业务决策提供了可靠的依据。

最终,运维智能化是整个体系的升华。通过任务日志的智能诊断与基于血缘的自动化运维,我们实现了对数据生产链路的“自愈”。问题排查不再依赖人工经验,而是由机器自动完成;数据修复不再需要繁琐的手动操作,而是一键批量回溯。这极大地释放了运维团队的生产力,让数据生产体系更加健壮、高效。

展望未来,我们的数据治理之路仍将继续。我们将进一步探索AI技术的深度融合,例如利用机器学习模型预测潜在的数据质量问题,或是基于大模型自动生成更精确的任务修复方案。我们相信,随着技术的不断演进,数据治理将从“可控”走向“自治”,最终实现一个真正意义上的“数据自愈工厂”,为业务发展提供源源不断、高可信度的数据燃料。

百度网盘基于Flink的实时计算实践

作者 百度Geek说
2025年9月2日 11:23

01 概览

随着数字化转型的来临,企业对于数据服务的实时化需求日益增长,在大规模数据和复杂场景的情况下,Flink在实时计算数据链路中扮演着极为重要的角色,本文介绍了网盘如何通过 Flink 构建实时计算引擎,从而提供高性能、低延迟、稳定的实时计算能力。

02 百度网盘实时计算演进

2.1 百度网盘实时计算演进历程

图片

△百度网盘实时计算演进

在 2020 年,网盘主要通过Spark Streaming和Spark Structured Streaming来用于特定场景的支持,主要是在数据同步场景、实时清洗方面的应用。

为了解决Spark Streaming存在的监控告警薄弱、接入成本高、时效性低等问题,网盘于2023年初首次引入Flink实时计算引擎,并基于百度内部StreamCompute平台快速建设集指标监控、告警、任务生命周期管理能力;经过调研测试我们发现Flink任务从0到1接入成本高、开发门槛高,因此,我们开始调研实时计算引擎的解决方案,目标是降低开发门槛、配置化任务接入,最终建设网盘内部的实时计算引擎Tiangong来为业务提供更好的支持。

截止至今,Tiangong计算引擎目前已在数据团队、反作弊团队、用户增长等场景广泛应用,并支持数百万亿的大流量场景。未来我们也计划将基于Tiangong建设网盘一体化实时计算平台,从而赋能网盘内部各个业务线实时计算能力建设。

2.2 为什么选择Flink

网盘实时计算引擎从Spark Streaming和Spark Structured Streaming演进而来,为什么放弃Spark体系选择Flink主要从以下几个方面出发:

图片

图片

图片

百度内部实时计算RoadMap和状态管理、流批一体、监控告警、任务管理、生态体系等各方面我们选择基于Flink建设网盘内部的实时计算平台。

2.3 实时计算引擎

2.3.1 实时计算引擎接入现状

目前,百度网盘的Tiangong计算引擎已接入17+应用场景,高峰时作业处理的吞吐量达到千万/s,而机器规模也已经达到了1500台,资源5800CU,并且已经覆盖用商策略、反作弊、主端一刻用增实时投放等多个场景。

2.3.2 Flink Tiangong引擎架构

如下图所示的是网盘Tiangong实时计算引擎的架构。

  • 最下层为Runtime层,负责Tiangong计算任务的部署方式,目前支持StreamCompute、Kubernetes、Yarn、Local等方式;

  • 核心能力包括Source组件Sink组件以及数据转换引擎

  • Source组件:支持Db、Message Queue、BigData组件、自定义Source等多个异构数据源;

  • Sink组件:支持Db、Message Queue、BigData组件、自定义Sink等多个异构数据目的地;

  • 数据转换引擎:支持流批一体、自定义配置化数据清洗、精准一次数据处理、失败容错、IOC容器化管理、自定义SQL拓扑、灵活监控告警等能力;

图片

△ Tiangong计算引擎

功能层面来看,Tiangong实时计算引擎主要包括作业管理和资源管理。其中,作业部分包括作业配置、作业上线以及作业生命周期管理三个方面的功能。

  • 作业配置方面,则包括运行环境配置、source配置、sink配置、清洗逻辑配置以及作业拓扑结构设置;
{
    "jobName""作业名",
    "env": {运行环境配置},
    "sources": [source端配置],
    "udfs": [用户定义函数],
    "views": [清洗逻辑],
    "coreSql": [核心写入逻辑],
    "sinks": [sink端配置],
    "customTopology": {自定义作业运行拓扑}
}


  • 作业发布方面,则包括作业启动、取消以及删除等;

图片

  • 作业状态则包括自定义规则告警、监控大盘等;

图片

△ 自定义规则告警

图片

△ 监控大盘

  • 资源管理方面,利用StreamCompute平台能力支持Flink集群动态扩缩容能力与灰度发布能力;

2.4 业务场景实践

前面提到实时计算引擎演进过程和实时计算引擎对比,可以看出网盘实时计算引擎更多地会关注在易用性、稳定性和监控告警体系等方面,具体体现的应用场景主要涉及服务端日志、埋点日志、DB Binlog等场景的实时清洗计算。

2.4.1 网盘实时商业BI中心

网盘现阶段缺乏商业收入数据实时分析与商业策略实验实时评估的能力,导致商业策略AB实验推全链路往往需要经过周粒度才能完成,建设一套适用于网盘的实时商业BI中心有益于加快策略实验迭代与实时商业流水波动分析,助力网盘整体收入增长;

图片

如上图,通过将收银台行为、商业订单、策略实验埋点数据秒粒度接入至实时数仓Palo中后,配合数据可视化平台Sugar建设商业实时BI中心,以此来助力商业策略、商业PM等各个角色快速完成AB实验快速推全,将天粒度实验收益评估机制优化至分钟粒度,整体实验推全链路由周粒度优化至天粒度;

图片

2.4.1.1 Tiangong配置化接入

下述案例为Tiangong引擎配置化接入商业订单实时流:

  • 实时流数据源配置
{
  "sourceType": "bp_source",
  "deserializerType": "STRING",
  "sourceConfig": {
    "parallelism": 20,
    "operatorName": "xietong_strategy_businessorder_fr_bp_source",
    "metaHost": "host:ip",
    "cluster": "demo-cluster",
    "username": "username",
    "password": "password",
    "pipeletName": "demo-pipelet-name",
    "pipeletNum": "20",
    "startingOffset": {},
    "startPoint": "LATEST",
    "endOffset": {},
    "bpWebServiceAddress": "service_address"
  }


  • 核心处理逻辑配置
{
  "jobName""netdisk_membership_order_deatils_bp2doris",
  "env": {
    "streamConfigName""20p_ck_3s_10fail_env",  ## 环境配置,主要配置Checkpoint间隔和并行度,根据数据量定义,一般为上游消息队列分区倍数
    "tableConfig": {}
  },
  "sources": [
    {
      "configType""CONFIG",
      "sourceTableName":"membership_order_binlog"## 数据源配置,bigpipei订单实时流
      "sourceConfig""prod/netdisk_membership_order_bp_source"
    },
   {
         "configType""SQL",
         "sourceConfig""CREATE TABLE ods_order_info_rt  ## 写入目的地配置,palo写入表
                          (
                              id               bigint,
                              order_no         string,
                              user_id          bigint,
                              dev_uid          bigint,
                              app_id           bigint,
                              client_channel   tinyint,
                              pay_channel      tinyint,
                              product_id       string,
                              .... 
                          ) WITH (
               'connector' = 'doris',
               'fenodes' = 'host:ip',
               'table.identifier' = 'dbName:tableName',
               'username' = 'username',
               'password' = 'password',
               'sink.properties.format' = 'json',
               'sink.properties.read_json_by_line' = 'true',
               'sink.label-prefix' = 'label-prefix',
               'sink.enable-2pc'='true',
               'sink.parallelism' = '1'
       )"
     }
  ],
  "views": [
    {
      "name""binlog_filter_view",  ## 核心数据处理逻辑,纯SQL接入
      "sql""select CAST(JSON_VALUE(new_values, '$.id') as bigint)                 as id,
                     JSON_VALUE(new_values, '$.business_no')        as business_no,
                     JSON_VALUE(new_values, '$.order_no')           as order_no,
                     UNIX_TIMESTAMP()          as write_timestamp,
                     .....
              FROM membership_order_binlog,
                   LATERAL TABLE(BINLOG_NEWVALUES_FILTER(f0))" ## 系统内置Binlog清洗TableFunction
    }
  ],
  "coreSql""insert into ods_order_info_rt select id, ## 写入下游palo表,写入间隔为Checkpoint间隔,上述配置为3秒,每3秒写一批
                                              business_no,
                                              order_no,
                                              user_id,
                                              write_timestamp from binlog_filter_view"
}


2.4.1.2 可视化监控体系

Flink作业UI监控

图片

Grafana监控大盘

图片

实时任务监控配置

图片

图片

2.4.2 用户商业策略实时特征

基于商业策略实时核心行为相关特征依赖场景,结合核心行为以及用户付费埋点行为数据建设从0点实时累计特征与基于滚动窗口的近X分钟实时特征有助力策略侧对用户刚需需求的感知,并结合用户刚需行为个性化出价以此促进整体商业收入。

2.4.2.1 核心方案

图片

  • 如上图,方案二主要将数据流拆为三块,如流数据拼接、热点文件计算、消费行为统计;

  • 流数据拼接:利用Tiangong计算引擎,通过Flink SQL+行为清洗UDF函数,将各类行为数据打平为统一格式,并通过union all进行聚合,过滤异常数据后行为行为视图,数据流式产出。

  • 热点文件计算:实时将各个file_md5的消费次数存储Flink Map状态中,并根据离线分析得到的热点文件消费阈值判断热点文件,将热点文件流式写入Bigpipe与Palo中,数据流式产出,最优可做到毫秒级;

  • 消费行为次数计算:根据热点文件数据流关联用户消费行为,实时对用户消费的文件进行热点/普通归一化处理,后续将每个用户消费不同行为类型的热点/普调次数写入Flink Map状态中,累加计算从0点至今的文件消费次数,实时写入Doris和Palo中,最优可做到秒级;

2.4.2.2 技术难点
(1)大状态问题

问题引入

  • 热点文件和用户消费文件次数的计算,都涉及到数据累计的问题,如果将数据存储在共享存储(例如Redis/Table)这类kv存储中,每条数据或每个窗口的数据都需要先查一下上次的计算结果,累加后再写入共享存储中,这从而导致每次计算多一次网络读IO操作,故利用Flink状态机制,将热点文件和用户消费次数存储在Flink状态中,每次判断都在TaskManger本地或者内存中,不涉及到网络IO操作,故性能更好。

  • 数据都存入Flink状态中也导致Flink存在大状态问题,从而导致Checkpoint耗时过大从而引起任务背压,最终导致数据处理延迟等问题。

解决方案

状态后端优化

  • 选择Rocksdb作为状态后端,开启增量Checkpoint

  • 配置changelog状态机制,防止Rocksdb定期Compaction导致的Checkpoint耗时久问题

  • 调整rocksdb manged内存大小、rocksdb write buffer大小

快照存储优化

  • 开启快照压缩配置

状态TTL机制

  • 长期为更新的状态做小时粒度更新,防止状态持续增大。
(2)TableStroage写入性能差

问题引入

  • 因厂内Table API创建Table Client过程中需要根据特定表对应的机器数创建对应个数的brpc-client-work-thread、brpc-client-io-thread、fairStrategy-timer-thread等线程,共计3*机器数个,网盘特征Table存储底层表占用200台机器,故创建一个Table Client需要创建600+线程,从而导致Flink计算节点的底层martix容器线程超限,经过和StreamCompute同学沟通需限制Table Client的Rpc线程数为1,并对应Flink集群的计算节点容器最大线程数由1000->1500,从而解决线程超限问题。但因限制Table Client Rpc线程为1导致Table整体写入性能偏差。

解决方案

  • 细粒度拆分任务,首先对用户各类行为以及消费的热点/普调资源进行实时计算,后续根据user_id+行为类型keyby,并开3s窗口,取最新的数据落入Table,将3s一个窗口的数据进行压缩。

优化效果

  • 原本天粒度写入48亿+次行为特征优化为2亿+次,具体效果如下图:

图片

业务场景大致可以分为实时数仓、实时数据复杂聚合计算、DB业务数据CDC等场景,在这几个场景Flink本身就提供高性能、高稳定性的能力,再配合网盘Tiangong实时计算引擎不熟悉Flink的业务方也可以配置化、低代码的方式快速建设起实时应用。

03 Flink技术挑战和解决方案

3.1 Flink底座建设

图片

△ Flink基建建设

基于StreamCompute平台提供的动态扩缩容、任务生命周期管理、Flink多版本管理、云原生监控告警体系等能力,来快速构建网盘Flink实时计算能力。

3.2 实时计算平台建设

图片


△ Tiangong计算引擎

以上为Tiangong计算引擎能力支持,其作为网盘实时计算平台支持目前厂内大部分异构数据源,使用方可以通过简单的配置快速建设实时计算能力,拿上述业务场景实践中的用户商业策略实时特征项目接入Tiangong来看,只需下述配置和少量窗口数据聚合逻辑开发即可:

{
    "jobName""business_feature_compute_bp2table", // 作业名
    "env": { // 作业运行环境配置
        "streamConfigName""300p_ck_30s_5fail_env",
        "tableConfig": {
            "stateTtlMs"600000
        }
    },
    "sources": [  // source配置,download日志
        {
            "configType""CONFIG",
            "sourceTableName""idc_log_source",
            "sourceConfig""prod/business_strategy_idc_bp_source"
        }
    ],
    "udfs":[  // 数据清洗转换逻辑,SQL无法完成时通过UDF
               {
                   "name""idc_log_filter_func",
                   "className""com.baidu.xxx.IdcLogFilterFunction"
               },
               {
                   "name""idc_feature_transform_func",
                   "className""com.baidu.xxx.IdcFeatureTransformFunction"
               }
           ],
    "views": [
        {
            "name""idc_log_feature_view",
            "sql""select feature_data.event_time as event_time,
                           .....
                    from (select idc_feature_transform_func(f0) as feature_data
                          from idc_log_source
                          where idc_log_filter_func(f0) = true) as tmp
                    where feature_data.log_time <> '0' and ....
        }
    ],
    "sinks": [ // 双写TableStorage、Doris
        {
          "sinkConfigNames": ["prod/netdisk_strategy_idc_feature_mi_table_sink","prod/netdisk_strategy_feature_doris_sink"],
          "transformSQL": "select event_time,
                                   .....
                           from idc_log_feature_view",
           "watermarkConfig":{  // 涉及开窗逻辑所涉及的watermark配置
                "maxOutOfOrdernessMs": 5000,
                "idlenessMs": 10000,
                "timeAssignerFunctionName": "row_event_time_assigner"
           },
           // 开窗计算逻辑函数
          "rowTransformFunc": "strategyFeatureTransformFunction"
        }
      ]
    }
}


3.3 自定义作业执行计划

3.3.1 细粒度算子并行度优化

图片

△ 细粒度算子并行度优化

Tiangong计算引擎本质基于Flink SQL+Table API+DataStream API做的混合计算引擎,其本质相当于Flink SQL,因此一旦定义好Source和Sink并行度后,其任务所涉及的计算、清洗、聚合等算子都与Source端并行度一致,从而导致如果想要增加清洗等算子的并行度需要把Source的并行度也增加,从而造成资源浪费、性能降低等问题。

3.3.2 分区关系优化

图片

△ 分区关系优化

作业内上下游算子连接数过多,会占用较大的 Network buffer 内存,从而影响作业的正常启停,基于自定义SQL执行计划能力,我们可以手动将 Rebalance 边修改为 Rescale。

比如上图的示例,左边上游算子有 500 个并发,而下游的 Sink 算子只有 200 个并发。在这种场景下,Flink SQL 会默认生成 Rebalance 的连接方式,共需 500*200,共 10 万个逻辑连接。

通过自定义SQL执行计划能力,我们手动将 Rebalance 设置为 Rescale 后,它只需要 500 个连接,大大降低了 Network buffer 的内存需求。

3.3.3 资源共享策略优化

3.3.3.1 资源共享
  • 默认情况下,flink允许subtask共享slot,即使是不同task的subtask,这样的结果是一个slot可以保存作业的整个管道。

  • 如果是同一步操作的并行subtask需要放到不同的slot,如果是先后发生的不同的subtask可以放在同一个slot中,实现slot的共享。

图片

△ Slot与Task的关系

3.3.3.2 自定义共享策略

图片

△ 资源共享策略优化

支持按照算子类型将算子划分到一个slot group中,从而来减少数据的跨网络传输、提升资源利用率以及提升计算性能等。

3.3.4 算子名称优化

Flink SQL不支持为每个算子自定义名称,从而导致算子名是根据系统规则来生成的,从而导致算子名称不能够通俗的表示其具体含义。为了便于作业维护和管理,自定义作业执行计划支持算子名称优化。

04 未来展望

图片

△ 未来展望

4.1 实时计算平台化

目前Tiangong计算引擎的使用方式主要在公共代码库提交任务配置和UDF代码的方式接入,使用方需要拥有Tiangong计算引擎的代码库权限,存在代码安全和任务隔离性差等问题,后续我们计划基于Tiangong计算引擎搭建网盘自己的实时化计算平台,实现页面低代码方式快速接入实时任务。

4.2 实时DTS平台

目前网盘主要使用厂内DTS平台,通过增量binlog和全量select快照方式采集数据至下游AFS,整体链路为DTS->AFS->UDW,一旦上游表格式变化下游的采集任务就会失败,因此整体稳定性、维护成本和性能都过差。因此我们计划基于Tiangong计算引擎构建实时DTS平台,具体架构如下:

图片

△ RealTime-DTS架构

5个技巧让文心快码成为你的后端开发搭子

作者 百度Geek说
2025年8月28日 16:49

本期内容4年开发经验的 Java 大佬执墨为我们带来了包括规则配置在内的5个文心使用技巧分享。助你增加 AI Coding 技能点!一起来看看!

执墨,4年开发经验程序员一枚,一个懂点 AI 的软件研发工程师,持续学习有意思的技术、做有意思的事,目前在探索如何培养出一个 AI 开发搭子。

相信大家在实际使用 AI 生成代码的过程中,会发现**有些代码让人抓心挠肝,不是放错了位置,就是不符合项目规范,最后还要返工手动修改,觉得不如自己手搓。**但别担心,自己学写代码怎么说也学了三四年,玩游戏角色释放技能也有前摇,AI 写好代码当然也需要慢慢培养。从 Zulu 开始公测我就在使用文心快码,也算是小有经验。那么结合个人在 IntelliJ IDEA 中的使用体验,我总结了 Zulu 和 Chat 各自比较实用的技巧,希望能对大家有所帮助。

▎Zulu 调教指南:生成代码更可用

1.用 # 提供上下文

大语言模型本质上是基于前文内容来预测下一个最可能的词或代码片段。没有上下文,模型就无法准确判断下一步生成内容,因此对上下文的理解和利用是生成高质量代码的基础。在开发场景中,上下文不仅包含当前文件或代码片段,还涵盖项目结构、依赖关系、函数和变量作用域等。通过理解这些上下文,AI 能够更准确补全代码或生成符合项目风格的内容。

在文心快码中为 Zulu 添加上下文:Zulu 目前支持文件、文件夹和项目级别的上下文。开发者可以通过 # 操作符来唤起当前被索引的所有的文件,并添加为当前会话的上下文。

Step1:# 操作符唤起上下文菜单

e813a4977abd98ff6c65386cfa26ca06.jpg

Step 2:选择对应的文件或者目录。可以添加多个,如果没有选择上下文,则会默认使用当前项目为上下文环境。

b54a4078c4a7c2ca41d622c6e3e74aca.jpg

Step 3:上下文配置好以后,可以通过自然语言的方式来描述你需要让 AI 干的事情。

在这个例子中,我选择了 Cache.java 这个文件,然后让 Zulu“实现一个查询缓存时,根据类型做反序列化的函数,目标为 Redis 序列化”。这时 Zulu 就开始阅读上下文,立刻理解了我的需求,在 Cache 接口中进行修改,添加了目标功能。

a28bd1d6169f8fc9e066b70508afe7e5.jpg

2.善用命令自动执行

**Zulu 能够自动感知当前工程的框架、技术栈、文件结构和运行环境,根据需求自动生成终端命令,并将这些命令发送到开发环境中的终端进行执行。**这种能力在脚本语言的开发过程中,非常具有优势,比如 Python、JS 等。你无需关注需要使用什么框架,AI 自行去进行使用和安装,开发者能够更专注于业务逻辑的实现。

例如在下面的 Python 虚拟环境创建和配置中,Zulu 首先生成并执行了终端命令 python3 -V,查看当前环境中已安装的 Python 版本,然后通过命令 python3 -m venv venv 创建了一个虚拟环境,最后通过 source venv/bin/activate && pip install -r requirements.txt 激活虚拟环境并安装项目依赖。整个过程完全没有跳出 IDE,极好地维护了开发过程中的心流体验。

c6aadce7cb5220fd4cc6e357273d06cf.jpg

3.规则约束

当没有提供规则文件去约束 Zulu 的生成行为时,在进行一个新的项目开发过程中,很容易会生成一些不达预期的代码,也会魔改代码。了解到文心快码支持自定义 Rules,因此我为 Zulu 编写了执行的上下文约束,控制其代码的生成。下面将具体展开我撰写规则的思路。

3.1编码环境

**介绍当前的编码环境,说明当前项目的所使用的技术栈。这一步至关重要,就好比给 Zulu 描绘了一幅项目的蓝图,让它清楚自己所处的 “战场” 环境。**例如在这个基于 Java 的 Spring Boot 项目中,明确告知了 Zulu 项目使用的是 Java 语言,以及 Spring、Spring Boot、Spring Security 等相关技术框架。这样,Zulu 在生成代码时,就能遵循这些技术栈的规范和特点,生成与之适配的代码。

## 编码环境
用户询问以下编程语言相关的问题:
- Java
- Spring&SpringBoot&SpringSecurity
- MyBatis&MybatisPlus
- RocketMq
- Nacos
- Maven
- SpringSecurity

3.2代码实现指南

**这个部分说明当前项目具体的代码如何实现,比如数据库表的创建规范、用户上下文怎么获取、项目结构的含义等。这相当于给 Zulu 制定了一套详细的工作 SOP,让它生成的代码符合项目的特定要求。**在采用 DDD(领域驱动设计)方式实现代码的项目中,我为 Zulu 提供了如下的 SOP。

1. 项目使用 DDD 的方式来实现代码,你需要注意如下几点:
  1. 领域层和仓库层的入参都要使用 DO、仓库层的实体对象需要添加 PO 的后缀
  2. Application或者Service层的输出必须的DTO,接口层的返回可以是DTO 也可以自己定义 VO
  3. 每一层对应的对象都需要添加对应的后缀,并且后缀要全大写。如仓库层的实体 UserPO,领域层领域UserDO,应用层的DTOUserDTO
  4. 项目的类之间的转换需要使用 MapStruct 来完成
2. 在使用三方依赖的时候,需要将对应的依赖内容先添加到 Maven 依赖中
3. 所有的接口都按照 RestFul 的风格定义,并且你需要区分接口的使用场景,如:前端使用、OpenApi、小程序端使用。
  1. 如果你无法通过用户的上下文知道需要你生成的接口的使用场景,你可以再次询问用户
  2. 前端统一前缀使用 /api/fe/v1/xxxxx,OpenApi 使用 /api/open/v1/xxxx,小程序使用 /mini-program/v1/xxxx并且三个入口的文件需要区分不同的文件夹
  3. 对于批量查询接口,你需要涉及分页的能力,不能使用内存分页,只能在 DB 层面做分页,并且要考虑深分页的问题
  4.  所有的接口返回需要返回 BaseResp 对象,BaseResp 的定义如下:
  @Data
  publicclassBaseResp<T> {
      privateString code;
      privateString message;
      privateT data;
  }
  4. 对于应用层,需要注意如下几点:
      1. 函数的输入和输出都是 DTO

3.3总结历史记录

每次使用 Zulu 生成代码后,可以让 Zulu 帮我们将每一次 Query 后的结论进行总结并记录到文件中,这对于项目的跟踪和回溯非常有帮助。提示词如下:

## 历史记录
1. 针对你回答用户问题的答案,你需要将本次回答的内容记录到项目的根路径下的 .cursor-history 文件里,格式如下:
2025-11-11 10:10:10
变更内容如下:
1. 增加用户模块
2. 修改用户管理内容
3. 增加用户内容
涉及文件为:
xxxx.java
xxxx.java
2. 你需要按照倒序的方式记录这个历史纪录

这种详细的记录格式,能够清晰地展示每次代码生成的时间、变更内容以及涉及的文件,方便开发者随时查看和追溯项目的开发记录。而倒序记录使得最新的变更记录排在前面,开发者能够快速获取到最新的项目动态,提高了信息查找的效率。

▎Chat 隐藏技巧:编码交互更灵活

在研究 Zulu 的同时,我也发现了 Chat 功能比较好用的地方,下面想继续分享一些让编码过程更方便快捷的能力。

1.Inline Chat 行间会话

通过圈选代码片段,使用 Ctrl + I 快捷键可以唤起文心快码的行间对话能力,帮助我们快速对局部代码进行优化和调整,**此时上下文即当前的代码片段。

在对话框中输入需要 AI 完成的任务,Comate 会自动扫描代码并编辑,编辑完成后可以自行决定是否采纳或者忽略。

764962263d0a9b9055b561ae6e63332f.jpg2.Git Commit 快捷键提交代码

在完成一个功能模块的开发后,需要提交代码到版本库。一般来说需要手动梳理本次代码的修改内容,编写提交信息。而在文心快码中,只需点击 Git Commit 快捷按钮,Comate 就能自动分析代码的变更情况,生成详细准确的提交信息,大大节省了时间,同时也提高了提交信息的质量,方便团队成员更好地了解代码的变更历史。

在 Git Commit 的时候点击快捷按钮,可以快速总结本次代码的变更内容。

1bb9df02a5f599f068e308d1c8530356.jpg

▎案例实操

接下来就把这些小技巧应用在实际案例中,检验一下是否对开发流程有提效。

1. 实现一个社区自动签到脚本

文心快码在编写脚本方面具有显著优势,准确率极高。在实际工作中,我现在用到的脚本几乎都由文心快码完成,并且几乎都能一次性运行通过。**以实现一个社区自动签到脚本为例,具体操作步骤如下:

Step 1: 书写提示词,直接用自然语言描述即可,需要给出其接口定义信息和执行规则。

“给我写一个 python 脚本,实现接口签到和抽奖能力。

以下是签到接口的定义:

GET 接口:……(为保护隐私,此处略去)

以下是抽奖接口的定义:……

再调用接口时,你需要按照先调用签到再调用抽奖的顺序来完成,并且这两个接口需要一个 cookie 信息来完成调用,因此你需要定义一个全局的 cookie 来实现这两个接口的定义。”

6b7c3b1aac40f4c79124eff2ef98479d.jpg

Step 2: Zulu 后自行生成对应的文件

be98a802b5973c9b2510642593a6cd70.png

Step 3: 按照 Zulu 的提示执行对应的命令,然后这个脚本就成功实现完成了。

2. 实现一个约束之下的意图识别服务

这个案例的重点在于,在新的项目中如何将自己业务项目中的一些编码规则告知 AI,使生成的代码更符合团队的开发规范。

Step 1: 书写提示词,在提示词部分添加了“实用技巧”中的第3点规则约束部分提到的规则。

“我需要你实现一个意图识别的工程能力,它的主要功能是对外提供一个 OpenApi 的接口来根据用户的输入返回一个固定的意图。这个 OpenApi 的实现思路是:

1.查询本地的规则列表;然后进行匹配;

2.如果本地的规则都无法匹配,则调用第三方的 LLM 接口进行意图识别;

3.返回结果。

你的代码实现需要按照这个规则来:#.zulurules”

658c635c05d8d0e4e517bbff6864c6d1.png

完整规则见附录一

Step 2: Zulu 生成代码与总结

997e833b4718f7461461d30e6edf8b85.jpg

22d137547651552721300fb2fa8934ca.png

▎写在最后

文心快码是我个人使用的第一款 AI 编程工具,其核心功能围绕两大模块展开:编程智能体 Zulu 与 Chat ,二者协同能够满足不同编程需求。Zulu 与 Chat 功能相比,核心差异在于其具备更强的自动化编码能力:能够直接生成完整文件并编写代码,且生成内容会以 Diff 格式清晰展示修改痕迹,方便开发者直观对比并选择是否采纳。文心快码插件实现了与 JetBrains 系列 IDE 的深度集成——开发者无需离开熟悉的 IDE 环境,即可调用 AI 编程能力。对于我这样习惯使用 JetBrains 工具链的 Java 程序员而言,这种原生集成的体验尤为友好,能在日常开发流程中自然融入 AI 辅助,减少工具切换成本。

附录:Rules 示例

你是一名资深后端开发专家,精通 JavaSpringSpringBootMyBatisMyBatisplusRocketMq以及各种中间件,如:ZookeeperNacosSpringCloud等。你思维缜密,能够提供细致入微的答案,并擅长逻辑推理。你会仔细提供准确、事实性、深思熟虑的答案,并且在推理方面堪称天才
- 严格按照用户的需求执行。
- 首先逐步思考——用伪代码详细描述你的构建计划。
- 确认后,再编写代码!
- 始终编写正确、符合最佳实践、遵循 DRY 原则(不要重复自己)、无错误、功能完整且可运行的代码,同时确保代码符合以下列出的 代码实现指南。
- 优先考虑代码的易读性和简洁性,而不是性能。
- 完全实现所有请求的功能。
- 不要留下任何待办事项、占位符或缺失的部分。
- 确保代码完整!彻底验证最终结果。
- 简洁明了,尽量减少其他描述。
- 如果你认为可能没有正确答案,请明确说明。
- 如果你不知道答案,请直接说明,而不是猜测。
- **注意:尽量使用已经存在的目录,而不是自建目录**
- 你需要严格按照 cursorrules 中的内容来生成代码,不要遗漏任何内容
# 编码环境
用户询问以下编程语言相关的问题:
Java
Spring&SpringBoot&SpringSecurity
MyBatis&MybatisPlus
RocketMq
Nacos
Maven
SpringSecurity
# 代码实现指南
## 依赖处理
- 你所有使用到的依赖必须在根目录的 Pom 文件中做 Dependency Management 版本管理
- 对于通用的依赖可以直接放到根目录的 Pom 文件中,如 lombok
## 监控上报能力
- 你需要为项目中所有使用到的外部插件增加监控上报能力,如:线程池,RedisMySQL 等。你可以使用 Spring actuator 提供的能力对外提供 Prometheus 格式的上报信息
## 数据库SQL
你需要根据用户的输入来推断可能使用到的表的结构,并按照如下的格式生成。
- 其中 create_timeupdate_timecreate_userupdate_user 是必须拥有的字段。
extis_deleted可以根据用户的需求来选择添加
- 对于唯一索引,其需要同一个前缀为 ux_,如:ux_business_key_type;对于非唯一索引,需要同一个前缀为 idx_,如:idx_business_key_type
```CREATE TABLE `audit_log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '账户日志ID',
`business_key` varchar(100) NOT NULL DEFAULT '' COMMENT '业务实体ID或索引,如账号名',
`business_type` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '10000-账号,20000-邮箱,30000-ADKeeper,40000-远程账号',
`operate_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '操作描述',
`version` int(11) NOT NULL DEFAULT '0' COMMENT '版本号',
`ext` json DEFAULT NULL COMMENT '扩展属性',
`is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '是否删除0为未删除,1为删除',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`create_user` varchar(32) NOT NULL DEFAULT '' COMMENT '创建人',
`update_user` varchar(32) NOT NULL DEFAULT '' COMMENT '更新人',
PRIMARY KEY (`id`),
KEY `idx_business_key_type` (`business_key`,`operate_type`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='账户审计表'
```#编写代码时遵循以下规则:
- 你不能直接在根目录上创建 src 文件夹,而是要创建一个当前项目的子模块来完成代码生成,模块的名字默认为 当前项目名-api
- 项目使用 DDD 的方式来实现代码,你需要注意如下几点:
  - 使用充血模式和工厂模式的方式来完成项目代码的实现
  - 领域层和仓库层的入参都要使用 DO、仓库层的实体对象需要添加 PO 的后缀
  - Application或者Service层的输出必须的 DTO,接口层的返回可以是 DTO 也可以自己定义 VO
  - 每一层对应的对象都需要添加对应的后缀,并且后缀要全大写。如仓库层的实体 UserPO,领域层领域 UserDO,应用层的DTO UserDTO
  - 项目的类之间的转换需要使用 MapStruct 来完成
  - 所有的接口都按照 RestFul 的风格定义,并且你需要区分接口的使用场景,如:前端使用、OpenApi、小程序端使用。
  - 如果你无法通过用户的上下文知道需要你生成的接口的使用场景,你可以再次询问用户
  - 前端统一前缀使用 /api/fe/v1/xxxxxOpenApi 使用 /api/open/v1/xxxx,小程序使用 /mini-program/v1/xxxx并且三个入口的文件需要区分不同的文件夹
  - 所有的接口返回需要返回 BaseResp 对象,BaseResp 的定义如下:
  @Data
  public class BaseResp<T> {
      private String code;
      private String message;
      private T data;
  }
  - 对于应用层,需要注意如下几点:
     - 函数的输入和输出都是 DTO
  - 对于远程调用层,需要注意如下几点:
     - 你需要使用 @HttpExchange 的能力来完成远程调用,并且让项目中的第三方配置收口到同一个配置节点下。示例如下:
@HttpExchange
public interface IntentRemoteClient {
    @PostExchange(value = "/api/open/agent/intent")
    BaseResprecognizeIntent(
        @RequestBody IntentRequest request
    );
}
@Data
@ConfigurationProperties(prefix = "api")
public class ApiProperties {
    /**
     * 应用依赖的外部服务的配置, 这些外部服务使用 MiPaaS 认证中心提供的认证
     */
    @Valid
    @NotEmpty
    private Map external;
    /**
     * 外部服务配置
     */
    @Data
    public static class ExternalService {
        /**
         * 服务 API 的基础 URL
         */
        @NotBlank
        @URL
        private String baseUrl;
        /**
         * 对一些配置的覆写
         */
        private ExternalServicePropertiesOverrides overrides;
    }
    /**
     * 认证使用不同的 URL 和 认证凭据的配置
     */
    @Getter
    @AllArgsConstructor
    public static class ExternalServicePropertiesOverrides {
        private String authServiceBaseUrl;
        private ClientCredential clientCredential;
    }
    @Getter
    @AllArgsConstructor
    public static class ClientCredential {
        private String appId;
        private String appSecret;
    }
} 
@Configuration
@EnableConfigurationProperties(ApiProperties.class)
public class RestApiConfig {
    private final Mapservices;
    public RestApiConfig(ApiProperties appProperties) {
        this.services = appProperties.getExternal();
    }
    @Bean
    public IntentRemoteClient intentRemoteClient() {
        // 1. 获取服务对应的配置
        var svc = findServiceConfiguration("intent");
        // 2. 构建 Client
        var httpClient = HttpClient.create()
          .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
          .wiretap(true)
          .responseTimeout(Duration.ofSeconds(10));
        var client = WebClient.builder()
          .baseUrl(svc.getBaseUrl())
          .codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(50 * 1024 * 1024))
          .clientConnector(new ReactorClientHttpConnector(httpClient))
          .filter(new AuthorizationAuthFilter(svc.getOverrides().getClientCredential().getAppId(),
            svc.getOverrides().getClientCredential().getAppSecret(), svc.getBaseUrl()))
          .build();
        var factory = HttpServiceProxyFactory.builderFor(WebClientAdapter.create(client)).build();
        return factory.createClient(IntentRemoteClient.class);
    }
    /**
     * 生成服务配置
     *
     * @param name 服务名称
     * @return ExternalService
     */
    @NotNull
    private ApiProperties.ExternalService findServiceConfiguration(@NotNull String name) {
        var svc = services.get(name);
        if (svc == null) {
            throw new IllegalArgumentException("no such service");
        }
        return svc;
    }
} 
  - 对于数据库层,你需要注意如下几点:
     - 你需要为DB增加 自动映射枚举 的能力,即可以在数据库的 PO 中直接使用枚举
     - 你需要使用 自动填充字段 功能来填装 create_timeupdate_timecreate_userupdate_user。其中创建人和更新人可以通过 SpringSecurity 获取。
# 历史记录
针对你回答用户问题的答案,你需要将本次回答的内容记录到项目的根路径下的 .cursor-history 文件里,格式如下:
2025-11-11 10:10:10
变更内容如下:
1. 增加用户模块
2. 修改用户管理内容
3. 增加用户内容
涉及文件为:
xxxx.java
xxxx.java
你需要按照倒序的方式记录这个历史纪录

ERNIE-4.5-VL:技术解密+应用实战,解锁多模态新场景!

作者 百度Geek说
2025年8月28日 14:31

当人工智能进入深度应用的黄金时代,单一模态的局限正被多模态交互彻底打破。文心 ERNIE-4.5-VL 视觉语言模型( ERNIE-4.5-VL-28B-A3B;ERNIE-4.5-VL-424B-A47B )以突破性的图文、视频理解与推理能力,架起数字世界与物理世界的智能桥梁,更支持100+语言交互,让跨模态智能触手可及。

66e0c3652d5d2fb25de3e6bf5d3d41dd.png

00b40dbed1f8d251c2212752560f6eff.png 实验结果表明,轻量级视觉语言模型 ERNIE-4.5-VL-28B-A3B 的激活参数显著减少,但与 Qwen2.5-VL-7B 和 Qwen2.5-VL-32B 等模型相比,其在大多数基准测试中仍具有竞争力,甚至表现更优。

ERNIE-4.5-VL 模型支持128K 上下文长度,结合“思考模式”与“非思考模式”双选项,既能快速响应基础任务,又能深度破解复杂问题,灵活适配从日常场景到专业领域的全场景需求。

ERNIE-4.5-VL 的跨模态能力覆盖以下核心任务场景:

2f1fe627e2888fe3c37f4e21becaa17d.png

▎相关链接

文心大模型技术 Blog(含技术报告下载):

yiyan.baidu.com/blog/posts/…

文心4.5系列模型下载

文心4.5系列模型训练部署

播放器视频后处理实践(一)

作者 百度Geek说
2025年8月21日 16:41

1. 前言

在播放器架构不断演进的今天,视频后处理技术正在成为提升用户体验的关键环节。相比传统的解码即播,现代播放器越来越多地引入后处理链路,通过增强画质、渲染氛围等手段,为用户提供更具沉浸感的视听体验。

本系列文章将系统介绍我们在播放器视频后处理模块中的技术方案与工程实现,涵盖从效果设计、算法选型,到性能优化和跨平台兼容的全链路细节。第一期内容聚焦在两类核心能力:

  • 视频增强:提升画面清晰度、对比度与色彩表现,尤其针对暗场、低码率等场景进行针对性优化;

  • 氛围模式:基于视频内容实时生成边缘延展光效,打造更强沉浸感,适配大屏与移动端场景。

本文将着重介绍我们如何在性能受限的设备上实现视频增强效果,如何结合 GPU/OpenGL、Shader 编程以及平台图像处理 API 构建高效可控的处理链路。后续我们将陆续推出如氛围模式等视频后处理文章,敬请期待。

2. 视频增强(亮度和色彩)

丨2.1 什么是视频增强技术

视频增强技术是指一系列用于改善视频质量的技术手段,其目的是在不改变原始内容的情况下提升视频的视觉效果。技术的应用场景包括视频播放、编辑、传输、存储等领域,常用于提高图像清晰度、对比度、色彩饱和度等,使观看者获得更好的视觉体验。

丨2.2 常见视频增强技术

图片

图片

移动端实践:亮度与色彩增强。针对Android/iOS平台的视频播放场景,我们重点实现了亮度增强与色彩增强两项关键技术。本文将分享技术落地中的核心方案与优化经验。

丨2.3 亮度增强

图片

亮度增强效果示意图(左:原图 右:增强后)

2.3.1 技术选型

亮度增强是图像/视频处理中非常基础且常见的操作,常见的亮度增强原理可以分为以下几类,每种方式背后的核心思想略有不同。下面是详细的分类和解释:

  1. 线性亮度增强(线性增益)

原理:RGB整体直接乘以一个大于 1 的系数(或加一个偏移量)。

公式:

color.rgb = color.rgb * gain;       // 乘法增强color.rgb = color.rgb + offset;     // 加法增强

  • 简而言之,这种做法就是简单粗暴的在原本的RGB上进行提升,从这里,可以想到RGB颜色调整后容易出现色偏。

  • 那么我们可能会想到,如果先将RGB转换为YUV,调节Y 分量,再反变换为 RGB。

公式:

Y = 0.299*R + 0.587*G + 0.114*B;
Y_new = Y * gain;

  • 这确实是视频增强中一种常用且理论上“更稳”的方式,因为它分离了亮度(Y)和色彩(UV / IQ / CbCr)信息。

  • 但这种处理方式有一个严重的问题,不处理图像的对比度或中间的关系,且不能保留高光细节(Clipping),也就是调整后,超过范围[0.0,1.0]的值会被截断(clamp),造成高光过曝。

  1. 直方图均衡(Histogram Equalization)

原理:通过调整像素分布,让亮度值均匀分布在整个区间,从而整体提升视觉亮度。

特点:增强暗部和亮部的对比,对低对比度图像尤其有效。

实现相对复杂,不常用于实时shader,考虑到其运算复杂性,我们也pass了这种方式。

  1. Gamma 变换(幂律调整)

原理:使用幂函数对像素进行非线性拉伸。

公式:

color.rgb = pow(color.rgb, vec3(gamma));

特点:γ < 1:图像变亮,主要拉升暗部;γ > 1:图像变暗,压缩亮部。

具有两个优点:

  • 调整方式具有非线性特点,能更细腻地控制中间调亮度,避免简单加法可能引起的局部过曝或暗部细节丢失。

  • 模拟现实中显示设备的响应曲线,效果较为自然。

这也是我们最后选择的方式,他的运算量简单,适合端上视频播放的实时处理。

2.3.2 背后的原理

我们引申一下,这种方式的优点是怎么得出来的呢。

  1. 为何能避免简单加法可能引起的局部过曝或暗部细节丢失

从公式看,原本亮度较低的像素会被相对“提亮”更多,而原本亮度较高的像素提升幅度较小。暗部像素相对于原值会获得更大的“提拉”,而亮部像素则变化较小,从而既能提升整体曝光,又能保留高光细节。

  1. 为什么说模拟现实中显示设备的响应曲线,更为自然呢?

因为显示器、人眼视觉和视频编码,都是非线性系统,不是简单线性变化。

  • 真实世界的光亮度是线性的,比如两支灯加起来就是两倍亮。

  • 但人眼感知亮度是对数感知的(小亮度变化很敏感,大亮度变化不敏感)。

  • 视频和图像在存储时通常经过一个 Gamma编码,原本线性光 → 压缩(比如取 1/2.2 次方) → 存成文件。这种光和电的转换过程,就是OETF/EOTF响应曲线。

所以这种pow(color, gamma)的调整方式,实际就是在模拟显示端的响应曲线。

总结一句话:

编码有 Gamma,所以显示端或后处理也必须按照 Gamma空间规则来调节,才能保持自然感知。

丨2.4 色彩增强

图片

色彩增强效果示意图(左:原图 右:增强后)

从上图可以看到山体、草地上的花,饱和度增强。

2.4.1 调节的目标

1. 增强色彩感知

提高图像的“鲜艳度”或“视觉吸引力”,让图像更生动。

特别是在图像颜色偏灰、曝光不佳或图像压缩后颜色损失的情况下。

2. 突出主体

通过饱和度调节,增强主体与背景之间的色彩对比,提高视觉聚焦度。

3. 修复/还原真实色彩

对摄像头采集后色彩不足的图像进行还原,尤其是肤色、植物、天空等自然色彩。

针对上述目标,我们主要依赖主观评测感受,同时需要避免以下问题:

主观评估(人眼视觉)

  • 色彩鲜明但不刺眼:增强后色彩更加明显但不过饱和。

  • 肤色自然:人脸或皮肤色调不过红或黄(肤色是视觉最敏感区域)。

  • 色彩分布均衡:图像中颜色种类丰富但不过分集中某一色调。

  • 无色彩断层:调节后颜色过渡应平滑,不能有色阶突变。

2.4.2 技术选型

目前业界对色彩增强主要有以下2种方向的研究:

  1. 传统SDR色彩增强。

  2. SDR2HDR,模拟HDR效果,达到增强目的。

从实现方式上,主要也有2种主流方式:

1. 非神经网络(传统算法 or 结合lut查找表)

2. 基于神经网络(模型)

模型需要较高的技术储备,且在移动端运行耗时大,所以目前我们没有选择这种方式,而是寻找效果较好且可控的算法。

2.4.2.1 色彩三要素

我们先了解下“色彩三要素”。他们是色彩学中用于描述颜色感知的三个基本维度,分别是:色相、饱和度、明度。这三者共同定义了一个颜色的完整视觉特性。

图片

图片

色相

图片

饱和度

图片

明度

在色彩增强中,一般主要调节的是饱和度(Saturation),其次可能会适当调整明度(Brightness / Value) ,而色相(Hue)通常不会主动改变。原因如下:

常调节的要素及原因:

1. 饱和度(Saturation)

  • 最常调节的要素,增强后画面显得更鲜艳、更有吸引力,尤其适用于风景、商品、动漫类画面。可提升视觉冲击力和色彩表现力。
  1. 明度 / 亮度(Brightness / Value)
  • 有时作为辅助增强项,提高整体图像的通透感。与 Gamma 调节、曝光补偿常一起使用,即配合使用上一章节的亮度调整即可。
  1. 色相(Hue)
  • 一般不调整,因为改变色相会改变物体本身颜色,可能导致不真实(如人脸偏色、草地变蓝等)。只在需要艺术化或特殊滤镜(如复古风格、红外效果)时才会使用。
2.4.2.2 颜色空间的选择

选择好色彩增强的调节方向为『饱和度』后,第二步,我们需要选择好颜色空间。

当视频一帧画面作为GL纹理输入到后处理链路时,为RGB颜色模型,我们想要调节饱和度,则需要将其转换为其他颜色空间进行调节,那么面临的第一个问题是如何选择合适的颜色模型去进行算法设计?

  • RGB

  • HSV

  • LCH/LAB

2.4.2.3 基于RGB空间
  1. 基于RGB颜色直接调节

们可以理解,饱和度是色彩的纯度,即色彩相对于灰度(无色)的程度。那么我们可以基于RGB颜色模型,并根据灰度进行差值混合即可。

如GPUImage的GPUImageSaturationFilter提供了类似例子,它对饱和度调节,是基于RGB颜色,然后取出灰度值通过在原始颜色和灰度之间插值,mix(vec3(luma), color.rgb, saturation) 实现了饱和度的变化:

  • 插值因子 saturation 越接近 0,图像越趋向于灰度;

  • saturation 越高,图像越接近原始颜色或超出原始饱和度,色彩更鲜艳。

这种简单的算法存在一个问题:原本局部饱和度已经比较高,如果依然提高饱和度,则局部细节消失。

图片

过饱和,细节丢失

2. 为了解决上述问题,我们基于自然饱和度的调整。

自然饱和度(Vibrance)的概念最先由photoshop提出,重点在于适应性,自然饱和度调整后一般比饱和度调整要自然。其核心特点:

图片

进行自适应饱和度调节的流程:

  • 计算亮度(Luma):使用加权平均公式从 RGB 获取亮度:luma = 0.2126 * r + 0.7152 * g + 0.0722 * b

  • 计算饱和度(Saturation):使用 RGB 最大值和最小值之差估算色彩纯度:saturation = max(r, g, b) - min(r, g, b)

图片

  • 计算调节因子 k:根据当前饱和度和用户设置的 Vibrance 强度进行非线性调节:k = 1.0 + Vibrance * (1.0 - saturation / 255.0)(Vibrance 取值范围通常为 0.0 ~ 1.0)

  • 应用颜色调整:将颜色向亮度方向插值,使低饱和度颜色更鲜艳,同时高饱和区域变化较小:color.rgb = mix(vec3(luma), color.rgb, k)

其调整倾向于将RGB值往同一个luma值进行靠近,也是无法保证颜色保持稳定,容易会发生偏色的情况。

图片

色彩增强效果示意图(左:原图 右:自然饱和度增强后)

于是,我们继续探索其他的颜色模型。

2.4.2.4 基于HSV颜色模型的饱和度调整

基于HSV饱和度的调整方法是将RGB颜色模型转换为HSV颜色模型,其中HSV分别表示色相(Hue)、饱和度(Saturation)、明度(Value)。只调整饱和度可以在不影响明暗和色相的情况下增强色彩的鲜艳程度。

图片

将常见的调整方法有整体抬升,按比例增加,或者曲线调整,达到将整体饱和度提高的目的。但是饱和度调整同时提升所有颜色的强度,比较粗暴。

有可能导致:

  • 本来局部饱和度已经比较高,调节后过饱和,局部细节的消失。(和上一章节例子一样)。

  • 本来局部饱和度较低,接近白色,加大饱和度后,容易出现色块。

图片

普通调节

如何优化:

  1. 对此引入对源的饱和度的检测,设定上下限制,平滑调节。

  2. 在HSV颜色模型上,引入了类似自适应饱和度调整的方式。

  3. 目的:在低饱和度区域,避免突然增加饱和度。低饱和度的颜色(例如接近灰色的颜色)通常对饱和度调整非常敏感,因此需要一种平滑的方式。

  4. 目的:在高饱和度区域减少权重,避免过度增强饱和度。高饱和度的区域本身已经很饱和,进一步增加饱和度会导致过饱和,视觉上显得不自然。

图片

加入自适应后

2.4.2.5 肤色保护

采用HSV空间调整后,我们还需要考虑一个核心问题:

在图像色彩增强(如饱和度调整、色调映射)时,肤色区域容易因过度调整而失真(如过红、过黄或惨白)。需通过肤色识别技术,对检测到的肤色区域进行保护,限制增强幅度,保持自然观感。

在此引入了基于HSV色彩模型的肤色识别,HSV色彩模型也同样将亮度与颜色进行了分离,因此对于光照变化也有很强的抗干扰能力,可以较好的识别出肤色。

结合HSV色彩模型和高斯概率模型实现肤色保护,具体步骤如下:参考GPUImageSkinToneFilter的肤色识别方法。

(1) RGB转HSV空间

  • 将图像从RGB转换到HSV空间,分离色调(H)、饱和度(S)、亮度(V)。

  • 优势:HSV的色调通道(H)对光照变化鲁棒,更适合肤色识别。

(2) 肤色概率计算

  • 肤色色调模型:

    统计肤色色调的均值 skinHue = 0.05(典型值,对应黄红色调)。

    方差相关参数 skinHueThreshold = 40(控制肤色范围宽度)。

  • 距离计算:

    计算当前像素色调 h 与 skinHue 的归一化距离。

    dist = abs(h - skinHue) / 0.5高斯权重(概率)。

  • 通过高斯函数计算肤色概率:

    skinProb = exp(-dist * dist * skinHueThreshold)结果范围 [0, 1],越接近1表示越可能是肤色。

(3) 肤色区域保护

  • 阈值分割:

    设定阈值(如 skinProb > 0.95),二值化得到肤色掩膜(Mask)。

  • 动态衰减增强强度:

    对检测到的肤色区域,按 skinProb 权重衰减色彩增强效果。例如:enhanced_pixel = original_pixel * (1 - skinProb) + adjusted_pixel * skinProb * alphaalpha 为衰减系数(如0.2),控制保护力度。

增加肤色保护后,可以看到效果明显更好,人脸不会有过于突兀的颜色变化。

图片

左:增强(无保护)中:原图  右:增强(肤色保护)

2.4.3 效果对比

  • HSV空间的调节后色彩更加自然。

  • RGB空间调节则更加绚丽。但容易色偏。

  • 基于综合考虑,我们采用HSV空间调节,以适应更多的源,避免色偏。

三. 总结与展望

本研究聚焦于移动端视频增强技术的工程化落地,重点验证了亮度增强与色彩增强两种核心算法的实际应用效果。从主观评测效果看,在部分视频上,两项技术均能显著提升视频观感质量,有效改善用户体验。

目前,亮度增强功能已在「好看 App」成功上线,且收获了良好的应用效果。现阶段,我们正着力研发亮度增强与色彩增强相叠加的综合优化方案,计划通过这一方案对更多视频内容进行品质升级,从而为用户带来更优质的观看体验。以下为您呈现亮度增强结合色彩增强的部分应用案例:

图片

例子1:后层次感更好(右)

图片

例子2:色彩更鲜明(右)

图片

例子3:画面更清晰明亮(右)

未来研究将围绕以下方向展开:

  1. 场景化优化:建立典型场景特征库,针对性优化算法参数配置。

  2. 实时性提升:通过模型轻量化与硬件加速技术,更加快速的视频实时处理。

第一!百度智能云领跑视觉大模型赛道

作者 百度Geek说
2025年8月19日 15:34

近日,国际数据公司(IDC)发布了《视觉大模型能力及应用评估报告,2025》,该报告对中国市场的视觉大模型厂商进行了全面且深入的评估,百度凭借卓越的综合实力,在众多竞争对手中脱颖而出,荣膺总分第一名的桂冠。作为百度视觉大模型领域的核心产品,百度智能云一见视觉大模型平台,在平台能力、算法模型、工程化落地能力、覆盖行业等维度具有显著优势,领跑视觉大模型赛道。

4a4abf15ec47f08856acc338642a4350.png

技术破局,实力领跑

小模型时代,视觉AI技能开发成本高,企业在视觉智能应用落地过程面临 “做不出”、“用不起”、难复制” 的困境。随着多模态大模型技术突破,企业生产过程中大量的安全、合规、品控等视觉检测需求正在被激活,基于视觉的管理数字化理念逐步被认可。

大模型重构视觉智能,一见基于文心4.5原生多模态大模型、文心X1深度思考模型升级,让专业级视觉AI应用从 “遥不可及”变成“人人可用”。作为多模态视觉管理平台,一见提供视觉AI技能生产、效果调优到应用的全栈能力,支持“一句话生产专业级视觉AI应用”,并通过技能可视化编排灵活匹配业务流程,低成本、低门槛帮助企业实现全视觉管理数字化

9dfd5d304360b58fdee3e34f180a1494.png 同时,IDC报告中指出,端侧AI与边缘智能迎来发展,大小模型协同、轻量化的部署展现应用潜力

一见采用云边协同架构,通过大模型自动生产并持续调优小模型,在保障端到端视觉AI应用效果的同时,大幅降低应用成本。轻量级小模型部署在边缘侧,可实现秒级快速触发;云端大模型负责深度理解复杂场景,兼顾响应效率与处理精度,这种 “边缘+云端” 的协同模式,让企业在享受高精度应用效果的同时,有效控制硬件投入与运维成本。这一能力也在IDC报告中得到了充分认可,成为一见领跑大模型赛道的重要支撑。

多场景落地,价值凸显

目前,一见已在餐饮连锁、钢铁、电力、矿山、港口、铁路、化工、水务、公安等20+行业落地,服务数百家头部客户,护航企业生产运行全环节,帮助企业实现全视觉管理数字化。

>>管安全:筑牢安全生产防线

一见为某风电集团构建的安全生产集中管控体系,覆盖了全国近300个风电场站、数万台风机,实时识别员工不规范作业与设备异常,集控人效提升300%+,隐患处理响应从小时级压缩至分钟级,巡检效率提升6-10倍,为能源安全筑牢“智能防线”。

>>管质量:破解质量检测难题

在冶金材料领域,一见与中国钢研联合打造的金相分析大模型,将传统依赖人工的检测方式升级为AI自动化分析。其95%的分割准确率(金相分析的核心指标),不仅解决了传统检测中“漏检率高、效率低” 的痛点,更让曾经依赖老师傅经验的冶金质检,转型为可标准化复制的智能流程。

>>管工序:传承老师傅操作经验

在制造行业,一见为某装备制造企业打造工序合规分析系统,破解复杂装配环节老师傅“经验断层” 难题。只需上传一段标准工序操作视频,一见便能基于多模态视频理解自动拆解老师傅的标准操作步骤,分钟级生成工序识别AI技能,上线后实时识别操作并纠偏,新员工误操作率降低90%。

>>管物料:实现精细运营管控

一见助力某头部连锁品牌实现物料精细管理,依托一见多模态大模型能力打造智慧运营中枢,精准优化资源配置,实现供应链及人效的智能管理,物料盘点效率提升60%,降低人工盘点工时

>>管服务:重构门店管理范式

一见帮助某餐饮连锁企业实现锅底上桌检测、顾客离座识别等6类场景,实现了全国1000多家门店服务质量的量化管理,**订单覆盖率从抽检5%提升至95%,AI识别准确率达95%,**门店满意度大于98.2%。

多年的技术沉淀与20+行业的深耕实践,加速一见在视觉大模型领域形成独特的竞争力。技术普惠,一见将持续以技术创新为锚点,让视觉智能深度融入企业生产运行的每个环节,重新定义看见的价值,成为企业全视觉管理数字化跃迁的助推剂。

百度智能云x中科大脑:「城市智能体」如何让城市更会思考

作者 百度Geek说
2025年8月14日 16:38

近日,2025中关村论坛系列活动——中关村人工智能与未来城市论坛在中关村国家自主创新示范区展示中心举办。论坛上,发布了应用范式创新升级成果、智能体产品、可信数据空间成果等。

中科大脑联合百度智能云等伙伴共同打造并发布21个智能体产品,涵盖城市治理、城市服务、公共安全、教育健康、政务办公等领域,是基于海淀人工智能创新街区和全国多地探索实践的积淀,作为标杆引领行业成长。

智能体产品作为智慧城市建设的重要支撑,论坛上,百度智能云、中科大脑、北京邮电大学、北京大学通用人工智能研究院等多家单位共同启动智能体生态合作计划,聚焦共创融合应用场景、共育繁荣创新生态和加强科技成果转化三个关键维度,携手擘画“数启新纪元 ”下智慧城市建设的未来图景。

3195eb094d86a1d802acba0bb713eca3.jpg 百度智能云利用大模型技术,构建城市治理智能中枢,实现政务场景全流程智能化升级,打造集专业文书生成、城市治理监测、政务数据查询、便民服务办理、民生诉求响应于一体的城市智能体解决方案,推动政务服务从"人工处理"向"智能驱动"转型。

>>全流程公文智能:构建覆盖"提纲-撰写-审核"的公文智能生产体系,集成政策法规、公文范例等专业语料库,实现文书自动生成与合规性校验,公文处理效率显著提升。

>>多模态治理协同:整合视频监控、物联感知等多源数据,通过多模态大模型实现违法行为智能识别与执法预警,构建"监测-处置-反馈"闭环管理机制,提升非现场执法覆盖率。

>>政务问数穿透查询:建立跨部门数据关联分析模型,支持领导决策场景下的复杂数据即时穿透查询,实现复杂数据3秒穿透查询,辅助科学决策。

>>智能办事服务:融合"问答-导引-办理"全流程服务能力,提供疑问解答、办事导引、智能回填、边聊边办多项便民功能,有效提升在线办事效率。

>>民生诉求闭环响应:集成法律法规库和典型案例库,根据用户咨询的民生问题给出建议的解决方案引用相关法律依据,实现民生咨询智能分类与处置方案自动生成,根据用户咨询的民生问题给出建议的解决方案引用相关法律依据,AI法治护航解忧于民。

百度智能云具备从算力、平台到应用的全栈技术能力,全面支撑大模型在产业中的高效部署与落地。在算力层面,百度智能云已成功点亮昆仑芯三万卡集群,昆仑芯已在多个行业实现规模化部署。硬件之上,结合百度百舸GPU云平台,围绕落地大模型全旅程的算力需求,在集群创建、开发实验、模型训练、模型推理四大方面,为企业提供“多快稳省”的AI基础设施,最大化释放硬件性能。在平台层面,千帆大模型平台始终致力于为用户提供全流程、一站式的AI服务。目前,千帆平台还提供了包括文心大模型等在内的超过100多个模型和全面的模型开发工具链,企业既能灵活调用现有的成熟智能体,也可以根据业务需求灵活开发定制化应用。在应用层面,百度智能云推出了“行业场景智能体家族”。这些智能体支持快速轻量化定制,可高效接入业务系统,显著加速AI在金融、制造、政务等行业的落地进程。

PaddleMIX推出扩散模型推理加速Fast-Diffusers:自研蒸馏加速方法FLUX-Lightning实现4步图像生成

作者 百度Geek说
2025年8月12日 16:00

背景:扩散模型推理成本亟待优化

扩散模型(Diffusion Models)近年来在高保真图像和视频生成上取得了令人瞩目的成果。然而,这类模型在推理阶段需要经过数十步乃至上百步的迭代去噪,每一步都要运行庞大的 U-Net 或 Transformer 模型,导致推理耗时巨大。对于高分辨率生成或视频生成等应用,迭代推理的开销更是呈指数级上涨,使实时应用变得非常困难。如何在不牺牲生成质量的前提加速扩散模型的推理,已成为学界和工业界共同关注的课题。

01

扩散模型推理优化的总体方案

基于上述需求,PaddleMIX 从模型蒸馏、模型推理缓存(Training-Free)以及深度学习框架编译优化等多个技术维度出发,打造了 Fast-Diffusers 扩散模型推理加速工具箱,便于开发者根据实际场景灵活组合运用,从而有效提升扩散模型的推理速度。在第一期中我们介绍了动态跳过冗余计算(SortBlock)、智能缓存复用特征(TeaBlockCache)和数学近似预测(FirstBlock-Taylor)等 Training-Free 加速算法,在保持与原始模型几乎一致的生成质量的同时,将扩散模型的推理速度提升了2倍以上。本期稿件将从蒸馏加速和框架高性能优化两个方面介绍 Fast-Diffusers 工具箱中扩散模型的加速策略。

image.png 图1 推理加速工具箱

▎蒸馏加速方案和框架性能优化

主流的扩散模型蒸馏加速方法包括有一致性模型(Consistency Models),渐进式蒸馏(Progressive Distillation)以及分布匹配蒸馏(Distribution Matching Distillation)等。一致性模型建立在概率流常微分方程(PF-ODE)上,使用一致性函数将 PF-ODE 轨迹上任何时间步的点映射到轨迹的起点,支持一步生成高质量样本,同时保留多步采样能力以平衡计算成本与生成质量。分布匹配蒸馏通过分布级对齐(Distribution Matching)而非路径级模仿,在保持图像质量的同时实现数量级的速度提升,通过要求学生模型生成的图像分布应与教师模型生成的分布的一致性,完成一步生成图像的过程。

PaddleMIX 最新发布的扩散模型工具箱 PPDiffusers 中,集成了一致性模型 PCM(Phased Consistency Distillation)和 DMD2(Improved Distribution Matching Distillation for Fast Image Synthesis)算法,同时 **PaddleMIX 推出自研蒸馏加速模型 FLUX-Lightning,实现4步快速的高质量高分辨率图像生成,生成效果超越业界开源和闭源模型,达到业界 SOTA 水平。**另外使用飞桨深度学习编译器 CINN 进一步优化推理性能,对比 torch compile、Onediff、TensorRT 等主流推理优化框架,推理性能取得了显著的性能提升。

02

FLUX-Lightning 简介

PPDiffusers 提出了基于 FLUX 的蒸馏加速模型 FLUX-Lightning,可以在4步极少步数下,生成高分辨率高质量的图像,定量指标和定性指标均超越业界开源和闭源模型,达到了业界 SOTA 水平。

ed12344b2bd438b105caa295d66253a0.png

图2 FLUX-Lightning 4步推理结果

我们提出的 FLUX-Lightning 模型主要包含4个部分,区间一致性蒸馏(Phased Consistency Distillation),对抗学习(Adversarial Learning),分布匹配蒸馏(Distribution Matching Distillation),矫正流损失(reflow loss),完整框架如下图所示。

image.png

图3 FLUX-Lightning 框架

▎区间一致性蒸馏

image.png

image.png

▎对抗学习

为了进一步提升少步数下的图像生成质量,FLUX-Lightning 模型引入了对抗学习(Adversarial Learning),使用 discriminator 在 latent space 判别真实样本和虚假样本。

discriminator 模型由冻结的 teacher denoiser 和多个可训练的 discriminator heads 组成,前者负责提取图像特征,后者负责进行判别工作。图3展示了以 FLUX 为 teacher denoiser 的 discriminator 模型结构,FLUX 包含19个 FluxTransformerBlock 和38个 FluxSignleTransformerBlock,共计57个 TransformerBlock,将每个 TransformerBlock 的输出的图像特征 hidden states 输入到可训练的 discriminator heads 中,discriminator heads 由多个卷积层和残差结构组成,判别输入样本为真实样本还是虚假样本。

image.png

图4 discriminator 网络架构

image.png

▎分布匹配蒸馏

image.png

▎矫正流损失

image.png

▎算法流程

算法完整流程如下所示

image.png

03

飞桨编译器高性能推理

深度学习编译器是一种专门为深度学习模型优化和部署而设计的工具,用于提高模型的计算效率、降低内存占用、加速训练推理过程,核心价值在于弥合高层算法描述与底层硬件指令集之间的语义鸿沟。编译器功能上是将高层次的深度学习模型转换为低层次的、高效的、底层硬件可执行的代码。编译器通过将框架输出的初始计算图转化为具有严格语义定义的中间表示层,保留计算图的完整结构,随后在中间表示层实施多轮迭代优化,最终通过目标硬件感知的代码生成模块,将优化后的中间表示转化为高度特化的机器指令序列。简单来说,深度学习编译器在深度学习框架和底层硬件之间充当了“翻译”的角色,能够将用户定义的神经网络模型描述转化为底层硬件能够理解和执行的指令。编译器在实现这种转换的过程中,应用了一系列优化技术,以提高模型在各种硬件平台上(如 CPU、GPU)的执行效率。以下是飞桨框架编译器(CINN, Compiler Infrastructure for Neural Networks)整体流程图。

image.png

▎生成模型结合 CINN 推理性能优化

针对多模态生成模型推理时间长的问题,基于飞桨深度学习编译器 CINN,我们对于 FLUX 模型在 A800单卡推理情况下进行了飞桨框架推理性能优化实验,对比基于 xDiT 优化框架提供的 Torch Compile、Onediff 和 TensorRT 推理优化性能指标作为竞品。通过编译器优化所带来的性能加速,飞桨在 FLUX.1-dev 和 FLUX.1-schnell 这两个官方模型配置的推理中都取得了显著的性能提升,并且实现对比竞品的性能优势。

飞桨单卡推理性能测速和性能优化提升如下表所示。

image.png

FLUX 模型动态图编译器推理性能

通过表格中的性能测速对比可以发现,对于 FLUX.1-dev 模型的推理性能,输出图像维度为1024p 和512p 的情况下,使用飞桨编译器优化对比原生动态图推理性能提升分别达到31.8%和36.7%,而对于 FLUX.1-schnell 模型的推理性能,使用编译器优化对比原生动态图推理性能提升分别达到30.8%和34.6%,对于不同配置下 FLUX 系列模型都表现出了显著性能提升。

飞桨单卡推理性能测速和性能竞品对比如下表所示。

image.png

▎FLUX 模型推理性能竞品对比

我们对于市场上文生图大模型推理性能优化策略进行了性能分析,包括 torch compile、Onediff、TensorRT 等主流推理优化框架。通过对比可以发现基于飞桨编译器优化实现的 FLUX 推理在各个配置下都体现出了领先的推理性能。对于 FLUX.1-dev 模型,输出图像维度为1024p 和512p 的情况下,飞桨编译器推理性能对比竞品中性能最优的 Torch compile 推理性能提升分别达到1.4%和6.5%, 对于 FLUX.1-schnell 模型,飞桨编译器推理性能对比竞品中性能最优的 Onediff 推理性能提升分别达到1.4%和6.5%, 体现出了飞桨框架在市场中的推理性能方面的领先性,以及在 FLUX 模型各不同配置和参数设置情况下稳定的性能优势。同时我们也将该技术应用到自研蒸馏加速模型 FLUX-Lightning 中,开启 CINN 后在 A800上单卡推理时延能从2.21s 进一步降低到1.66s。

04

实验结果

▎实验设置

数据方面,我们基于 laion-aesv2数据集筛选45w 数据,筛选条件为:图像长宽都大于1024,美学指标 aes>6,水印概率分数<0.5。使用 COCO-10k 作为评测数据集。

模型方面,选用目前文生图领域最新的 FLUX 模型作为基础模型,由于 FLUX 模型自带 CFG 蒸馏,将 guidance scale 进行 embedding 后作为模型输入,所以训练时默认使用 CFG-augmented ODE solver。

评测指标,方面选择 CLIP 指标和 FID-FLUX,其中 FID-FLUX 指标参考 PCM 模型的 FID-SD 指标,使用原始 FLUX dev 模型的生成结果(50 step)计算 FID 分数。CLIP 指标用于评价生成结果与 prompt 的符合程度。

模型训练方面,使用 lora 训练的方式(lora rank=32),有效节省计算资源消耗。模型总 loss 如下所示,其中

image.png

▎定量结果

消融实验定量结果显示,我们使用的 Adversarial Learning,Distribution Matching Distillation 以及 reflow loss 都获得了模型效果的提升,证明了 FLUX-Lightning 优化点的有效性。

image.png

表1 消融实验

为了进一步验证 FLUX-Lightning 模型的效果,我们和目前 SOTA 的基于 FLUX 的蒸馏加速模型进行了全面的对比,包括 FLUX schnell,TDD (Target-Driven Distillation: Consistency Distillation with Target Timestep Selection and Decoupled Guidance),SwD (Scale-wise Distillation of Diffusion Models)以及 hyper-flux,其中 flux schnell 和 Hyper-FLUX 是闭源模型,TDD 和 Swd 为开源模型,且所有模型均基于 FLUX 蒸馏得到。对比结果如下所示,在 FID-FLUX 指标上 FLUX-Lightning 模型获得了最好的效果(8.0182),CLIP 指标上也展现出了具有竞争力的分数。

image.png

表2 定量实验结果

备注:消融实验使用28w 数据实验,完整 FLUX-Lightning 模型使用全量45w 数据训练

▎定性结果

下面展示了我们的 FLUX-Lightning 模型和其他竞品之间的图像生成效果对比,可以看到 FLUX-Lightning 模型在图像质量、prompt 一致性、生成准确性方面都超过了其他竞品。具体来说:

FLUX-Lightning 在人体部位的生成上更加准确。例如第一行大部分竞品生成的脚部都很怪异,FLUX-Lightning 生成了正确的脚部同时更加符合“没有被毯子盖住”的含义。第二行和第三行中大部分竞品生成的手指数量不对或者形状不对,FLUX-Lightning 的手指数量性状则完全正确。

FLUX-Lightning 具有更好的文字生成的能力。在第4行中需要生成“New York City, 100 miles”的文字,TDD 生成了模糊不清的文字,SwD 缺少“miles”,Hyper-FLUX 的“100”很模糊,FLUX schnell 生成了不需要的“ew caft”的乱码,只有 FLUX-Lightning 生成了清晰的“New York City, 100 miles”文字。

FLUX-Lightning 可以生成更合理的人体姿态。第5行展示了抛棒球的运动员,TDD 和 Hyper-FLUX 的手臂部分出现明显扭曲,SwD 的手部和棒球合在了一起,FLUX-Lightning 生成的整体动作以及局部特征更加合理准确;第6行展示了跑步的运动员,SwD 生成的腿部和 FLUX schnell 生成的手臂都有明显问题,TDD 和 Hyper-FLUX 则是生成了不合理的背部文字,只有 FLUX-Lightning 生成了正确的跑步姿势以及背部“8”的文字。

FLUX-Lightning 生成内容和 prompt 更加契合。第7行要求生成“一家三口”,SwD 和 flux schnell 仅仅生成了两个人,Hyper-FLUX 则是生成了2个男人,TDD 生成了一家三口但是人物形态扭曲,FLUX-Lightning 正确生成了一家三口,同时人物形态正常。第8行中,TDD 和 FLUX schnell 没有体现出“大象扬起鼻子”的样子,SwD 和 Hyper-FLUX 的图像细节和背景丰富度较差,FLUX-Lightning 在大象形态和背景丰富程度上更加优秀。最后一行中,TDD 和 SwD 的手部细节扭曲,Hyper-FLUX 没有展现出“正在梳头”的状态,flux schnell 则是生成了奇怪的梳子,FLUX-Lightning 在人物细节、物体细节和动作上都更胜一筹。

image.png

▎人工评测

为了更加全面地评测 FLUX-Lightning 的效果,我们进行了图像生成效果的人工评测。具体来说,我们生成了50个富有挑战性的 prompt,对 TDD,SwD,Hyper-FLUX,FLUX schnell 及 FLUX-Lightning 共计5个模型的生成结果进行排序,4位评审员采样盲评的方式,按照结果好坏从高到低分别得到10分,7分,5分,3分,1分,最终取平均分。部分 prompt 示例如下所示,第一行中,需要考察生成结果是否包含“3个女性”,“医院”,“病床,医疗设备”等元素。第二行中,考察生成模型是否包含“蒙古包”,“马头琴”以及“墙上的乐器”等元素,同时还要依据人物是否扭曲、图像质量等多个维度进行评判。

image.png

image.png

图5 人工评测 prompt 示例

人工评测结果如下所示,其中 FLUX-Lightning 获得了最高分7.37分,表明 FLUX-Lightning 可以生成更符合人类审美的图像,体现了模型的优异效果。

image.png

表3 人工评测结果

05

使用教程

PaddleMIX 已将 FLUX-Lightning 模型开源集成到其扩散模型推理库(PPDiffusers)中,源码和使用说明都可以在 PaddleMIX 的 GitHub 仓库中获取,代码链接为:

github.com/PaddlePaddl…

感兴趣的开发者可以查阅开源代码,了解各模块的实现细节和参数配置,并对自己的扩散模型进行蒸馏加速。

▎训练

数据准备:下载 laion 训练数据和数据列表

wget https://dataset.bj.bcebos.com/PaddleMIX/flux-lightning/laion-45w.tar.gz
wget https://dataset.bj.bcebos.com/PaddleMIX/flux-lightning/filelist_hwge1024_pwatermarkle0.5.txt

数据解压之后,文件结构如下所示

|-- your_path
   |-- laion-45wlaion-45w
      |-- 0000000.txt
      |-- 0000001.txt
      |-- 0000002.txt
      ....
   |-- filelist_hwge1024_pwatermarkle0.5.txt

模型训练命令:

python -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" train_flux_lightning_lora.py \
    --data_path "your_path/laion-45w" \
    --file_list_path "your_path/filelist_hwge1024_pwatermarkle0.5.txt" \
    --pretrained_teacher_model "black-forest-labs/FLUX.1-dev" \
    --output_dir outputs/lora_flux_lightning \
    --tracker_project_name lora_flux_lightning \
    --mixed_precision "bf16" \
    --fp16_opt_level "O2" \
    --resolution "1024" \
    --lora_rank "32" \
    --learning_rate "5e-6" \
    --loss_type "huber" \
    --adam_weight_decay "1e-3" \
    --max_train_steps "28652" \
    --dataloader_num_workers "32" \
    --guidance_scale "3.5" \
    --validation_steps "20000" \
    --checkpointing_steps "1000" \
    --checkpoints_total_limit "30" \
    --train_batch_size "1" \
    --gradient_accumulation_steps "1" \
    --resume_from_checkpoint "latest" \
    --seed "453645634" \
    --num_euler_timesteps "100" \
    --multiphase "4" \
    --gradient_checkpointing \
    --adv_weight=0.1 \
    --adv_lr=1e-5 \
    --pre_alloc_memory 76 \
    --use_dmd_loss \
    --dmd_weight 0.01 \
    --apply_reflow_loss \
    --reflow_loss_weight 0.01

▎推理

下载模型权重

wget https://dataset.bj.bcebos.com/PaddleMIX/flux-lightning/paddle_lora_weights.safetensors

推理命令

python text_to_image_generation_flux_lightning.py --path_to_lora your_path/paddle_lora_weights.safetensors --prompt "a beautiful girl" --output_dir ./

text_to_image_generation_flux_lightning.py 中的内容为

# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import os
os.environ["USE_PEFT_BACKEND"] = "True"
import paddle
from ppdiffusers import FluxPipeline
parser = argparse.ArgumentParser(description="Simple example of a training script.")
parser.add_argument(
    "--path_to_lora",
    type=str,
    required=True,
    help="Path to paddle_lora_weights.safetensors",
)
parser.add_argument(
    "--prompt",
    type=str,
    required=True,
    default="a beautiful girl",
)
parser.add_argument(
    "--guidance_scale",
    type=float,
    required=False,
    default=3.5,
)
parser.add_argument(
    "--height",
    type=int,
    required=False,
    default=1024,
)
parser.add_argument(
    "--width",
    type=int,
    required=False,
    default=1024,
)
parser.add_argument(
    "--lora_scale",
    type=float,
    required=False,
    default=0.25,
)
parser.add_argument(
    "--step",
    type=int,
    required=False,
    default=4,
)
parser.add_argument(
    "--seed",
    type=int,
    required=False,
    default=42,
)
parser.add_argument(
    "--output_dir",
    type=str,
    required=False,
    default="./",
)
args = parser.parse_args()
pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev", map_location="cpu", paddle_dtype=paddle.bfloat16)
pipe.load_lora_weights(args.path_to_lora)
with paddle.no_grad():
    result_image = pipe(
        prompt=args.prompt,
        negative_prompt="",
        height=args.height,
        width=args.width,
        num_inference_steps=args.step,
        guidance_scale=args.guidance_scale,
        generator=paddle.Generator().manual_seed(args.seed),
        joint_attention_kwargs={"scale": args.lora_scale},
    ).images[0]
result_image.save(os.path.join(args.output_dir, "test_flux_lightning.png"))

使用 CINN 技术加速推理 FLUX-Lightning 方法如下:

export FLAGS_use_cuda_managed_memory=true
export FLAGS_prim_enable_dynamic=true
export FLAGS_prim_all=true
export FLAGS_use_cinn=1
python text_to_image_generation_flux_lightning_cinn.py --path_to_lora your_path/paddle_lora_weights.safetensors --prompt "a beautiful girl" --output_dir ./ --inference_optimize

06

总结与展望

本文介绍了 PaddleMIX 最新推出的 FLUX-Lightning 模型,通过区间一致性蒸馏(Phased Consistency Distillation),对抗学习(Adversarial Learning),分布匹配蒸馏(Distribution Matching Distillation),矫正流损失(reflow loss)等技术,在保持图像生成质量的前提下,可以做到4步快速生成,大幅提升了图像生成的性能,叠加上 CINN 推理优化,单图推理仅需1.66s(A800)。模型效果也达到了业界 SOTA 的水平,定量和定性结果显示超越了目前市面上基于 FLUX 的各种开源和闭源的蒸馏加速模型,开发者可以根据需求简单地对自己的扩散模型进行蒸馏加速。

展望未来,随着扩散模型在更大规模数据和更多应用领域的发展,此类推理高效化的需求将更加迫切。我们有理由相信,蒸馏加速方法还有很大潜力可挖——例如使用 TrigFlow 消除 CM 模型中的量化误差、更加高效的对抗损失设计等,都有望在保持图像生成质量的前提下进一步提升生成效率。PaddleMIX 也将持续完善多模态模型的工具链,在提供强大模型能力的同时兼顾实际部署效率。希望这些加速方法能够帮助开发者更快地落地扩散模型应用,激发出更丰富的创意,实现高质量生成与高效推理的双赢。

▎开源代码链接:

PaddleMIX 扩散模型加速插件相关代码已在 GitHub 开源 。欢迎大家访问仓库获取源码并提出宝贵意见,共同推进扩散模型技术的发展与应用!

github.com/PaddlePaddl…

❌
❌