从Agent到AGI还有多远?

人工智能
本文将通过一个关于 Agent 的实验,探讨从 Agent 到 AGI 还有多远。

一、一个探讨 Agent 极限的实验

首先来看一个简单的题目,屏幕上展示了一串字符,任务是从中抽取一个语法正确的英文句子。请大家花十秒钟时间尝试一下。

图片

为了简化这一任务,我们对这些词进行着色处理,帮助大家更快识别出正确的句子。

图片

当把这个问题交给模型时,即使是像 GPT4 这样的高级模型,也可能出现一些细微但关键的错误,比如遗漏字母或单词拆分不准确。

图片

我们的团队致力于构建一个能够精确解决问题的智能体。以下是八月时的一个截图,展示了我们的系统如何逐步学习并最终解决了这个难题。

图片

为了评估系统能力,我们参考了一个由 HuggingFace 和 Meta 设计的评估基准(benchmark),它包括三个不同难度级别的测试。人类在这个基准上的表现近乎完美,得分高达 90 分,而即便是最先进的系统如 GPT-4 或搜索引擎,再加上 Plugin 后,仍然难以达到相同水平。然而,我们的系统能够在测试集上取得最佳成绩。事实上,在提交结果后六小时内就引起了关注,Llama 团队的 Thomas 通过推特联系我,希望能够了解我的方法和技术细节。

图片

下图中是几个来自 GAIA Benchmark 的案例,从简单到复杂逐步递进,展示了智能体处理不同类型查询的能力。第一个例子相当基础,几乎不需要深入解析。而第二个则需要更高的定位和解析能力,因为涉及到的信息检索和理解更为复杂,在处理具体信息的过程中,需要查阅特定资料。随着任务的深入,非专业人士可能会遇到理解障碍,甚至需要具备编程能力来读取和解析一些复杂文件,并执行计算以得出结果。最终步骤往往变得更加复杂。

图片

这些问题具有以下特点,首先,虽然看似简单,但完成它们可能需要相当长的时间——大约 5 到 20 分钟,最多可达 50 个步骤,这些任务虽然各自简单,但组合起来形成一个冗长且复杂的流程。更复杂的例子包含大量的学术内容,例如某个问题可能需要经过 12 步的搜索和分析才能从 PDF 文档中找到答案。这类问题对我个人而言也颇具挑战性,因为它们涉及许多专业术语和背景知识。

我们进行这项研究的原因并非直接与产品相关,而是出于个人兴趣。当前使用的各种 AI 产品或工具,无论是 GPT 还是国内其他 AI 产品,在实际部署当中,我们希望确保系统能够在指定时间内向用户提供反馈,并尽量降低机房运营成本。然而,探索 AI  能力边界的需求与此目标存在一定矛盾。因此,我们决定在不受任何产品或成本限制的情况下,评估现有系统的极限性能。这一过程中,我们不考虑成本因素,专注于观察其效果。

另一个目的是寻找更高效的日常工具。尽管现有的工具如 ChatGPT 和 Perplexity 已经非常实用,但仍存在改进空间。例如,Perplexity 能够进行简单的多步搜索。尽管付费版可以提供额外的支持,但仍然不足以满足所有需求。从个人工作角度来看,调研不同领域的工作是一项耗时的任务,每次大约需要 1 到 2 周时间,因此希望有一个更加高效和多功能的工具来加速这一过程。

图片

回顾智能体(agent)的定义,根据经典本科教材,智能体是指具有主观能动性的实体,能够采取行动。这种主观能动性(agency)是语言模型基础智能体的核心特征。记忆和规划能力可以通过工具调用来增强智能体的功能,使得许多原本复杂的任务变得可行。此框架的应用使得我们可以更快地为客户提供定制化服务,降低成本,同时应对各种可能出现的问题。

在 GAIA Benchmark 排行榜上,微软、HuggingFace 等机构的研究成果名列前茅。我们在尝试复现这些结果时,发现了多种智能体解决方案。通过 Google 搜索相关文献,可以看出智能体领域的研究方案众多。这表明智能体的设计和实现具有很大的灵活性,但也意味着选择最优方案并非易事。现有的大多数方案都是把 SOP(standard operating procedure) 转成 workflow,但缺乏理论指导来确定哪个方向能持续带来更好的结果。例如构建小型 Agent 医院或 Agent 企业的过程中,哪些方案是真正有效的?这些问题在学术讨论中较少涉及,更多被视为工程上的复杂框架。

