过去的一年,ChatGPT成为维基百科上受访最多的词条,是获取上亿用户最快的消费者产品。它开启了人工智能的新时代,产品功能快速迭代升级,一步一步都具有标志性意义。
那么,在OpenAI内部,是一个什么样的团队在建造这个产品?什么样的文化,让Chat
GPT团队能在如此激烈的竞争中保持领先?
像OpenAI所有的员工一样,Evan Morikawa在Linkedin上的头衔是OpenAI的技术员工成员(Member of Technical Staff),他实际上负责的应用工程(Applied Engineering)团队,构建了ChatGPT产品。
Evan Morikawa
需要了解的是,ChatGPT只是OpenAI的产品之一——OpenAI还推出了诸如DALL·E 3(图像生成)、GPT-4(大型语言模型)和OpenAI API(供开发者和公司将AI整合到业务中使用)等产品。
打造和扩展这些产品的工程、产品和设计部门被称为“Applied”。研究训练大型模型,然后Applied在这些模型上构建产品,如ChatGPT和API。
Applied小组在公司内成立较晚。OpenAI成立于2015年,而Applied则始于2020年夏季。当时OpenAI刚刚完成对GPT-3的训练,成立这个团队是为了构建和扩展GPT-3的API。
就在OpenAI发动董事会“政变”事件的前夕,他接受了科技博主 Gergely Orosz 的采访,介绍了OpenAI的文化。
下面是经过整理他的自述:
我于2020年10月加入OpenAI。那时OpenAI总共有大约150名员工,而Applied团队只有几个人。当时几乎每个在OpenAI工作的人都是研究员。我没有机器学习博士学位,但对于OpenAI正在构建API和工程团队感到兴奋。
在OpenAI,我最初单独为GPT-3API编写代码。几个月后,也就是2021年1月,我开始管理Applied Engineering团队。那时,我的团队大约有6个人。时至今日,两年半过去了,Applied Engineering团队已经发展到了130名工程师,我管理其中的一半左右。还有20个人是项目经理和设计师,整个Applied团队大约有150人。
从2020年10月起,OpenAI的规模已经从大约150人增长到今天的约700人(最近达到了近800人——编者)。而且我们还在继续招聘。
OpenAI是如何以如此之快的速度推出新功能的呢?我感觉每隔几个月就会推出一个重大的新功能。对于一个外部人来说,仅仅跟上就已经很难了!
一方面,这绝对是我职业生涯中速度最快的地方;另一方面,这并不是魔法。我认为关键有如下几点:
将ChatGPT设置为像一个小型独立创业公司一样运营
与研究的紧密集成
长期的产品和研究思考
解耦和渐进的发布
高人才密度
好习惯的日积月累
像小型独立创业公司一样运营
ChatGPT看起来、感觉起来,以及行为上都像仅一年的初创公司,但OpenAI本身已经成立了将近8年。OpenAI内的Applied组成立了3年。ChatGPT是Applied内的一个产品团队,大约一年前开始的。
我和其他Applied领导层希望,ChatGPT团队感觉就像是他们自己的独立创业公司。在实践中,这个目标随着团队的成长而发生变化。
在2022年夏季,我们开始开发后来成为ChatGPT的产品。那时,Applied有大约30名工程师,几个PM和设计师,并在运营如下产品:
GPT-3和Codex的API
模型的微调
嵌入式API
DALL·E 2
所有这些产品都使用相同的代码库,运行在相同的计算集群上,并使用相同的构建管道。在Applied内,我们按功能组建,工程师是一个统一的团队。
这些都随着ChatGPT而改变。
一些Applied的工程师、设计师、研究人员和布洛克曼(OpenAI总裁)一起找了一个房间,开始迅速迭代产品想法。
我们为这个初创的ChatGPT小组提供了一个独立的代码库和一个新的算力集群。开发环境看起来像创业公司或个人项目的初期阶段。
我们给予这个小小的ChatGPT子团队的目标是创造一个处于早期阶段的氛围,朝着产品适应市场(PMF)不断迭代。
我们需要形成节奏、速度和自主性。团队的每个成员都在现场工作,我们重新安排了座位,让人们相互靠近。
随着ChatGPT团队的壮大,我们确保其垂直整合。这意味着工程、产品、设计和关键研究人员始终紧密合作。在2023年5月,Peter Deng加入,领导ChatGPT工程、产品和设计,形成了一个紧密的团队。
我们之所以知道要这样设置ChatGPT团队,是因为在Applied团队开始开发第一个OpenAI API版本时,我们已经创建了类似的结构。三年前,我们也是从一小撮工程师开始,有一个全新的代码库、新的集群和绿地开发。我们也像初创公司一样运作,寻找产品市场适应。
这种“分形创业公司”的方法,感觉对任何新产品类别都是个的好模式。我预计对我们正在考虑的新的想法,将继续用这一模式应迅速迭代。
与研究的紧密集成
在大多数科技公司中,工程团队的经典三驾马车通常被称为EPD:
工程
产品
设计
这些团队通常彼此密切合作,跨功能团队通常包括工程、产品和设计的成员。
研究与产品团队的集成至关重要。与“EPD”相比,我更喜欢将我们在工程中紧密合作的团队称为“DERP”:
设计
工程
研究
产品
在OpenAI,许多产品问题实际上是研究问题。
例如,考虑这些问题,它们可能被视为功能请求:
ChatGPT如何生成更简洁的输出?
ChatGPT如何提供更准确的答案?
ChatGPT如何连接到其他数据源?
尽管这些问题可能感觉像是产品问题,但实际上它们在很大程度上依赖于研究。例如:如何调整或微调底层模型以实现期望的目标,我们可以采取哪些其他方法来实现这些结果?
研究人员与产品工程的整合并非总是显而易见的。在OpenAI,研究和应用是独立的组织结构。在研究组织内,有各种不同的研究团队,例如:
预训练团队:该团队训练GPT-4模型
后训练团队:他们对GPT-4进行微调
超级对齐团队:对齐GPT-4
多模态团队:使GPT-4能够看、听和说
……还有其他几个。
研究人员往往具有重要的学术或行业背景。他们阅读大量学术论文以保持前沿状态。他们还采用各种想法并运行大量实验来改进我们的模型。
他们都是亲自动手的;研究人员完成大量工程工作并编写大量代码!
我们本可以选择一种方法,把模型被“扔过墙”,即研究训练一个模型,然后交给Applied部门推广。然而,
我们总是希望避免一种文化,即研究仅专注于进行实验,而产品则只想商业化和赚钱。
为了防止这种情况发生,像ChatGPT这样的产品团队由软件工程师、设计师、产品经理和研究人员共同工作。在ChatGPT的情况下,大多数研究人员来自我们称之为Post Training(训练后)的研究团队。这些研究人员是最新微调技术和强化学习(RL)方法(如Proximal Policy Optimization。OpenAI提出的一种强化学习算法——编者)的专家。这些技术对于不断改进ChatGPT中的底层模型是必不可少的。由于这些研究人员是产品团队的一部分,并且正在进行自己的A/B实验,因此研究与工程之间的反馈循环非常紧密。
与研究的紧密结合,是我们为什么能够如此快速地推出新想法的原因。我们是如何在如此短的时间内推出浏览、代码执行、插件等ChatGPT功能的呢?这是因为紧密的整合!所有这些都始于研究思想,并且由于进行研究的团队与工程团队紧密结合,它们迅速部署到生产环境!此外,在研究和应用中都有一种摆弄和原型设计的文化。许多这些原型非常迅速地进入了实际产品中。
长期产品和研究思维
OpenAI的使命是确保通用人工智能(AGI)使全人类受益。我们所说的AGI,指的是在大多数经济上有价值的工作中超越人类的高度自治系统。这一使命在OpenAI章程文件中有所体现。章程文件更详细地反映了OpenAI的战略,例如详细说明了对长期安全性的关注。
我们的章程和使命几乎在每次全员会议上都会被提及。在具体产品讨论中,我们总是善于用这种说法提出我们的使命,“这些选项中哪一个感觉更接近AGI”。它不仅有助于决定要构建什么,也决定了很多不构建的东西,因为专注于使命。
清晰的焦点总是推动速度的因素。
我确信我们的使命有助于保持这种关注,并为许多新想法铺平了道路。
另一件非常有用的事情,是我们组织研究倡议:
并行的研究计划有助于我们更快地推出产品。
研究团队不断思考创建更强大模型的统一方式。例如,多模态一直是一个与文本模型并行的研究。研究还要确保各种并行的工作不是零和的,也不是与其他研究无关的。
我们不希望构建大量的小模型;我们希望朝着通用人工智能迈进。
并行的多个研究计划加速了我们的推进。例如,我们能够在相对短的时间内推出了GPT-4、GPT-4V、文本到语音和语音到文本。这在很大程度上要归功于研究团队内部的并行努力。
非耦合和渐进式发布
我们尽力避免采用“一次性全部”的发布模式。这不仅因为早期和经常发布是一种经过验证的产品策略,也是因为渐进式发布是我们安全策略的基本原则之一。
在公司内部,AI安全是一个重要话题。安全问题在我们的工作中非常核心,以至于安全顾虑可以超越发布和增长目标。我们的核心原则之一是逐渐从现实世界中学习。关于这个主题,我们在《我们的AI安全方法》中有更多的文档。
我们在安全方面采取了多种方法,比如:
红队测试:由一组安全专家组成的“红队”扮演攻击者的角色,测试和评估安全措施的有效性
对齐研究:研究和开发确保AI系统以符合人类价值观行事,不会不经意地造成伤害的技术
政策工作:加强AI技术和服务的安全性和信任性,总结治理实践,与全球各地的政策制定者合作
除了这些工作,我们还观察到,渐进地、有控制地与现实世界接触是识别和解决安全问题的最重要方法之一。
我们的产品逐渐推出,并进行监控。我们的产品发布必须经过这样一个阶段,与精选的API客户进行监控试验,然后进行渐进式的推广。
也许有趣的是,尽管外界看到ChatGPT突然爆红,但在OpenAI内部,我们花了多年时间在更受控制的环境中熟悉这些模型!
ChatGPT的发布本意是收集有关对话模型的反馈,没想到这一版本引爆了一轮病毒性的媒体传播。
高人才密度
OpenAI的CEO Sam Altman一直非常注重高才密度。所谓的“高才密度”是指平均技能水平和绩效远远超过大多数公司的标准,因此在OpenAI,卓越就是工作的标准。
高级团队可以非常快速地推出产品。由于专注于高才密度,我们在Applied内部招聘时故意偏向招聘资深的工程师。我们还尽量保持团队的规模较小。事实证明,
小规模的高级团队可以非常快速地推出产品!
这样就更容易授权和信任他们做出正确的决策。我对自发决策很有信心,通常认为它们会基本指向正确的方向。我们进行内部审查并记录我们的想法,但并非是一种强制性的方式。
在招聘Applied团队时,将YCombinator创始人类型与在大型科技公司大型项目开发经验的人融合在一起非常成功。我们需要同时满足两个方面的需求:
在ChatGPT中进行敏捷的早期迭代。前Y Combinator创始人在最早期阶段很善于折腾,在这方面表现出色。
大规模扩展我们复杂分布式系统的工程技能。曾经深入参与大规模系统扩展的工程师在这方面经验丰富。
我们并不害怕“买”而不是“造”。
了解创业生态系统最新工具的人是必不可少的
,但也要了解在我们的用例中这些工具何时可能失效。在可能的情况下,购买这些工具而不是自己建造它们,有助于保持团队的规模小而灵活。
然而,我们不能总是依赖购买或使用现有工具。我们认为对业务至关重要的任何事情,我们都会投资自己。此外,随着规模的扩大,我们可能会超越一些工具,有些人经历过这些痛苦,这些经验对我们来说至关重要。
谦卑感是我们普遍使用“技术人员成员”(member of technicalstaff)头衔的主要原因之一。在OpenAI,每个人都有“技术人员成员”的头衔,不管他们的经验或专业知识如何。这有几个原因。我们这里没有空间容忍不善于团队合作的“独行侠”,我们也不想吸引那些追求构建不必要复杂的东西来获得下一个花哨头衔的人。
我们希望每个人都能良好沟通,为我们的使命做出最好的决策。只要我们能够坚守这一点,我们将保持更高的专注度和更快的推进速度。
我们将安全性置于速度之上。在招聘时,我们会非常重视对AI安全性的思考深度。我们不希望速度把安全性置于次要地位。在使命的背景下,对正念的重视非常重要。
日常习惯的累积效应
关于为什么我们能够如此快速地推出产品,还有一个小节需要注意:我们的工作风格中有一个长尾的小事项,所有这些小事项都会积累起来:
星期一至星期三在办公室工作。每个人都在星期一、星期二、星期三来我们旧金山总部上班。这种面对面的方式有助于我们遇到意想不到的情况时仍能执行下去。
我记得在ChatGPT的早期,我们构建的东西每天都在发生变化。例如,我们正在构建的模型是不断调整的结果,因为我们的研究人员不断地对其进行微调。
令人惊讶的是,大量的进展是在肩膀上的即兴轻拍或参与听到的谈话中取得的。当然,我们定期进行同步会议,我们也能在计划的协作点之上取得即兴进展。
我们还进行了大量的即兴白板讨论。我们会在午餐桌上获得很多想法——真的!即兴社交互动在我们的团队迅速扩张时,成为了主要的入职机会。如果没有即兴的面对面互动,过去两年内入职大约120人将会更加困难。
星期四和星期五是一些员工的无会议日。在这些日子里,办公室的人员较少。很多人决定在这些日子里不开会,而是更专注于工作。
协调这些日子对我们的生产力至关重要。通过这种协调,我们团队每周的办公室的时间,在前三天就达到了关键的份量 (critical mass)。
这种节奏相当紧张。使命、产品的影响力和技术推动人们努力工作。但我应该指出,这并不一定意味着工作时间非常长。这不是一个在守着办公桌直到凌晨2点的地方。每个人都相互支持,我们对过度劳累保持警惕。
我们偏向于聘请更高级别的人,正如我之前提到的。这也意味着有很多带孩子的父母。每个人都非常认真地花时间和家人在一起。这些额外的承诺确实迫使人们保持高度的专注,优先考虑和时间的灵活性,包括我自己!
未来之路
我们面临着许多挑战,以保持我们的速度,比如:
壮大的团队。更大的团队将增加沟通开销和协调难度
更成熟的产品。我们构建的产品正在变得更加成熟,这种演变使得进行全面的产品更改更加困难
AI安全挑战。这些挑战将变得更加严峻,不仅对我们而言,对整个行业也是如此。我们可能需要调整我们的部署策略以适应这些挑战
我们期望尽量保持我们目前的原则。坚定的使命、整合的研究团队和高人才密度应该始终有助于我们。
对于我的团队、公司和人工智能的潜力,我持谨慎乐观的态度。我们自己工具的力量会让生产力得到提升,感受到这一点非常重要。我认为迄今为止我们所看到的只是可能性的冰山一角。
参考:
https://newsletter.pragmaticengineer.com/p/inside-openai-how-does-chatgpt-ship
.data_color_scheme_dark{--weui-ORANGERED: #ff6146;--weui-BG-0: #111;--weui-BG-1: #1e1e1e;--weui-BG-2: #191919;--weui-BG-3: #202020;--weui-BG-4: #404040;--weui-BG-5: #2c2c2c;--weui-FG-0: rgba(255, 255, 255, .8);--weui-FG-HALF: rgba(255, 255, 255, .6);--weui-FG-1: rgba(255, 255, 255, .5);--weui-FG-2: rgba(255, 255, 255, .3);--weui-FG-3: rgba(255, 255, 255, .1);--weui-FG-4: rgba(255, 255, 255, .15);--weui-FG-5: rgba(255, 255, 255, .1);--weui-RED: #fa5151;--weui-REDORANGE: #ff6146;--weui-ORANGE: #c87d2f;--weui-YELLOW: #cc9c00;--weui-GREEN: #74a800;--weui-LIGHTGREEN: #3eb575;--weui-BRAND: #07c160;--weui-BLUE: #10aeff;--weui-INDIGO: #1196ff;--weui-PURPLE: #8183ff;--weui-WHITE: rgba(255, 255, 255, .8);--weui-LINK: #7d90a9;--weui-TEXTGREEN: #259c5c;--weui-FG: #fff;--weui-BG: #000;--weui-TAG-TEXT-RED: rgba(250, 81, 81, .6);--weui-TAG-BACKGROUND-RED: rgba(250, 81, 81, .1);--weui-TAG-TEXT-ORANGE: rgba(250, 157, 59, .6);--weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);--weui-TAG-TEXT-GREEN: rgba(6, 174, 86, .6);--weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);--weui-TAG-TEXT-BLUE: rgba(16, 174, 255, .6);--weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);--weui-TAG-TEXT-BLACK: rgba(255, 255, 255, .5);--weui-TAG-BACKGROUND-BLACK: rgba(255, 255, 255, .05)}.data_color_scheme_dark{--weui-BTN-ACTIVE-MASK: rgba(255, 255, 255, .1)}.data_color_scheme_dark{--weui-BTN-DEFAULT-ACTIVE-BG: rgba(255, 255, 255, .126)}.data_color_scheme_dark{--weui-DIALOG-LINE-COLOR: rgba(255, 255, 255, .1)}.data_color_scheme_dark{--weui-BG-COLOR-ACTIVE: #373737}.data_color_scheme_dark{--weui-BG-6: rgba(255, 255, 255, .1);--weui-ACTIVE-MASK: rgba(255, 255, 255, .1)}.rich_media_content{color:#000000e5;font-size:17px;font-size:var(--articleFontsize);overflow:hidden;text-align:justify}.rich_media_content{color:#ffffffa6;color:var(--weui-FG-HALF)}.rich_media_content{position:relative;z-index:0}.wxw-img{vertical-align:bottom}blockquote{padding-left:10px;border-left:3px solid #dbdbdb;color:#00000080;font-size:15px;padding-top:4px;margin:1em 0}blockquote{color:#ffffff8c;color:var(--weui-FG-1)}@media(prefers-color-scheme:dark){body:not([data-weui-theme=light]) .rich_media_meta_text,body:not([data-weui-theme=light]) .icon_appmsg_tag.default,body:not([data-weui-theme=light]) .simple_pagination,body:not([data-weui-theme=light]) .sp_page_current,body:not([data-weui-theme=light]) blockquote,body:not([data-weui-theme=light]) .blockquote_info{color:#ffffff4d}}@media(prefers-color-scheme:dark){body:not([data-weui-theme=light]) blockquote{border-color:#404040}}@media(prefers-color-scheme:dark){body:not([data-weui-theme=light]) blockquote{border-color:#404040}}.data_color_scheme_dark .rich_media_meta_text,.data_color_scheme_dark .icon_appmsg_tag.default,.data_color_scheme_dark .reward_area_win .reward_user_tips .weui-loadmore__tips a,.data_color_scheme_dark .simple_pagination,.data_color_scheme_dark .sp_page_current,.data_color_scheme_dark blockquote,.data_color_scheme_dark .blockquote_info{color:#ffffff4d}.data_color_scheme_dark blockquote{border-color:#404040}*{margin:0;padding:0}.rich_media_content *{max-width:100%!important;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;word-wrap:break-word!important}body,.wx-root,page{--weui-BTN-HEIGHT: 48;--weui-BTN-HEIGHT-MEDIUM: 40;--weui-BTN-HEIGHT-SMALL: 32}body,.wx-root{--weui-FG-1: rgba(0, 0, 0, .55);--weui-ORANGERED: #ff6146;--weui-BG-0: #ededed;--weui-BG-1: #f7f7f7;--weui-BG-2: #fff;--weui-BG-3: #f7f7f7;--weui-BG-4: #4c4c4c;--weui-BG-5: #fff;--weui-FG-0: rgba(0, 0, 0, .9);--weui-FG-HALF: rgba(0, 0, 0, .9);--weui-FG-1: rgba(0, 0, 0, .5);--weui-FG-2: rgba(0, 0, 0, .3);--weui-FG-3: rgba(0, 0, 0, .1);--weui-FG-4: rgba(0, 0, 0, .15);--weui-FG-5: rgba(0, 0, 0, .05);--weui-RED: #fa5151;--weui-REDORANGE: #ff6146;--weui-ORANGE: #fa9d3b;--weui-YELLOW: #ffc300;--weui-GREEN: #91d300;--weui-LIGHTGREEN: #95ec69;--weui-BRAND: #07c160;--weui-BLUE: #10aeff;--weui-INDIGO: #1485ee;--weui-PURPLE: #6467f0;--weui-WHITE: #fff;--weui-LINK: #576b95;--weui-TEXTGREEN: #06ae56;--weui-FG: #000;--weui-BG: #fff;--weui-TAG-TEXT-RED: rgba(250, 81, 81, .6);--weui-TAG-BACKGROUND-RED: rgba(250, 81, 81, .1);--weui-TAG-TEXT-ORANGE: #fa9d3b;--weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);--weui-TAG-TEXT-GREEN: #06ae56;--weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);--weui-TAG-TEXT-BLUE: #10aeff;--weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);--weui-TAG-TEXT-BLACK: rgba(0, 0, 0, .5);--weui-TAG-BACKGROUND-BLACK: rgba(0, 0, 0, .05)}body,.wx-root{--weui-BG-6: rgba(0, 0, 0, .05);--weui-ACTIVE-MASK: rgba(0, 0, 0, .05)}@media screen and (min-width:1024px){body:not(.pages_skin_pc){background:#191919;background:var(--weui-BG-2)}}@media(prefers-color-scheme:dark){body:not([data-weui-theme=light]).my_comment_empty_data{background-color:#111}}.wx-root,body{--weui-BTN-ACTIVE-MASK: rgba(0, 0, 0, .1)}.wx-root,body{--weui-BTN-DEFAULT-ACTIVE-BG: #e6e6e6}.wx-root,body{--weui-DIALOG-LINE-COLOR: rgba(0, 0, 0, .1)}.wx-root,body{--weui-BG-COLOR-ACTIVE: #ececec}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--appmsgExtra-BG: #121212}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-ORANGERED: #ff6146;--weui-BG-0: #111;--weui-BG-1: #1e1e1e;--weui-BG-2: #191919;--weui-BG-3: #202020;--weui-BG-4: #404040;--weui-BG-5: #2c2c2c;--weui-FG-0: rgba(255, 255, 255, .8);--weui-FG-HALF: rgba(255, 255, 255, .6);--weui-FG-1: rgba(255, 255, 255, .5);--weui-FG-2: rgba(255, 255, 255, .3);--weui-FG-3: rgba(255, 255, 255, .1);--weui-FG-4: rgba(255, 255, 255, .15);--weui-FG-5: rgba(255, 255, 255, .1);--weui-RED: #fa5151;--weui-REDORANGE: #ff6146;--weui-ORANGE: #c87d2f;--weui-YELLOW: #cc9c00;--weui-GREEN: #74a800;--weui-LIGHTGREEN: #3eb575;--weui-BRAND: #07c160;--weui-BLUE: #10aeff;--weui-INDIGO: #1196ff;--weui-PURPLE: #8183ff;--weui-WHITE: rgba(255, 255, 255, .8);--weui-LINK: #7d90a9;--weui-TEXTGREEN: #259c5c;--weui-FG: #fff;--weui-BG: #000;--weui-TAG-TEXT-RED: rgba(250, 81, 81, .6);--weui-TAG-BACKGROUND-RED: rgba(250, 81, 81, .1);--weui-TAG-TEXT-ORANGE: rgba(250, 157, 59, .6);--weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);--weui-TAG-TEXT-GREEN: rgba(6, 174, 86, .6);--weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);--weui-TAG-TEXT-BLUE: rgba(16, 174, 255, .6);--weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);--weui-TAG-TEXT-BLACK: rgba(255, 255, 255, .5);--weui-TAG-BACKGROUND-BLACK: rgba(255, 255, 255, .05)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-BTN-ACTIVE-MASK: rgba(255, 255, 255, .1)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-BTN-DEFAULT-ACTIVE-BG: rgba(255, 255, 255, .126)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-DIALOG-LINE-COLOR: rgba(255, 255, 255, .1)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--APPMSGCARD-BG: #1E1E1E}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--APPMSGCARD-LINE-BG: rgba(255, 255, 255, .07)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-BG-COLOR-ACTIVE: #373737}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--weui-BG-6: rgba(255, 255, 255, .1);--weui-ACTIVE-MASK: rgba(255, 255, 255, .1)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--discussInput-BG: rgba(255, 255, 255, .03)}}@media(prefers-color-scheme:dark){.wx-root:not([data-weui-theme=light]),body:not([data-weui-theme=light]){--nickName-FG: #959595}}.rich_media_content p{clear:both;min-height:1em}td p{margin:0;padding:0}@media(prefers-color-scheme:dark){body:not([data-weui-theme=light]) .rich_media_content img:not(.wx_img_placeholder){filter:brightness(.8)}}a{color:#576b95;text-decoration:none;-webkit-tap-highlight-color:#0000;-webkit-user-drag:none}a{color:#7d90a9;color:var(--weui-LINK)}a,button{cursor:pointer}@media screen and (min-width:1024px){body:not(.pages_skin_pc) :root{--appmsgPageGap: 20px}}:root{--articleFontsize: 17px}:root{--sab: env(safe-area-inset-bottom)}:root{--wxBorderAvatarRatio: 3}:root{--discussPageGap: 20px}:root{--appmsgPageGap: 20px}