得物App白屏优化系列|网络篇

一、背景

图片加载作为重中之重的App体验指标,端侧的白屏问题则是其中最为严重的问题之一。想象一下如果你在浏览交易商品、社区帖子等核心场景下,图片无法完成加载是多么糟糕的体验。

网络作为图片资源加载的最主要来源途径,如果不能够快速的响应请求,那对上层图片库而言,就是巧妇难为无米之炊了。

而且,通过线上白屏问题归因,我们看到网络问题导致比例最高,占比达81.97%。除去常见的弱网/无网等问题外,还有很多各种各样的网络环境问题我们是可以进行优化的,例如设备不支持IPv6,CDN节点异常,证书超时等。

01.jpg

二、网络优化&监控概览

02.jpg

网络优化与监控体系

三、网络监控能力

网络异常导致的图片白屏问题,往往和当时的环境有关,例如用户连的WIFI不支持IPv6但是DNS返回的大部分是V6的IP等,此时仅靠几条带有SocketTimeoutException的网络日志根本无法排查出问题的根因,就如同ANR问题需要火焰图一样,白屏问题同样需要一套完善的监控体系来记录问题现场的信息,从而分析问题根因。

OkHttp基础监控

图片网络请求的阶段信息,可以通过实现OkHttp自带的EventListener来获取,在各个阶段开始和结束点记录下时间戳即可。

其中需要重点关注connectFailed,requestFailed和responseFailed这三个失败的回调,他们都会在失败之后重试,并重复执行阶段开始的回调(例如connectStart),因此针对这些需要单独记录好每一次失败信息,避免被覆盖。

例:某个图片请求TCP建连失败的记录

03.jpg

APM流量监控

尽管我们有专门的网络诊断工具,但是考虑到网络异常的滞后性,故障往往是数十秒之前引入的(例如进电梯弱网),而发生问题之后才触发的网络诊断结果仅能作为参考,并不能作为最终问题归因的证据。

因此我们需要一个更直观的表达用户设备网络状况的数据,那就是通过系统API获取的当前App流量消耗,在排除了一些本地socket通信产生的干扰之后,最近N秒之内消耗的流量/N就可以认为是白屏问题发生时的网速。

我们以3秒为间隔分段计算并取最大值来排除波动,这样我们就得到了白屏问题发生前一段时间内的网速状态,过低的就可以判定为弱网/无网。

网速计算示意图:

04.jpg

CDN异常记录

CDN厂商侧的异常,例如服务器IP跨省,节点挂了等问题相对少见,在网络日志中通常就表现为建连超时但是网络正常,因此需要收集多个Host的请求记录进行横向对比来确认是单个CDN厂商的问题。

为此我们记录了主站接口的域名,以及所有CDN域名在最近N分钟内的请求统计,包括了正常请求、慢请求、失败请求的数量和原因,以及失败请求使用的具体IP。

例:图中可以看到某CDN的请求全部都是建连失败,而其他CDN以及我们主站域名请求均正常,那么此问题可以归类为该CDN的单点问题,联系CDN服务商剔除该IP所在节点即可解决问题。

05.jpg

网络库请求缓存

常规的网络监控方案为了节省内存,会在请求结束时将其从内存缓存队列中移除,而白屏问题因为其滞后性,只有在屏幕中大面积出现白图才会被判定,此时再去查询加载失败的图片网络请求日志自然早已被移出队列,因此需要单独使用一个LRU队列来缓存最近N条网络日志,图片库同理。

网络诊断工具

在逐步解决用户问题的过程中,我们研发了网络诊断工具,实现了基础网络信息采集、Ping、TraceRoute等。

当检测到用户发生白屏时自动触发网络诊断。

06.jpg

单域名诊断流程

我们会依次进行DNS、Http、Ping(ICPM)与Ping(TCP)、TraceRoute诊断。如果是双栈客户端(同时返回了IPv4与IPv6),那么我们会选择首个IPv4与首个IPv6同时进行Ping/TraceRoute以确认不同IP类型的联通情况。

07.jpg

多域名诊断流程

同时对3个得物核心域名发起诊断。为了辅助判断,当得物核心域名诊断失败时,也会对一些主流三方域名稍微Ping一下。

诊断数据的上报

由于网络诊断可能耗时10秒以上,而如此长的时间内用户如果退出App那我们的诊断数据可能就丢失了。因此,任意一个小阶段的诊断完成时,我们就立即上报此结果,以避免此类情况的发生。

四、CDN质量监控

CDN作为整体白屏问题中重要的一环。在白屏排查过程中,经常遇到接口正常,但CDN访问异常的case。而多云CDN的质量问题往往依赖于云厂商,如何衡量和监控云厂商的CDN情况成为了关键,故我们自定义了端侧的CDN质量指标体系以及配合云厂商推进云端策略的优化。

