从Paxos到Raft,分布式一致性算法解析

导语 | 后台服务架构经过了集中式、SOA、微服务和服务网格四个阶段,目前互联网界大都使用微服务和服务网格。服务从集中式、中心化向分布式、去中心化不断演进,服务也变得更灵活,能够自动扩缩容、快速版本迭代等。但是分布式架构也将集中式下一些问题放大,比如通信故障、请求三态(成功、失败、超时)、节点故障等,这些问题会导致一系例数据不一致的问题,也是计算机领域的老大难问题。本文将与大家一起学习分布式一致性算法,因作者水平有限,若文中有不正处,还请多多指导。文章作者:董友康,腾讯PCG研发工程师。


一、CAP理论和BASE理论

理论是指导业界实现的纲领,也是提炼了多年研究的精华,在分布式一致性领域,最主要的指导理论是CAP和BASE两个。

1. CAP理论

CAP理论是Eric Brewer教授在2000年提出 的,是描述分布式一致性的三个维度,分别是指:


(1)一致性(Consistency)

每次读操作都能保证返回的是最新数据;在分布式系统中,如果能针对一个数据项的更新执行成功后,所有的请求都可以读到其最新的值,这样的系统就被认为具有严格的一致性。


(2)可用性(Availablity)

任何一个没有发生故障的节点,会在合理的时间内返回一个正常的结果,也就是对于每一个请求总能够在有限时间内返回结果。


(3)分区容忍性(Partition-torlerance)

当节点间出现网络分区,照样可以提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。那么,什么是网络分区呢?分区是系统中可能发生的故障之一,可能有节点暂时无法提供服务:发生了像 长时间GC、CPU死循环、链接池耗尽或者是网络通信故障等问题。

CAP指出,一个分布式系统只能满足三项中的两项而不可能满足全部三项。举例来看:如下图所示,假设有五个节点:n1~n5 ,因网络分区故障被分成两组:[n1、n2]和[n3~n5],那么当n1处理客户端请求时(为了支持"容忍网络分区",即支持 P):

  1. 如果要保证C(一致性),那么它需要把消息复制到所有节点,但是网络分区导致无法成功复制到n3~n5,所以它只能返回"处理失败"的结果给客户端。(这时系统就处于不可用状态,即丧失了A) 

  2. 如果要保证可用性A,那么n1就只能把消息复制到n2,而不用复制到n3~n5(或者无视复制失败/超时),但n3同时也可能在处理客户端请求,n3也为了保证A而做了同样的处理。那么 [n1、n2]和[n3~n5]的状态就不一致了,于是就丧失了C(一致性)。

  3. 如果不容忍网络分区,则P(分区容忍性)不能满足。

既然CAP理论无法全部满足,为了指导工业实现,就需要降低标准,因此出现了BASE理论。

2. BASE理论

BASE理论是eBay的架构师Dan Pritchett提出的,它的思想是:“即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性” 。


BASE理论有三项指标:

  • 基本可用(Basically Available):是指分布式系统在出现不可预知故障的时候,允许损失部分可用性:比如响应时间、功能降级等;

  • 软状态( Soft State):也称为弱状态,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点之间进行数据同步的过程存在延时;

  • 最终一致性( Eventual Consistency):强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达成一致的状态。

BASE理论面向的是大型高可用、可扩展的分布式系统。BASE通过牺牲强一致性来获得可用性,并允许数据短时间内的不一致,但是最终达到一致状态。

接下来,我们一起学习经典的分布式算法。


二、经典分布式算法

1. PAXOS算法

Paxos算法是Leslie Lamport 在1990年提出的,经典且完备的分布式一致性算法。Leslie大佬也在这个算法中展示了他不同常人的智商。


该算法的目标是:在不同的节点间,对一个key的取值达成共识(同一个值)。

(1)角色

协议将系统中的节点分为三种角色:Proposer(提案者)、Acceptor(决议者)、Leaner(学习者),他们的具体职责为:

  • 提案者:对key的值提出自己的值;

  • 决议者:对提案者的提议进行投票,选定一个提案,形成最终决策;

  • 学习者:学习决议者达成共识的决策。


(2)约束条件推导

本小节将通过推导来引出Paxos算法的约束条件,故事灵感来自于分布式理论:深入浅出Paxos算法【1】,在原文基础上优化了可读性。

https://my.oschina.net/u/150175/blog/2992187

在介绍paxos算法协议前,我们先来看一个故事,故事名叫《小明姓什么》。在孤儿院长大的小明马上就要步入社会了,但是孤儿院的老师还没有找到小明的姓氏,因此决定开会解决这个问题。


在会议上,由提案者P提出姓氏,然后决议者A来决定选择哪一个。


场景1: Pa向 A1提出“赵”, Pb向A2,A3提出“钱”。现在有超过半数的决策者接受了“钱”,所以最终的决策结果就是“钱”。


这里引出了一个基础的约束条件:

P0. 当集群中,超过半数的Acceptor接受了一个议案,那我们就可以说这个议案被选定了(Chosen)

P0 是完备的条件,但是不实用。


场景2 :Pa向 A1提出“赵”, Pb向A2提出“钱”, Pc向A3提出“孙”,这样就出现了三个决议者各执一票,无法形成多数派决议的局面。


