说说唯一ID与CAS|得物技术

一、从数据的唯一标识开讲

数据区分与标识表现

数据和算法组成了我们现有的应用软件,当然互联网应用也不例外。为了区分应用系统收集和运行所必要的这些数据,我们通过各种方法,来组织其存储形式,方便其为我们所用。从数据结构、文件、到专业数据库等工具,无一不是方便数据存储和访问的利器。

但无论如何,我们对数据存储,都要通过唯一的标识来对其进行区分,以确保我们根据这个标识来定位到它。

在不同的系统中,这个标识的表现也各不相同:

  • 在编程语言中,它表现为变量名称、常量名称等;

  • 在文件系统中,它表现为目录以及目录下的文件名等;

  • 在数据库表中,它表现为库名、表名、主键或唯一索引;

  • 在网络通信中,它表现为IP地址、MAC地址等;

  • 在计算机内存中,它表现为物理内存地址等。

标识的生成与组织

客观现实要求我们必须要做每一份数据的唯一性区分,在数据量少的时候,我们尚可以简单的命名方式来实现,但是当存在海量数据的时候,我们若想要将其区分标记出来,除了命名,还要相应地进行组织结构的变更,来降低命名的复杂度,否则海量杂乱的数据名称会加大我们管理和获取的难度。

最常见的几种区分方式通常有如下几类:

  • 全随机(可读性差,文字组合其实也可以当成一种全随机的特殊情况)

    • 例如UUID(结构示例如下:6B29FC40-CA47-1067-B31D-00DD010662DA)

    • 该方式经常用于小范围数据区分

    • 该方式通常不会单独使用,一般会结合树形结构来实现一些目录区分

  • 顺序递增的数值结构

    • 该方式形式简单,索引方便

    • 例如:数据库的自增主键、计算机内存的物理地址、Excel表的序号

  • 树形结构区分

    • 组织方式方便直观,便于索引

    • 例如:文件目录结构、关系型数据库数据组织方式、编程语言的多层结构体

  • 分布式ID生成方式

    • 例如雪花算法,该算法的分段标记其实有点树形结构的结合,但其增长方式又有数值的使用便利
  • 其他:以上方式的结合

    • 很多其他的唯一性区分通常都表现成以上方式的结合

    • 例如:URL

      • URL的域名以及Path,本身就存在树形结构的引子(虽然其本身指向的资源存储不一定是该方式);

      • Path中的每一小段,都是区分性命名,世界范围内看,都是随机和不确定的。

几种形式标识的结构表现图例:

01.jpg

全部随机形式以及递增数值

02.jpg

树形结构区分的目录

03.jpg

分布式ID之雪花算法的二进制结构(实际转换为10进制就是个长串的数值)

标识唯一性保证与核验

虽然我们已经有了唯一性生成的方式,人工确认数据的唯一性是一方面,但是在我们的软件系统中,存储唯一性数据的时候,如何保证其唯一性呢?

想必大家在使用计算机文件系统存储文件的时候会发现,在文件改名时,如果当前文件的新名字和同一目录下存在的文件名称冲突,那么系统可能会给出冲突提示,这是一种前置检测。

而且在数据库表设置了唯一索引的时候,如果唯一索引字段存在冲突,那么系统也会给出相应的提示。

另外一些情况下,不同的软件系统,通过自身的规则设计,保证了其生成的数据唯一性,例如数据库自增主键。

全局分布式ID生成算法中的雪花算法,一般也保证其生成数据的唯一性,但是在极端情况下,却也可能存在冲突。

一些软件唯一值冲突提示信息展示:

04.jpg

文件系统命名冲突

05.jpg

数据库唯一索引冲突

06.jpg

编程语言变量重复命名

以上的例子其实提示了我们,在使用唯一标识生成的时候,一定要确认该标识是否在你的系统中能保证唯一,如果不能,那么有可能存在无法预期的风险。这些风险,需要我们提前识别并预设方案来解决,例如:

  • 同一个文件夹下如果来了重名文件,是要选择丢弃操作还是进行文件覆盖?

  • 唯一ID重复导致数据写入失败,是要丢弃数据还是通过其他方法来补偿?

笔者曾经遇到过这样的场景:历史项目中使用到了一个封装的随机字符串生成库,该库在低并发下生成的字符串无异常,但是在高并发状态下,其生成结果有重复项。而生成的目标字符在使用时未做唯一性校验,这就导致了一些异常的发生。