08.jpg

CDN质量大盘

在白屏监控平台侧,我们经常能够发现用户侧的CDN单点问题,往往存在跨省、跨运营商调度的情况,或者是单节点的高负载响应超时。故我们基于此情况记录了端侧的本地IP&CDN远端IP,建设了CDN质量大盘,核心指标如下:

09.jpg

依赖CDN质量大盘,我们可以横向、纵向对不同云厂商服务进行CDN质量评估工作,由于端侧实际发起的总请求数量统计成本高、到CDN侧的请求存在丢失等情况,我们采用了端侧采样上报、统计还原的思路,将得物侧的整体CDN指标大盘采样放大比例为1 / 千分之三(当前采样比例)。过程指标的确会收到采样用户质量的影响,但整体CDN趋势、各厂商CDN的横向对比还是有很大的参考意义的。

平台截图展示:

10.jpg

省份、运营商

11.jpg

超时率、跨省率

12.jpg

节点情况

13.jpg

CDN云端监控

如果说端侧CDN指标是对CDN质量抽象评估的长周期指标,那么云端监控则是CDN质量的精确告警的短时效指标。

这部分就是一些较为常见的策略与手段了,如CDN节点拨测、CPU负载监控、异常错误码监控等,并协同SRE团队将其同飞书通知打通,实现及时告警。

节点拨测

CDN节点拨测整体指定的图片拨测阈值当前限制在200ms。

14.jpg

站点拨测

15.jpg

飞书通知

节点监控

关于到节点后的请求监控,主要依赖于云厂商的监控能力,我们也协同云厂商对核心指标的告警阈值等进行了调优,核心主要为:

16.jpg

此处思考一个问题,如果建连请求无法抵达CDN节点,那么即使CDN厂商开启了TCP级日志,也无法监测到此异常,也就无法及时进行调度调整。

故对于非到节点的建联问题,基于TCP建连进行监控是很有必要的,我们基于客户端建连的监控数据,以用户网络环境(网络运营商,地域)视角,分析建连过程是否正常,及时发现异常连接线路,并通过推动CDN服务商调整区域DNS返回来恢复正常。

监控指标如下:

17.jpg

18.jpg

建联失败、异常率

19.jpg

建联p50、p99耗时分布

五、网络问题优化治理

DNS策略优化

从网络监控、白屏监控中我们可以清楚的观察到DNS错误是网络阶段导致白屏的最大因素。此外,DNS错误是所有网络错误中最多的,甚至可以占比80%以上。

20.jpg

连续DNS错误导致白屏

LocalDNS行为

为什么DNS阶段如此脆弱,是我们使用不当,还是其本身性能如此?我们首要做的是观察下Android平台下LocalDNS的行为逻辑以确认性能较差的原因。

按照TTL缓存

通过不停的向系统进行查询DNS,在抓包中,我们很容易观察到DNS的查询逻辑。其中一个重要参数是TTL(Time to Live),这个参数表明当前查询结果的有效时间。比如说TTL=7,表明在7秒钟内当前结果是有效的、可被缓存的,即使7秒钟内再次查询,依然是此结果。

Android平台严格遵守了此协议,按照TTL进行缓存。而较短的有效时间,也意味着我们需要进行域名查找时(冷热启动),大概率系统内没有缓存可用。

21.jpg

DNS TTL与查询频率

通常TTL设置为120秒以内,这是因为要考虑到节点故障,能够快速切换。而到端侧查询时,TTL会在0~120之间。低于120是因为我们查询此结果的DNS server自身已经缓存了一定的时间。

双栈客户端同时查询

双栈客户端上,同时发起A类(IPv4)、AAAA类(IPv4)查询。

22.jpg

某运营商5G网络下DNS查询及响应

当两类查询都成功响应时,Android会将两类结果组合起来排序后返回给应用层。无论是A类地址先返回,还是AAAA类地址先返回,Android都会将IPv6地址放在前面(划重点,后面要考)。

-- app.dewu.com 的DNS查询结果
[app.dewu.com/2405:e000:1004:1::f3ff:4b49, app.dewu.com/203.107.32.125]

可以看到电信的LocalDNS服务器并未遵守TTL时间(app.dewu.com 的 TTL为60),而是进行了额外的缓存。这是部分运营商为了降低客户端的查询频率(降成本)而搞出的小把戏,不在我们的讨论范围内。

DNS数据包错误与重试

我们将DNS服务器设置为一个虚假的DNS服务器,来观察Android平台在DNS未返回时的重试逻辑。