因此,必须允许一个决策者能够接受多个议案,后接受的议案可以覆盖之前的议案。这样,Pc可以向所有决策者提起议案“孙”,形成一个多数派决议。

但是,现在Pa Pb提案者也可以利用重新提案的能力,来重新提出自己的提案,导致形成的共识重新被推翻。会议乱成了一锅粥。因此还需要新的约束条件来保证会议正常进行。


我们提炼一下问题:在不同版本的提案中,选择一个固定的值作为全局决议。

Paxos算法就是为解决这种不一致问题而提出的,算法目标有两个:

  • T1:一次选举必须要选定一个议案(不能出现所有议案都被拒绝的情况);

  • T2:一次选举必须只选定一个议案(不能出现两个议案有不同的值,却都被选定的情况)。

首先介绍一个概念 “编号”:编号在算法中是唯一自增的键值,假设第一个提出的议案版本是n1, 接下来提出的第二个议案版本 n2 = n1+1 。有了编号之后,一条提案也变成了(Num, Value)二元组。

为了达成上述目标,算法提出了一组约束条件:

P1:一个Acceptor必须接受它收到的第一个议案。
P2:如果一个值为v的议案被选定了,那么被选定的更大编号的议案,它的值必须也是v。
a:如果一个值为v的议案被选定了,那么Acceptor接受的更大编号的议案,它的值必须也是v。
b:如果一个值为v的议案被选定了,那么Proposer提出的更大编号的议案,它的值必须也是v。

P2 和 P2a、P2b 理解起来比较费劲。P2这个约束是为了解决上述场景2中,形成决议后又被推翻覆盖的问题。有了约束2之后,当形成了决议“孙”,则后续提出的议案的值必须为“孙”。


那么,如何才能满足P2呢,P2a约束是在场景2的问题决策域提出的。为了能够满足P2a,自然可以在问题的产生域也提出约束, 既P2b。如果算法能够满足P2b,也就是将解决“产生一致性问题”的时机提前。所以,P2b是P2a的充分条件,只要能满足P2b,那P2a就自动满足。

那么,作为提案者,如何提前知道一个目前的决议(多数派)议案呢?接下来,我们就提出了新的约束P2c:

P2c: 在所有Acceptor中,任意选取半数以上的集合,称这个集合为S。Proposal新的提案Pnew (Nnew , Vnew )必须符合下面两个条件之一:  1)如果S中所有Acceptor都没有接受过议案,那么Pnew的编号保证唯一性和递增,Pnew的值可以是任意值。  2)如果S中有Acceptor曾经接受过议案,找出编号最大的议案PN (N,V) 。那么Pnew的编号必须大于N,Pnew的值必须等于V。

在P2c中,引入了多数派集合S。根据集合S中是否有被接受的议案,来推断全局节点是否已经形成决议。根据约束P0,如果一个议案(Nchosen, Vchosen)是被选中的,那么它必然是被多于半数节点选中的。那么,在任意一个多数派集合S中,一定会存在至少一个节点A,它的数据中已经决议的议案是(Nchosen, Vchosen)。


反之,如果多数派集合中没有被决议的议案,表示此时系统中还没有一个被选定的决议。

看这个例子,假设目前选定了(3, Va)状态;下次发起提案时,proposer选定A3、4、5作为集合S进行查询;提出了编号为4的提案,在P2c约束条件下,提案必定为(4,Va)。


因此,满足P2c的算法也满足P2b算法。

但是也可能存在这种情况,当proposer发查询请求时,还没有一个被确认的提案,所以发出了(4, Vb)提案,这样还是会破坏P2b约束。

因此,当一个议案在提出时(即使已经在发送的半路上了),它必须能够知道当前已经提出的议案的最大编号。这听起来很魔幻,毕竟跑在网线上的请求很难被召回。因此,我们提出了新的约束条件;

P3:议案(n,v)在提出前,必须将自己的编号通知给半数以上的Acceptor。收到通知的Acceptor将n跟自己之前收到的通知进行比较,如果n更大,就将n确认为最大编号。当半数以上Acceptor确认n是最大编号时,议案(n,v)才能正式提交。

P4:Acceptor收到一个新的编号n,在确认n比自己之前收到的编号大时,必须承诺不再接受比n小的议案。

有了P3的约束,则能够保证两个不同编号的议案,不可能同时被认为是最大编号;同时再加上P4约束,保证了一个决议者不会对自己接受的议案版本进行回退。
至此,Paxos算法的约束条件就介绍完了。


(3)协议流程

在Paxos中,一个决策过程(Round、Phase)分为两个阶段:

phase1(准备阶段):

  1. Proposer向超过半数(n/2+1)Acceptor发起prepare消息(发送编号);

  2. 如果Acceptor 收到一个编号为 N 的 Prepare 请求,且 N 大于该 Acceptor 已经响应过的所有 Prepare 请求的编号,那么它就会将它已经接受过的编号最大的提案(如果有的话)作为响应反馈给 Proposer,同时该Acceptor 承诺不再接受任何编号小于 N 的提案。否则拒绝返回。

