GPL协议中国第一案尘埃落定,相关开源软件应如何风控?

“

导读:2019年11月6日,数字天堂(北京)网络技术有限公司(以下简称 “数字天堂公司”)诉柚子(北京)科技有限公司、柚子(北京)移动技术有限公司(以下简称 “柚子公司”)侵犯计算机软件著作权纠纷一案由北京市高级人民法院做出二审终审判决,认定柚子公司提出的HBuilder软件三个插件属于应遵循《GNU通用公共许可协议》(以下简称“GPL协议”)开放源代码的衍生作品的抗辩理由不成立,APICloud软件复制并修改HBuilder软件中的三个插件的行为构成对数字天堂公司复制权、改编权及信息网络传播权的侵犯,判令柚子公司停止侵权并赔偿71万元。至此,第一个在中国涉及GPL协议的诉讼案件结局已尘埃落地。

本案作为中国第一个关涉GPL协议的诉讼案件,对开源软件许可协议在中国司法程序中的效力认定和中国法院对于GPL协议的条款解读具有重要的参考意义。本文将对案件中涉及GPL协议的部分展开讨论,并就此提出商业公司使用GPL协议的开源软件时应如何开展风险管控的思考。

一、案情介绍

1.一审案情简介

原告数字天堂公司起诉被告柚子公司侵犯其计算机软件著作权纠纷一案,由北京知识产权法院于2015年4月13日受理,并于2018年4月12日作出判决[1]。

数字天堂公司诉称柚子公司发布的APICloud软件抄袭了数字天堂公司HBuilder软件中的三个插件(代码输入法功能插件、真机运行功能插件、边看边改功能插件,以下简称“涉案三个插件”)的源代码,该举侵犯了数字天堂公司对HBuilder软件享有的复制权、修改权和信息网络传播权,并据此要求法院判令柚子公司在公开网站赔礼道歉,消除影响,并赔偿经济损失及合理费用。

柚子公司辩称HBuilder软件属于应遵循GPL协议开放源代码的软件。对于GPL协议的开源软件,任何第三方有权不经另行取得著作权人的许可,直接遵循GPL协议使用源代码,构建衍生软件作品,而不构成对著作权的侵犯。

北京知识产权法院认定:

  • 数字天堂公司的HBuilder软件属于《中华人民共和国著作权法》下的计算机软件作品,数字天堂公司是该软件作品的著作权人。

  • 数字天堂公司是HBuilder软件中涉案三个插件的著作权人。

  • 根据工业和信息化部软件于集成电路促进中心知识产权司法鉴定所(以下称“鉴定机构”)对APICloud软件与HBuilder软件同一性鉴定出具的鉴定意见[2],柚子公司APICloud软件中对应插件源代码部分与数字天堂公司的涉案三个插件构成同一性。

  • 根据鉴定机构对数字天堂公司涉案三个插件的源代码与在先第三方及开源软件源代码同一性鉴定出具的鉴定意见[3],涉案三个插件的源代码仅有一小部分与第三方或开源软件的源代码相同。

  • 涉案三个插件处于独立的文件夹中,且文件夹中均未包含GPL协议。

    HBuilder软件的根目录也不存在GPL软件协议。

    尽管HBuilder软件中包含的其他文件夹中含有GPL协议,但GPL协议对涉案三个插件并无约束力。

    涉案三个插件不属于应根据GPL协议开放源代码的衍生软件作品。

    柚子公司认为数字天堂公司涉案三个插件属于开源软件的抗辩理由不成立,其被诉行为构成侵犯数字天堂公司享有的著作权。

2.二审案情简介

柚子公司不服北京知识产权法院的判决,向北京市高级人民法院提起上诉。北京市高级人民法院于2018年7月20日受理本案,并于2019年11月6日作出终审判决。[4]

上诉人柚子公司诉称数字天堂公司的HBuilder软件(包括涉案三个插件)应整体受到GPL协议的约束,必须依据GPL协议的规定承担开放源代码的义务,并针对三个插件的独立性认定问题再次提出司法鉴定申请。[5]

二审法院以柚子公司在一审程序中怠于行使举证责任,在二审诉讼中再次提出第三次鉴定申请有违司法程序公正和司法程序效率,且司法鉴定申请内容与本案待证事实之间并无直接关联性为由,驳回了司法鉴定申请。