23.jpg

DNS重试(主、备、隐藏款)

可以看到,0秒时向主DNS服务器发起查询,5秒向备DNS服务器发起查询,8秒向114发起查询。

现在我们想一下,在我们DNS查询时,只要0秒的第一次查询向主没有正常返回(比如丢包),即使备选正常,能成功查询到结果也是5秒钟后的事情了,而这意味着用户在5秒内无法正常的请求网络。然后,用户熟练的打开设置、点击用户反馈、选择白屏、输入些表达欣喜的文字、提交!(嘿,来活了)

那么我们能否通过多次查询来触发系统来同时发起多个查询请求呢?不行。当前Android内有一个同步栅栏,多个线程同时查询一个Host,只会允许一个通过。如果成功时,全部被阻拦的查询一同返回结果;如果失败时,再允许一个查询。也就是说,在这5秒内,我们只能静静的等着,让用户也等着。

主/备DNS服务器我们可以通过在设置中修改,而114这个隐藏款只出现在部分国产品牌上,不同品牌内置的隐藏备用DNS服务器也并不相同。

iOS平台的DNS行为

众所周知,iOS平台下的DNS异常率远远低于Android,甚至差了一个数量级。iOS为何如此优秀?

  • 较长的缓存时长。当DNS的TTL较低时(比如3秒),iOS会忽略TTL值,直接缓存1分钟以上。

  • 积极的重试逻辑。只要1秒内未收到响应立即进行多次重试,其中主DNS 6次,备DNS 8次。

24.jpg

DNS优化

通过对LocalDNS的行为分析,我们看到Android平台下的LocalDNS查询极其不可靠,好在我们并非只能通过LocalDNS来解析IP。任何将域名转换为IP的手段都可以使用,比如通过http获取、磁盘缓存等。

在LocalDNS的基础上,我们增加了HttpDNS,磁盘缓存来优化DNS问题。其中HttpDNS在第60ms异步启动,磁盘缓存在第6秒钟时异步启动。三种查询方式任意一个返回,则DNS结束。

25.jpg

HttpDNS

我们实现Http进行DNS查询,并将其作为备用DNS使用。在LocalDNS 60ms未成功返回时,异步启动HttpDNS进行查询。这将能解决LocalDNS下主DNS失败5秒后才会进行下一次重试的弊端。

HttpDNS的实现方式,我们暂时选择接入成熟的三方HttpDNS,快速解决用户在DNS方面的困境是主要原因之一。

当然,也并非全部域名通过HttpDNS查询都会有效果,比如localhost、IP地址等就需要从HttpDNS的查询中排除。

同步栅栏:当存在单个host的多个查询线程时,仅允许第一个线程查询,其他全部等待查询结果。(类似于Android系统对多线程同时查询时的处理)

磁盘缓存

DNS查询成功时,我们将查询结果缓存到磁盘上。在LocalDNS、HttpDNS都未如期返回时,将磁盘上缓存的结果返回给应用层。如此以来,只要历史上这个用户查询成功过,我们始终不会失败在DNS阶段。

需要注意的是,在磁盘上缓存IP时,需要按照网络类型、运营商进行缓存。原因是不同网络下的最佳IP往往不同,比如同一个CDN域名中国移动的CDN节点与中国电信的CDN节点会在各自的机房里。如果我们不分开存储,那么用户网络切换后,我们磁盘缓存出的IP或许可用,但可能不是最佳(延迟更高)。

此外,我们的磁盘缓存也完全忽略了DNS TTL。原因是我们将磁盘缓存作为其他DNS查询全部失败后的兜底手段使用,而非主要手段。即使TTL过期的IP可能会存在一些问题,但也不会有更坏的结果了。

收益情况

通过线上实验观察到,DNS异常率降低了60%以上。

26.jpg

不同配置下的DNS异常率对比

IPv6故障修复

前文提到对于双栈客户端,Android会将IPv6地址放在前面返回给应用层。本意上,IPv4地址即将枯竭而向IPv6过渡的方式,而这恰恰是Android平台在TCP建连阶段时遇到的最大问题。

27.jpg

用户A-DNS结果

我们来看一个例子,用户A访问 cdn.poizon.com 是DNS共响应了10个IPv6、10个IPv4,然而此用户IPv6无法访问,且给个IPv6都是建连10秒后超时,最终导致用户在第100秒时才在第11个IPv4地址上成功。

28.jpg

RFC6555 摘要

正如 RFC6555 摘要中描述的那样,当服务器的 IPv4 路径和协议正常,但IPv6 路径和协议不工作时,相对于IPv4单栈客户端,双栈客户端会经历显着的连接延迟。而这个延迟通常是10秒以上(IPv6的个数和建连超时时间的乘积)。