架构设计本质上是一种搜索过程,那么如何进行有效的搜索呢?我们需要一些启发方法。

回顾历史,1956 年和 1957 年是关键两年,这两年萌芽了人工智能(AI)和认知科学两个领域。认知科学和 AI 可以认为是同一事物的不同方面:AI 通过重建方式理解人类智能,而认知科学尝试从分析人类来研究智能的本质。因此,我们考虑使用认知理论作为指导,以避免盲目尝试,并检验这些理论是否有助于建模人类智能。

图片

Dual Process Theory 这一理论将人类智能抽象成两套系统:快速、自动化且无意识的过程(如简单算术),以及需要缓慢、有意注意和有意识思考的过程(如解释思考过程)。后者的特点是可以向第三方报告思考过程,适用于解决更复杂的任务。

图片

另一理论是 Global Workspace Theory。该理论认为大脑内部存在不同的模块,这些模块通过某些总线或公共区域进行通讯。人类的意识范围有限,我们同时能关注的信息量非常有限。最初这只是一个纯理论概念,后来 Dehaene 提出的 Global Neural Workspace Theory 理论进一步提供了解剖学支持,使得这一理论更加清晰易懂。它本质上提出了一个递归的数据结构,而在不同 Decoder 模型中都有类似的上下文限制。

例如,早期的模型如 GPT-2 具有 4096 个 token 的上下文窗口,而更新的模型则扩展到数百万个 token。尽管如此,实际应用中,模型通常强调其长上下文窗口的能力。然而,用户在实际使用时可能并不会完全利用到这么大的窗口。模型的效果会随着使用时间的增长而逐渐下降,并非完全无损。这种衰减背后的因素众多,例如,在处理文档分组(document grouping)时,数据切割会影响质量;在进行 SFT 时,缺乏高质量、长文本的数据也会导致效果随 token 长度增加而逐渐下降。

图片

基于这些理论,我们设计了一套系统。其核心流程为:提出问题后,模型选择适当的工具(系统主要包含浏览器和 Python 执行器两个组件)通过这些工具选择和提取信息,并将这些信息压缩后放入全局工作空间(global workspace);随后,系统判断是否需要更多信息以完成多步推理或搜索过程;当系统认为已获取足够信息来回答问题时,进入一个多代理辩论过程,最终得出结论并返回结果。

在这个过程中,全局工作空间(Global Workspace)扮演着关键角色。因为有大量文献检索结果和事实性信息,所以需要一套机制来管理这些信息。

图片

具体来说,Sibyl 的每个模块内部都采用了类似 CoT(Chain-of-Thought)的方法。并且由于较多的推理流程,会产生大量的中间 token。我们如何管理这个流程中产生的大量 token?

举个例子,当抓取一个 PDF 文件时,模型每次仅查看一个窗口内的内容,窗口大小约为 5000 个 token。在获取 5000 个 token 后,模型根据问题进行思考,并进行事实性抽取(类似抽取式摘要)。抽取出的事实包括来源网页及具体位置信息。经过一系列思考步骤,最终生成大约 300 个左右的笔记。解决一个问题时,整套系统消耗的 token 数量最多不超过 10k,远低于大多数现有模型所需的 token 数,这使得模型效果有显著提升。

图片

起初,我们采用 RAG 方案,但发现这种方法难以解决复杂问题,因为 RAG 会抛弃上下文中的顺序信息,代价就是速度较慢且成本较高。

关键问题包括:

  • GPT-4 会犯低级错误,例如重复搜索同一关键词,即便之前已经找到相关信息。
  • 缺乏系统性的学习机制,整个系统是一个静态函数,无法根据使用情况进行自我改进。
  • 推理过程不可靠,当推理过程过长时,失败率显著增加,影响问题解决的成功率。OpenAI 的 o1 出来后稍有改善。

这些问题促使我们进一步深入 Agent 和 LLM 的底层细节,探究问题的根源。

二、Agent 和 LLM 的一些底层细节

LLM 实现 Agent 的原理其实相当简单,下图是一个 Chat Template 的示例。LLM 底层本质上就是在类似的文本结构上进行 token 预测,并实现了如角色定制、工具调用等功能。