phase2(决议阶段或投票阶段):

  1. 如果超过半数Acceptor回复promise,Proposer向Acceptor发送accept消息。注意此时的V:V 就是收到的响应中编号最大的提案的,如果响应中不包含任何提案,那么V 就由 Proposer 自己决定;

  2. Acceptor检查accept消息是否符合规则,只要该 Acceptor 没有对编号大于 N 的 Prepare 请求做出过响应,它就接受该提案。

在实际发展中,Paxos算法也演变出一系列变种:

  • PBFT(实用拜占庭容错)算法:是一种共识算法,较高效地解决了拜占庭将军问题;

  • Multi-Paxos算法:优化了prepare阶段的效率,同时允许多个Leader并发提议;以及FastPaxos、EPaxos等,这些演变是针对某些问题进行的优化,内核思想还是依托于Paxos。

2. Raft算法

Paxos协议从被提出,一直是分布式一致性算法的标准协议,但是它不易理解,对于工程师来说实现起来很复杂,以至于算法提出近30年都没有一个完全版的实现方案。业界很多实现都是Paxos-like。

Raft算法是斯坦福大学2017年提出,论文名称《In Search of an Understandable Consensus Algorithm》,望文生义,该算法的目的是易于理解。Raft这一名字来源于"Reliable, Replicated, Redundant, And Fault-Tolerant"(“可靠、可复制、可冗余、可容错”)的首字母缩写。

Raft使用了分治思想把算法流程分为三个子问题:选举(Leader election)、日志复制(Log replication)、安全性(Safety)三个子问题。

  • Leader选举:当前leader跪了或集群初始化的情况下,新leader被选举出来。

  • 日志复制:leader必须能够从客户端接收请求,然后将它们复制给其他机器,强制它们与自己的数据一致。

  • 安全性:如何保证上述选举和日志复制的安全,使系统满足最终一致性。

(1)概念介绍

在Raft中,节点被分为Leader Follower Cabdidate三种角色:

  • Leader:处理与客户端的交互和与follower的日志复制等,一般只有一个Leader;

  • Follower:被动学习Leader的日志同步,同时也会在leader超时后转变为Candidate参与竞选;

  • Candidate:在竞选期间参与竞选;

Term:是有连续单调递增的编号,每个term开始于选举阶段,一般由选举阶段和领导阶段组成。

随机超时时间:Follower节点每次收到Leader的心跳请求后,会设置一个随机的,区间位于[150ms, 300ms)的超时时间。如果超过超时时间,还没有收到Leader的下一条请求,则认为Leader过期/故障了。

心跳续命:Leader在当选期间,会以一定时间间隔向其他节点发送心跳请求,以维护自己的Leader地位。

(2)协议流程

a. 选举流程

当某个follower节点在超时时间内未收到Leader的请求,它则认为当前Leader宕机或者当前无Leader,将发起选举, 既从一个Follower变成Candidate。


这个转变过程中会发生四件事:

  • 增加本地节点的Current Term值;

  • 将状态切换为Candidate;

  • 该节点投自己一票;

  • 批量向其他节点发送拉票请求(RequestVote RPC)。

在这个过程中,其他Follower节点收到拉票请求后,需要判断请求的合法性,然后为第一个到达的合法拉票请求进行投票。投票过程对于Follower的约束有三点:

  • 在一个任期Term中只能投一张票;

  • 候选人的Term值大于Current Term,且候选人已执行的Log序号不低于本地Log(Log及已执行的概念见《日志复制》小节),则拉票请求是合法的;

  • 只选择首先到达的合法拉票请求;

如果一个Candidate收到了超过半数的投票,则该节点晋升为Leader,会立刻给所有节点发消息,广而告之,避免其余节点触发新的选举;开始进行日志同步、处理客户端请求等。


如果一次选举中,Candidate在选举超时时间内没有收到超过半数的投票,也没有收到其他Leader的请求,则认为当前Term选举失败,进入下一个选举周期。

b. 日志复制

在了解日志同步前,需要了解“复制状态机”这个概念。


复制状态机(Replicated state machines)是指:不同节点从相同的初始状态出发,执行相同顺序的输入指令集后,会得到相同的结束状态。

If two identical, deterministic processes begin in the same state and get the same inputs in the same order, they will produce the same output and end in the same state.

分布式一致性算法的实现是基于复制状态机的。


在Raft算法中,节点初始化后具有相同初始状态。为了提供相同的输入指令集这个条件,raft将一个客户端请求(command)封装到一个log entry中。Leader负责将这些log entries 复制到所有的Follower节点,然后节点按照相同的顺序应用commands,达到最终的一致状态。


当Leader收到客户端的写请求,到将执行结果返回给客户端的这个过程,从Leader视角来看经历了以下步骤:

  • 本地追加日志信息;

  • 并行发出 AppendEntries RPC请求;

  • 等待大多数Follower的回应。收到查过半数节点的成功提交回应,代表该日志被复制到了大多数节点中(committed);

  • 在状态机上执行entry command。既将该日志应用到状态机,真正影响到节点状态(applied);

  • 回应Client 执行结果;

  • 确认Follower也执行了这条command;如果Follower崩溃、运行缓慢或者网络丢包,Leader将无限期地重试AppendEntries RPC,直到所有Followers应用了所有日志条目。