根据如上分析,我们需要通过如下两个方式来处理这个问题:

  • 切换离散性更高的的唯一字符串生成方式

    • 这个可以通过UUID算法来实现
  • 增加唯一性校验

    • 理论上在UUID算法下,几乎不会出现重复,但在防御性编程的考量下,我们依然引入校验做双重保障。

二、唯一索引到分布式锁

唯一索引的业务契合度

在未说明更详细信息的情况下,一定有人会问:既然你的数据要入库,为什么不使用唯一索引来保证数据不会冲突呢?

通常情况下,如果数据满足了全局唯一这个条件,我们确实可以使用唯一索引在保证数据入库数据关键字段唯一,但还存在一些例外的业务场景。

例如:

  • 数据字符较长,同时又不作为索引字段。

  • 应用数据软删除的要求,系统中可能存在某个唯一字段的多条数据。

这种情况下,就不得不放弃数据库的校验,将数据唯一性检验的过程纳入到自己的系统中。

前置校验的方式选择

我们考虑到要在系统中加入唯一性校验,那么在数据INSERT场景下,首先就要查询数据库以判断其是否存在,不存在再写入。

到了这一步,有以下几个问题需要考虑:

  • 这一步一定要查询数据库才能确认是否存在重复吗?

  • 你确定自己要查询的这个字段是索引字段吗?如果不是,查询性能太差,要怎么办?

  • 你查询数据库就一定能保证不重复吗?高并发下检测存在并发与时差怎么处理?

这里我们拆开来一个一个地讲:

是否必须查询数据库验证

数据库作为我们最终数据的存储载体,它所承载的数据总体来说体量是比较大的,即便我们有索引,但在索引查询以及查询数据库时候的网络交互开销一直不低。所以我们是否必须要从数据库来查询这些内容,存在一定的可选择性。

我们可以适当地通过唯一标识生成的规则,来做一些基本的数据隔离。

例如以时间段作为前缀,再追加上随机字符来区分数据:

  • 这样的标识自带时间区分度,我们只要在这个前缀的时间粒度上保证唯一,那么就可以确认整个数据在整个系统的唯一性。

  • 随机数据的生成,通常习惯于用系统时间作为种子值,所以高并发下的冲突不能依赖前缀来解决。

  • 时间的颗粒度按照数据的量来确认,通常需要自行平衡其同级以及下级的数据量。

例如如下的一串字符串 “foo_bar_20240616_randStr”,我们以foo、bar作为一二级前缀,时间日期作为第三级前缀,在这种情况下,我们可以不用关注历史数据的情况,直接校验单日维度的数据是否有重复即可,如果怕并发时间差影响,可以适当扩充延长校验的范围。

多级前缀或者类树形数据隔离后需要校验的数据量漏斗:

07.jpg

再比如UUID算法,根据理论分析,UUID版本4(随机生成的UUID)的冲突概率可以被认为是忽略不计的。这种情况下,我们可以根据业务的需求来确认是否需要前置校验。

由此我们知道,只要我们确认数据重复性的可能是不存在的,或者有其他更简洁的替代方法,那么我们确实不需要去数据库查询核验。

非索引字段怎么验证处理

在不确认数据唯一性的情况下,或者查询数据库不是最合适的解决方案的情况下,我们该用什么方法来解决这个问题呢?通常选择的一种方法是增加分布式锁来进行校验。

依然针对我们提到的字符串“foo_bar_20240616_randStr”,经过前缀隔离之后,我们判断下来,只要校验按日维度的数据不存在重复即可。

这样我们选择分布式锁的时候,需要保证锁的时间维度在一天或者稍多就能满足需求。

高并发下如何保证正确性

如果我们确实要走数据库查询核验,那么在高并发场景下,查询到存储的间隙,有其他进程或线程触发同样的逻辑造成冲突了怎么办?其他机器上部署的业务也同样触发相同的逻辑又该如何?

这种情况下,我们自然而然地也想到了分布式锁。

内存级分布式锁工具的高性能可以弥补直接查询数据库判断比对的处理时间差。

分布式锁的必要性

我们知道,编程语言中也到处有锁的身影,例如Go语言的互斥锁、读写锁,但是其作用是在单应用进程内提供的协程并发访问互斥机制,无法作用到多进程或者多节点部署的情况。

而分布式锁,正好可以帮助多节点部署的业务服务来解决并发访问共享资源时的一致性问题。