图片

下图是经典的Transformer架构,包括Encoding、Decoding两部分。Encoding 之后,进行 cross attention,在 forward 过程中,每层都执行加操作。特别指出加操作的原因在于它不仅有助于梯度传递,还对训练稳定性、模型可解释性等方面有着积极作用。

图片

例如,在多层神经网络中,每一层都会从残差流中读取信息,执行特定操作后,再将这些信息添加到输出中。Attention 机制负责在不同 token 之间复制信息,而 MLP 则专注于信息的筛选与更新。这种逐步完善 token 预测的过程,直到最终结果的生成,体现了深度学习模型在处理复杂任务时的内在逻辑。

图片

关于知识定位的问题,去年我们的一位实习生的工作展示了如何通过模型追踪特定知识的位置。例如,确定“法国的首都是什么”这类事实性知识在模型中的存储位置。这项工作强调了模型解释性的重要性,即理解模型是如何以及在哪里存储和应用知识的。

Attention 机制的作用是将相关信息(如关于法国的信息)带入到需要处理的位置。随后,MLP 的任务是识别“法国的首都”这类信息,并将其填入相应位置,从而生成一个选项。这一过程展示了模型如何逐步完善预测,直到最终输出结果。

图片

大型语言模型不仅具备大量预训练知识,还在 Inference 阶段具有一定的学习能力。在推理过程中,模型能够通过特殊的注意力头(induction head)实现上下文学习(in-context learning)。具体来说,当模型尝试用 A 来预测 B 时,注意力头会向前搜索类似 A 的 token,并将这些 token 之后的信息复制过来,以辅助当前预测。仅靠这种注意力机制,模型就能实现大多数上下文学习任务,且通常只需少量层次(两层)即可完成。

因此,模型的知识和学习能力共同构成了其两大核心功能。我们可以通过解释模型的残差流(residual stream)来理解其内部工作原理,这有助于揭示模型在不同层次上的信息处理方式。

图片

我非常喜欢的一项研究展示了模型在处理句子时的内部运作。如下图,该研究输入给模型一个句子,观察其预测每个词的概率伴随层的变化。例如,在预测逗号后的词时,模型的不同层次逐渐完善预测,直至达到较高的准确性。研究显示,某些层次的结果已经足够准确,这意味着并非所有层次都是必要的,从而为优化推理过程提供了可能性。

由于模型采用残差结构,推理过程中可以裁剪掉一些最后的层而不太影响性能,这有助于降低成本。然而,现在的模型结构也有一些挑战:模型的层数固定,使得每次推理所需的算力和能源消耗成为常量,无法根据问题难度动态调整。这意味着对于复杂度不断变化的问题,模型的效率可能受限。

图片

传统上,模型回答问题的方式较为直接,即输入一个问题并立即给出答案,而无需深入思考。这种方式可能导致模型依赖记忆而非推理。为了解决这一问题,我们希望将推理过程尽可能地在语言空间中展开,形成更复杂的推理链(chain-of-thought)。这不仅能提高模型的推理能力,还能增强其灵活性和适应性,使其更好地应对各种复杂问题。

图片

简单计算任务如 1+1 是否需要两步推理?如果询问模型“1+1 等于多少”,它可能会给出冗长的解释。然而,对于简单的算术运算,我们通常不需要如此复杂的推理过程。成人只有在思考 23×32 这类问题的时候才会需要推理过程,但是三岁的孩子在计算 2+3 时也需要借助手指。因此,推理并非一个静态的过程,而是涉及能量消耗和记忆空间的动态活动。

第二个问题是关于推理的定义。我们可以将推理总结为基于规则或知识进行计算的过程,这种计算可以理解为演绎。既然涉及到计算,就不可避免地会遇到停机问题,这部分内容将在后续讨论中展开。

前面提到了很多底层细节,这些细节往往难以记忆。因此,很多研究尝试将论文中的概念具象化,使其更易于理解。

随机鹦鹉(stochastic parrots):即仅通过统计模式生成文本,而不是基于真正的理解或推理。

通用模式机器(general pattern machine):能够通过上下文学习(in-context learning)从输入中提取模式并进行预测。

模拟器(simulator):可以高保真地模拟训练数据分布及其背后的机制。但因为是有损的,所以存在一些问题。