logs由顺序排列的log entry组成 ,每个log entry包含command和产生该log entry时的leader term。从上图可以看到,五个节点的日志并不完全一致,raft算法为了保证高可用,并不是强一致性,而是最终一致性,leader会不断尝试给follower发log entries,直到所有节点的log entries都相同。

在前面的流程中,leader只需要日志被复制到大多数节点即可向客户端返回,而一旦向客户端返回成功消息,那么系统就必须保证log在任何异常的情况下都不会发生回滚。

这里推荐两个Raft算法动画演示,通过动画能够对Raft算法的选举和日志复制过程有直观清晰的认知。

  • raft step by step入门演示: http://thesecretlivesofdata.com/raft/

  • raft 官方演示: https://raft.github.io/

在动画演示中,可以通过调整时间流速和时间轴来观察节点间通信。

也可以通过单击节点或者请求包来查看节点的具体状态和请求包的数据。


3. 安全性及约束

(1)选举安全性

即任一任期内最多一个leader被选出。在一个集群中任何时刻只能有一个leader。系统中同时有多余一个leader,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。


在raft中,通过两点保证了这个属性:

  • 一个节点某一任期内最多只能投一票;而节点B的term必须比A的新,A才能给B投票。

  • 只有获得多数投票的节点才会成为leader。

(2)日志append only

首先,leader在某一term的任一位置只会创建一个log entry,且log entry是append-only。


其次,一致性检查。leader在AppendEntries请求中会包含最新log entry的前一个log的term和index,如果follower在对应的term index找不到日志,那么就会告知leader日志不一致, 然后开始同步自己的日志。同步时,找到日志分叉点,然后将leader后续的日志复制到本地。

(3)日志匹配特性

如果两个节点上的某个log entry的log index相同且term相同,那么在该index之前的所有log entry应该都是相同的。


Raft的日志机制提供两个保证,统称为Log Matching Property:

  • 不同机器的日志中如果有两个entry有相同的偏移和term号,那么它们存储相同的指令。

  • 如果不同机器上的日志中有两个相同偏移和term号的日志,那么日志中这个entry之前的所有entry保持一致。

(4)Leader完备性 

被选举人必须比自己知道的更多(比较term 、log index)。


如果一个log entry在某个任期被提交(committed),那么这条日志一定会出现在所有更高term的leader的日志里面 。选举人必须比自己知道的更多(比较term,log index)如果日志中含有不同的任期,则选最新的任期的节点;如果最新任期一致,则选最长的日志的那个节点。


选举安全性中包含了Leader完备性

(5)状态机安全性

状态机安全性由日志的一致来保证。在算法中,一个日志被复制到多数节点才算committed, 如果一个log entry在某个任期被提交(committed),那么这条日志一定会出现在所有更高term的leader的日志里面。


三、总语

    

分布式算法已经经历了近40年的发展(1982- ),涌现出各种各样的算法。正如Chubby的作者所说:

“这个世界上只有一种一致性算法,那就是 Paxos”

Paxos算法的贡献和地位无可替代。理解了Paxos算法,再去理解其他算法,则会势如破竹。
    

Raft算法以其易于理解和实现的特性,推动分布式一致性算法进入了广泛应用阶段,不再是工程师心中的那颗拿得起,放不下的朱砂痣。????

分布式一致性算法的前沿理论也在飞速发展着,值得我们继续学习和关注。

参考资料:

Paxos:

  • https://my.oschina.net/u/150175/blog/2992187

  • https://zh.wikipedia.org/wiki/Paxos算法

  • https://blog.51cto.com/12615191/2086264

Raft:

  • https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14

  • https://raft.github.io/

  • http://thesecretlivesofdata.com/raft/

  • https://www.cnblogs.com/xybaby/p/10124083.html

相关推荐

大模型的Agent Skill功能,在LLM HTTP底层交互流中是怎么承载的?

网络文章文本的 skill,昨天我实现了之后也就开始好奇起 Skills 的底层原理了——相比起各种花里胡哨的 agrnt 应用,我一直以来都很对大模型在纯粹的 HTTP 交互层面是如何交互的更感兴趣。Skill 的全部"魔法"都发生在 system prompt 的措辞和 SKILL.md 文件的编写质量上——本质上是一种 prompt engineering + 文件系统的组合。但是各种天花乱坠的 skills,是如何在底层的 HTTP 中,与大模型——这个只会嘴遁的工具交互的呢?

QcloudCommunity的博客 401

万字入门AI Infra:深入理解大模型中的数学与Infra优化

关注腾讯云开发者,一手技术干货提前解锁👇AI Infra科普、入门或者进阶 ~~ 不到 5 万字,带你融会贯通理解大模型的数学、算法、硬件到系统工程。任何问题欢迎沟通交流。可怕,我竟然有点认同这句话。当然大概率是因为姚顺宇太懂AI了,而我则是因为无知者无畏。不过仔细想想,大模型推理中的数学逻辑确实不复杂,很多原理只需要高中数学知识就能看懂。但是为什么像 vLLM 这种推理系统这么复杂呢?本文将拆解大模型中几个核心操作(RMSNorm、Softmax、Causal Mask、Sampling)背后的数学与