三、锁的共性问题

分布式锁的正确性保障

相信对分布式锁感兴趣的小伙伴,或多或少都知道常用的两种分布式锁应用方式:Redis、Zookeeper。

通常使用分布式锁时候要考量如下的问题:

  • 加锁成功之后,后续对该锁的所有操作,能否确认该锁是当前线程持有

    • 当前线程释放锁是否有可能释放了不是本线程持有的锁?

    • 我加了锁,锁的时间不够我业务执行,后面我再操作锁,这个锁还是本线程的锁吗?

  • 加锁的时间问题

    • 当前线程持有的锁时间内,任务还没完成锁就过期了该怎么办?

    • 当前线程持有的锁还有很长时间才自动释放,但是任务已经结束,并发上不来阻塞了怎么办?

  • 锁的释放问题

    • 你确定当前线程加的锁在程序正确执行或者异常之后都释放了吗?
  • 你如何知道Redis或者Zookeeper给你保证的锁是唯一的呢?

    • Redis的单线程模型保证锁操作的正确性,如果你的Redis是主从版或者集群版又正好节点异常切换了呢?

    • Zookeeper的强CP原则,牺牲了A(可用性),但是也可能存在宕机等问题,如何处理?

针对业务上的前面几个问题,我们通常可以通过下面的几个方法来解决,但依然存在局限性。

对于最常见的基于Redis实现的分布式锁:

  • 获取锁的时候给锁value设置随机唯一标识,该标识可以用来判断接下来的锁持有方;

  • 给锁一个合适的初始有效时长,并在锁即将到期的时候续期;

  • 在程序执行的正常区间和异常区间都要释放锁;

  • 如果有自旋场景,那么一定要给自旋场景一个最大过期时间防止死锁;

  • 对于每一个操作,最好使用lua脚本实现操作的原子性;

  • 针对集群版或者主从版本的Redis,需要根据业务权衡是否需要采用redlock或者单节点的Redis来作为锁载体。

    • redlock算法较重而且极端情况下也可能存在问题;

    • 单节点显然存在单点问题,但是肯定可以保证强一致性。

而基于Zookeeper实现的分布式锁:

  • Zookeeper基于其临时有序节点的“申请-未获取-监听-申请-获取-操作-释放”的循环来实现分布式锁;

  • 因为临时节点的释放是基于会话级别的,所以在会话关闭或者异常中断的情况下,也都会自动释放,所以避免了死锁的问题,心跳的存在我们也不用手动续期。

Redis使用自身单线程操作内存的机制、Zookeeper使用ZAB协议,其实都存在一些共同点,它们的共同点就在于要保证我设置的key或者节点的次序是首次。

它们要保证的是,无论你的业务系统分布式程度多高,基于它们所获取到锁数据,都是唯一的和最先的。

以上我们讲了那么多,其实都绕不开一个概念,那就是多个线程的访问,经过层层传递收缩,最终都指向到同一份数据上或者同一个数据标识上(因为对于分布式缓存而言,数据可能存有多份,并通过半数以上同意的协议形式来确定其一致性)。

业务线程锁逻辑访问收缩示例:

08.jpg

能支持分布式锁的,不只有Redis和Zookeeper。理论上,其他满足CAP理论中CP(一致性和分区容忍性)的分布式系统,在一定程度上都能满足支持分布式锁的条件。

数据库主键唯一性保障

在MySQL数据库中,我们知道,主键一定是唯一的,唯一索引却不一定是主键。虽然上面提到的场景,我们引入了分布式锁来保障数据的唯一性,但是MySQL自身的自增主键机制,也是我们所离不开的。

在MySQL中,自增主键通过“AUTO_INCREMENT控制”的机制来确保主键值的唯一性和自增,AUTO_INCREMENT控制主要通过数据库的内部机制来实现。

具体来说,当表中的某个列被指定为AUTO_INCREMENT主键时,MySQL会自动维护一个用于该列的自增计数器,并确保每次对表的插入操作都会使这个计数器递增。

具体实现的方式包括以下几个方面:

  • 内部计数器:MySQL内部会维护一个计数器,用来记录下一个可用的自增值。这个计数器通常保存在系统表中,跟踪每个表,以及每个表的AUTO_INCREMENT列的当前值。

  • 锁机制:在插入新记录时,MySQL会使用锁机制来确保自增值的唯一性。在插入操作之前,会对计数器或相关数据进行锁定,以避免多个客户端同时尝试获取相同的自增值。

  • 事务支持:对于使用事务的情况,MySQL也会确保在事务失败时(例如回滚),已分配的自增值不会被使用,以维护自增值的连续性和唯一性。