同时,二审法院承继了一审法院对于涉案三个插件不应受到GPL协议约束的论述,仍然维持柚子公司的行为构成侵犯数字天堂公司著作权的判定,仅对一审法院侵权代码的数量、侵权行为个数和赔偿金额的认定做出修正。

二、法律分析

1.本案法院判决的积极意义

本案作为中国第一个涉及GPL协议的诉讼案件,对开源软件协议在中国司法程序中的效力认定具有积极意义。

开源软件起源于二十世纪八十年代从美国兴起的自由软件和开放源代码运动,是对当时大行其道的商用软件传统模式的反叛,旨在打破商业软件的垄断,加强技术的自由交流与合作。

尽管开源软件推崇开放、自由和共享的理念,使用开源软件也通常无需支付费用或另行获取著作权人的许可,但并不意味着使用开源软件无需承担任何责任。

开源软件基于著作权法下“版权许可”的方式,通过附随的许可协议约定使用该等软件应遵循的条款条件。遵循开源软件许可协议使用该开源软件,即已遵守著作权利人的版权许可,不侵犯著作权。也就是说,一旦使用开源软件,即视为已同意接受该开源软件附随的许可协议,遵守其中规定的条件或限制。反之,如果不遵守开源软件许可协议,则构成对开源软件著作权的侵犯。

由于开源软件的概念和绝大部分的开源协议都来源于国外,部分人士对于英文的开源软件许可协议在中国的法律效力问题始终存在疑虑。

本案一审法院虽然没有明确论述GPL协议的法律效力,但其大篇幅引用GPL v3.0协议的原文,并论述GPL协议对涉案三个插件是否具有约束力,相当于已经默认GPL协议在中国同样具有法律约束力,二审法院也同样接受了一审法院有关GPL协议是否对涉案三个插件具有约束力的论述。本案法院默认了GPL协议的法律约束力,从一定程度上消除了未来有关开源软件许可协议在中国诉讼中法律效力认定的不确定性。

2.本案法院对GPL协议的解读存在争议

本案法院虽然认可了GPL协议的法律效力,但未深入探讨或阐述对GPL协议“传染性”的理解,对涉案三个插件是否构成独立作品,是否应受到GPL协议约束的判断规则也存在争议。

究竟为什么本案法院对于涉案三个插件是否受GPL协议约束的判断引发国外知识产权律师的质疑?[6]

我们需要回到本案法院引述的GPL v3.0协议原文进行分析,下面摘录了部分协议原文做展示:

1.

"The Program" refers to any copyrightable work licensed under this License.

[...]

To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of p 4, provided that you also meet all of these conditions:

[...]

  1. c) [...] This License will therefore apply, along with any applicable p 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged [...]

[...]

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.[7]

根据GPL v3.0协议的要求,一旦使用以GPL v3.0协议许可的开源软件,被许可人在传播GPL开源软件或其修订版本时,都应当遵守GPL协议的要求开放源代码,并同样使用GPL v3.0协议对外提供许可,允许其他人根据GPL v3.0协议条款使用GPL开源软件或其修订版本,这就是在开源业界经常提到的GPL协议的“传染性“。

但是,GPL v3.0协议也明确规定了一个例外情形。即对于与GPL开源软件聚合(Aggregate)在一起的独立的程序,如果其本质不属于GPL开源软件的衍生,也不是与GPL开源软件结合成一个更大的程序,那么GPL协议并不会“传染”此类独立的程序,GPL协议条款对其不具有约束力。

GPL协议允许被许可人制作并发布一个聚合版,即使其中包含非开源软件或与GPL协议不兼容的其他开源协议也可以,只要被许可人制作的聚合版许可协议不禁止用户行使每个独立程序许可协议允许的权利。

由此可见,本案柚子公司提出的涉案三个插件属于应遵守GPL协议开放源代码的程序是否成立,应取决于涉案三个插件是属于独立的程序,还是属于GPL开源软件的衍生作品。

根据Free Software Foundation(GPL协议的作者)对“聚合版”和“修改版”的对比分析[8]:“‘聚合版’包含有多个独立的程序,并在同一个CD-ROM或其他媒体上发行。

究竟怎么区分是两个独立的程序,还是一个程序的两个部分呢?这是一个法律命题,最终会由法官来决定。