QcloudCommunity的博客 1158

平平无奇的源码,竟藏着Agent的核心秘密?

System Prompt 是剧本,Skill 是剧本的扩展包,Agent Loop 是演员按剧本行动。欢迎留言,我们将邀请作者针对性回复你的评论,我们将选取1则优质的评论,送出腾讯云定制文件袋套装。,让 Agent 能主动"巡逻",而不只是被动等待用户消息。OpenClaw 的 System Prompt 分层结构。的"行为底线",任何 Skill 或用户命令都无法覆盖它。精华 2:Skill 的"按需加载"避免 token 浪费。精华 1:System Prompt 是"分层乐高积木"

QcloudCommunity的博客 424

QQ音乐Harness Engineering实践

一个看似简单的需求,背后可能牵动服务调用链、配置、灰度、埋点、错误码、接口契约和历史兼容性。当 AI 开始快速生成大量代码,真正的瓶颈就不再是"写不出来",而是"看不完、想不清、管不住"。在对话式编码阶段,一种典型的工作模式逐渐流行:开发者把需求丢给 AI,扫一眼输出"看起来对"就直接采纳,不审 diff、不追问逻辑、不验证边界。以音乐商业化业务为例,一个需求可能从 TAPD 单开始,经过需求评审、技术方案、服务影响面分析、IDL 契约变更、业务代码实现、测试验证、CR、灰度上线,最后才进入稳定运行。

QcloudCommunity的博客 712

从Prompt、Context到Harness,工程的三次进化与终局之战

同时,强制要求散落各处的决策记录(Slack、邮件、文档)全部迁移至代码仓库,确保 Agent 的唯一信息来源是可信的、版本受控的仓库。更坑爹的是,研究表明,当上下文过长时,模型会出现"中间遗忘(Lost in the Middle)"现象:它对开头和结尾的内容记忆较好,对中间大段内容的关注度大幅下降。这篇文章,我想带你完整走一遍这三次进化的逻辑:它们分别解决了什么问题,它们之间是什么关系,它们的边界在哪里,以及:当三者融合,AI 工程师的终极形态究竟是什么?大语言模型的本质,就是这位金鱼助理。

QcloudCommunity的博客 713

让Skill自己训练自己:8阶段Loop、3层评测、5维AND门控,从此实现自进化

所以每一轮改动都是有据可查的,不是「感觉这里可以优化」,而是「Case 41 挂了,因为 agent 把离职问题路由到了邮箱分类,但正确答案在通讯录,所以我改 root_index.md 加个易混淆提示」。但让我最后决定把它记录下来的,不是这的个「吸收」过程,而是它真的在替我探索我不想费脑力触达的边界,这看起来更像是一个机器智能应该有的样子。不准跨层,每轮只改一层的东西。但我经过这 19 轮之后觉得,更准确的描述是互补——你在明处看着,AI 在暗处替你试错,你看不见的那一半就是 AI 能贡献的地方。

QcloudCommunity的博客 1118

只加两行代码,为什么要两天?一文深度理解业务系统的复杂性

关注腾讯云开发者,一手技术干货提前解锁👇业务系统复杂性一直是令开发者头痛的问题。复杂的不是增加一个需求需要耗费多少时间,而是在增加一个需求后带来的蝴蝶效应:其它功能会不会受到影响、要如何去找到这些影响,最终如何实现系统正常运行......功能之间隐秘增加的耦合、不可避免的代码腐化在导致业务复杂性增加。大家都在说的软件开发提效到底在提什么?程序员日常工作中应该如何提升开发效率?敏捷开发、瀑布流式开发孰是孰非?欢迎阅读。业务背景与目标我依然非常清晰地记得某个时候,我所在团队 Leader 曾讲过一段话:“我担

QcloudCommunity的博客 708

从零设计生产级 Multi-Agent Harness:架构、评估、记忆、成本与 MCP 工具接入全拆解

在 AI Agent 领域,Multi-Agent Harness 指的是把多个 Agent 的能力、工具、状态、通信、编排、监控统一收束在一个运行时之内的框架。第三,Agent 路由。一个输入框,一个大模型,几个工具,一段写得很漂亮的 System Prompt,再配上一个炫酷的前端,看起来就像一个能干活的“数字员工”。Multi-Agent 完全不一样——它有计划、有中间步骤、有工具调用、有 Agent 协作、有重试、有反思、有最终合成。增加 Budget、权限、重试、压缩、轨迹评估、审计、回归测试。

QcloudCommunity的博客 705

拆完Hermes源码,我发现Agent的“自我进化“根本不需要训练模型

两个月 5.2 万 Star,Hermes Agent 用一个"LLM 审判官"机制实现了 Agent 的自我进化——不改模型权重,只改"怎么用模型"的策略。OpenClaw(社区昵称"龙虾"🦞)是 2025-2026 年最火的开源 Agent 框架,30 万+ Star,插件市场 ClawHub 里有数千个插件,能接入 Telegram、WhatsApp、Slack、飞书、企业微信——几乎是一个"个人 AI 操作系统"。Skill 是英语写的,Memory 是英语写的,审查 Prompt 也是英语写的。