总的来说,MySQL的AUTO_INCREMENT控制主要依靠内部的自增计数器和相应的锁机制来实现。这种机制有效地确保了主键的自增属性,并保证了主键的唯一性。

进程内协同之一:互斥

以上说到的是分布式锁,但是在单机系统中,也存在不同线程或协程数据交互与执行互斥的问题。例如操作系统多应用互访、单进程应用配置数据的多线程访问和变更、下游访问的并发抑制操作等。

编程语言给我们提供了一系列进程内协同的方式:同步、互斥与通信。这里的进程内互斥体,其实也就是称为锁。

Go语言提供的互斥锁功能,其底层依赖有如下一些机制:

  • 原子操作

    • 原子操作是CPU提供的功能,由CPU保证执行的原子性

    • Go语言互斥锁所依赖的主要原子操作是CAS( Compare and Swap )

  • 自旋模式与阻塞模式

    • 自旋+CAS 、阻塞/唤醒双模式

    • 协程与锁的多对一状态,锁的自旋等待显得尤为必要

    • 但对于长CPU时间片的操作,自旋等待过程所消耗的资源其实也不低

    • Go语言通过自旋模式到阻塞模式的切换,来缓解锁竞争激烈场景下的CPU消耗

  • 均衡调度

    • 普通模式:普通模式下,老协程相比新的协程,在正常锁竞争下缺乏优势,可能导致长时间无法获得执行权限

    • 饥饿模式:饥饿模式会使未得到执行的协程获得更高的执行优先级,以摆脱长时间获取不到锁无法执行的困境

其他的编程语言一般也提供相应的锁机制,来保证系统中多线程执行互斥的问题。

分布式锁与进程内锁的共性

从上面的信息,我们看的出来,无论是分布式锁,还是进程内的互斥锁,都存在下面的一些共性:

  • 使用唯一标识来识别锁的当前归属;

  • 通常使用CAS方式来实现变更操作的原子性;

  • 要考虑获得锁的失败自旋以及时间问题;

  • 根据需要来确定是自旋等待还是失败结束。

唯一标识与CAS的联系

编程语言提供的互斥锁功能,在底层上依赖CPU提供的原子操作功能CAS 。

我们在使用Redis分布式锁的时候,如果使用lua脚本,其比对该锁的value是否是本线程持有的时候,也有个比对后再更改的过程。

Zookeeper实现分布式锁的时候,我们也是获取到临时顺序节点的最小序号(有个比对过程),才能确定获取到锁。

另外在数据库数据更新的时候,我们也经常用该方式保证数据变更条件的准确性。

当然,CAS这个操作概念,其C(compare),所依赖的依然是某个数值在当前场景下的唯一性。这也是我为什么从数据唯一性引申到这里的原因,而且CAS也是我在这里要重点说的思想。

看到这里,不知道大家有没有发现,这里存在一个很有意思的情况:

  • 数据唯一性检验可以使用锁来解决

  • 而锁的获取,又依赖一个小范围的唯一数据

所以这也是一个将大范围唯一性校验,通过一定方式转换为小范围唯一性校验的方法。而小范围唯一性的标记,甚至可以深入简化到底层二进制的0和1两个状态来完成。

四、同类场景延伸

分布式ID生成原理

我们在前面提到了唯一标识的生成组织方式,其中分布式ID生成算法之一的雪花算法,就使用了时间前缀区分、分片标识、节点数据自增的方式,将大范围唯一标识生成缩小成小范围的数据自增,还兼顾了按时间增长与高并发等性能优势。

常用的分布式ID生成算法,各有其特点:

  • 雪花算法:雪花算法是Twitter开源的分布式ID生成算法,它可以在分布式系统中生成全局唯一的、递增有序的ID。Snowflake算法的ID由时间戳、机器ID和序列号组成。

  • 数据库自增ID:在分布式系统中,可以使用单独的数据库服务器生成自增ID。不同的服务器会有不同的起始值和步长,从而避免冲突。

  • 使用Redis的INCR命令:Redis的INCR命令可以用来原子递增一个key的值,因此可以利用这个特性来生成全局唯一ID。