那么如何优化?

最简单的方式是禁用IPv6,简单到甚至只需要运维动动小手即可。但是由于众所周知的原因,我们国内对于推动IPv6十分积极,对于IPv6的浓度动不得。

最合理的方式自然是按照RFC6555描述的那样实现快乐眼球算法,但是开发成本和风险都较大。而线上时而有类似反馈。因此我们决定分两步走,先上线低风险的IPv6探测&重排序解压此困境,再实现快乐眼球算法。

OkHttp5.x 已支持RFC6555,但是目前尚未正式发布。且得物历史上对源码的修改较多,整体迁移到5.x成本较高。

IPv6探测&重排序

此实现的思路是既然IPv6可能故障,那么提前探测潜在故障。通过调整即将建连的IP列表的顺序来解决客户端建连到IPv4的延迟问题。

此实现在DNS查询成功之后,建连之前。因为不涉及修改OkHttp源码修改所以风险可控。

IPv6探测

如果IP列表中同时包含IPv6&IPv4,则对第一个IPv6地址同步进行Ping探测。如果250ms内探测成功或曾经探测成功,则认为IPv6正常。

重排序

如果IPv6畅通,则按照IPv6优先进行交叉排序。如果IPv6故障,则按照IPv4优先进行交叉排序。

# 重排序前
[
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:13",
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:10",
    "imagex-cdn.dewu.com\/183.240.183.19",
    "imagex-cdn.dewu.com\/183.240.183.15"
]
# 重排序后(IPv6探测失败)
[
    "imagex-cdn.dewu.com\/183.240.183.19",
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:13",
    "imagex-cdn.dewu.com\/183.240.183.15",
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:10"
]
# 重排序后(IPv6探测成功)
[
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:13",
    "imagex-cdn.dewu.com\/183.240.183.19",
    "imagex-cdn.dewu.com\/2409:8c54:b010:b:8000:0:b00:10",
    "imagex-cdn.dewu.com\/183.240.183.15"
]

29.jpg

IPv6探测&重排序 流程图

快乐眼球(HappyEyeball)

当前DNS返回的IP地址数量超过一个时,每250ms异步启动一个新的TCP建连,任意一个TCP建连成功,则断开其他TCP并开始同步TLS建连。

TLS 建连成功则返回此Connection,流程结束;TLS 建连失败时,如果是可恢复的TLS失败(部分SSLException),则立即重试;如果是不可恢复失败,则再次启动其他TCP的竞速。

核心修改点是原流程的建连部分。原流程中,在网络线程中同步的、依次进行TCP、TLS建连。新流程中,将TCP与TLS建连分开,竞速建连TCP,TCP建连完成后建连TLS。

  • OkHttp3.x 建连流程

30.jpg

OkHttp3.x 建连流程

注:OkHttp3.x 的nextRoute之间的循环在RetryAndFlow实现

  • OkHttp-HappyEyeball建连流程

31.jpg

OkHttp-HappyEyeball建连流程

具体实现方式可以参考OkHttp5.x 代码

收益情况

自IPv6优化上线后,再无相关IPv6相关用户反馈。

六、CDN质量问题治理

从白屏监控大盘中可以看到,CDN的问题可能只占据1%~2%,但是不同于通用网络问题,用户凭持着其他App可以用,但是得物App为什么白屏的疑问,是极容易引起线上反馈的一种case。故我们也是协同SRE团队、云厂商一起做了一些优化手段,力争在现有条件下将端侧的图片CDN质量调整到最优。

返回IP策略优化

从网络优化来看,DNS优化以及IPv6探测&重排序为我们解决了双栈IPv6问题、单IP不可用等问题,但CDN问题本身由于不同省份、不同区域等节点数量、网络硬件质量均存在差异,这部分是端侧无法弥补的,故我们想到了优化CDN返回IP策略的思路来规避以上问题。

32.jpg

返回IP优化策略

过程中考虑到得物IPv6浓度问题,最早期是返回了3个v4 IP、3个v6 IP的策略,但发现v6 IP数量变多后,由于LocalDNS天然会把v6 IP排放在v4 IP前面。此举在没有建连竞速优化的老版本下,会导致v6不通的建连时间被逐步拉长30s。故我们在尽可能保证v6浓度的情况下,将返回的v6 IP数量降低到了2个。

由于v6 IP优先请求的情况,我们考虑优先保证v6 IP的本省同大区覆盖,故对v6 IP的本省的大区返回粒度会比v4 IP更细些。

  • 跨省调度问题

针对v4 IP本省2个大区至少返回2个IP
针对v6 IP本省1个大区至少返回1个IP

  • 单ip返回、v4不返回问题