QcloudCommunity的博客 904

AI Infra 其实没有多少新东西

传统 Infra 追求横向扩展,而 AI Infra 呈现 “AI 大型机”特性,是因为传统后台服务的可以容忍毫秒级延迟,但 AI 集群不行,GPU 的算力是 CPU 的数百倍,微秒级的延时等待也会造成很大的算力损耗,需要硬件的高度集成。在可预见的1-3年的未来,这样的专用硬件+网络的集中式架构很难发生比较大的改变。与之相似,模型推理的批处理就是将多个输入样本打包(batch),将原本串行的 N 次轻量的推理计算,合并为 1 次重量的计算,实现单位时间内处理更多的请求,提高了 GPU 利用率。

QcloudCommunity的博客 819

程序员越早想通这些越好

永远没有正确架构,你永远无法偿还完所有的技术债务,如同你永远不会设计出完美的界面,请避开完美主义的陷阱,永远没有完美的代码,能够满足当前需求,又为未来不管是自己还是他人留有扩展空间,就很好了。我们努力的方向就是将现实世界映射到有限的数据结构中,这就需要用户自定义类型,如果你的代码中包含类似 trader portfolio 这样的概念,你就可以使用他们的名称来建模,而不是使用基本数据类型复杂嵌套表述你的目的。从另一个角度看,代码里的注释都是补丁,是碎片化的,局部的注释很难推导模块整体的顺序及耦合关系。

QcloudCommunity的博客 464

RAG已死?不,是Grep回归了!

这样一来可以直接复用已有的计算缓存,只为新增的增量部分付全价,前面累积的大头按约 1/10 的缓存价计费。所以实际的工具组合方式是灵活的:Grep(默认模式)→ Read 是最常见的路径,但 Grep(content 模式)可以独立使用,LLM 也可以直接调 Read(如果已经知道文件路径),或者一次同时发起多个 Grep 并行搜索。它从零开始构建自己的对话历史,不继承主对话的消息,这意味着它搜索过程中产生的大量 grep 结果、代码片段都留在自己的 context 里,主对话只收到一段总结性的文本结论。

QcloudCommunity的博客 571

深入浅出Harness Engineerring之核心模式与理念

在智能体生命周期的关键节点(如会话开始、工具调用后)自动触发预设动作(如代码格式化),由系统确保关键流程被执行,不依赖可能被模型遗忘的指令。简单讲就是利用向量存储这个技术,来实现模糊检索,原理是:即使字面不同,但语义相近的文本,其向量在数学空间中的位置也很接近。根据命令类型、参数和影响,自动评估其风险等级(安全、有风险、危险),并采取自动执行、请求确认或直接拦截等不同策略。关键特性是可隔离、可重建、可扩展。不是一次判断就定终身,允许你改变、允许情况复杂,通过不断观察、思考、调整,越来越懂真实的你。

QcloudCommunity的博客 621

Harness Engineering实践心得:如何高效驾驭AI?

但如果这些经验被拆成一条条 Rule、一个个 Skill、一项项 Script 检查——"XAML 不能有中文"、"编译要用这个路径的 MSBuild"、"SVN 命令必须带认证参数"——AI 就能在秒级时间里"吸收"十年的踩坑经验。然后可以看到下方的图,我的PM会很顺利的调度其他agent分别负责不同的事项,遇到问题的时候也能准确的找到合适的agent。MCP 本质上是在扩展 AI 的"感知范围"——Rule 管"该怎么做",Skill 管"怎么操作",MCP 管"能看到什么、能碰到什么"。

QcloudCommunity的博客 838

从第一性原理思考 Agentic Engineering

需要注意的是,这一结论是有条件的:如果 AI 缺乏领域知识,过早介入反而可能引入 1.2 节所述的"似是而非"损耗——因此上下文供给(实践 1)是 AI 全链条参与的前提,而非结果。通过一个专门的自迭代 Skill 实现——当 AI 在协作过程中识别到自己被纠正(用户否定了 AI 的输出并给出了正确方向),它自动评估这个错误的根因,搜索现有的 Rules 和 Skills 中是否已有针对该类问题的处理规则。事实上,越是复杂的项目,工程师的认知负担越重(公理 3),AI 分担认知负担的潜在边际价值也越大。

QcloudCommunity的博客 755

万字干货!Harness Engineering如何工程化落地?

关注腾讯云开发者,一手技术干货提前解锁👇Harness Engineering 的概念已经火了有一阵了,全网很多文章基本都是在讲理念,讲为什么今天做 AI 开发,不能只靠一段提示词,也不能把模型当一个“更聪明的代码补全”。但与此同时,一个问题也在持续地发酵:这个问题特别重要。因为 Harness 这个词听上去很大,很像一个抽象的方法论,但它如果不能落到工程、目录、文档、脚本、工作流里,那它最后就只是一句漂亮的话。事实上,不同项目落地出来的 Harness,表面上可能完全不一样。有的项目是 CI 很强,有的

QcloudCommunity的博客 1160

全方位对比:Hermes VS OpenClaw