KV Database(70%)+In Context Learning(10%)+?(20%):这是我个人的理解。因为其大多数行为类似 KV Database,所以不可避免地存在 reversal curse。推荐阅读一篇关于可解释性的文章,其核心观点指出,模型在训练过程中可能无法正确关联 A 和 B 的关系,但如果将它们放入上下文中,模型就能更好地理解这些关系。

在实践过程中我们经常发现 prompt 不按预期工作。可以从两个角度来解释这一现象。

首先,从模拟器视角,一个衍生理论是 The Waluigi Effect。例如,在读侦探小说时,读者最初认为某个角色是好人,但在故事进展中发现其实际上是坏人。这反映了模型在处理新信息时可能出现认知转变。在训练过程中,模型的上下文定义可能是不完备的,就像一本小说中的人物关系需要逐步揭示一样,当新的 token 出现时,模型的理解会发生变化。

另外,从 KV DB + In Context Learning 视角,数据库中没有相关知识,需要通过插值的方式来处理,而插值不准,可以通过 CoT 或 RAG 的方式来解决。还可能是 prompt 的逻辑过于复杂,模型无法理解,可以通过 few-shot 的方式来解决。

三、从 Agent 到 AGI 还有多远

文章开头提到的 benchmark 显示,最优秀的 Agent 方案仅能达到三四十分,距离人类的 90 分还有 60 分的差距。这 60 分的差距到底在哪里呢?

首先第一个问题是,模型和人类谁更聪明。

图片

AlphaGo 的出现让人们看到了机器的能力,但它其实除了下棋其它事情并不擅长。因此我们需要明确对“聪明”的定义。

OpenAI 在其 2023 年 2 月发布的《Planning for AGI and beyond》一文中将 AGI 定义为“在大多数具有经济价值的工作中表现超越人类的高度自主系统”。2024 年 7 月,OpenAI 内部还发布了一个五级分类系统,用于评估其 AI 系统向 AGI 发展的进程:

  • 聊天机器人(Chatbots):具备对话能力的人工智能。
  • 推理者(Reasoners):能够解决人类水平问题的人工智能。
  • 代理(Agents):可以代表用户采取行动的人工智能。
  • 创新者(Innovators):能够协助发明的人工智能。
  • 组织者(Organizations):能够完成整个组织工作的人工智能。

回顾 IQ 的相关定义,最早的理论可以追溯到一百年前,一篇论文中通过大量儿童智力测试结果绘制出了分数的正态分布图,中位数设定为 100,用以衡量个体的认知能力高低。然而,随着时代变迁,这一标准也在改变。例如在 1987 年的研究中发现,从 1952 年到 1982 年间,人类的平均智商显著提升。

图片

随着时间推移,心理学家开始将认知能力拆分为更细致的体系,如流体智力(fluid intelligence)和晶体智力(crystallized intelligence)。流体智力涉及解决新问题、识别模式、抽象推理及适应新环境的能力;而晶体智力则包括累积的知识和经验、专业技能等。流体智力通常随年龄增长而逐渐下降,而晶体智力则会随着不断积累而上升。

图片

在实际应用中,当前的大型语言模型更倾向于晶体智力方面的工作,即基于已有的大量知识进行回答。虽然欧文等模型声称具有强大的推理能力,但在面对全新的、未见过的问题时,其表现往往不如人意,更多依赖于记忆中的已有信息而非即时推理。

为了进一步细化认知能力的分类,心理学引入了 CHC 理论(Cattell–Horn–Carroll theory),该理论发展至今已成为一个非常复杂的系统。它分为三层结构:最底层是具体子能力,如数量推理、语言能力、记忆能力等;中间层是对这些能力的归类;最顶层则是对整个系统的概括性描述——g factor。g factor 并非一个实际存在的概念,而是用来表达对下面所有评测结果的一种综合理解。

打个比方,例如刘翔作为一位优秀的短跑运动员,如果让他去打篮球,他学习的速度肯定比一般人快,因为他具备良好的体能。这种体能在人的身体素质中是一个通用的因子,类似的,g factor 就是人在智能领域的一个通用因子。

图片