针对v4 IP至少返回3个
针对v6 IP至少返回2个

云厂商优化策略

为了保证图片CDN的节点质量,我们积极同CDN厂商进行沟通协作,进行了部分优化尝试。

图片专属节点

将原有云厂商的图片、视频、文件等通用节点,迁移至图片专属的L1节点,最大程度保证图片请求稳定性和效率。

33.jpg

H2协议栈优化

过去发现请求耗时增大的一个case是H2弱网阻塞,在低质量的网络环境下使用HTTP/2协议时可能遇到的性能问题或阻塞问题。

云厂商均多次调整了H2协议栈的算法优化逻辑,并对比了优化前后的慢请求监控情况。

  • 观察调整省份节点水平,调整后平均耗时下降15%、慢请求率下降23%左右。

34.jpg

请求耗时大于5000ms的优化情况

节点动态剔除细化

我们针对云厂商的到端链路监控以及白屏用户反馈的潜在非到端问题,通过平台归因1min内的CDN请求 & 网络诊断的情况,并经过人工确认为CDN单通问题后,进行节点剔除切换,优先处理节点抖动带来的影响面问题。

  • CDN节点的可用性探测判断节点持续抖动并最终剔除的时效在15min内;

  • 白屏反馈用户的sop应急响应剔除时效从2~3小时降低到30min内。

35.jpg

CA证书问题

除了建连阶段的问题外,TLS等证书认证问题上也有较多的用户反馈,同时白屏平台也有较多类似的错误。

36.jpg

37.jpg

历史为了优化SSL耗时过长、证书认证安全等问题,接口、图片域名均开启了ocsp的功能,但实际监控发现部分用户存在本地时间不对齐的情况,即超过了CA证书 ocsp校验的有效期(一般7天) 或者超过了域名的证书有效期(一般2年)。此类用户会导致所有图片请求均被证书拦截而无法完成请求最终引发白屏。

ocsp问题

  • TLS耗时开启前后并无实际收益,对于网络耗时的优化可忽略不计;

  • 证书的安全性问题,由于图片域名访问为CDN资源非接口核心信息,关闭风险可控;

  • 对比主流站点的ocsp开启情况,主流App的图片域名大多未开启。

38.jpg

ocsp的当前时间和下次更新时间

故我们最终关闭了图片域名的ocsp功能,整体请求异常数、请求耗时并无劣化且图片ocsp的问题反馈数逐步清零。

域名CA证书替换失效问题

得物目前有100+的域名,CA证书的申请对于CA机构来说,一般在证书有效期小于30天时会进行新证书的签发流程,且证书有效期以申请期时间为准。但过往的证书有效期更新替换后,往往会面临时间前置的用户无法通过CA证书校验,最终引起用户白屏。

39.jpg

我们协同运维侧制定了较为严格的图片域名证书更新时效期,并在多个主域名按此标准落地。

40.jpg

  • 证书30天到期自动告警能力,及时跟进证书审批事项;

  • 证书替换选择在有效期提前3天,避免无规律的申请即更新的情况。

七、总结

网络问题作为用户白屏的主要原因之一,如果不能及时针对性的优化将对大量用户产生困扰。我们在以解决用户白屏为目标的行动中,逐步完善了客户端网络监控、云端CDN监控。并在此过程中完成DNS、建连、证书、运营商调度等方面的优化,杜绝了某些特定错误的发生,保障了更多用户的网络体验。

近期我们会继续推出一篇介绍如何在客户端监控白屏问题,以及平台如何对白屏问题自动化归因的文章,敬请期待。

*文 / 厉飞雨、GavinX、Jordas

本文属得物技术原创,更多精彩文章请看:得物技术

未经得物技术许可严禁转载,否则依法追究法律责任!

相关推荐

压测AI Agent 治理与评测调优实践|得物技术

本文介绍智能分析Agent在压测调试中上线后的治理闭环建设:通过Langfuse记录完整执行链路,结合用户反馈与Trace还原问题根因;利用CLI Mock固化证据数据集,实现相同场景下的回测验证。基于固定案例与五档评分机制,持续评估方案质量、延迟与成本,确保修复有效且无新问题引入,推动Agent能力迭代优化。

SmartCodeTech的博客 309

从中心调度到自驱协作多 Agent 架构的三次反转|得物技术

本文探讨多Agent系统中的控制权分配问题,提出三大协作架构:Master Agent(中心调度)、任务看板(共享状态)与Advisor(轻量咨询)。通过划清上下文边界与模型边界,强调应以信息相关性而非职业标签划分Agent。三种模式分别将决策权集中于中心、下放至共享状态、再下沉至执行者,形成控制权逐步下沉的演进路径。案例显示,合理设计可提升复杂任务的并行性、弹性与可维护性。