多账号矩阵运营 如果你的业务涉及同时管理多个社交媒体账号、多个平台的内容分发、多渠道的客户互动——OpenClaw是目前市场上的"无可替代的底座"。一个有专业背景的个人,现在可以快速构建一个垂直领域的AI助手:比如"财务分析Hermes"、"法律咨询Hermes"、"技术架构Hermes",直接通过微信提供服务,积累自己的专业IP。跨平台生态融合 如果你的工作流涉及飞书、Slack、Discord等多个平台的深度集成,需要这些平台之间的数据流转和联动——OpenClaw的生态支持是强大的。

QcloudCommunity的博客 1216

一文讲透:Harness Engineering即控制论!

而研发模式的升级我认为将会是一个飞跃的过程,之所以现在我们仍然需要需要参与编码,一个非常大的原因就是缺乏传感器和基建,仍然需要人来串流程,比如需要人来验证UI是否正确、需要人来告诉AI代码不符合代码规范,因此在有些场景我们仍然感觉 AI 完成的很吃力,但这不是 AI 能力不行,而是我们并没有为 AI 提供友好的环境……控制论中的突变理论介绍了矫枉过正和飞跃现象之间的矛盾,如果质变中经历的中间过渡态是不稳定的,那么他就是一个飞跃的过程,如果中间过渡态是稳定的,那么他就是一个渐变的过程。但是这些阶段要解决的。

QcloudCommunity的博客 1202

神级开源插件!一句话让QClaw变3D小镇,Agent工作可视化,赛博云监工

这个架构是翻了几次车才想通的—原有AI的实现机制是用 setTimeout 猜动画时长导致了幽灵 NPC、工位撞车、越改越崩,后面我停下来换了思路,推翻原有的架构,按照“意图+回传”的架构进行重构,之前的问题一次性全部解决。15 天,我和 AI 吵了 185 次架, 4.5 万行代码,开发了一款 QClaw / OpenClaw 的UGC游戏插件,这可能是人类跟 Agents 交互的新范式,插件已完全开源,有需要的欢迎自取~我天天用,用着用着我就在思考,Agent 产品现在的交互体验,基本都一个样。

QcloudCommunity的博客 1194

一文搞懂Hermes:新顶流Agent如何从经验中自我进化

Voyager 是一个能在 Minecraft 中自主探索、学习技能、无限积累能力的 AI Agent,它提出了 "Skill Library"(技能库)的概念——Agent 将成功的行为序列编码为可复用的技能函数,存储在一个持续增长的代码库中。如果 Skill 的名称和描述不够精准,或者用户的任务描述与 Skill 的触发条件有语义差距,Agent 可能会错过相关的 Skill。如果进程在写入过程中崩溃,目标文件要么是旧内容(还没被替换),要么是新内容(替换已完成),绝不会出现写了一半的损坏文件。

QcloudCommunity的博客 2627

自掏腰包一万元,拥抱AI这一年,我的工具、实践和思考

其实也很好理解,过往的每个领域(比如前端、后端、设计、测试等等)都主要是这个领域的从业者在为它添砖加瓦,但是大模型时代的 AI 应用领域却几乎是所有使用 AI 的人类一起在迭代,无分领域,无分文理,无分老少。因为每个时期的 AI 都有着不同的特点,很多时候当我费尽心思去钻研,自以为有点弄明白 AI 应该怎么玩的时候,基座模型和行业范式常常就会迎来颠覆式的变革,很多过往的经验都会倾覆,然后只能从头再来。过去一年多,被热议的 AI 范式大概是沿着四个阶段递进演化,每一个阶段其实都在解决前一个阶段的核心问题。

QcloudCommunity的博客 626

办公Agent的CI/CD时刻到来了

核心观点是:企业给员工配了一堆 AI 工具,试点跑了几百个,但真正拖慢 AI 转型速度的瓶颈不在模型能力,在"最后一公里":AI 输出和实际工作流之间的那道鸿沟。代码写完,打个 tar 包,开 FTP 传到服务器上,SSH 进去解压,改配置文件,重启服务,刷一下页面祈祷别 500。你复制,切窗口,粘贴到腾讯文档里,发现 Markdown 格式全乱了,手动调标题层级,代码块重新标记语言类型,表格散架了重排一遍。模型是越来越聪明了,但"生成"到"落地"之间那段路,还是你自己在走,一步一步,手动搬运。

QcloudCommunity的博客 607

4亿token买来5个教训:让6个AI Agent连写4天代码发生了什么?

Watchdog 检测到崩溃 → 启动诊断 Agent 分析原因 → 诊断 Agent 跑满 20 轮没搞定 → Watchdog 判定“已修复”,重启系统 → 重启的系统因为诊断 Agent 留下的环境变量被继承,连续 3 次拒绝启动 → 触发连续失败保护退出 → Watchdog 第 3 次巡检,发现进程和记录文件都没了,尝试手动重启,自己也停了。启动前我翻了论文、做了架构设计、写了监控+修复异常的脚本。这个发现让我的情绪从沮丧变成了兴奋——不是那种"终于修好了"的释然,是"我找到根因了"的快感。

QcloudCommunity的博客 583

赛博斗蛐蛐:9大模型决战三国志,天命在谁?