回顾深蓝计算机的例子,人们曾以为只要解决了像国际象棋这样的特定任务,就等于解决了人类智能的问题,这里其实犯了一个错误。实际上,深蓝使用的是有限的能力,例如一些记忆能力——对常见棋盘开局的记忆,以及快速推理能力,在一个狭窄领域内做得非常迅速准确。但实际上,它缺乏许多其它方面的能力,因此尽管它可以解决很多问题,但并未准备好应对那些尚未被当前系统涵盖的问题。

现在大模型可能已经有所改进,但与人类智慧仍相差甚远。下图指引着 AGI 的发展方向,这些未触及的挑战正是目前研究的焦点。这个图也可以作为 AI 行业从业者的职业规划参考指南。

ARC-AGI 是一个专门设计用来测试 AI 系统在解决极其困难的数学和逻辑问题方面能力的基准测试,它由 François Chollet 于 2019 年提出。测试任务如下图所示,由前三组图推理出第四幅图对应的图片应该是怎样的。这个问题对于人类来说并不难,只是一个简单的填色问题。但对于 AI 而言,它考察了几件事情。

图片

首先,这是一个抽象的推理任务,它抛弃了所有的先验知识,不需要任何书本上的知识,也不需要会写字或说话。理论上,小孩子也能在一定程度上解决这类问题,但对于机器来说,处理记忆部分特别困难。这里考核了人类核心知识的掌握程度,包括物体表征,即能够识别物体;还有数量表征,即对数量的理解。

这个问题之所以受到广泛关注,是因为其他基准测试,很快即达到饱和,超过了人类的标准。而这一基准自 2019 年提出之后,其增长曲线一直很缓慢,人类的成绩大约在 85 分左右,他们设定了 85 分为奖项标准。而现有系统仅能够达到 50 多分的水平,提升非常有限。

所以,大语言模型还只是人类智力光谱中的一小片光芒。它很小,很亮,但距离实现全面的人工智能仍有很长的路要走。

二十世纪四十年代,冯Ÿ诺伊曼在研究自复制机的时候提出了元胞自动机的概念。元胞自动机是一个根据特定规则演化的离散系统。其中一种规则是 rule 30,如下图所示,假设有一系列格子,一行一行地看,如果三个相邻格子是黑色,则下一个变成白色。状态由二进制表示,这样一套规则定义了自动机的行为。由于它是基于规则的,自动机能够在给定条件下执行特定的操作,这与人类利用经验和逻辑来决策的过程形成了对比。

图片

这一过程实际上类似于推理,一步步迭代。问题在于:当有足够多的行后,下面会出现一些难以预测的模式。

图片

其背后的理论是计算不可约性。Stephen Wolfram 有一本书非常值得推荐,名为《A New Kind of Science》。书中提出了计算不可约性的理论,即某些系统的动态行为无法通过任何捷径或简化方法来预测,必须通过一步一步的演算才能得到最终答案。即使是最简单的规则,如这里只是 8 个 bit 的规则,也能产生极其复杂的行为。人类或自然界中的规则会更为复杂,因此有很多现象是不可知的,这意味着 AI 很难预测或模拟其他系统。

尝试用计算机软件系统模拟人类智能是否可行?或者在多大程度上可行?这种真实性的实现受到计算不可约性的影响,导致我们难以很好地模拟复杂的系统。

图片

Wolfram 做了一个有趣的实验,涉及八个元胞自动机规则,每个规则都很简单。下图是真实迭代结果。如果我们训练一个神经网络,像 GPT 一样进行 token 预测,能达到怎样的预测结果?

随着训练量的增加,我们发现它的表现确实有所改善。首先,在样本数量很少的情况下,它可以成功地将白色部分预测为白色,尽管对黑色部分的预测效果不佳。但在训练过程中,对于一些复杂的事件,它也能够做出预测。这说明通过增加更多的训练量,我们的确能够拟合出一些系统行为,但这消耗了 800k 的参数,而实际上实现该功能可能 20 行代码即可完成。二者之间的差异反映了计算阻力的问题。当我们试图模拟人类智能时,究竟需要多少计算能力是一个非常大的问题。

因此,当我们讨论推理时,简单地创建一个大型模型可能还不够,因为我们不清楚模拟人类智能所需的具体分区和计算能力。另一个更深层次的问题是我们尝试创造人工智能实际上是一门科学,我们试图归纳出人类智能的一些规律以模拟它。然而,这与科学研究相似,在初期阶段容易实现,例如让模型学会生成看似合理的人类语言。但实际上,它并不聪明,因为它的知识有限。神经网络可以拟合某些东西,但对于一些很多问题是难以解决的。

