当前位置: 首页 > 科技观察

【NCTS峰会回顾】京东物流范宇:如何让送货地址更精准——带你走近京东物流大数据算法测试之路_0

时间:2023-03-19 18:02:21 科技观察

2019年10月26日,由Testin主办的第二届NCTSChina云测试产业峰会在京召开。本次峰会以“AI+未来”为主题,汇聚国内外检测领域知名专家学者、企业决策领导者、高层技术管理者、媒体从业者等,共商高新技术端云测试技术,帮助测试从业者了解最前沿的行业动态和最新的行业实践。会上,京东物流高级测试开发工程师范宇做了主题演讲《如何让配送地址更准确——带你走近京东物流大数据算法测试探索之路》。范宇指出,“做算法测试,首先要建立算法测试模型,然后获取真实有效的历史数据,然后完成算法相关接口的调用,最后完善我们的测试流程。”以下为范宇演讲实录:大家好,我先做自我介绍。我来自京东物流。我是2013年加入京东的,我们的大数据算法测试是在2016年底和2017年初开始逐步开始的,一开始我们也做了一些自动化测试,UI自动化,界面自动化,自动化测试工具平台,数据集成。今天给大家分享一下大数据算法的测试。先介绍一下目录吧。第一部分是项目背景,第二部分是算法模型的建立,第三部分是测试数据的获取,第四部分是算法测试执行过程,然后是总结,主要分为几个部分.首先,让我介绍一下技术背景。从去年年底开始,京东快递逐渐开始支持微信小程序下单。原来是JD。快递”,小程序界面有自动提取关键词的算法,可以将整个地址复制到微信小程序中,然后提取地址信息、电话号码、通讯录。这个过程可以减少手工输入的过程。提升我们的用户体验,因为大家的地址是共享的,比如从一个应用复制过来放到另一个应用中,非常方便。这是一个截图。这是我们系统的界面。输入地址后,系统会自动提取姓名、电话号码和详细地址。这是我们的项目背景。下面说一下算法模型的建立。前面的介绍讲的比较快,这部分稍微慢一点。我们假设收货地址是一个很长的字符,S2,S2到S7是一级地址,二级地址,S6是姓名,S7是电话号码。这个模型是如何建立的?算法测试通常需要建立模型。左边的部分是经常用于算法测试的模型。例如,第一个是准确率和召回率。如果你做搜索相关的测试,你就会有所了解。准确率和召回率大家都知道。比率是一个真值表。例如,期望为真,实际为真,期望为假;实际是错误的事实是准确性的情况。召回率是我期望结果为假,但实际上结果为真且预期结果为真,而实际结果为真,即部分结果为真值的情况。这就是召回率。下一部分的概率,很多算法都是通过概率来衡量的,最后一部分是余弦相似度,这个在很多算法测试中用的比较多,因为余弦相似度是衡量高倍向量的结果,会有很多维度,我们衡量两个向量之间的大部分差异,通过余弦相似度来比较。当然,不限于文本的比较,其他的也是可以的。既然是算法模型,我们就需要考虑什么是分子?分母是什么?让我们回顾一下左边的四个统计模型。他们的结果都有一个特征,就是0到1之间的一个数。想象一下我们的分子是怎么构造出来的?分母是如何构造的?让我们回到刚刚提到的技术背景。我们测试算法的应用实际上是跨域的。现在经常用的新词是跨界的。一是自然语言处理,二是地理位置服务。这类似于一般算法。考试不一样,它跨越了这两个领域的界限。大家都知道,跨境这种东西一般都比较难,可能和我们平时的考试有很大的不同。一开始我们会得到用户的地址,我们可以把它作为测试的初始数据。地址有两部分。第一个地址是发送地址,第二个是接收地址。从功能测试的角度来讲,我们可以把地址倒过来,接收地址也可以作为发送地址,这样可以增加测试覆盖率。下一步涉及地理编码的概念。如果了解LBS测试功能,就应该知道geocoding的概念,一种是正向geocoding,一种是reverse。正向地理编码就是说如果我给你一个地址街道门牌号,它会生成经纬度坐标,另外一个就是给你一个经纬度坐标,给你最近的地址。我们将计算这两个作为地理编码。然后我们会得到相应的坐标。根据坐标,我们可以计算出距离。要知道距离也可以用最简单的方法计算,就是计算两点之间的距离。我们也使用这种方法。相对来说,这个模型比较简单。但是我们需要衡量转换后的坐标是否准确,或者原地址转换是否有问题。如果地址转换不好,就会有差异,距离会达到几公里甚至几十公里,所以我们转换计算距离,计算出一个阈值,低于这个阈值是可以接受的。我们继续,我们会统计计算正确转换的地址的个数,也就是有多少个地址转换正确,这个就是我们刚才说的分母,同时我们也会做一些过滤,也就是计算出正确转换的地址在地址数的匹配范围内被错误转换。因为我们刚开始的时候,京东配送是不支持全国的,现在全国都支持了。当时只在北京、上海等部分地区支持,超出范围就不支持了,所以要排除这部分数据。最后,我们再来看看这个数据。我们用召回率来统计,看看有多少东西在地址转换上有问题。这就是我们算法模型的建立过程。算法测试通常不同于我们的功能测试。功能测试是我们自己创建的所有数据,比如订单数据,一些商户的数据,以及其他数据,或者在给定的原型中使用一些数据进行开发。.但是算法测试往往是用在线历史数据来做的,所以我们会涉及到第三部分的内容,即测试数据的获取和提取。这个PPT大家不是很清楚。第一框是“历史数据”,左边是“运单数据”,中间框是“小程序日志数据”,最后一部分是派送员PDA日志。因为我们有发货运单数据,所以我们会把运单数据中所有有效的地址都取出来。刚才说的运单里面有两个地址,一个是收货地址,一个是收货地址,而且因为我们已经正式提交了,地址肯定是有效的。当然这个数据不是我们小程序里面的,而是京东里面的一些原始历史数据。然后再说PDA部分,收集同一用户在较短时间内地址变更的行为。为什么说是同一时间段内的小时间呢?也就是说,当用户输入地址时,输入可能是错误的。大家会想到的一个情况就是,本来是家里的地址,居然要输入公司的地址。设置一个时间间隔,例如地址在一小时或两小时内更改。此外,更改行为可能意味着之前的地址输入错误,我们将使用它作为输入数据。最后一部分是送货员的PDA日志数据。发货时也会有经纬度坐标定位。我们将把这个经纬度坐标作为我们用户的输入。需要再次强调,派送员取件时有异常数据。例如,用户下错了订单。本来应该寄到A地址的,结果是B地址,这时候会打电话叫派送员去B地址取包裹。这时候PDA就有了找零记录,送货员在寄件的时候也会出现上述类似的行为,我们就把找零记录作为我们的输入数据。在我们的实践中,取用户的地址数据是比较复杂的。我们再考虑一下中间遇到的新问题,如何转换新地址的地址,在前面的S中对地址进行分段。这其实和我们经常使用探索性测试很相似。每个人都想在原有项目的基础上,找出是否存在潜在的问题。因为很多时候,在测试开始的时候,在我们介入之前,我们是根据之前用户反馈的问题来开发发现一些问题的,找一个解决一个,所以效率比较低,体验也不是特别好。因此,我们最重要的一点就是处理新地址。您可以想象新地址实际上有两个来源。该包不受支持但现在支持,属于新的分发区域。还有一种情况更长更复杂。支持此送货区域,但添加了新地址。比如我所在的地区,北京朝阳区是支持的,但是这个地区新建了一个社区,社区是新的。在后一种情况下,您可以考虑如何解决这个问题。这就是我们这次要讲的核心内容,就是生成新坐标的情况。我们其实就是用这个极坐标来解决这个问题。您可能还记得上学时的极坐标概念。这与传统的笛卡尔坐标不同。一个坐标代表距离,另一个代表角度。我们将用户的所有地址聚类。聚类后??,我们将以聚类的质点为圆心。我们会用两个循环生成一个新的地址,然后再过滤,用这些地址得到可以投递的地址,因为有的时候生成的逆向地址是不能投递的,比如某个街道路口或者公交车站,我们需要把这些过滤掉,然后做去重,比如一个半径几公里的小区,就去重这个。我们在测试小区的时候,会精确到每栋楼,不需要精确到单元和楼层,因为这个对于地址来说其实是一样的。这部分就是我们说的比较重要的部分,也就是算法测试执行的过程。首先,先获取历史数据,取出历史地址和坐标,然后进行地理编码,根据地理编码计算坐标聚类,最后进行有效去重,去重后进行逆地理编码计算,然后生成新的严格来说,蓝色部分属于我们其他测试的测试准备阶段,就是创建数据,但是我们的数据是基于真实数据生成的。让我们看看正确的部分。这其实就是我们实际测试执行的过程。我们将这个地址作为分词,我们会添加噪音和冗余信息,比如添加姓名和电话号码,然后调整地址识别和转换的接口。比较期望值,然后根据期望值生成geocode,然后比较我们的距离。如果距离大于阈值,则存在问题。如果小于阈值,则没有问题。这是我们整个测试过程的执行。让我专注于中间过程。例如,让我谈谈集群。如果您对方法测试有所了解,那么您应该有所了解。例如,普通聚类就是均值聚类。我们不使用均值聚类,因为数据量比较大。大的。结合业务特点,京东配送站有一个经纬度坐标,我们用这个经纬度坐标作为初始聚类点。然后使用这个半径内的坐标来形成集群。如果坐标不满足集群内的数据量要求,则将两个配送站的地址合并。如果满足我们的要求,比如我们的簇需要10000个坐标点,如果超过10000我们就终止,聚类就结束了,然后把簇的元素从大到小排序取前N个值,最后根据粒子生成极坐标,这就是我们的聚类过程。地址转换算法是算法测试,那么如何提供类似缺陷列表的内容呢?每个人都想让我做一个功能测试。不管是手动测试还是自动化测试,经过一轮测试都会出现一些bug。我们提到了缺陷管理系统,但我们的算法测试可能最终只是一个数字,比如召回率80%或90%。%,但是没有缺陷的一般不会被产品、开发和测试本身喜欢。怎么才能提供这种类似于缺陷列表的功能呢?我们来看看怎么做,取这些历史记录中出现次数最多的前N个坐标对应的地址,然后取距离较大的前M个。前M个坐标必须大于阈值,然后我们在前N个中选择出现的前M个地址,相当于一个TOPN问题。我们会和工程师核实,如果有什么问题,我们会在缺陷系统中作为缺陷发布或者直接发邮件带表格,因为缺陷很多,一轮测试发现几百个,然后提供给开发,开发依据查看缺陷列表,看是程序问题,数据问题,还是其他配置导致的问题。这比仅仅通过或不通过召回率要好,而且很有说服力。我们再看另外一个问题,如何生成输入参数,后台是一个接口,输入一个地址从S1反馈到SN的地址,如果我们加一个噪声点呢?这是我们的做法。如果我这里有地址,北京市丰台区范阳路,我为什么要去这里?这里有一个坑,后面会告诉大家。做个分词吧,北京/丰台区/范阳路。因为我姓范,可以把我的名字加进去,就是黄色的。范阳路范宇后面的号码和我的手机号码是多少,这个模拟用户真实的收货地址或者取件地址,系统判断,因为都是范,但是里一不一样,一个是街道,另一个是姓氏,它增加了一种测试噪音。也有位置颠倒的情况。名字写完后,直接输入手机号,最后输入门牌号,因为我们在log中也看到了这种情况,就是顺序不一样,我们就把顺序倒过来。在这种情况下也会有一些噪音。最后一部分噪音,我们对应一个写字楼或者住宅区,我们把这些具体的地址换成住宅区的一些建筑物。用户经常使用这种邮件,其实就是一个地址,只是表现形式不同而已。一样,最后换成这个表格。大家可以看一下黄色文字的部分,相当于增加了噪音,这样可以增加我们转化率测试的覆盖率,更好的发现转化算法中潜在的问题。其实我们的做法是提取一些涉及街道的姓氏,然后根据姓氏随机生成一些名字。如何加快我们的测试执行过程?我们在这方面使用了一些并行计算,因为我们使用并行计算还有一个原因。地理编码操作和反向地理编码操作将花费很长时间。一个地址的反向地理编码大约需要几百毫秒,积累起来会很多,所以我们使用并行计算来读取历史数据。缓存中存储的信息不足。地址可能重复。如果有缓存,我们不需要调整接口,直接获取缓存中的数据,可以放在数据库等地方。最后我们计算召回率得到我们需要的结果,这样可以加快执行速度,在调试过程中只需要执行一两次就可以了。在实际运行时,我们使用并行计算来运行。最后,我们将向您介绍算法测试方法。这是我们团队的理解。一般来说,任何算法测试都需要先建立算法测试模型。像我们一样,我们使用召回率计算。其他人可能有不适当的召回率。使用余弦相似度。第二部分,我们获取历史数据,是真实有效的数据,用它来进行回归测试,可以反映有算法和没有算法情况的前后对比。第三部分是算法相关的接口,但是有些算法可能会调整其他外围接口,可能同时存在上下游接口,所以需要考虑这方面。最后一部分是改进我们的测试过程。我们刚才讲的如何生成新的坐标,是我们改进的一个过程,也是一种创新。另外就是怎么增加噪音,属于我们测试流程的改进。这部分将为您介绍。我想很多公司已经开始,或者逐渐想要从事这种算法测试。算法测试需要什么样的基础?让我给你一个简短的总结。第一部分是要有数学基础。我们案例中涉及的极坐标和距离都是数学技巧。你不一定了解开发算法。这是一个纯黑核,但是需要对自己的算法有一定的了解。即算法模型的建立、召回率的计算、分母和分子如何选取,都需要考虑。第三部分是自动化接口测试。我觉得很多团队都有这个能力,因为界面比较快,基本不涉及UI。实际测试和数据采集都是通过接口触发的。第四部分是并行计算能力。您可能需要多线程、多进程和分布式计算能力来提高测试速度。因为不可能说一天没有完成一次试运行,因为有很多开发需要等待上线。还有就是我们要有数据挖掘的能力,就是我测试的这个东西需要从哪里得到数据,我要转换成什么样的数据,这个是需要知道的。最后一部分,我个人认为所有测试需要掌握的一个东西就是业务场景。不同业务场景的测试侧重点不同,导致我们使用的一些算法模型和一些结果存在一些差距。以上几点是大家在算法测试中的一些期待。最后一部分是展望未来,因为我们现在是做离线测试,所以我们以后会搭建一个在线测试环境,就是完全放到线上,用我们的CI/CD和数据集成的方式来做说完这些,我们准备在运营期间测试超区,因为现在京东配送基本支持全国,但是有超区的情况,说明配送有问题。它非常接近,但是分配这样会导致运行效率降低。我们会做一个京东第三方地址转换测试,作为取货地址。因为京东物流也会接触到很多商家,其实都是属于第三方地址的。最后两部分是非大陆地址,也就是国外地址,因为京东物流有很多国际业务,因为国外的地址和国内的不一样,因为大部分都是英文的,分子系统和我们的不一样,这将在未来需要。干预。最后一部分就是我们要降低我们人工识别的比例,因为现在很多东西还是人工识别的,有时候计算的门槛可能会很大,但实际上情况可能是正常的,比如有一个河,河上有好几座桥如果要过河取包裹,必须要过桥,过桥的距离会很远。这时候就需要人工识别了。以后我们会通过其他方式来降低人工识别的难度。以上就是小编分享给大家的。