我猜是这样的,当Gemini面临决策的时候,一系列关键词比如 守城,劣势,粮草,三国等等,在语义层面的关联性中LLM发现了竖壁清野这个关键词概率非常高,所以以此为策略,然后再根据这个策略完美执行操作。MiMo 的外交是三方中最精明的。Kimi作为国产模型,也同样颠覆了我对他的看法,最后的比赛他甚至一度是优势者,存在很多夺冠的可能性,要知道他的对手可是claude和gemini,而他经常出兵慢,回过头来想想或许正是他的策略,毕竟中后期他的优势都来自于稳健的发展和较少的战斗频率(和claude比).

QcloudCommunity的博客 871

Claude Code是怎么知道你在骂他的?这 12 条发现值得关注

确实存在——5,500+ 行,集成了消息队列、工具装配、MCP 编排、会话状态、权限、分析、文件持久化和优雅关闭,基本上一个文件干了所有事。对抗虚假声明——"不要在输出显示失败时声称所有测试通过,不要压缩或简化失败的检查来制造绿色结果"。完整的 KAIROS 是一个持续驻留的守护进程,能感知你在不在电脑前、主动寻找有用的工作做,更像是住在终端里的全职同事。源码里藏着一个叫 "Buddy" 的电子宠物系统,完整度令人惊讶——这不是一个 TODO,而是一个从数值系统到 ASCII 动画都实现了的完整功能。

QcloudCommunity的博客 701

逆向深扒Claude Code源码,我发现了什么!?

Anthropic 内部用户获得更严格的质量控制 prompt、更好的验证机制(独立 Verification Agent)、以及针对 model 弱点的专门对策(如 Capybara v8 的 29-30% 错误声明率对策)。这不是代码混乱的标志——它是整个 Agent Loop 的心脏,所有的流式处理、工具调度、上下文压缩、子代理管理都在这个文件中协调。这种"胖核心"设计是刻意的:保持核心循环的原子性,避免分散到多个模块导致的协调复杂度。核心价值:Fork 代理的工具输出不会回到主代理的上下文窗口。

QcloudCommunity的博客 885

一文讲透如何构建Harness——六大组件全解析

本文将从"裸模型的四个硬伤"出发,逐一拆解 Harness 的六大组件——文件系统、Bash + 沙箱、记忆(AGENTS.md)、Web Search + MCP、上下文工程、编排 + Hooks——带你看清 AI Agent 真正的竞争壁垒,不在模型层,而在 Harness 层。如果你用过 Agent 做复杂任务,你一定有过这样的体验:一开始 Agent 的表现很好,但随着对话变长,它开始"变笨"——遗忘之前的约定,重复之前犯过的错误,甚至对同一个问题给出前后矛盾的回答。对于简单的问答场景,这无所谓。

QcloudCommunity的博客 758

Harness Engineering 来了,SDD 还有意义吗?

他们的解法是把「品味」编码进规则,然后用一个定期运行的「doc-gardening」Agent 自动扫描漂移、发起修复 PR——「技术债务就像一笔高息贷款,不断地以小额贷款的方式偿还,总比让债务不断累积要好」。代码仓库本地的、已版本化的工件,才是 Agent 所能看到的全部。在 Vibe Coding 模式下(即不做规划、随意向 AI 提需求的开发方式),大量设计决策、跨服务约定、「为什么不选另一个方案」的讨论,全部停留在一次性的 AI 对话里——下一个人,或者下一次 AI 会话,完全无从获取。

QcloudCommunity的博客 417

零废话!一文讲透从0构建AI Agent

每个工具都要写一套"定义→解析→执行"的胶水代码。上下文管理就是在"记住足够多"和"别超标"之间找平衡,常见策略包括滑动窗口、摘要压缩、RAG 检索增强。上下文窗口是 Agent 的"工作记忆",但它有硬性限制。LLM 负责"动脑"决策,代码负责"动手"执行。这是从"聊天机器人"进化到"Agent"的关键一步。每次调 API 都把完整对话历史发过去,LLM 本身是无状态的,"记忆"完全靠客户端的数组模拟。这样 Agent 一开始就知道自己"在哪里"、"手头有什么",不需要先花一轮工具调用去探索环境。

QcloudCommunity的博客 710

距离AI把小编我裁掉还有72小时

这是一个基于 OpenClaw 开源生态打造的本地化 AI Agent 助手,已于上周开启全量公测,无需复杂配置,三步即可上手,自带安全防护,支持微信直连绑定,内置多款优质国产大模型,现阶段也是完全免费使用,基本上前面提到过的痛点都可以靠它解决。对了,这里特别强调一点,上面的截图让产品同事汗流浃背,再三找我确认 QClaw 思考过程中优美的“草”字说法,不会是默认出现的吧?AI 好,AI 得学,但更重要的是,在你的工作和生活里,哪些东西是能结构化地被 AI 所接入的,不要死守着那些脏活累活不放。

QcloudCommunity的博客 672
上一篇: service mesh - 微服务通信进化之路
下一篇: 云原生专场免费报名中!听技术大咖在线分享实践案例
腾讯云开发者
腾讯云开发者 企业官方账号 企业官方账号
博客等级 码龄10年 6290粉丝 1962原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值