图片

当人类面对星空时,是如何总结出日心说这样一套理论的?这实际上涉及计算中可约部分的寻找。具体而言,如何从一个图映射到另一个图是一个问题。人类能够实现这种映射,但 AI 能否做到这一点呢?即便我们对此习以为常,实际上这对机器来说仍然是一个挑战。

图片

四、Q&A

Q1:如果一个 agent 足够强大,例如通过调用外部工具或多个模型的组合,它在解决 RAG 问题时,两种技术方案会是什么样的?另外,agent 在未来将会发展到什么程度?

A1:这个问题实际上是关于生产系统中如何设计高效、低成本且效果好的系统。而我所做的研究中约束条件是几乎没有限制,因此我可以采用非常复杂的方法。工作流程是这样的:模型看到的是浏览器,而浏览器只能看到网页的一小部分内容;接着,它决定是否滚动页面、回退或是使用 Ctrl+F 进行搜索,甚至直接打开搜索引擎,这是一个很长的基于 agent 的搜索流程。其优点是效果较好,但成本很高。因此,我们需要权衡效率与成本之间的关系——是追求快速发展速度还是产品面向的是需要快速响应的系统,还是可以接受较低速度但效果尚可的系统.

Q2:在您展示的计算不可约性图表后面有一张图,其中白色部分如果大部分用于学习,似乎能很快学出来。原因是不是因为它更接近于数据分布的主要模式?如果让大部分学习这部分内容,应该更容易学到,假设预测下一部分全是白色,那么大概率是正确的,所以预测白色更容易,是这样吗?

A2:可以这么理解,因为正如您所提到的,大多数情况下,它确实很快就能适应这些简单的情况,这里并没有使用大模型,实验只用了 800k 参数,不需要大模型也能完成任务,因为这块损失最小最容易拟合,所以它留下了这个特点。

Q3:最近很多基础模型团队都在讨论他们使用大量生成的数据或模拟数据进行训练,这些数据并非真实数据。这种情况类似于给定一个大的参数量,但数据却不是实际收集的。这引发了对于训练数据真实性与模型性能之间关系的思考。

A3:对于小模型(比如 3B 或 7B 参数量),因为它们面向的是轻量化、快速响应的需求,本身对深度知识的要求没那么高。此时,如果想让模型更贴近某个具体领域或场景,用合成数据能带来更好的针对性。毕竟从网上抓下来的数据质量有限,而且跟具体业务不一定匹配。但合成数据需要保证质量,至少要和目标场景的内容相符,否则也会带来噪音。

在做 SFT(监督微调)时,如果缺少高质量的人类标注数据,一些团队会根据规则或专家经验来“人造”数据。这比直接让大模型自动生成要更可控,可以把行业知识或业务逻辑融进来,快速填充数据集。不过,它依然需要一定的验证和筛选,避免把错误信息大量灌进模型里。

大模型使用合成数据也有机会带来收益,尤其在没什么标注数据的场景,比如类似解谜或问答类任务。但大模型的容量更大,对脏数据更敏感,一旦有明显的错误样本,负面影响会更严重,所以需要更严格的质量把控。

责任编辑:姜华 来源: DataFunTalk
相关推荐

2015-10-28 17:19:20

2023-11-22 15:53:45

2014-05-04 10:32:06

创业创业心得

2009-07-09 18:20:53

云存储云计算云服务

2012-05-01 08:38:47

制造

2019-09-03 18:38:39

2016-08-03 15:35:14

云计算云计算发展趋势

2012-12-10 16:25:34

IPv6

2016-07-20 13:08:59

云计算

2013-08-15 11:01:22

2020-08-16 08:48:51

零信任网络安全网络攻击

2020-09-10 09:30:03

鸿蒙安卓操作系统

2015-09-15 10:03:43

流量无限运营商

2011-07-21 08:53:42

HTML 5

2023-08-24 09:52:44

自动驾驶设计

2024-12-31 10:48:04

2015-11-30 11:02:00

5G通信技术

2014-08-14 09:12:50

2024-01-19 12:26:08

AI智能车

2020-07-20 11:23:24

信息安全个人信息数据安全
点赞
收藏

51CTO技术栈公众号