但是无论使用哪种方案,都需要考虑ID的唯一性、性能、可用性以及分布式环境下的并发安全性,选择合适的方案应根据具体需求以及系统架构来进行权衡和决策。

接口幂等与MQ消费幂等

业务数据接口幂等操作与消费队列消费的幂等操作,幂等性保证其实是一样的原理。

幂等性是指针对同一个操作,多次执行的结果和一次执行的结果是一致的。在计算机科学和网络编程中,幂等性是一个重要的概念,特别是在分布式系统和网络通信中。

针对幂等性处理,我们要记住的唯一思想其实也是CAS。对于存在数据变动的场景,CAS的原则可以保证数据只在指定条件下才发生变化。

以下几种保证MQ消费幂等的方式中,CAS的思想其实是一致的:

  • 基于数据库中唯一ID以及某个状态的值做前置判断,符合条件才执行;

  • 使用消息ID作为Redis分布式锁的key来判断当前消息是否消费成功;

  • 使用消息ID入库以及成功后状态变更来判断消息消费是否已经执行过。

操作系统进程间通信与互斥

对于进程间协同来说,主流操作系统支持了锁(Mutex)和信号量(Semaphore)。Windows还额外支持了事件(Event)同步原语。

进程间的锁(Mutex),语义上和进程内没有什么区别,只不过标识互斥资源的方法不同。Windows最简单,用名称(Name)标识资源,iOS用路径(Path),Linux 则用共享内存。

从使用接口看,Windows和iOS更为合理,虽然大家背后实现上可能都是基于共享内存(对用户进程来说,操作系统内核对象都是共享的),但是没必要把实现机理暴露给用户。

CAS原理的其他应用场景

  • 无锁数据结构:CAS原理通常与无锁数据结构结合使用,以实现高效的并发数据访问。由于CAS原子操作的特性,可以在不使用锁的情况下对共享数据进行操作,从而提高并发性能。

  • 分布式系统:CAS原理的思想可以应用于分布式系统中的数据同步和一致性问题。在分布式环境中,类似CAS的原子操作除了可以用于实现分布式锁,还可以用来实现分布式事务以及一致性算法,确保全局状态的一致性和可靠性。

  • 数据库事务:在数据库系统中,CAS原理的思想可以用于乐观锁和并发控制。通过比较数据版本或标记位,并进行更新的原子操作,实现数据库事务的并发控制和一致性。

  • 业务流程控制:CAS原理的思想也可以应用于业务系统中的流程控制,例如利用乐观锁的机制来处理并发访问下的业务逻辑一致性问题。(上面提到的幂等实现其实也是该大类下的)

五、总结

唯一标识与CAS与多对一模型

到这里,我们发现,上面提到的基于唯一标识与CAS原理来解决问题的方式,其本质都是多对一模型下,实现多线程同步互斥,以及并发收缩问题的基础依赖。

所以我们遇到的多对少或者多对一模型下的,数据访问或修改的收缩问题,其实都可以通过类似的思想来尝试寻找解决方案。

学会抽象归纳

唯一ID与CAS这两个点,乍一看好像并无联系,但是经过关联梳理,我们依然能发现它们在多对一模型下的关联。

当我们在工作学习中,遇到的比较相似的问题多了,只要愿意深入思考,就能发现其中的共性,并且总结提炼出来,在下一次遇到类似的情况时,自然而然就能想到它。

熟能生巧之外,我们也可以主动使用一些通用的思路和方法,配合工具来提升自己的抽象归纳能力。具体来说,抽象归纳有以下思路和方法:观察和辨识共性、提炼概念、泛化思维、归纳推理、应用验证等,可以使用的工具则有:思维导图、数据分析工具、逻辑推理工具或游戏等。

希望这些方法思路和工具,可以带大家直击问题本质,提升大家面对问题的分析能力和解决能力。

*文 / 预子

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

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

相关推荐

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

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

SmartCodeTech的博客 310

从中心调度到自驱协作多 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的博客 317

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

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

SmartCodeTech的博客 302

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

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

SmartCodeTech的博客 543

企业级 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的博客 657

让 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
上一篇: 深入理解 Babel - 微内核架构与 ECMAScript 标准化|得物技术
下一篇: 客服测试流水线编排设计思路和准入准出应用|得物技术
得物技术
得物技术 得物技术官方账号 得物技术官方账号
博客等级 码龄6年 2492粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值