SmartCodeTech的博客 420

Jev 实战:为AI工作流引入轻量决策层 x10倍提速|得物技术

完成这三个场景后,我对适用边界有了更明确的认识:它们都可以先定义答案范围,再根据判断结果驱动下一步操作。接入时,我会优先明确输入、选项、采纳条件和兜底路径,再评估Jev是否适合承担这一环节。结合这些实践,我更容易理解Jev(TypeSafe System One)作为专用结构化决策模型不生成自然语言,而是返回带概率的判断结果。后续接入时,我会继续从脚本中边界明确的判断任务开始,分别验证准确性、耗时和费用,再决定是否扩大使用范围。下面整理了相关能力、限制和接入要点,便于查阅。

SmartCodeTech的博客 345

国产算力·昇腾 910C 大模型推理优化(下):源码修改与算子优化,提速30%|得物技术

本文延续上篇,深入vllm-ascend源码优化:通过多流重叠实现MoE共享专家并行计算,消除冗余事件开销,并解除与FUSED_MC2的互斥限制,实现c=1下TPOT从8.2ms降至8.0ms;优化decode阶段host侧开销,引入状态跟踪跳过冗余拷贝;设计Block Table CPU快路径,规避小batch下NPU kernel启动延迟;针对GDN层融合L2Norm至recurrent kernel,减少算子调用与内存往返。综合优化后推理性能显著提升,形成可复用的昇腾910C大模型推理优化方法论。

SmartCodeTech的博客 245

国产算力·昇腾 910C 大模型推理优化(上):镜像更新与参数调优,提速 40%|得物技术

文中详细给出每一项优化的动机、实现(含具体源码改动路径与关键代码片段)、验证数据与踩坑记录(包括十余项实测无效或负向的尝试),希望为同样在国产算力上做推理优化的团队提供一份可直接复用的工程参考。

SmartCodeTech的博客 225

动态规则的 Agent 实践:用确定性工程驾驭 LLM 的资产智能验收

面对财务验收中规则多变、材料非结构化、核对复杂等痛点,传统规则引擎难以应对。系统采用“规则即配置”思路,由大语言模型(LLM)负责理解合同、扫描件等非结构化材料并执行语义比对,工程系统则保障流程编排与可追溯性。通过异步处理、幂等设计、三类流量隔离及双通道(文本/图像)处理,实现高效稳定运行。结合用户反馈构建自动标准答案,辅以试跑、回测与发布门禁机制,形成闭环质量体系。底层采用确定性工作流架构,确保行为可预期、可测试,真正实现灵活规则的快速迭代与安全上线。

SmartCodeTech的博客 344

发一张图,它居然“跃“出屏幕了?一文读懂得物 3D 空间图片技术实践

3D 空间图片功能的落地,涉及模型生成、内容分发、客户端渲染之间的一系列取舍。本文重点分享如何生产出高质量、小体积的模型,以及如何在手机上流畅运行。

SmartCodeTech的博客 555

别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?

你搜"af1",它得给你"空军一号"。这一年,得物交易搜索把召回从"做选择题"改成了"写答案"——不再从商品池里"找"最像的,而是让模型自己"生成"你真正想要的。从 LLM 语义索引到 HLLM、语义 ID,搜索是怎么从"检索"走向"生成"的?

SmartCodeTech的博客 594

指标平台:从语义底座到智能消费的实践路径|得物技术

这篇文章想做的,不是在本体化的宏大叙事上再叠加一层理论,而是把我们在真实落地中验证过的路径讲清楚:语义底座怎么从零建立起来、怎么保证质量不失控、怎么支撑 Text2SQL 和 AI Coding 两条消费主线,以及沿着这条路径往前走,下一步该往哪个方向发力。

SmartCodeTech的博客 316

企业级 MultiAgent 落地:Plan 模式与主子 Agent 协作|得物技术

基于 AgentScope Java 的企业级 MultiAgent 平台,为研发、数据分析和知识问答等场景提供统一的模型调用、工具接入、任务编排、流式输出与运行追踪能力。

SmartCodeTech的博客 302

得物小摊 AI Native 演进实录:用 Harness 构建可控 AI 交付

AI Coding 一个人用很顺手,进了团队就漏:指令没人审、经验难沉淀、过程看不见、链路不闭环。作者团队基于 Multica 做了 EP-Harness,把 Agent 当成员管,给它套一层可执行、可观察、可治理的 Harness,并让反馈闭环。成果:可追溯决策、多 Agent 协作,高频异常从每 4 小时 2400 多条降到个位数,对得物技术补上团队级 AI 协作关键一环。