我们相信合理的标准既依赖于通信的机制(exec、pipes、rpc、共享地址空间的函数调用,等等),也依赖于通信的语义(交换了什么样的信息)。如果两个模块都包含在同一个可执行文件里,那么它们一定是一个程序的组件。

如果两个模块运行时是在共享地址空间连接在一起的,那么它们几乎也构成一个组合软件。反过来,管道(pipes)、套接(sockets)和命令行参数通常都是两个不同程序通信的机制。

因此,如果使用它们来通信,这些模块正常应该是独立的程序。但是如果通信的语义非常密切,交换复杂的内部数据结构,那么它们也被会认为是一个大程序的两个组合部分。

也就是说,判断一个程序是需要遵守GPL协议的衍生作品,还是不需要遵守GPL协议的独立程序,应该基于对程序之间通信关系、依赖关系、调用关系的深入分析。

而本案一审法院仅以“处于独立的文件夹”和“文件夹中没有GPL开源协议”认定涉案三个插件属于独立的程序,不受GPL协议的约束的判断过于简单粗暴,不符合开源社区和其他国家司法实践中的主流思路和方案,难免引起外界争议。

尤其是“文件夹中是否包含GPL协议”不应当成为认定该程序是否受到GPL协议约束的因素。因为从逻辑上来讲,一个程序需要遵循GPL协议时,附随GPL协议对外分发是一个必须履行的义务,没有按照要求将GPL协议包含在程序中对外分发则构成对GPL协议的违反,进而构成对原著作权人的权利侵犯。

如果文件夹中不包含GPL协议是认定不受GPL协议约束的因素之一,那是不是被许可人在再次分发GPL软件时都会选择不要随附GPL协议,以此规避GPL协议对某个程序的“传染性”?

此外,本案二审法院在其认定侵权行为个数时提到“数字天堂公司现有证据不足以正面涉案三个插件可以独立于HBuilder开发工具软件中的其他程序独立运行”,既然涉案三个插件不可独立于其他程序独立运行,是否更应该深入分析其与其他程序之间的关系,并进而分析涉案三个插件是否应当受到GPL协议的约束?

正由于涉案三个插件的独立与否是柚子公司在本案唯一的突破口,柚子公司才在二审伊始即对涉案插件的独立性提出第三次司法鉴定。

遗憾的是,二审法院基于程序正义的原因驳回了柚子公司的鉴定申请,其对涉案三个插件不具独立性的认定与涉案三个插件不应受到GPL协议约束的原因分析也似乎存在矛盾。

三、相关开源软件应如何风控?

商业软件公司使用开源软件时如何开展风险防控?本案有以下启示:

1.如何规避GPL协议的“传染性”

在众多开源软件许可协议中,GPL协议无疑是最负盛名的一种,从第一版到第三版,协议条款随开源理念的发展在不断更新演进,还发展出“传染性”相对较弱的LGPL协议(GNU Lesser General Public License),和“传染性”更强的AGPL协议(GNU Affero General Public License)。

这些GPL家族的开源协议是开源软件中应用最为广泛的许可协议。相比于MIT、BSD、Apache等宽松开放的开源软件许可协议,GPL协议的宗旨在于保障每个人对GPL开源软件拥有同等的复制、修改和创建衍生作品的自由。

因此使用、修改GPL开源软件或创建其衍生作品均需根据GPL协议条款,对外开放整个程序的源代码。

随着开源软件的盛行,越来越多的商业产品也有需要用到GPL开源软件,但是又对GPL协议的“传染性”闻者色变,担心其“传染性”导致整个商业软件产品被迫要求开放源代码,造成商业利益的损失。

那么如何能在商业产品中使用GPL开源软件,并避免GPL协议的传染性?

首先,GPL协议的触发点是“分发distribute(GPL v2.0协议)”或“输送convey(GPL v3.0协议)”[9]。

也就是说,被许可人使用GPL开源软件,但不对外分发或输送GPL开源软件或其衍生作品的副本,则不需要受到GPL协议的约束。使用电子邮件、U盘、网页链接、私有化部署等方式提供给用户下载或安装GPL开源软件都视为构成分发或输送,但是通过“软件即服务(SaaS)”的模式,即在后端服务器部署GPL开源软件,而用户无需进行任何安装,直接通过网络远程接入服务的方式即可避免GPL协议的“传染性”,这也是当下迅猛发展的公有云服务厂商经常采用的一个规避措施。