SmartCodeTech的博客 542

企业级 MultiAgent 的记忆系统:短期上下文与四层记忆架构实现|得物技术

在 MultiAgent 平台中,Agent 的"记忆"能力是实现智能对话和个性化服务的核心资产。本文深入剖析 Agent 记忆系统的设计理念与实现细节,重点解析长期记忆架构的写入与加载流程,涵盖 LLM 智能判断、语义检索、Token 预算控制、冲突处理等关键技术,为开发者提供完整的技术实现参考。

SmartCodeTech的博客 502

EP-Harness:从个人 AI Coding 到团队级 Agent 工作流|得物技术

AI Coding 个人用得爽,一到团队就崩。EP-Harness 把 Agent 从聊天工具变成团队协作成员——可管理、可追溯、可闭环。落地后高频异常从 2400+/4h 收敛到个位数。

SmartCodeTech的博客 694

得物知识问答:复合检索 Agent 的系统设计实践

从"搜到什么用什么"到"搜→筛→挖→验"自主决策闭环——我们造了一个有判断力的 RAG Agent,不是套壳。

SmartCodeTech的博客 734

实战从零开始构建一个Coding Agent:Violin |得物技术

理解了 coding agent 的构建原理,也就掌握了理解其他 agent 的一把钥匙。笔者对每天都在使用的 agent 原理很感兴趣,于是决定自己写一个:violin。

SmartCodeTech的博客 927

AI Native 交易核心系统的研发范式|得物技术

如何改造旧研发流程适配 AI 编码?本文提出五道标准化关口治理思路,依托 Claude Code Spec-Driven 插件打通需求澄清、方案设计、TDD 落地、门禁管控与埋点监控,构建带人工确认门控的完整工作流,以五层自底向上架构实现 AI 编码规范化落地。

SmartCodeTech的博客 975

推荐系统体验的数字化突破:得物自动化评测平台的技术实践|AICon 文章整理

「得物推荐 AI Harness 工程化实践系列」的末篇内容,本系列共三篇连载。本篇(末篇)详解得物推荐评测平台的完整技术体系:从主观体验量化到大模型自动化评测流水线,涵盖多维度指标设计、人机协作提示词校验闭环、分布式任务调度与成本精控等核心工程实现,以及单周百万级审计需求下实现 91% 资源成本优化的工业级落地实战细节。

SmartCodeTech的博客 1494

RAG 核心概念与原理:Chunking、Embedding、相似度、HNSW 与多路召回|得物技术

决定 RAG 效果的关键不在大模型,而是文本切块、查询改写、多路召回与精排。合理切块存好知识库内容,向量匹配抓语义、BM25 匹配关键词互补。先优化用户提问,快速召回一批相关文档,再用精排模型精细筛选,整套检索流程配合到位,问答准确度才会明显提升。

SmartCodeTech的博客 1079

从“机械应答“到“服务伙伴“:得物高可控智能客服的 Agent 工程实践|AICon 演讲整理

本次分享围绕以下核心技术展开:客服 Agent 挑战与架构设计(Single-Agent→Multi-Agent→Harness);高可控性数据飞轮(PE 自动化 + DPO 训练);RL 策略训练和人工经验对齐;多轮半双工消息流控制。

SmartCodeTech的博客 750

得物推荐系统诊断 Agent:从 “调接口” 到 “会思考”|AICon 演讲整理

本文是得物技术专家在 AICon 上海演讲整理的技术实录。AICon上海2026_全球人工智能开发与应用大会暨大模型应用生态展_InfoQ技术大会「得物推荐 AI Harness 工程化实践系列」的中篇内容,本系列共三篇连载。本篇(中篇)进一步详解得物推荐复杂业务场景下,AI代码从生成、防护校验到安全上线的完整技术体系、自研AI Harness整体架构框架、全流程安全防护机制、混合智能体核心算法实现,以及工业级工程落地的实战细节。

SmartCodeTech的博客 1364

得物 OceanBase 落地实践

得物选型OceanBase多模数据库应对业务挑战,通过验证其高可用架构、存储压缩技术及混合负载处理能力。测试显示OceanBase在复杂查询场景性能较MySQL提升130-200倍,在高并发TP/AP混合场景表现优异,存储成本降低40%+。通过DBA内部报表业务试点验证其稳定性后,逐步推广至核心业务场景,优化数据库技术栈,实现性能与成本的双重收益。

SmartCodeTech的博客 1383

AI UITester:AI Native 的 UI 自动化测试新范式|得物技术

ai_uitester 代表了 AI Native 的 UI 自动化测试新范式:这不仅是工具的升级,而是测试范式的转变 ------ 从 "代码驱动" 转向 "视觉驱动",从 "人工调试" 转向 "AI 自愈",从 "三端分离" 转向 "统一抽象"。

SmartCodeTech的博客 779

从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理

本文是得物技术专家在 AICon 上海演讲整理的技术实录。「得物推荐 AI Harness 工程化实践系列」的开篇内容,本系列共三篇连载。将系统拆解得物推荐复杂业务场景下,AI 代码从生成、防护校验到安全上线的完整技术体系,逐一详解自研 AI Harness 整体架构框架、全流程安全防护机制、混合智能体核心算法实现,以及工业级工程落地的实战细节。本篇(上篇):将整体介绍团队自研的 AI Harness 体系,包括建设思路、全生命周期防护机制、混合智能体架构及落地效果。

SmartCodeTech的博客 1082

从表单到 Agent:得物社区活动搭建的 AI 实践之路

一场营销活动从策划到上线,运营要在三个系统间跳转 10 + 次、填写 40 + 个字段。我们用 AI 重新设计了这条链路 —— 从 “AI 帮你填表单” 到 “两阶段 Agent + 聚合工作台”。这篇文章记录的不是技术细节,而是这条路上的选择和反思。

SmartCodeTech的博客 744

从埋点需求到规则资产:Hermes Agent 重构得物数仓工作流

埋点和指标需求中,消耗数据承接方的不是生成答案,而是补齐证据链、对齐历史口径、识别下游影响,并在生产写入前留下可追溯的确认记录。本文数据承接方指承接业务需求的数据同学或业务合作伙伴;后文讨论内部研发、元数据、查询和门禁能力在流程中的角色。

SmartCodeTech的博客 656

让 Claude Code 拥有自我进化和记忆系统|得物技术

本文记录了为 Claude Code 构建的一套持久化记忆与自我学习系统的设计思路与实现细节。这套系统让 AI 助手能够跨越会话边界记住用户习惯,并在每次对话结束后自动提炼行为规律和系统信息,通过向量检索快速提取关键信息,下一次对话时主动应用,逐步进化为更懂你的编程伙伴。

SmartCodeTech的博客 994

用 LLM Agent 重构告警排查流程|得物技术

告警排查需频繁切换日志、APM、链路追踪等多个平台,耗时 10~30 分钟,且高度依赖个人经验。我们做了 Troubleshooter——用 LLM Agent 自动完成数据采集、根因分析和处置建议生成。上线后中位数排查耗时从 20 分钟降到 4.4 分钟,覆盖 11 个服务和 10+ 种告警类型。

SmartCodeTech的博客 1008

HorizonVault 技术深潜:如何在 HDD 上做出 100GB/s+ 级大吞吐分布式存储|得物技术

HorizonVault是一款面向Kafka远程存储的高吞吐分布式存储引擎,通过分布式并行写入和状态感知调度解决冷数据存储的三大核心问题:吞吐瓶颈、性能抖动和恢复能力。系统采用分层架构,Meta负责全局资源调度,Broker处理请求路由,Store实现本地磁盘管理,形成完整的写入治理链路。通过将HDD磁盘提升为一等资源,实现顺序追加写入、多盘并行和慢盘隔离,在保证高吞吐的同时控制延迟。存储结构采用DiskStore组织磁盘资源,LogSegment顺序写入数据,IndexSegment定位读取,Change

SmartCodeTech的博客 892

Claude Code Harness 工程:数仓侧落地方案|得物技术

Harness 工程通过职责分层实现研发流水线可靠性提升。Claude 负责需求理解与代码生成等语义层工作;hooks 负责规范检查等确定性执行;Subagents 隔离血缘查询、自测等高 token 操作;Memory 承载跨会话状态持久化。四层协同使数仓 AI 开发从"对话式辅助"转变为"规则驱动的自动化流程"。

SmartCodeTech的博客 1101

BP Claw 破解 AI 编码输入难题 ——FlinkSpec 需求智能化实践|得物技术

本文为 FlinkSpec 系列之开篇,亦是这场工程化变革的序章。BP Claw 所立之处,不过链路之源。FlinkSpec 所图,乃以 AI 之力,将实时数仓从需求落地至验收上线的全程工序,熔铸为一套精密自洽、生生不息的智能工程体系。宏图未竟,后续系列将逐章揭幕,敬请期待!

SmartCodeTech的博客 1039
上一篇: 利用多Lora节省大模型部署成本|得物技术
下一篇: 浅析JVM invokedynamic指令和Java Lambda语法|得物技术
得物技术
得物技术 得物技术官方账号 得物技术官方账号
博客等级 码龄6年 2492粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值