其次,根据本文之前的分析,GPL协议明确规定了一个例外情形,即GPL协议并不会“传染”仅仅与GPL开源软件聚合在一起,本质不属于GPL开源软件的衍生,也不是与GPL开源软件结合成一个更大的程序的独立程序。

Free Software Foundation对“聚合版”和“修改版”的对比解释说明进一步提供了规避GPL协议“传染性”的解决方案,即不要将GPL开源软件和商业软件产品存放于共享地址空间,而通过管道(pipes)、套接(sockets)和命令行参数等方式达成独立程序之间的通信或调用,以此实现商业软件产品与GPL开源软件的隔离,避免商业软件产品被GPL协议传染,被迫开放源代码。

值得注意的是,动态链接的方式能否规避GPL协议的“传染性”仍然存在争议。

Free Software Foundation认为不可以,把GPL开源软件与其他作品动态链接就是基于GPL开源软件合成了一个作品,而这个“组合”就是GPL开源软件的衍生品[10]。Free Software Foundation这一观点与目前主流商业软件公司的观点存在冲突,也还从未在法庭上进行过验证。

2.中国法院是否倾向于保护对GPL协议的违反行为?

署名为You Yunting的作者曾在Bridge IP Law Commentary网站发表一篇题为《为什么中国法院保护违反GPL许可协议的行为?》的文章[11],试图分析为什么中国法院的判决倾向于保护违反GPL协议的行为。

其中提到一个现实的原因是绝大部分开源软件都是由国外开发者贡献,国内企业鲜少参与,因此即使对开源软件权利的保护不足也不会对国内企业产生很大的影响。同时,中国法院采取的立场是更多地鼓励创新,即便违反了开源软件许可协议,但在开源软件基础上产生的衍生作品也属于一种创新,需要得到保护。

姑且不论这篇文章的观点是否正确,从数字天堂公司诉柚子公司的GPL中国第一案可以看到中国法院对于GPL协议条款的解读确实暂未达到专业和精准的程度,那是不是意味着中国能成为GPL协议违反行为的避风港?

显然不是的,毕竟著作权侵权诉讼可以在侵权作品传播的地点提起。也就是说,即便是一家中国公司在中国使用GPL开源软件开发其商业产品,只要这个违反GPL协议的商业产品在美国存在分发,比如权利人在美国可以下载到不遵守GPL协议的商业软件产品,权利人完全有可能选择在美国提起著作权侵权诉讼。

参考资料:

[1] (2015)京知民初字第631号 数字天堂(北京)网络技术有限公司与柚子(北京)移动技术有限公司等一审民事判决书(以下称“《一审判决书》”)http://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=da814402b7af4f2a9f2aa8cc0010dbb4

[2] “鉴定机构的主要鉴定意见为:1、针对输入法功能插件:被诉侵权软件30个源代码中有29个源代码文件与原告软件对应源代码具有同一性;2、针对真机运行功能插件,被诉侵权软件23个源代码中有18个源代码文件与原告软件对应源代码具有同一性;3、针对边改边看功能插件,被诉侵权软件56个对应源代码中有44个源代码与原告软件对应源代码具有同一性。” -- 摘自《一审判决书》

[3] “鉴定机构的第二次鉴定意见为:1、将具有同一性的代码输入功能插件的29个源代码与被告提供的在先软件源代码进行比对,均无对应关系,即不具有同一性;2、将具有同一性的真机运行功能插件的18个源代码与被告提供的在先软件源代码进行比对,共13个源代码文件具有同一性;3、将具有同一性的边改边看功能插件的44个源代码与被告提供的在先软件源代码进行比对,共2个源代码文件具有同一性。” -- 摘自《一审判决书》

[4] (2018)京民终471号 柚子(北京)移动技术有限公司等与数字天堂(北京)网络技术有限公司二审民事判决书(以下称“《二审判决书》”)http://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=3c0957c9b82e456eb6ceab0d002c50ba

[5] “柚子科技公司和柚子移动公司补充提交(2018)京方正内经证字第01807号公证书,并再次提出司法鉴定,申请以下鉴定事项:1、涉案三个插件是否可以脱离Eclipse主体软件在Windows环境中独立运行;2、将涉案三个插件源代码编译为插件以验证插件能否在Eclipse主体软件中独立运行;3、任意删除Hbuilder软件目录下的一个或多个以“org.eclipse”“org.apache”“com.aptana”为前缀的文件或目录JAR文件以验证涉案三个插件能否正常运行;4、将涉案三个插件的文件反编译后的代码与(2018)京方正内经证字第01807号公证书中的第三方代码文件做比对,以判断是否具有同一性或同一性比例;5、将涉案三个插件相关的com.aptana.core_3.3.0.201503251818.jar文件反编译后的代码与(2018)京方正内经证字第01807号公证书中的第三方代码文件做比对,以判断是否具有同一性或同一性比例。” -- 摘自《二审判决书》

[6] China's Courts Pass Controversial Rulings on Open-source Licensing, by Markus Deck and Philippe Heinzke, at https://www.lexology.com/library/detail.aspx?g=597bfc93-0e53-4ffb-8311-a8fe3129d7f8

[7] GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007, at https://www.gnu.org/licenses/gpl-3.0.txt

[8] GNU许可证常见问题 https://www.gnu.org/licenses/gpl-faq.html

[9] GNU许可证常见问题:“GPLv3中的“输送”和GPLv2中的“分发”是一回事吗?(#Convey vs Distribute) 是的,差不多是一回事。在我们针对 GPLv2 的执法过程中,我们了解到一些法律体系在其版权法中使用 “发布” 一词,但是涵义和我们的不同。我们创造了新的术语,用来避免这些不同造成的混淆和问题。” https://www.gnu.org/licenses/gpl-faq.html#NoDistributionRequirements

[10]GNU许可证常见问题:“GPL对相关软件的静态连接和动态连接模块有不同的要求吗?(#GPL Static vs Dynamic) 不。把GPL作品和其他模块静态或动态连接在一起就是在基于GPL作品合成一个作品。因此,GNU通用公共许可证的条款和条件涵盖整个合成的作品。” https://www.gnu.org/licenses/gpl-faq.html#GPLStaticVsDynamic

[11] Why China Court Protects Violation Against GPL License Agreement? Posted on July 15, 2013 by You Yunting, at http://www.chinaiplawyer.com/china-court-protects-violation-gpl-license-agreement/.

[12]GNU通用公共许可协议(英语:GNU General Public License,缩写:GNU GPL、GPL),是一个广泛被使用的自由软件许可协议条款,最初由理查德·斯托曼(Richard Matthrew Stallman)为GNU计划而撰写。此许可证最新版本为“第3版”(v3),于2007年6月29日发布。GNU宽通用公共许可证是改自GPL的另一个版本,其目的是为了应用于一些软件库。GPL给予了计算机程序自由软件的定义,并且使用Copyleft来确保程序的自由被完善的保留。--摘自百度百科

推荐阅读

TVP访谈 | 贝壳金服史海峰:中台虽百家争鸣,但不是所有企业必需品

相关推荐

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

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

QcloudCommunity的博客 402

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

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

QcloudCommunity的博客 1160

平平无奇的源码,竟藏着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的博客 713

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

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

QcloudCommunity的博客 714

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

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

QcloudCommunity的博客 1121

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

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

QcloudCommunity的博客 709

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

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

QcloudCommunity的博客 706

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

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

QcloudCommunity的博客 905

AI Infra 其实没有多少新东西

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

QcloudCommunity的博客 820

程序员越早想通这些越好

永远没有正确架构,你永远无法偿还完所有的技术债务,如同你永远不会设计出完美的界面,请避开完美主义的陷阱,永远没有完美的代码,能够满足当前需求,又为未来不管是自己还是他人留有扩展空间,就很好了。我们努力的方向就是将现实世界映射到有限的数据结构中,这就需要用户自定义类型,如果你的代码中包含类似 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的博客 756

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

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

QcloudCommunity的博客 1161

全方位对比: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的博客 1195

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

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

QcloudCommunity的博客 2628

自掏腰包一万元,拥抱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的博客 872

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的博客 759

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的博客 711

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

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

QcloudCommunity的博客 673
上一篇: TVP访谈 | 贝壳金服史海峰:中台虽百家争鸣,但不是所有企业必需品
下一篇: GPL协议中国第一案尘埃落定,相关开源软件应如何风控?
腾讯云开发者
腾讯云开发者 企业官方账号 企业官方账号
博客等级 码龄10年 6290粉丝 1962原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值